From 099a7a8ac0f54c32fbc68cba53bec88284ad6e40 Mon Sep 17 00:00:00 2001 From: Matt Moore Date: Mon, 20 Apr 2020 10:46:31 -0700 Subject: [PATCH] Initial commit --- .gitattributes | 15 + .gitignore | 11 + CONTRIBUTING.md | 6 + DEVELOPMENT.md | 73 + Gopkg.lock | 1170 + Gopkg.toml | 69 + LICENSE | 201 + OWNERS | 7 + OWNERS_ALIASES | 11 + README.md | 14 + cmd/controller/kodata/HEAD | 1 + cmd/controller/kodata/LICENSE | 1 + cmd/controller/kodata/VENDOR-LICENSE | 1 + cmd/controller/kodata/refs | 1 + cmd/controller/main.go | 31 + cmd/webhook/kodata/HEAD | 1 + cmd/webhook/kodata/LICENSE | 1 + cmd/webhook/kodata/VENDOR-LICENSE | 1 + cmd/webhook/kodata/refs | 1 + cmd/webhook/main.go | 129 + code-of-conduct.md | 75 + config/100-namespace.yaml | 21 + config/200-clusterrole.yaml | 35 + config/200-serviceaccount.yaml | 21 + config/201-clusterrolebinding.yaml | 28 + config/300-addressableservice.yaml | 46 + config/400-webhook-service.yaml | 28 + config/500-webhook-configuration.yaml | 74 + config/config-logging.yaml | 66 + config/config-observability.yaml | 89 + config/controller.yaml | 70 + config/webhook.yaml | 62 + example.yaml | 7 + hack/OWNERS | 10 + hack/boilerplate/add-boilerplate.sh | 38 + hack/boilerplate/boilerplate.go.txt | 15 + hack/boilerplate/boilerplate.sh.txt | 15 + hack/update-codegen.sh | 42 + hack/update-deps.sh | 52 + hack/verify-codegen.sh | 55 + pkg/apis/samples/register.go | 21 + .../v1alpha1/addressable_service_defaults.go | 26 + .../v1alpha1/addressable_service_lifecycle.go | 44 + .../v1alpha1/addressable_service_types.go | 80 + .../addressable_service_validation.go | 36 + pkg/apis/samples/v1alpha1/doc.go | 19 + pkg/apis/samples/v1alpha1/register.go | 53 + pkg/apis/samples/v1alpha1/register_test.go | 41 + .../samples/v1alpha1/zz_generated.deepcopy.go | 125 + pkg/client/clientset/versioned/clientset.go | 97 + pkg/client/clientset/versioned/doc.go | 20 + .../versioned/fake/clientset_generated.go | 82 + pkg/client/clientset/versioned/fake/doc.go | 20 + .../clientset/versioned/fake/register.go | 56 + pkg/client/clientset/versioned/scheme/doc.go | 20 + .../clientset/versioned/scheme/register.go | 56 + .../samples/v1alpha1/addressableservice.go | 191 + .../versioned/typed/samples/v1alpha1/doc.go | 20 + .../typed/samples/v1alpha1/fake/doc.go | 20 + .../v1alpha1/fake/fake_addressableservice.go | 140 + .../v1alpha1/fake/fake_samples_client.go | 40 + .../samples/v1alpha1/generated_expansion.go | 21 + .../typed/samples/v1alpha1/samples_client.go | 89 + .../informers/externalversions/factory.go | 180 + .../informers/externalversions/generic.go | 62 + .../internalinterfaces/factory_interfaces.go | 40 + .../externalversions/samples/interface.go | 46 + .../samples/v1alpha1/addressableservice.go | 89 + .../samples/v1alpha1/interface.go | 45 + pkg/client/injection/client/client.go | 49 + pkg/client/injection/client/fake/fake.go | 54 + .../injection/informers/factory/factory.go | 56 + .../injection/informers/factory/fake/fake.go | 45 + .../addressableservice/addressableservice.go | 52 + .../v1alpha1/addressableservice/fake/fake.go | 40 + .../v1alpha1/addressableservice/controller.go | 97 + .../v1alpha1/addressableservice/reconciler.go | 339 + .../addressableservice/stub/controller.go | 54 + .../addressableservice/stub/reconciler.go | 66 + .../samples/v1alpha1/addressableservice.go | 94 + .../samples/v1alpha1/expansion_generated.go | 27 + .../addressableservice/addressableservice.go | 104 + .../addressableservice/controller.go | 65 + test/OWNERS | 10 + test/presubmit-tests.sh | 34 + third_party/VENDOR-LICENSE | 7324 ++ vendor/cloud.google.com/go/LICENSE | 202 + .../go/compute/metadata/metadata.go | 513 + .../container/apiv1/cluster_manager_client.go | 676 + .../go/container/apiv1/doc.go | 49 + .../go/internal/version/version.go | 71 + .../monitoring/apiv3/alert_policy_client.go | 284 + .../go/monitoring/apiv3/doc.go | 105 + .../go/monitoring/apiv3/group_client.go | 369 + .../go/monitoring/apiv3/metric_client.go | 468 + .../apiv3/notification_channel_client.go | 384 + .../go/monitoring/apiv3/path_funcs.go | 107 + .../monitoring/apiv3/uptime_check_client.go | 368 + vendor/cloud.google.com/go/trace/apiv2/doc.go | 105 + .../go/trace/apiv2/path_funcs.go | 43 + .../go/trace/apiv2/trace_client.go | 154 + .../exporter/ocagent/LICENSE | 201 + .../exporter/ocagent/common.go | 38 + .../exporter/ocagent/connection.go | 113 + .../exporter/ocagent/nodeinfo.go | 46 + .../exporter/ocagent/ocagent.go | 572 + .../exporter/ocagent/options.go | 161 + .../exporter/ocagent/transform_spans.go | 248 + .../ocagent/transform_stats_to_metrics.go | 274 + .../exporter/ocagent/version.go | 17 + .../exporter/prometheus/LICENSE | 201 + .../exporter/prometheus/prometheus.go | 277 + .../exporter/prometheus/sanitize.go | 50 + .../exporter/stackdriver/AUTHORS | 1 + .../exporter/stackdriver/LICENSE | 202 + .../exporter/stackdriver/label.go | 33 + .../exporter/stackdriver/metrics.go | 519 + .../exporter/stackdriver/metrics_batcher.go | 201 + .../exporter/stackdriver/metrics_proto.go | 569 + .../aws_identity_doc_utils.go | 57 + .../monitoredresource/gcp_metadata_config.go | 117 + .../monitoredresource/monitored_resources.go | 232 + .../exporter/stackdriver/resource.go | 143 + .../exporter/stackdriver/sanitize.go | 50 + .../exporter/stackdriver/stackdriver.go | 480 + .../exporter/stackdriver/stats.go | 628 + .../exporter/stackdriver/trace.go | 178 + .../exporter/stackdriver/trace_proto.go | 291 + vendor/github.com/aws/aws-sdk-go/LICENSE.txt | 202 + vendor/github.com/aws/aws-sdk-go/NOTICE.txt | 3 + .../aws/aws-sdk-go/aws/awserr/error.go | 164 + .../aws/aws-sdk-go/aws/awserr/types.go | 221 + .../aws/aws-sdk-go/aws/awsutil/copy.go | 108 + .../aws/aws-sdk-go/aws/awsutil/equal.go | 27 + .../aws/aws-sdk-go/aws/awsutil/path_value.go | 222 + .../aws/aws-sdk-go/aws/awsutil/prettify.go | 113 + .../aws-sdk-go/aws/awsutil/string_value.go | 88 + .../aws/aws-sdk-go/aws/client/client.go | 96 + .../aws-sdk-go/aws/client/default_retryer.go | 116 + .../aws/aws-sdk-go/aws/client/logger.go | 190 + .../aws/client/metadata/client_info.go | 13 + .../github.com/aws/aws-sdk-go/aws/config.go | 536 + .../aws/aws-sdk-go/aws/context_1_5.go | 37 + .../aws/aws-sdk-go/aws/context_1_9.go | 11 + .../aws-sdk-go/aws/context_background_1_5.go | 56 + .../aws-sdk-go/aws/context_background_1_7.go | 20 + .../aws/aws-sdk-go/aws/context_sleep.go | 24 + .../aws/aws-sdk-go/aws/convert_types.go | 387 + .../aws-sdk-go/aws/corehandlers/handlers.go | 228 + .../aws/corehandlers/param_validator.go | 17 + .../aws-sdk-go/aws/corehandlers/user_agent.go | 37 + .../aws/credentials/chain_provider.go | 100 + .../aws-sdk-go/aws/credentials/credentials.go | 292 + .../ec2rolecreds/ec2_role_provider.go | 180 + .../aws/credentials/endpointcreds/provider.go | 203 + .../aws/credentials/env_provider.go | 74 + .../aws/credentials/processcreds/provider.go | 425 + .../shared_credentials_provider.go | 150 + .../aws/credentials/static_provider.go | 55 + .../stscreds/assume_role_provider.go | 313 + .../github.com/aws/aws-sdk-go/aws/csm/doc.go | 46 + .../aws/aws-sdk-go/aws/csm/enable.go | 67 + .../aws/aws-sdk-go/aws/csm/metric.go | 109 + .../aws/aws-sdk-go/aws/csm/metric_chan.go | 54 + .../aws-sdk-go/aws/csm/metric_exception.go | 26 + .../aws/aws-sdk-go/aws/csm/reporter.go | 260 + .../aws/aws-sdk-go/aws/defaults/defaults.go | 207 + .../aws-sdk-go/aws/defaults/shared_config.go | 27 + vendor/github.com/aws/aws-sdk-go/aws/doc.go | 56 + .../aws/aws-sdk-go/aws/ec2metadata/api.go | 169 + .../aws/aws-sdk-go/aws/ec2metadata/service.go | 152 + .../aws/aws-sdk-go/aws/endpoints/decode.go | 188 + .../aws/aws-sdk-go/aws/endpoints/defaults.go | 4407 + .../aws/endpoints/dep_service_ids.go | 141 + .../aws/aws-sdk-go/aws/endpoints/doc.go | 66 + .../aws/aws-sdk-go/aws/endpoints/endpoints.go | 449 + .../aws/aws-sdk-go/aws/endpoints/v3model.go | 307 + .../aws/endpoints/v3model_codegen.go | 351 + .../github.com/aws/aws-sdk-go/aws/errors.go | 13 + .../aws/aws-sdk-go/aws/jsonvalue.go | 12 + .../github.com/aws/aws-sdk-go/aws/logger.go | 118 + .../aws/request/connection_reset_error.go | 19 + .../request/connection_reset_error_other.go | 11 + .../aws/aws-sdk-go/aws/request/handlers.go | 277 + .../aws-sdk-go/aws/request/http_request.go | 24 + .../aws-sdk-go/aws/request/offset_reader.go | 60 + .../aws/aws-sdk-go/aws/request/request.go | 673 + .../aws/aws-sdk-go/aws/request/request_1_7.go | 39 + .../aws/aws-sdk-go/aws/request/request_1_8.go | 33 + .../aws-sdk-go/aws/request/request_context.go | 14 + .../aws/request/request_context_1_6.go | 14 + .../aws/request/request_pagination.go | 264 + .../aws/aws-sdk-go/aws/request/retryer.go | 163 + .../aws/request/timeout_read_closer.go | 94 + .../aws/aws-sdk-go/aws/request/validation.go | 286 + .../aws/aws-sdk-go/aws/request/waiter.go | 295 + .../aws/session/cabundle_transport.go | 26 + .../aws/session/cabundle_transport_1_5.go | 22 + .../aws/session/cabundle_transport_1_6.go | 23 + .../aws/aws-sdk-go/aws/session/doc.go | 273 + .../aws/aws-sdk-go/aws/session/env_config.go | 236 + .../aws/aws-sdk-go/aws/session/session.go | 719 + .../aws-sdk-go/aws/session/shared_config.go | 329 + .../aws-sdk-go/aws/signer/v4/header_rules.go | 82 + .../aws/aws-sdk-go/aws/signer/v4/options.go | 7 + .../aws/aws-sdk-go/aws/signer/v4/uri_path.go | 24 + .../aws/aws-sdk-go/aws/signer/v4/v4.go | 796 + vendor/github.com/aws/aws-sdk-go/aws/types.go | 201 + vendor/github.com/aws/aws-sdk-go/aws/url.go | 12 + .../github.com/aws/aws-sdk-go/aws/url_1_7.go | 29 + .../github.com/aws/aws-sdk-go/aws/version.go | 8 + .../aws/aws-sdk-go/internal/ini/ast.go | 120 + .../aws-sdk-go/internal/ini/comma_token.go | 11 + .../aws-sdk-go/internal/ini/comment_token.go | 35 + .../aws/aws-sdk-go/internal/ini/doc.go | 29 + .../aws-sdk-go/internal/ini/empty_token.go | 4 + .../aws/aws-sdk-go/internal/ini/expression.go | 24 + .../aws/aws-sdk-go/internal/ini/fuzz.go | 17 + .../aws/aws-sdk-go/internal/ini/ini.go | 51 + .../aws/aws-sdk-go/internal/ini/ini_lexer.go | 165 + .../aws/aws-sdk-go/internal/ini/ini_parser.go | 347 + .../aws-sdk-go/internal/ini/literal_tokens.go | 324 + .../aws-sdk-go/internal/ini/newline_token.go | 30 + .../aws-sdk-go/internal/ini/number_helper.go | 152 + .../aws/aws-sdk-go/internal/ini/op_tokens.go | 39 + .../aws-sdk-go/internal/ini/parse_error.go | 43 + .../aws-sdk-go/internal/ini/parse_stack.go | 60 + .../aws/aws-sdk-go/internal/ini/sep_tokens.go | 41 + .../aws/aws-sdk-go/internal/ini/skipper.go | 45 + .../aws/aws-sdk-go/internal/ini/statement.go | 35 + .../aws/aws-sdk-go/internal/ini/value_util.go | 284 + .../aws/aws-sdk-go/internal/ini/visitor.go | 166 + .../aws/aws-sdk-go/internal/ini/walker.go | 25 + .../aws/aws-sdk-go/internal/ini/ws_token.go | 24 + .../aws/aws-sdk-go/internal/sdkio/io_go1.6.go | 10 + .../aws/aws-sdk-go/internal/sdkio/io_go1.7.go | 12 + .../internal/sdkrand/locked_source.go | 29 + .../aws/aws-sdk-go/internal/sdkuri/path.go | 23 + .../internal/shareddefaults/ecs_container.go | 12 + .../internal/shareddefaults/shared_config.go | 40 + .../aws/aws-sdk-go/private/protocol/host.go | 68 + .../private/protocol/host_prefix.go | 54 + .../private/protocol/idempotency.go | 75 + .../private/protocol/json/jsonutil/build.go | 296 + .../protocol/json/jsonutil/unmarshal.go | 250 + .../aws-sdk-go/private/protocol/jsonvalue.go | 76 + .../aws-sdk-go/private/protocol/payload.go | 81 + .../private/protocol/query/build.go | 36 + .../protocol/query/queryutil/queryutil.go | 246 + .../private/protocol/query/unmarshal.go | 39 + .../private/protocol/query/unmarshal_error.go | 69 + .../aws-sdk-go/private/protocol/rest/build.go | 310 + .../private/protocol/rest/payload.go | 45 + .../private/protocol/rest/unmarshal.go | 225 + .../aws-sdk-go/private/protocol/timestamp.go | 72 + .../aws-sdk-go/private/protocol/unmarshal.go | 21 + .../private/protocol/xml/xmlutil/build.go | 306 + .../private/protocol/xml/xmlutil/unmarshal.go | 291 + .../protocol/xml/xmlutil/xml_to_struct.go | 148 + .../aws/aws-sdk-go/service/sts/api.go | 2580 + .../aws/aws-sdk-go/service/sts/doc.go | 116 + .../aws/aws-sdk-go/service/sts/errors.go | 73 + .../aws/aws-sdk-go/service/sts/service.go | 95 + vendor/github.com/beorn7/perks/LICENSE | 20 + .../beorn7/perks/quantile/stream.go | 316 + vendor/github.com/blang/semver/LICENSE | 22 + vendor/github.com/blang/semver/json.go | 23 + vendor/github.com/blang/semver/range.go | 416 + vendor/github.com/blang/semver/semver.go | 455 + vendor/github.com/blang/semver/sort.go | 28 + vendor/github.com/blang/semver/sql.go | 30 + .../opencensus-proto/AUTHORS | 1 + .../opencensus-proto/LICENSE | 202 + .../gen-go/agent/common/v1/common.pb.go | 361 + .../agent/metrics/v1/metrics_service.pb.go | 275 + .../agent/metrics/v1/metrics_service.pb.gw.go | 150 + .../gen-go/agent/trace/v1/trace_service.pb.go | 457 + .../agent/trace/v1/trace_service.pb.gw.go | 150 + .../gen-go/metrics/v1/metrics.pb.go | 1127 + .../gen-go/resource/v1/resource.pb.go | 100 + .../gen-go/trace/v1/trace.pb.go | 1553 + .../gen-go/trace/v1/trace_config.pb.go | 359 + vendor/github.com/davecgh/go-spew/LICENSE | 15 + .../github.com/davecgh/go-spew/spew/bypass.go | 145 + .../davecgh/go-spew/spew/bypasssafe.go | 38 + .../github.com/davecgh/go-spew/spew/common.go | 341 + .../github.com/davecgh/go-spew/spew/config.go | 306 + vendor/github.com/davecgh/go-spew/spew/doc.go | 211 + .../github.com/davecgh/go-spew/spew/dump.go | 509 + .../github.com/davecgh/go-spew/spew/format.go | 419 + .../github.com/davecgh/go-spew/spew/spew.go | 148 + vendor/github.com/evanphx/json-patch/LICENSE | 25 + .../github.com/evanphx/json-patch/errors.go | 38 + vendor/github.com/evanphx/json-patch/merge.go | 383 + vendor/github.com/evanphx/json-patch/patch.go | 696 + vendor/github.com/gobuffalo/envy/LICENSE | 21 + vendor/github.com/gobuffalo/envy/LICENSE.txt | 8 + vendor/github.com/gobuffalo/envy/envy.go | 276 + vendor/github.com/gobuffalo/envy/version.go | 3 + vendor/github.com/gogo/protobuf/AUTHORS | 15 + vendor/github.com/gogo/protobuf/CONTRIBUTORS | 23 + .../gogo/protobuf/GOLANG_CONTRIBUTORS | 5 + vendor/github.com/gogo/protobuf/LICENSE | 35 + .../github.com/gogo/protobuf/proto/clone.go | 258 + .../gogo/protobuf/proto/custom_gogo.go | 39 + .../github.com/gogo/protobuf/proto/decode.go | 428 + .../github.com/gogo/protobuf/proto/discard.go | 350 + .../gogo/protobuf/proto/duration.go | 100 + .../gogo/protobuf/proto/duration_gogo.go | 49 + .../github.com/gogo/protobuf/proto/encode.go | 203 + .../gogo/protobuf/proto/encode_gogo.go | 33 + .../github.com/gogo/protobuf/proto/equal.go | 300 + .../gogo/protobuf/proto/extensions.go | 604 + .../gogo/protobuf/proto/extensions_gogo.go | 368 + vendor/github.com/gogo/protobuf/proto/lib.go | 987 + .../gogo/protobuf/proto/lib_gogo.go | 50 + .../gogo/protobuf/proto/message_set.go | 314 + .../gogo/protobuf/proto/pointer_reflect.go | 357 + .../protobuf/proto/pointer_reflect_gogo.go | 59 + .../gogo/protobuf/proto/pointer_unsafe.go | 308 + .../protobuf/proto/pointer_unsafe_gogo.go | 56 + .../gogo/protobuf/proto/properties.go | 608 + .../gogo/protobuf/proto/properties_gogo.go | 36 + .../gogo/protobuf/proto/skip_gogo.go | 119 + .../gogo/protobuf/proto/table_marshal.go | 3006 + .../gogo/protobuf/proto/table_marshal_gogo.go | 388 + .../gogo/protobuf/proto/table_merge.go | 657 + .../gogo/protobuf/proto/table_unmarshal.go | 2245 + .../protobuf/proto/table_unmarshal_gogo.go | 385 + vendor/github.com/gogo/protobuf/proto/text.go | 928 + .../gogo/protobuf/proto/text_gogo.go | 57 + .../gogo/protobuf/proto/text_parser.go | 1018 + .../gogo/protobuf/proto/timestamp.go | 113 + .../gogo/protobuf/proto/timestamp_gogo.go | 49 + .../gogo/protobuf/proto/wrappers.go | 1888 + .../gogo/protobuf/proto/wrappers_gogo.go | 113 + .../gogo/protobuf/sortkeys/sortkeys.go | 101 + vendor/github.com/golang/groupcache/LICENSE | 191 + .../github.com/golang/groupcache/lru/lru.go | 133 + vendor/github.com/golang/protobuf/AUTHORS | 3 + .../github.com/golang/protobuf/CONTRIBUTORS | 3 + vendor/github.com/golang/protobuf/LICENSE | 28 + .../golang/protobuf/descriptor/descriptor.go | 93 + .../golang/protobuf/jsonpb/jsonpb.go | 1284 + .../github.com/golang/protobuf/proto/clone.go | 253 + .../golang/protobuf/proto/decode.go | 427 + .../golang/protobuf/proto/deprecated.go | 63 + .../golang/protobuf/proto/discard.go | 350 + .../golang/protobuf/proto/encode.go | 203 + .../github.com/golang/protobuf/proto/equal.go | 301 + .../golang/protobuf/proto/extensions.go | 607 + .../github.com/golang/protobuf/proto/lib.go | 965 + .../golang/protobuf/proto/message_set.go | 181 + .../golang/protobuf/proto/pointer_reflect.go | 360 + .../golang/protobuf/proto/pointer_unsafe.go | 313 + .../golang/protobuf/proto/properties.go | 544 + .../golang/protobuf/proto/table_marshal.go | 2776 + .../golang/protobuf/proto/table_merge.go | 654 + .../golang/protobuf/proto/table_unmarshal.go | 2053 + .../github.com/golang/protobuf/proto/text.go | 843 + .../golang/protobuf/proto/text_parser.go | 880 + .../protoc-gen-go/descriptor/descriptor.pb.go | 2887 + .../github.com/golang/protobuf/ptypes/any.go | 141 + .../golang/protobuf/ptypes/any/any.pb.go | 200 + .../github.com/golang/protobuf/ptypes/doc.go | 35 + .../golang/protobuf/ptypes/duration.go | 102 + .../protobuf/ptypes/duration/duration.pb.go | 161 + .../golang/protobuf/ptypes/empty/empty.pb.go | 83 + .../protobuf/ptypes/struct/struct.pb.go | 336 + .../golang/protobuf/ptypes/timestamp.go | 132 + .../protobuf/ptypes/timestamp/timestamp.pb.go | 179 + .../protobuf/ptypes/wrappers/wrappers.pb.go | 461 + vendor/github.com/google/go-cmp/LICENSE | 27 + .../github.com/google/go-cmp/cmp/compare.go | 655 + .../google/go-cmp/cmp/export_panic.go | 15 + .../google/go-cmp/cmp/export_unsafe.go | 25 + .../go-cmp/cmp/internal/diff/debug_disable.go | 17 + .../go-cmp/cmp/internal/diff/debug_enable.go | 122 + .../google/go-cmp/cmp/internal/diff/diff.go | 372 + .../google/go-cmp/cmp/internal/flags/flags.go | 9 + .../cmp/internal/flags/toolchain_legacy.go | 10 + .../cmp/internal/flags/toolchain_recent.go | 10 + .../go-cmp/cmp/internal/function/func.go | 99 + .../cmp/internal/value/pointer_purego.go | 23 + .../cmp/internal/value/pointer_unsafe.go | 26 + .../google/go-cmp/cmp/internal/value/sort.go | 106 + .../google/go-cmp/cmp/internal/value/zero.go | 48 + .../github.com/google/go-cmp/cmp/options.go | 549 + vendor/github.com/google/go-cmp/cmp/path.go | 377 + vendor/github.com/google/go-cmp/cmp/report.go | 51 + .../google/go-cmp/cmp/report_compare.go | 296 + .../google/go-cmp/cmp/report_reflect.go | 278 + .../google/go-cmp/cmp/report_slices.go | 333 + .../google/go-cmp/cmp/report_text.go | 387 + .../google/go-cmp/cmp/report_value.go | 121 + vendor/github.com/google/gofuzz/LICENSE | 202 + vendor/github.com/google/gofuzz/doc.go | 18 + vendor/github.com/google/gofuzz/fuzz.go | 487 + .../google/licenseclassifier/LICENSE | 202 + .../google/licenseclassifier/classifier.go | 429 + .../file_system_resources.go | 65 + .../google/licenseclassifier/forbidden.go | 48 + .../licenseclassifier/internal/sets/sets.go | 20 + .../internal/sets/stringset.go | 228 + .../google/licenseclassifier/license_type.go | 376 + .../licenseclassifier/licenses/Unlicense.txt | 24 + .../licenseclassifier/licenses/licenses.db | Bin 0 -> 5479632 bytes .../stringclassifier/LICENSE | 202 + .../stringclassifier/classifier.go | 560 + .../stringclassifier/internal/pq/priority.go | 111 + .../stringclassifier/searchset/searchset.go | 491 + .../searchset/tokenizer/tokenizer.go | 175 + vendor/github.com/google/uuid/CONTRIBUTORS | 9 + vendor/github.com/google/uuid/LICENSE | 27 + vendor/github.com/google/uuid/dce.go | 80 + vendor/github.com/google/uuid/doc.go | 12 + vendor/github.com/google/uuid/hash.go | 53 + vendor/github.com/google/uuid/marshal.go | 37 + vendor/github.com/google/uuid/node.go | 90 + vendor/github.com/google/uuid/node_js.go | 12 + vendor/github.com/google/uuid/node_net.go | 33 + vendor/github.com/google/uuid/sql.go | 59 + vendor/github.com/google/uuid/time.go | 123 + vendor/github.com/google/uuid/util.go | 43 + vendor/github.com/google/uuid/uuid.go | 245 + vendor/github.com/google/uuid/version1.go | 44 + vendor/github.com/google/uuid/version4.go | 38 + vendor/github.com/googleapis/gax-go/LICENSE | 27 + .../googleapis/gax-go/v2/call_option.go | 161 + vendor/github.com/googleapis/gax-go/v2/gax.go | 39 + .../github.com/googleapis/gax-go/v2/header.go | 53 + .../github.com/googleapis/gax-go/v2/invoke.go | 99 + vendor/github.com/googleapis/gnostic/LICENSE | 203 + .../googleapis/gnostic/OpenAPIv2/OpenAPIv2.go | 8728 ++ .../gnostic/OpenAPIv2/OpenAPIv2.pb.go | 4455 + .../googleapis/gnostic/compiler/context.go | 43 + .../googleapis/gnostic/compiler/error.go | 61 + .../gnostic/compiler/extension-handler.go | 101 + .../googleapis/gnostic/compiler/helpers.go | 197 + .../googleapis/gnostic/compiler/main.go | 16 + .../googleapis/gnostic/compiler/reader.go | 175 + .../gnostic/extensions/extension.pb.go | 218 + .../gnostic/extensions/extensions.go | 82 + .../grpc-ecosystem/grpc-gateway/LICENSE.txt | 27 + .../grpc-gateway/internal/stream_chunk.pb.go | 119 + .../grpc-gateway/runtime/context.go | 236 + .../grpc-gateway/runtime/convert.go | 318 + .../grpc-gateway/runtime/doc.go | 5 + .../grpc-gateway/runtime/errors.go | 146 + .../grpc-gateway/runtime/fieldmask.go | 82 + .../grpc-gateway/runtime/handler.go | 209 + .../runtime/marshal_httpbodyproto.go | 43 + .../grpc-gateway/runtime/marshal_json.go | 45 + .../grpc-gateway/runtime/marshal_jsonpb.go | 262 + .../grpc-gateway/runtime/marshal_proto.go | 62 + .../grpc-gateway/runtime/marshaler.go | 48 + .../runtime/marshaler_registry.go | 91 + .../grpc-gateway/runtime/mux.go | 303 + .../grpc-gateway/runtime/pattern.go | 262 + .../grpc-gateway/runtime/proto2_convert.go | 80 + .../grpc-gateway/runtime/proto_errors.go | 106 + .../grpc-gateway/runtime/query.go | 391 + .../third_party/googleapis/LICENSE | 201 + .../grpc-gateway/utilities/doc.go | 2 + .../grpc-gateway/utilities/pattern.go | 22 + .../grpc-gateway/utilities/readerfactory.go | 20 + .../grpc-gateway/utilities/trie.go | 177 + vendor/github.com/hashicorp/golang-lru/2q.go | 223 + .../github.com/hashicorp/golang-lru/LICENSE | 362 + vendor/github.com/hashicorp/golang-lru/arc.go | 257 + vendor/github.com/hashicorp/golang-lru/doc.go | 21 + vendor/github.com/hashicorp/golang-lru/lru.go | 110 + .../hashicorp/golang-lru/simplelru/lru.go | 161 + .../golang-lru/simplelru/lru_interface.go | 36 + vendor/github.com/imdario/mergo/LICENSE | 28 + vendor/github.com/imdario/mergo/doc.go | 44 + vendor/github.com/imdario/mergo/map.go | 175 + vendor/github.com/imdario/mergo/merge.go | 255 + vendor/github.com/imdario/mergo/mergo.go | 97 + .../imdario/mergo/testdata/license.yml | 4 + .../github.com/jmespath/go-jmespath/LICENSE | 13 + vendor/github.com/jmespath/go-jmespath/api.go | 49 + .../go-jmespath/astnodetype_string.go | 16 + .../jmespath/go-jmespath/functions.go | 842 + .../jmespath/go-jmespath/interpreter.go | 418 + .../github.com/jmespath/go-jmespath/lexer.go | 420 + .../github.com/jmespath/go-jmespath/parser.go | 603 + .../jmespath/go-jmespath/toktype_string.go | 16 + .../github.com/jmespath/go-jmespath/util.go | 185 + vendor/github.com/joho/godotenv/LICENCE | 23 + vendor/github.com/joho/godotenv/godotenv.go | 346 + vendor/github.com/json-iterator/go/LICENSE | 21 + vendor/github.com/json-iterator/go/adapter.go | 148 + vendor/github.com/json-iterator/go/any.go | 321 + .../github.com/json-iterator/go/any_array.go | 278 + .../github.com/json-iterator/go/any_bool.go | 137 + .../github.com/json-iterator/go/any_float.go | 83 + .../github.com/json-iterator/go/any_int32.go | 74 + .../github.com/json-iterator/go/any_int64.go | 74 + .../json-iterator/go/any_invalid.go | 82 + vendor/github.com/json-iterator/go/any_nil.go | 69 + .../github.com/json-iterator/go/any_number.go | 123 + .../github.com/json-iterator/go/any_object.go | 374 + vendor/github.com/json-iterator/go/any_str.go | 166 + .../github.com/json-iterator/go/any_uint32.go | 74 + .../github.com/json-iterator/go/any_uint64.go | 74 + vendor/github.com/json-iterator/go/config.go | 372 + vendor/github.com/json-iterator/go/iter.go | 322 + .../github.com/json-iterator/go/iter_array.go | 58 + .../github.com/json-iterator/go/iter_float.go | 347 + .../github.com/json-iterator/go/iter_int.go | 345 + .../json-iterator/go/iter_object.go | 252 + .../github.com/json-iterator/go/iter_skip.go | 129 + .../json-iterator/go/iter_skip_sloppy.go | 144 + .../json-iterator/go/iter_skip_strict.go | 89 + .../github.com/json-iterator/go/iter_str.go | 215 + .../github.com/json-iterator/go/jsoniter.go | 18 + vendor/github.com/json-iterator/go/pool.go | 42 + vendor/github.com/json-iterator/go/reflect.go | 330 + .../json-iterator/go/reflect_array.go | 104 + .../json-iterator/go/reflect_dynamic.go | 70 + .../json-iterator/go/reflect_extension.go | 471 + .../json-iterator/go/reflect_json_number.go | 112 + .../go/reflect_json_raw_message.go | 60 + .../json-iterator/go/reflect_map.go | 318 + .../json-iterator/go/reflect_marshaler.go | 218 + .../json-iterator/go/reflect_native.go | 451 + .../json-iterator/go/reflect_optional.go | 133 + .../json-iterator/go/reflect_slice.go | 99 + .../go/reflect_struct_decoder.go | 1048 + .../go/reflect_struct_encoder.go | 210 + vendor/github.com/json-iterator/go/stream.go | 211 + .../json-iterator/go/stream_float.go | 94 + .../github.com/json-iterator/go/stream_int.go | 190 + .../github.com/json-iterator/go/stream_str.go | 372 + vendor/github.com/markbates/inflect/LICENCE | 7 + .../github.com/markbates/inflect/helpers.go | 19 + .../github.com/markbates/inflect/inflect.go | 892 + vendor/github.com/markbates/inflect/name.go | 163 + .../github.com/markbates/inflect/version.go | 3 + .../golang_protobuf_extensions/LICENSE | 201 + .../golang_protobuf_extensions/NOTICE | 1 + .../pbutil/decode.go | 75 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + .../github.com/modern-go/concurrent/LICENSE | 201 + .../modern-go/concurrent/executor.go | 14 + .../modern-go/concurrent/go_above_19.go | 15 + .../modern-go/concurrent/go_below_19.go | 33 + vendor/github.com/modern-go/concurrent/log.go | 13 + .../concurrent/unbounded_executor.go | 119 + vendor/github.com/modern-go/reflect2/LICENSE | 201 + .../modern-go/reflect2/go_above_17.go | 8 + .../modern-go/reflect2/go_above_19.go | 14 + .../modern-go/reflect2/go_below_17.go | 9 + .../modern-go/reflect2/go_below_19.go | 14 + .../github.com/modern-go/reflect2/reflect2.go | 298 + .../modern-go/reflect2/reflect2_amd64.s | 0 .../modern-go/reflect2/reflect2_kind.go | 30 + .../modern-go/reflect2/relfect2_386.s | 0 .../modern-go/reflect2/relfect2_amd64p32.s | 0 .../modern-go/reflect2/relfect2_arm.s | 0 .../modern-go/reflect2/relfect2_arm64.s | 0 .../modern-go/reflect2/relfect2_mips64x.s | 0 .../modern-go/reflect2/relfect2_mipsx.s | 0 .../modern-go/reflect2/relfect2_ppc64x.s | 0 .../modern-go/reflect2/relfect2_s390x.s | 0 .../modern-go/reflect2/safe_field.go | 58 + .../github.com/modern-go/reflect2/safe_map.go | 101 + .../modern-go/reflect2/safe_slice.go | 92 + .../modern-go/reflect2/safe_struct.go | 29 + .../modern-go/reflect2/safe_type.go | 78 + .../github.com/modern-go/reflect2/type_map.go | 103 + .../modern-go/reflect2/unsafe_array.go | 65 + .../modern-go/reflect2/unsafe_eface.go | 59 + .../modern-go/reflect2/unsafe_field.go | 74 + .../modern-go/reflect2/unsafe_iface.go | 64 + .../modern-go/reflect2/unsafe_link.go | 70 + .../modern-go/reflect2/unsafe_map.go | 138 + .../modern-go/reflect2/unsafe_ptr.go | 46 + .../modern-go/reflect2/unsafe_slice.go | 177 + .../modern-go/reflect2/unsafe_struct.go | 59 + .../modern-go/reflect2/unsafe_type.go | 85 + .../prometheus/client_golang/LICENSE | 201 + .../prometheus/client_golang/NOTICE | 23 + .../client_golang/prometheus/collector.go | 120 + .../client_golang/prometheus/counter.go | 277 + .../client_golang/prometheus/desc.go | 184 + .../client_golang/prometheus/doc.go | 201 + .../prometheus/expvar_collector.go | 119 + .../client_golang/prometheus/fnv.go | 42 + .../client_golang/prometheus/gauge.go | 286 + .../client_golang/prometheus/go_collector.go | 366 + .../client_golang/prometheus/histogram.go | 586 + .../client_golang/prometheus/http.go | 505 + .../prometheus/internal/metric.go | 85 + .../client_golang/prometheus/labels.go | 87 + .../client_golang/prometheus/metric.go | 174 + .../client_golang/prometheus/observer.go | 52 + .../prometheus/process_collector.go | 204 + .../prometheus/promhttp/delegator.go | 357 + .../client_golang/prometheus/promhttp/http.go | 310 + .../prometheus/promhttp/instrument_client.go | 219 + .../prometheus/promhttp/instrument_server.go | 447 + .../client_golang/prometheus/registry.go | 937 + .../client_golang/prometheus/summary.go | 750 + .../client_golang/prometheus/timer.go | 54 + .../client_golang/prometheus/untyped.go | 42 + .../client_golang/prometheus/value.go | 162 + .../client_golang/prometheus/vec.go | 472 + .../client_golang/prometheus/wrap.go | 179 + .../prometheus/client_model/LICENSE | 201 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/go/metrics.pb.go | 629 + .../prometheus/client_model/ruby/LICENSE | 201 + vendor/github.com/prometheus/common/LICENSE | 201 + vendor/github.com/prometheus/common/NOTICE | 5 + .../prometheus/common/expfmt/decode.go | 429 + .../prometheus/common/expfmt/encode.go | 88 + .../prometheus/common/expfmt/expfmt.go | 38 + .../prometheus/common/expfmt/fuzz.go | 36 + .../prometheus/common/expfmt/text_create.go | 468 + .../prometheus/common/expfmt/text_parse.go | 757 + .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 210 + .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 102 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/time.go | 270 + .../prometheus/common/model/value.go | 416 + vendor/github.com/prometheus/procfs/LICENSE | 201 + vendor/github.com/prometheus/procfs/NOTICE | 7 + .../github.com/prometheus/procfs/buddyinfo.go | 95 + vendor/github.com/prometheus/procfs/doc.go | 45 + vendor/github.com/prometheus/procfs/fs.go | 37 + .../prometheus/procfs/internal/fs/fs.go | 52 + vendor/github.com/prometheus/procfs/ipvs.go | 259 + vendor/github.com/prometheus/procfs/mdstat.go | 151 + .../prometheus/procfs/mountstats.go | 621 + .../github.com/prometheus/procfs/net_dev.go | 216 + vendor/github.com/prometheus/procfs/proc.go | 260 + .../github.com/prometheus/procfs/proc_io.go | 65 + .../prometheus/procfs/proc_limits.go | 150 + .../github.com/prometheus/procfs/proc_ns.go | 68 + .../github.com/prometheus/procfs/proc_psi.go | 110 + .../github.com/prometheus/procfs/proc_stat.go | 191 + .../prometheus/procfs/proc_status.go | 162 + vendor/github.com/prometheus/procfs/stat.go | 232 + vendor/github.com/prometheus/procfs/xfrm.go | 187 + .../github.com/rogpeppe/go-internal/LICENSE | 27 + .../rogpeppe/go-internal/modfile/gopkgin.go | 47 + .../rogpeppe/go-internal/modfile/print.go | 164 + .../rogpeppe/go-internal/modfile/read.go | 869 + .../rogpeppe/go-internal/modfile/rule.go | 724 + .../rogpeppe/go-internal/module/module.go | 540 + .../rogpeppe/go-internal/semver/semver.go | 388 + vendor/github.com/sergi/go-diff/AUTHORS | 25 + vendor/github.com/sergi/go-diff/CONTRIBUTORS | 32 + vendor/github.com/sergi/go-diff/LICENSE | 20 + .../sergi/go-diff/diffmatchpatch/diff.go | 1344 + .../go-diff/diffmatchpatch/diffmatchpatch.go | 46 + .../sergi/go-diff/diffmatchpatch/match.go | 160 + .../sergi/go-diff/diffmatchpatch/mathutil.go | 23 + .../sergi/go-diff/diffmatchpatch/patch.go | 556 + .../go-diff/diffmatchpatch/stringutil.go | 88 + vendor/github.com/spf13/pflag/LICENSE | 28 + vendor/github.com/spf13/pflag/bool.go | 94 + vendor/github.com/spf13/pflag/bool_slice.go | 147 + vendor/github.com/spf13/pflag/bytes.go | 209 + vendor/github.com/spf13/pflag/count.go | 96 + vendor/github.com/spf13/pflag/duration.go | 86 + .../github.com/spf13/pflag/duration_slice.go | 128 + vendor/github.com/spf13/pflag/flag.go | 1227 + vendor/github.com/spf13/pflag/float32.go | 88 + vendor/github.com/spf13/pflag/float64.go | 84 + vendor/github.com/spf13/pflag/golangflag.go | 105 + vendor/github.com/spf13/pflag/int.go | 84 + vendor/github.com/spf13/pflag/int16.go | 88 + vendor/github.com/spf13/pflag/int32.go | 88 + vendor/github.com/spf13/pflag/int64.go | 84 + vendor/github.com/spf13/pflag/int8.go | 88 + vendor/github.com/spf13/pflag/int_slice.go | 128 + vendor/github.com/spf13/pflag/ip.go | 94 + vendor/github.com/spf13/pflag/ip_slice.go | 148 + vendor/github.com/spf13/pflag/ipmask.go | 122 + vendor/github.com/spf13/pflag/ipnet.go | 98 + vendor/github.com/spf13/pflag/string.go | 80 + vendor/github.com/spf13/pflag/string_array.go | 103 + vendor/github.com/spf13/pflag/string_slice.go | 149 + .../github.com/spf13/pflag/string_to_int.go | 149 + .../spf13/pflag/string_to_string.go | 160 + vendor/github.com/spf13/pflag/uint.go | 88 + vendor/github.com/spf13/pflag/uint16.go | 88 + vendor/github.com/spf13/pflag/uint32.go | 88 + vendor/github.com/spf13/pflag/uint64.go | 88 + vendor/github.com/spf13/pflag/uint8.go | 88 + vendor/github.com/spf13/pflag/uint_slice.go | 126 + vendor/go.opencensus.io/AUTHORS | 1 + vendor/go.opencensus.io/LICENSE | 202 + vendor/go.opencensus.io/internal/internal.go | 37 + vendor/go.opencensus.io/internal/sanitize.go | 50 + .../internal/tagencoding/tagencoding.go | 75 + .../internal/traceinternals.go | 53 + .../go.opencensus.io/metric/metricdata/doc.go | 19 + .../metric/metricdata/exemplar.go | 38 + .../metric/metricdata/label.go | 35 + .../metric/metricdata/metric.go | 46 + .../metric/metricdata/point.go | 193 + .../metric/metricdata/type_string.go | 16 + .../metric/metricdata/unit.go | 27 + .../metric/metricexport/doc.go | 19 + .../metric/metricexport/export.go | 26 + .../metric/metricexport/reader.go | 187 + .../metric/metricproducer/manager.go | 78 + .../metric/metricproducer/producer.go | 28 + vendor/go.opencensus.io/opencensus.go | 21 + .../go.opencensus.io/plugin/ocgrpc/client.go | 56 + .../plugin/ocgrpc/client_metrics.go | 107 + .../plugin/ocgrpc/client_stats_handler.go | 49 + vendor/go.opencensus.io/plugin/ocgrpc/doc.go | 19 + .../go.opencensus.io/plugin/ocgrpc/server.go | 80 + .../plugin/ocgrpc/server_metrics.go | 97 + .../plugin/ocgrpc/server_stats_handler.go | 63 + .../plugin/ocgrpc/stats_common.go | 227 + .../plugin/ocgrpc/trace_common.go | 107 + .../go.opencensus.io/plugin/ochttp/client.go | 117 + .../plugin/ochttp/client_stats.go | 143 + vendor/go.opencensus.io/plugin/ochttp/doc.go | 19 + .../plugin/ochttp/propagation/b3/b3.go | 123 + .../go.opencensus.io/plugin/ochttp/route.go | 61 + .../go.opencensus.io/plugin/ochttp/server.go | 449 + .../ochttp/span_annotating_client_trace.go | 169 + .../go.opencensus.io/plugin/ochttp/stats.go | 292 + .../go.opencensus.io/plugin/ochttp/trace.go | 239 + .../plugin/ochttp/wrapped_body.go | 44 + vendor/go.opencensus.io/resource/resource.go | 164 + .../resource/resourcekeys/const.go | 67 + vendor/go.opencensus.io/stats/doc.go | 69 + .../go.opencensus.io/stats/internal/record.go | 25 + vendor/go.opencensus.io/stats/measure.go | 109 + .../go.opencensus.io/stats/measure_float64.go | 55 + .../go.opencensus.io/stats/measure_int64.go | 55 + vendor/go.opencensus.io/stats/record.go | 117 + vendor/go.opencensus.io/stats/units.go | 25 + .../stats/view/aggregation.go | 120 + .../stats/view/aggregation_data.go | 293 + .../go.opencensus.io/stats/view/collector.go | 86 + vendor/go.opencensus.io/stats/view/doc.go | 47 + vendor/go.opencensus.io/stats/view/export.go | 58 + vendor/go.opencensus.io/stats/view/view.go | 221 + .../stats/view/view_to_metric.go | 140 + vendor/go.opencensus.io/stats/view/worker.go | 281 + .../stats/view/worker_commands.go | 186 + vendor/go.opencensus.io/tag/context.go | 43 + vendor/go.opencensus.io/tag/doc.go | 26 + vendor/go.opencensus.io/tag/key.go | 45 + vendor/go.opencensus.io/tag/map.go | 229 + vendor/go.opencensus.io/tag/map_codec.go | 239 + vendor/go.opencensus.io/tag/metadata.go | 52 + vendor/go.opencensus.io/tag/profile_19.go | 31 + vendor/go.opencensus.io/tag/profile_not19.go | 23 + vendor/go.opencensus.io/tag/validate.go | 56 + vendor/go.opencensus.io/trace/basetypes.go | 119 + vendor/go.opencensus.io/trace/config.go | 86 + vendor/go.opencensus.io/trace/doc.go | 53 + vendor/go.opencensus.io/trace/evictedqueue.go | 38 + vendor/go.opencensus.io/trace/export.go | 97 + .../trace/internal/internal.go | 22 + vendor/go.opencensus.io/trace/lrumap.go | 37 + .../trace/propagation/propagation.go | 108 + vendor/go.opencensus.io/trace/sampling.go | 75 + vendor/go.opencensus.io/trace/spanbucket.go | 130 + vendor/go.opencensus.io/trace/spanstore.go | 306 + vendor/go.opencensus.io/trace/status_codes.go | 37 + vendor/go.opencensus.io/trace/trace.go | 598 + vendor/go.opencensus.io/trace/trace_go11.go | 32 + .../go.opencensus.io/trace/trace_nongo11.go | 25 + .../trace/tracestate/tracestate.go | 147 + vendor/go.uber.org/atomic/LICENSE.txt | 19 + vendor/go.uber.org/atomic/atomic.go | 351 + vendor/go.uber.org/atomic/error.go | 55 + vendor/go.uber.org/atomic/string.go | 49 + vendor/go.uber.org/multierr/LICENSE.txt | 19 + vendor/go.uber.org/multierr/error.go | 401 + vendor/go.uber.org/zap/LICENSE.txt | 19 + vendor/go.uber.org/zap/array.go | 320 + vendor/go.uber.org/zap/buffer/buffer.go | 115 + vendor/go.uber.org/zap/buffer/pool.go | 49 + vendor/go.uber.org/zap/config.go | 243 + vendor/go.uber.org/zap/doc.go | 113 + vendor/go.uber.org/zap/encoder.go | 75 + vendor/go.uber.org/zap/error.go | 80 + vendor/go.uber.org/zap/field.go | 310 + vendor/go.uber.org/zap/flag.go | 39 + vendor/go.uber.org/zap/global.go | 169 + vendor/go.uber.org/zap/http_handler.go | 81 + .../zap/internal/bufferpool/bufferpool.go | 31 + .../go.uber.org/zap/internal/color/color.go | 44 + vendor/go.uber.org/zap/internal/exit/exit.go | 64 + vendor/go.uber.org/zap/level.go | 132 + vendor/go.uber.org/zap/logger.go | 305 + vendor/go.uber.org/zap/options.go | 109 + vendor/go.uber.org/zap/sink.go | 161 + vendor/go.uber.org/zap/stacktrace.go | 126 + vendor/go.uber.org/zap/sugar.go | 304 + vendor/go.uber.org/zap/time.go | 27 + vendor/go.uber.org/zap/writer.go | 99 + .../zap/zapcore/console_encoder.go | 147 + vendor/go.uber.org/zap/zapcore/core.go | 113 + vendor/go.uber.org/zap/zapcore/doc.go | 24 + vendor/go.uber.org/zap/zapcore/encoder.go | 348 + vendor/go.uber.org/zap/zapcore/entry.go | 257 + vendor/go.uber.org/zap/zapcore/error.go | 120 + vendor/go.uber.org/zap/zapcore/field.go | 201 + vendor/go.uber.org/zap/zapcore/hook.go | 68 + .../go.uber.org/zap/zapcore/json_encoder.go | 502 + vendor/go.uber.org/zap/zapcore/level.go | 175 + .../go.uber.org/zap/zapcore/level_strings.go | 46 + vendor/go.uber.org/zap/zapcore/marshaler.go | 53 + .../go.uber.org/zap/zapcore/memory_encoder.go | 179 + vendor/go.uber.org/zap/zapcore/sampler.go | 134 + vendor/go.uber.org/zap/zapcore/tee.go | 81 + .../go.uber.org/zap/zapcore/write_syncer.go | 123 + vendor/golang.org/x/crypto/AUTHORS | 3 + vendor/golang.org/x/crypto/CONTRIBUTORS | 3 + vendor/golang.org/x/crypto/LICENSE | 27 + vendor/golang.org/x/crypto/PATENTS | 22 + .../x/crypto/ssh/terminal/terminal.go | 951 + .../golang.org/x/crypto/ssh/terminal/util.go | 114 + .../x/crypto/ssh/terminal/util_bsd.go | 12 + .../x/crypto/ssh/terminal/util_linux.go | 10 + .../x/crypto/ssh/terminal/util_plan9.go | 58 + .../x/crypto/ssh/terminal/util_solaris.go | 124 + .../x/crypto/ssh/terminal/util_windows.go | 103 + vendor/golang.org/x/net/AUTHORS | 3 + vendor/golang.org/x/net/CONTRIBUTORS | 3 + vendor/golang.org/x/net/LICENSE | 27 + vendor/golang.org/x/net/PATENTS | 22 + vendor/golang.org/x/net/context/context.go | 56 + .../x/net/context/ctxhttp/ctxhttp.go | 74 + .../x/net/context/ctxhttp/ctxhttp_pre17.go | 147 + vendor/golang.org/x/net/context/go17.go | 72 + vendor/golang.org/x/net/context/go19.go | 20 + vendor/golang.org/x/net/context/pre_go17.go | 300 + vendor/golang.org/x/net/context/pre_go19.go | 109 + vendor/golang.org/x/net/http/httpguts/guts.go | 50 + .../golang.org/x/net/http/httpguts/httplex.go | 346 + vendor/golang.org/x/net/http2/ciphers.go | 641 + .../x/net/http2/client_conn_pool.go | 282 + .../x/net/http2/configure_transport.go | 82 + vendor/golang.org/x/net/http2/databuffer.go | 146 + vendor/golang.org/x/net/http2/errors.go | 133 + vendor/golang.org/x/net/http2/flow.go | 50 + vendor/golang.org/x/net/http2/frame.go | 1614 + vendor/golang.org/x/net/http2/go111.go | 26 + vendor/golang.org/x/net/http2/go16.go | 16 + vendor/golang.org/x/net/http2/go17.go | 121 + vendor/golang.org/x/net/http2/go17_not18.go | 36 + vendor/golang.org/x/net/http2/go18.go | 56 + vendor/golang.org/x/net/http2/go19.go | 16 + vendor/golang.org/x/net/http2/gotrack.go | 170 + vendor/golang.org/x/net/http2/h2c/h2c.go | 492 + vendor/golang.org/x/net/http2/headermap.go | 88 + vendor/golang.org/x/net/http2/hpack/encode.go | 240 + vendor/golang.org/x/net/http2/hpack/hpack.go | 496 + .../golang.org/x/net/http2/hpack/huffman.go | 222 + vendor/golang.org/x/net/http2/hpack/tables.go | 479 + vendor/golang.org/x/net/http2/http2.go | 384 + vendor/golang.org/x/net/http2/not_go111.go | 17 + vendor/golang.org/x/net/http2/not_go16.go | 21 + vendor/golang.org/x/net/http2/not_go17.go | 95 + vendor/golang.org/x/net/http2/not_go18.go | 29 + vendor/golang.org/x/net/http2/not_go19.go | 16 + vendor/golang.org/x/net/http2/pipe.go | 163 + vendor/golang.org/x/net/http2/server.go | 2890 + vendor/golang.org/x/net/http2/transport.go | 2453 + vendor/golang.org/x/net/http2/write.go | 365 + vendor/golang.org/x/net/http2/writesched.go | 242 + .../x/net/http2/writesched_priority.go | 452 + .../x/net/http2/writesched_random.go | 72 + vendor/golang.org/x/net/idna/idna.go | 732 + vendor/golang.org/x/net/idna/punycode.go | 203 + vendor/golang.org/x/net/idna/tables.go | 4557 + vendor/golang.org/x/net/idna/trie.go | 72 + vendor/golang.org/x/net/idna/trieval.go | 119 + .../x/net/internal/timeseries/timeseries.go | 525 + vendor/golang.org/x/net/trace/events.go | 532 + vendor/golang.org/x/net/trace/histogram.go | 365 + vendor/golang.org/x/net/trace/trace.go | 1111 + vendor/golang.org/x/net/trace/trace_go16.go | 21 + vendor/golang.org/x/net/trace/trace_go17.go | 21 + vendor/golang.org/x/oauth2/AUTHORS | 3 + vendor/golang.org/x/oauth2/CONTRIBUTORS | 3 + vendor/golang.org/x/oauth2/LICENSE | 27 + .../golang.org/x/oauth2/google/appengine.go | 38 + .../x/oauth2/google/appengine_gen1.go | 77 + .../x/oauth2/google/appengine_gen2_flex.go | 27 + vendor/golang.org/x/oauth2/google/default.go | 155 + vendor/golang.org/x/oauth2/google/doc.go | 40 + vendor/golang.org/x/oauth2/google/google.go | 193 + vendor/golang.org/x/oauth2/google/jwt.go | 74 + vendor/golang.org/x/oauth2/google/sdk.go | 201 + .../x/oauth2/internal/client_appengine.go | 13 + vendor/golang.org/x/oauth2/internal/doc.go | 6 + vendor/golang.org/x/oauth2/internal/oauth2.go | 37 + vendor/golang.org/x/oauth2/internal/token.go | 304 + .../golang.org/x/oauth2/internal/transport.go | 33 + vendor/golang.org/x/oauth2/jws/jws.go | 182 + vendor/golang.org/x/oauth2/jwt/jwt.go | 170 + vendor/golang.org/x/oauth2/oauth2.go | 381 + vendor/golang.org/x/oauth2/token.go | 178 + vendor/golang.org/x/oauth2/transport.go | 144 + vendor/golang.org/x/sync/AUTHORS | 3 + vendor/golang.org/x/sync/CONTRIBUTORS | 3 + vendor/golang.org/x/sync/LICENSE | 27 + vendor/golang.org/x/sync/PATENTS | 22 + vendor/golang.org/x/sync/errgroup/errgroup.go | 66 + .../golang.org/x/sync/semaphore/semaphore.go | 127 + vendor/golang.org/x/sys/AUTHORS | 3 + vendor/golang.org/x/sys/CONTRIBUTORS | 3 + vendor/golang.org/x/sys/LICENSE | 27 + vendor/golang.org/x/sys/PATENTS | 22 + .../golang.org/x/sys/unix/affinity_linux.go | 124 + vendor/golang.org/x/sys/unix/aliases.go | 14 + vendor/golang.org/x/sys/unix/asm_darwin_386.s | 29 + .../golang.org/x/sys/unix/asm_darwin_amd64.s | 29 + vendor/golang.org/x/sys/unix/asm_darwin_arm.s | 30 + .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 + .../x/sys/unix/asm_dragonfly_amd64.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_386.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 + vendor/golang.org/x/sys/unix/asm_linux_386.s | 65 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 + vendor/golang.org/x/sys/unix/asm_linux_arm.s | 56 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 52 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 56 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 54 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 56 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 56 + vendor/golang.org/x/sys/unix/asm_netbsd_386.s | 29 + .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 29 + vendor/golang.org/x/sys/unix/asm_netbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_386.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 + .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 + .../golang.org/x/sys/unix/bluetooth_linux.go | 35 + vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 + vendor/golang.org/x/sys/unix/constants.go | 13 + vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 37 + vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 39 + vendor/golang.org/x/sys/unix/dev_darwin.go | 24 + vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 + vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 + vendor/golang.org/x/sys/unix/dev_linux.go | 42 + vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 + vendor/golang.org/x/sys/unix/dirent.go | 17 + vendor/golang.org/x/sys/unix/endian_big.go | 9 + vendor/golang.org/x/sys/unix/endian_little.go | 9 + vendor/golang.org/x/sys/unix/env_unix.go | 31 + .../x/sys/unix/errors_freebsd_386.go | 227 + .../x/sys/unix/errors_freebsd_amd64.go | 227 + .../x/sys/unix/errors_freebsd_arm.go | 226 + vendor/golang.org/x/sys/unix/fcntl.go | 32 + .../x/sys/unix/fcntl_linux_32bit.go | 13 + vendor/golang.org/x/sys/unix/gccgo.go | 62 + vendor/golang.org/x/sys/unix/gccgo_c.c | 39 + .../x/sys/unix/gccgo_linux_amd64.go | 20 + vendor/golang.org/x/sys/unix/ioctl.go | 30 + vendor/golang.org/x/sys/unix/mkpost.go | 98 + .../golang.org/x/sys/unix/openbsd_pledge.go | 95 + vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 + vendor/golang.org/x/sys/unix/race.go | 30 + vendor/golang.org/x/sys/unix/race0.go | 25 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 36 + vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 104 + vendor/golang.org/x/sys/unix/str.go | 26 + vendor/golang.org/x/sys/unix/syscall.go | 54 + vendor/golang.org/x/sys/unix/syscall_aix.go | 562 + .../golang.org/x/sys/unix/syscall_aix_ppc.go | 34 + .../x/sys/unix/syscall_aix_ppc64.go | 34 + vendor/golang.org/x/sys/unix/syscall_bsd.go | 624 + .../golang.org/x/sys/unix/syscall_darwin.go | 700 + .../x/sys/unix/syscall_darwin_386.go | 68 + .../x/sys/unix/syscall_darwin_amd64.go | 68 + .../x/sys/unix/syscall_darwin_arm.go | 66 + .../x/sys/unix/syscall_darwin_arm64.go | 68 + .../x/sys/unix/syscall_dragonfly.go | 523 + .../x/sys/unix/syscall_dragonfly_amd64.go | 52 + .../golang.org/x/sys/unix/syscall_freebsd.go | 535 + .../x/sys/unix/syscall_freebsd_386.go | 52 + .../x/sys/unix/syscall_freebsd_amd64.go | 52 + .../x/sys/unix/syscall_freebsd_arm.go | 52 + vendor/golang.org/x/sys/unix/syscall_linux.go | 1600 + .../x/sys/unix/syscall_linux_386.go | 385 + .../x/sys/unix/syscall_linux_amd64.go | 162 + .../x/sys/unix/syscall_linux_amd64_gc.go | 13 + .../x/sys/unix/syscall_linux_arm.go | 259 + .../x/sys/unix/syscall_linux_arm64.go | 212 + .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 + .../x/sys/unix/syscall_linux_gc_386.go | 16 + .../x/sys/unix/syscall_linux_gccgo_386.go | 30 + .../x/sys/unix/syscall_linux_gccgo_arm.go | 20 + .../x/sys/unix/syscall_linux_mips64x.go | 214 + .../x/sys/unix/syscall_linux_mipsx.go | 233 + .../x/sys/unix/syscall_linux_ppc64x.go | 131 + .../x/sys/unix/syscall_linux_s390x.go | 324 + .../x/sys/unix/syscall_linux_sparc64.go | 146 + .../golang.org/x/sys/unix/syscall_netbsd.go | 580 + .../x/sys/unix/syscall_netbsd_386.go | 33 + .../x/sys/unix/syscall_netbsd_amd64.go | 33 + .../x/sys/unix/syscall_netbsd_arm.go | 33 + .../golang.org/x/sys/unix/syscall_openbsd.go | 368 + .../x/sys/unix/syscall_openbsd_386.go | 33 + .../x/sys/unix/syscall_openbsd_amd64.go | 37 + .../x/sys/unix/syscall_openbsd_arm.go | 33 + .../golang.org/x/sys/unix/syscall_solaris.go | 730 + .../x/sys/unix/syscall_solaris_amd64.go | 23 + vendor/golang.org/x/sys/unix/syscall_unix.go | 394 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 15 + vendor/golang.org/x/sys/unix/timestruct.go | 82 + vendor/golang.org/x/sys/unix/types_aix.go | 229 + vendor/golang.org/x/sys/unix/types_darwin.go | 277 + .../golang.org/x/sys/unix/types_dragonfly.go | 263 + vendor/golang.org/x/sys/unix/types_freebsd.go | 385 + vendor/golang.org/x/sys/unix/types_netbsd.go | 281 + vendor/golang.org/x/sys/unix/types_openbsd.go | 265 + vendor/golang.org/x/sys/unix/types_solaris.go | 266 + vendor/golang.org/x/sys/unix/xattr_bsd.go | 231 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1360 + .../x/sys/unix/zerrors_aix_ppc64.go | 1361 + .../x/sys/unix/zerrors_darwin_386.go | 1783 + .../x/sys/unix/zerrors_darwin_amd64.go | 1783 + .../x/sys/unix/zerrors_darwin_arm.go | 1783 + .../x/sys/unix/zerrors_darwin_arm64.go | 1783 + .../x/sys/unix/zerrors_dragonfly_amd64.go | 1616 + .../x/sys/unix/zerrors_freebsd_386.go | 1793 + .../x/sys/unix/zerrors_freebsd_amd64.go | 1794 + .../x/sys/unix/zerrors_freebsd_arm.go | 1802 + .../x/sys/unix/zerrors_linux_386.go | 2635 + .../x/sys/unix/zerrors_linux_amd64.go | 2635 + .../x/sys/unix/zerrors_linux_arm.go | 2641 + .../x/sys/unix/zerrors_linux_arm64.go | 2626 + .../x/sys/unix/zerrors_linux_mips.go | 2642 + .../x/sys/unix/zerrors_linux_mips64.go | 2642 + .../x/sys/unix/zerrors_linux_mips64le.go | 2642 + .../x/sys/unix/zerrors_linux_mipsle.go | 2642 + .../x/sys/unix/zerrors_linux_ppc64.go | 2695 + .../x/sys/unix/zerrors_linux_ppc64le.go | 2695 + .../x/sys/unix/zerrors_linux_s390x.go | 2695 + .../x/sys/unix/zerrors_linux_sparc64.go | 2142 + .../x/sys/unix/zerrors_netbsd_386.go | 1732 + .../x/sys/unix/zerrors_netbsd_amd64.go | 1722 + .../x/sys/unix/zerrors_netbsd_arm.go | 1711 + .../x/sys/unix/zerrors_openbsd_386.go | 1628 + .../x/sys/unix/zerrors_openbsd_amd64.go | 1735 + .../x/sys/unix/zerrors_openbsd_arm.go | 1630 + .../x/sys/unix/zerrors_solaris_amd64.go | 1532 + .../golang.org/x/sys/unix/zptrace386_linux.go | 80 + .../golang.org/x/sys/unix/zptracearm_linux.go | 41 + .../x/sys/unix/zptracemips_linux.go | 50 + .../x/sys/unix/zptracemipsle_linux.go | 50 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1495 + .../x/sys/unix/zsyscall_aix_ppc64.go | 1495 + .../x/sys/unix/zsyscall_darwin_386.go | 1769 + .../x/sys/unix/zsyscall_darwin_amd64.go | 1769 + .../x/sys/unix/zsyscall_darwin_arm.go | 1769 + .../x/sys/unix/zsyscall_darwin_arm64.go | 1769 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1508 + .../x/sys/unix/zsyscall_freebsd_386.go | 1935 + .../x/sys/unix/zsyscall_freebsd_amd64.go | 1935 + .../x/sys/unix/zsyscall_freebsd_arm.go | 1935 + .../x/sys/unix/zsyscall_linux_386.go | 2105 + .../x/sys/unix/zsyscall_linux_amd64.go | 2272 + .../x/sys/unix/zsyscall_linux_arm.go | 2207 + .../x/sys/unix/zsyscall_linux_arm64.go | 2114 + .../x/sys/unix/zsyscall_linux_mips.go | 2285 + .../x/sys/unix/zsyscall_linux_mips64.go | 2256 + .../x/sys/unix/zsyscall_linux_mips64le.go | 2256 + .../x/sys/unix/zsyscall_linux_mipsle.go | 2285 + .../x/sys/unix/zsyscall_linux_ppc64.go | 2319 + .../x/sys/unix/zsyscall_linux_ppc64le.go | 2319 + .../x/sys/unix/zsyscall_linux_s390x.go | 2089 + .../x/sys/unix/zsyscall_linux_sparc64.go | 2172 + .../x/sys/unix/zsyscall_netbsd_386.go | 1653 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 1653 + .../x/sys/unix/zsyscall_netbsd_arm.go | 1653 + .../x/sys/unix/zsyscall_openbsd_386.go | 1508 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 1508 + .../x/sys/unix/zsyscall_openbsd_arm.go | 1508 + .../x/sys/unix/zsyscall_solaris_amd64.go | 1697 + .../x/sys/unix/zsysctl_openbsd_386.go | 270 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 257 + .../x/sys/unix/zsysctl_openbsd_arm.go | 270 + .../x/sys/unix/zsysnum_darwin_386.go | 436 + .../x/sys/unix/zsysnum_darwin_amd64.go | 436 + .../x/sys/unix/zsysnum_darwin_arm.go | 436 + .../x/sys/unix/zsysnum_darwin_arm64.go | 436 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 315 + .../x/sys/unix/zsysnum_freebsd_386.go | 403 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 403 + .../x/sys/unix/zsysnum_freebsd_arm.go | 403 + .../x/sys/unix/zsysnum_linux_386.go | 392 + .../x/sys/unix/zsysnum_linux_amd64.go | 344 + .../x/sys/unix/zsysnum_linux_arm.go | 363 + .../x/sys/unix/zsysnum_linux_arm64.go | 287 + .../x/sys/unix/zsysnum_linux_mips.go | 377 + .../x/sys/unix/zsysnum_linux_mips64.go | 337 + .../x/sys/unix/zsysnum_linux_mips64le.go | 337 + .../x/sys/unix/zsysnum_linux_mipsle.go | 377 + .../x/sys/unix/zsysnum_linux_ppc64.go | 375 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 375 + .../x/sys/unix/zsysnum_linux_s390x.go | 337 + .../x/sys/unix/zsysnum_linux_sparc64.go | 348 + .../x/sys/unix/zsysnum_netbsd_386.go | 274 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm.go | 274 + .../x/sys/unix/zsysnum_openbsd_386.go | 207 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 218 + .../x/sys/unix/zsysnum_openbsd_arm.go | 213 + .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 306 + .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 313 + .../x/sys/unix/ztypes_darwin_386.go | 489 + .../x/sys/unix/ztypes_darwin_amd64.go | 499 + .../x/sys/unix/ztypes_darwin_arm.go | 490 + .../x/sys/unix/ztypes_darwin_arm64.go | 499 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 469 + .../x/sys/unix/ztypes_freebsd_386.go | 536 + .../x/sys/unix/ztypes_freebsd_amd64.go | 539 + .../x/sys/unix/ztypes_freebsd_arm.go | 539 + .../golang.org/x/sys/unix/ztypes_linux_386.go | 1884 + .../x/sys/unix/ztypes_linux_amd64.go | 1906 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 1874 + .../x/sys/unix/ztypes_linux_arm64.go | 1885 + .../x/sys/unix/ztypes_linux_mips.go | 1879 + .../x/sys/unix/ztypes_linux_mips64.go | 1887 + .../x/sys/unix/ztypes_linux_mips64le.go | 1887 + .../x/sys/unix/ztypes_linux_mipsle.go | 1879 + .../x/sys/unix/ztypes_linux_ppc64.go | 1895 + .../x/sys/unix/ztypes_linux_ppc64le.go | 1895 + .../x/sys/unix/ztypes_linux_s390x.go | 1912 + .../x/sys/unix/ztypes_linux_sparc64.go | 690 + .../x/sys/unix/ztypes_netbsd_386.go | 448 + .../x/sys/unix/ztypes_netbsd_amd64.go | 455 + .../x/sys/unix/ztypes_netbsd_arm.go | 453 + .../x/sys/unix/ztypes_openbsd_386.go | 467 + .../x/sys/unix/ztypes_openbsd_amd64.go | 467 + .../x/sys/unix/ztypes_openbsd_arm.go | 460 + .../x/sys/unix/ztypes_solaris_amd64.go | 442 + vendor/golang.org/x/sys/windows/aliases.go | 13 + .../x/sys/windows/asm_windows_386.s | 13 + .../x/sys/windows/asm_windows_amd64.s | 13 + .../golang.org/x/sys/windows/dll_windows.go | 378 + .../golang.org/x/sys/windows/env_windows.go | 29 + vendor/golang.org/x/sys/windows/eventlog.go | 20 + .../golang.org/x/sys/windows/exec_windows.go | 97 + .../x/sys/windows/memory_windows.go | 26 + vendor/golang.org/x/sys/windows/mksyscall.go | 7 + vendor/golang.org/x/sys/windows/race.go | 30 + vendor/golang.org/x/sys/windows/race0.go | 25 + .../x/sys/windows/security_windows.go | 478 + vendor/golang.org/x/sys/windows/service.go | 183 + vendor/golang.org/x/sys/windows/str.go | 22 + vendor/golang.org/x/sys/windows/syscall.go | 74 + .../x/sys/windows/syscall_windows.go | 1205 + .../golang.org/x/sys/windows/types_windows.go | 1469 + .../x/sys/windows/types_windows_386.go | 22 + .../x/sys/windows/types_windows_amd64.go | 22 + .../x/sys/windows/zsyscall_windows.go | 2700 + vendor/golang.org/x/text/AUTHORS | 3 + vendor/golang.org/x/text/CONTRIBUTORS | 3 + vendor/golang.org/x/text/LICENSE | 27 + vendor/golang.org/x/text/PATENTS | 22 + .../x/text/collate/build/builder.go | 702 + .../x/text/collate/build/colelem.go | 294 + .../x/text/collate/build/contract.go | 309 + .../golang.org/x/text/collate/build/order.go | 393 + .../golang.org/x/text/collate/build/table.go | 81 + .../golang.org/x/text/collate/build/trie.go | 290 + vendor/golang.org/x/text/collate/collate.go | 403 + vendor/golang.org/x/text/collate/index.go | 32 + .../golang.org/x/text/collate/maketables.go | 553 + vendor/golang.org/x/text/collate/option.go | 239 + vendor/golang.org/x/text/collate/sort.go | 81 + vendor/golang.org/x/text/collate/tables.go | 73789 ++++++++++++++++ .../x/text/internal/colltab/collelem.go | 371 + .../x/text/internal/colltab/colltab.go | 105 + .../x/text/internal/colltab/contract.go | 145 + .../x/text/internal/colltab/iter.go | 178 + .../x/text/internal/colltab/numeric.go | 236 + .../x/text/internal/colltab/table.go | 275 + .../x/text/internal/colltab/trie.go | 159 + .../x/text/internal/colltab/weighter.go | 31 + vendor/golang.org/x/text/internal/gen/code.go | 369 + vendor/golang.org/x/text/internal/gen/gen.go | 333 + vendor/golang.org/x/text/internal/tag/tag.go | 100 + .../x/text/internal/triegen/compact.go | 58 + .../x/text/internal/triegen/print.go | 251 + .../x/text/internal/triegen/triegen.go | 494 + vendor/golang.org/x/text/internal/ucd/ucd.go | 371 + vendor/golang.org/x/text/language/common.go | 16 + vendor/golang.org/x/text/language/coverage.go | 197 + vendor/golang.org/x/text/language/doc.go | 102 + vendor/golang.org/x/text/language/gen.go | 1712 + .../golang.org/x/text/language/gen_common.go | 20 + .../golang.org/x/text/language/gen_index.go | 162 + vendor/golang.org/x/text/language/go1_1.go | 38 + vendor/golang.org/x/text/language/go1_2.go | 11 + vendor/golang.org/x/text/language/index.go | 783 + vendor/golang.org/x/text/language/language.go | 907 + vendor/golang.org/x/text/language/lookup.go | 396 + vendor/golang.org/x/text/language/match.go | 933 + vendor/golang.org/x/text/language/parse.go | 859 + vendor/golang.org/x/text/language/tables.go | 3686 + vendor/golang.org/x/text/language/tags.go | 143 + .../x/text/secure/bidirule/bidirule.go | 336 + .../x/text/secure/bidirule/bidirule10.0.0.go | 11 + .../x/text/secure/bidirule/bidirule9.0.0.go | 14 + .../golang.org/x/text/transform/transform.go | 705 + vendor/golang.org/x/text/unicode/bidi/bidi.go | 198 + .../golang.org/x/text/unicode/bidi/bracket.go | 335 + vendor/golang.org/x/text/unicode/bidi/core.go | 1058 + vendor/golang.org/x/text/unicode/bidi/gen.go | 133 + .../x/text/unicode/bidi/gen_ranges.go | 57 + .../x/text/unicode/bidi/gen_trieval.go | 64 + vendor/golang.org/x/text/unicode/bidi/prop.go | 206 + .../x/text/unicode/bidi/tables10.0.0.go | 1815 + .../x/text/unicode/bidi/tables9.0.0.go | 1781 + .../golang.org/x/text/unicode/bidi/trieval.go | 60 + vendor/golang.org/x/text/unicode/cldr/base.go | 105 + vendor/golang.org/x/text/unicode/cldr/cldr.go | 130 + .../golang.org/x/text/unicode/cldr/collate.go | 359 + .../golang.org/x/text/unicode/cldr/decode.go | 171 + .../golang.org/x/text/unicode/cldr/makexml.go | 400 + .../golang.org/x/text/unicode/cldr/resolve.go | 602 + .../golang.org/x/text/unicode/cldr/slice.go | 144 + vendor/golang.org/x/text/unicode/cldr/xml.go | 1494 + .../x/text/unicode/norm/composition.go | 508 + .../x/text/unicode/norm/forminfo.go | 259 + .../golang.org/x/text/unicode/norm/input.go | 109 + vendor/golang.org/x/text/unicode/norm/iter.go | 457 + .../x/text/unicode/norm/maketables.go | 976 + .../x/text/unicode/norm/normalize.go | 609 + .../x/text/unicode/norm/readwriter.go | 125 + .../x/text/unicode/norm/tables10.0.0.go | 7653 ++ .../x/text/unicode/norm/tables9.0.0.go | 7633 ++ .../x/text/unicode/norm/transform.go | 88 + vendor/golang.org/x/text/unicode/norm/trie.go | 54 + .../golang.org/x/text/unicode/norm/triegen.go | 117 + .../x/text/unicode/rangetable/gen.go | 115 + .../x/text/unicode/rangetable/merge.go | 260 + .../x/text/unicode/rangetable/rangetable.go | 70 + .../x/text/unicode/rangetable/tables10.0.0.go | 6378 ++ .../x/text/unicode/rangetable/tables9.0.0.go | 5737 ++ vendor/golang.org/x/time/AUTHORS | 3 + vendor/golang.org/x/time/CONTRIBUTORS | 3 + vendor/golang.org/x/time/LICENSE | 27 + vendor/golang.org/x/time/PATENTS | 22 + vendor/golang.org/x/time/rate/rate.go | 384 + vendor/golang.org/x/time/rate/rate_go16.go | 21 + vendor/golang.org/x/time/rate/rate_go17.go | 21 + vendor/golang.org/x/tools/AUTHORS | 3 + vendor/golang.org/x/tools/CONTRIBUTORS | 3 + vendor/golang.org/x/tools/LICENSE | 27 + vendor/golang.org/x/tools/PATENTS | 22 + vendor/golang.org/x/tools/cmd/getgo/LICENSE | 27 + .../x/tools/go/ast/astutil/enclosing.go | 627 + .../x/tools/go/ast/astutil/imports.go | 471 + .../x/tools/go/ast/astutil/rewrite.go | 477 + .../golang.org/x/tools/go/ast/astutil/util.go | 14 + vendor/golang.org/x/tools/imports/fix.go | 1141 + vendor/golang.org/x/tools/imports/imports.go | 310 + vendor/golang.org/x/tools/imports/mkindex.go | 173 + vendor/golang.org/x/tools/imports/mkstdlib.go | 107 + .../golang.org/x/tools/imports/sortimports.go | 230 + vendor/golang.org/x/tools/imports/zstdlib.go | 9734 ++ .../x/tools/internal/fastwalk/fastwalk.go | 191 + .../fastwalk/fastwalk_dirent_fileno.go | 13 + .../internal/fastwalk/fastwalk_dirent_ino.go | 14 + .../internal/fastwalk/fastwalk_portable.go | 29 + .../tools/internal/fastwalk/fastwalk_unix.go | 123 + .../x/tools/third_party/moduleloader/LICENSE | 22 + .../x/tools/third_party/typescript/LICENSE | 55 + .../x/tools/third_party/webcomponents/LICENSE | 27 + vendor/gomodules.xyz/jsonpatch/LICENSE | 202 + .../gomodules.xyz/jsonpatch/v2/jsonpatch.go | 336 + vendor/google.golang.org/api/AUTHORS | 10 + vendor/google.golang.org/api/CONTRIBUTORS | 55 + vendor/google.golang.org/api/LICENSE | 27 + .../googleapi/internal/uritemplates/LICENSE | 18 + .../api/googleapi/transport/apikey.go | 38 + .../google.golang.org/api/internal/creds.go | 102 + vendor/google.golang.org/api/internal/pool.go | 61 + .../api/internal/settings.go | 96 + .../api/iterator/iterator.go | 231 + .../api/option/credentials_go19.go | 33 + .../api/option/credentials_notgo19.go | 32 + vendor/google.golang.org/api/option/option.go | 235 + .../api/support/bundler/bundler.go | 349 + .../google.golang.org/api/transport/dial.go | 46 + vendor/google.golang.org/api/transport/doc.go | 21 + .../google.golang.org/api/transport/go19.go | 35 + .../api/transport/grpc/dial.go | 129 + .../api/transport/grpc/dial_appengine.go | 41 + .../api/transport/http/dial.go | 161 + .../api/transport/http/dial_appengine.go | 30 + .../http/internal/propagation/http.go | 96 + .../api/transport/not_go19.go | 35 + vendor/google.golang.org/appengine/LICENSE | 202 + .../google.golang.org/appengine/appengine.go | 137 + .../appengine/appengine_vm.go | 20 + vendor/google.golang.org/appengine/errors.go | 46 + .../google.golang.org/appengine/identity.go | 142 + .../appengine/internal/api.go | 671 + .../appengine/internal/api_classic.go | 169 + .../appengine/internal/api_common.go | 123 + .../appengine/internal/app_id.go | 28 + .../app_identity/app_identity_service.pb.go | 611 + .../appengine/internal/base/api_base.pb.go | 308 + .../internal/datastore/datastore_v3.pb.go | 4367 + .../appengine/internal/identity.go | 55 + .../appengine/internal/identity_classic.go | 61 + .../appengine/internal/identity_flex.go | 11 + .../appengine/internal/identity_vm.go | 134 + .../appengine/internal/internal.go | 110 + .../appengine/internal/log/log_service.pb.go | 1313 + .../appengine/internal/main.go | 16 + .../appengine/internal/main_common.go | 7 + .../appengine/internal/main_vm.go | 69 + .../appengine/internal/metadata.go | 60 + .../internal/modules/modules_service.pb.go | 786 + .../appengine/internal/net.go | 56 + .../internal/remote_api/remote_api.pb.go | 361 + .../internal/socket/socket_service.pb.go | 2822 + .../appengine/internal/transaction.go | 115 + .../internal/urlfetch/urlfetch_service.pb.go | 527 + .../google.golang.org/appengine/namespace.go | 25 + .../google.golang.org/appengine/socket/doc.go | 10 + .../appengine/socket/socket_classic.go | 290 + .../appengine/socket/socket_vm.go | 64 + vendor/google.golang.org/appengine/timeout.go | 20 + .../appengine/urlfetch/urlfetch.go | 210 + vendor/google.golang.org/genproto/LICENSE | 202 + .../api/annotations/annotations.pb.go | 54 + .../googleapis/api/annotations/client.pb.go | 76 + .../api/annotations/field_behavior.pb.go | 119 + .../googleapis/api/annotations/http.pb.go | 749 + .../googleapis/api/annotations/resource.pb.go | 153 + .../googleapis/api/authorization_config.pb.go | 93 + .../api/distribution/distribution.pb.go | 714 + .../googleapis/api/experimental.pb.go | 86 + .../googleapis/api/httpbody/httpbody.pb.go | 142 + .../genproto/googleapis/api/label/label.pb.go | 134 + .../googleapis/api/launch_stage.pb.go | 110 + .../googleapis/api/metric/metric.pb.go | 477 + .../api/monitoredres/monitored_resource.pb.go | 293 + .../container/v1/cluster_service.pb.go | 7105 ++ .../devtools/cloudtrace/v2/trace.pb.go | 1391 + .../devtools/cloudtrace/v2/tracing.pb.go | 227 + .../googleapis/monitoring/v3/alert.pb.go | 962 + .../monitoring/v3/alert_service.pb.go | 667 + .../googleapis/monitoring/v3/common.pb.go | 890 + .../monitoring/v3/dropped_labels.pb.go | 102 + .../googleapis/monitoring/v3/group.pb.go | 157 + .../monitoring/v3/group_service.pb.go | 941 + .../googleapis/monitoring/v3/metric.pb.go | 232 + .../monitoring/v3/metric_service.pb.go | 1218 + .../monitoring/v3/mutation_record.pb.go | 97 + .../monitoring/v3/notification.pb.go | 370 + .../monitoring/v3/notification_service.pb.go | 1309 + .../monitoring/v3/span_context.pb.go | 96 + .../googleapis/monitoring/v3/uptime.pb.go | 969 + .../monitoring/v3/uptime_service.pb.go | 786 + .../googleapis/rpc/status/status.pb.go | 159 + .../protobuf/field_mask/field_mask.pb.go | 280 + vendor/google.golang.org/grpc/AUTHORS | 1 + vendor/google.golang.org/grpc/LICENSE | 202 + vendor/google.golang.org/grpc/backoff.go | 38 + vendor/google.golang.org/grpc/balancer.go | 391 + .../grpc/balancer/balancer.go | 342 + .../grpc/balancer/base/balancer.go | 178 + .../grpc/balancer/base/base.go | 64 + .../grpc/balancer/roundrobin/roundrobin.go | 83 + .../grpc/balancer_conn_wrappers.go | 315 + .../grpc/balancer_v1_wrapper.go | 334 + .../grpc_binarylog_v1/binarylog.pb.go | 900 + vendor/google.golang.org/grpc/call.go | 74 + vendor/google.golang.org/grpc/clientconn.go | 1423 + vendor/google.golang.org/grpc/codec.go | 50 + .../grpc/codes/code_string.go | 62 + vendor/google.golang.org/grpc/codes/codes.go | 198 + .../grpc/connectivity/connectivity.go | 73 + .../grpc/credentials/credentials.go | 338 + .../grpc/credentials/internal/syscallconn.go | 61 + .../internal/syscallconn_appengine.go | 30 + .../grpc/credentials/oauth/oauth.go | 173 + .../grpc/credentials/tls13.go | 30 + vendor/google.golang.org/grpc/dialoptions.go | 558 + vendor/google.golang.org/grpc/doc.go | 24 + .../grpc/encoding/encoding.go | 118 + .../grpc/encoding/proto/proto.go | 110 + .../google.golang.org/grpc/grpclog/grpclog.go | 126 + .../google.golang.org/grpc/grpclog/logger.go | 85 + .../grpc/grpclog/loggerv2.go | 195 + vendor/google.golang.org/grpc/interceptor.go | 77 + .../grpc/internal/backoff/backoff.go | 78 + .../grpc/internal/balancerload/load.go | 46 + .../grpc/internal/binarylog/binarylog.go | 167 + .../internal/binarylog/binarylog_testutil.go | 42 + .../grpc/internal/binarylog/env_config.go | 210 + .../grpc/internal/binarylog/method_logger.go | 423 + .../grpc/internal/binarylog/sink.go | 162 + .../grpc/internal/binarylog/util.go | 41 + .../grpc/internal/channelz/funcs.go | 727 + .../grpc/internal/channelz/types.go | 702 + .../grpc/internal/channelz/types_linux.go | 53 + .../grpc/internal/channelz/types_nonlinux.go | 44 + .../grpc/internal/channelz/util_linux.go | 39 + .../grpc/internal/channelz/util_nonlinux.go | 26 + .../grpc/internal/envconfig/envconfig.go | 64 + .../grpc/internal/grpcrand/grpcrand.go | 56 + .../grpc/internal/grpcsync/event.go | 61 + .../grpc/internal/internal.go | 54 + .../grpc/internal/syscall/syscall_linux.go | 114 + .../grpc/internal/syscall/syscall_nonlinux.go | 73 + .../grpc/internal/transport/bdp_estimator.go | 141 + .../grpc/internal/transport/controlbuf.go | 852 + .../grpc/internal/transport/defaults.go | 49 + .../grpc/internal/transport/flowcontrol.go | 218 + .../grpc/internal/transport/handler_server.go | 430 + .../grpc/internal/transport/http2_client.go | 1397 + .../grpc/internal/transport/http2_server.go | 1214 + .../grpc/internal/transport/http_util.go | 676 + .../grpc/internal/transport/log.go | 44 + .../grpc/internal/transport/transport.go | 763 + .../grpc/keepalive/keepalive.go | 85 + .../grpc/metadata/metadata.go | 209 + .../grpc/naming/dns_resolver.go | 293 + .../google.golang.org/grpc/naming/naming.go | 69 + vendor/google.golang.org/grpc/peer/peer.go | 51 + .../google.golang.org/grpc/picker_wrapper.go | 197 + vendor/google.golang.org/grpc/pickfirst.go | 110 + vendor/google.golang.org/grpc/preloader.go | 64 + vendor/google.golang.org/grpc/proxy.go | 152 + .../grpc/resolver/dns/dns_resolver.go | 457 + .../grpc/resolver/passthrough/passthrough.go | 57 + .../grpc/resolver/resolver.go | 188 + .../grpc/resolver_conn_wrapper.go | 165 + vendor/google.golang.org/grpc/rpc_util.go | 863 + vendor/google.golang.org/grpc/server.go | 1524 + .../google.golang.org/grpc/service_config.go | 373 + .../google.golang.org/grpc/stats/handlers.go | 63 + vendor/google.golang.org/grpc/stats/stats.go | 300 + .../google.golang.org/grpc/status/status.go | 210 + vendor/google.golang.org/grpc/stream.go | 1513 + vendor/google.golang.org/grpc/tap/tap.go | 51 + vendor/google.golang.org/grpc/trace.go | 126 + vendor/google.golang.org/grpc/version.go | 22 + vendor/gopkg.in/inf.v0/LICENSE | 28 + vendor/gopkg.in/inf.v0/dec.go | 615 + vendor/gopkg.in/inf.v0/rounder.go | 145 + vendor/gopkg.in/yaml.v2/LICENSE | 201 + vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 31 + vendor/gopkg.in/yaml.v2/NOTICE | 13 + vendor/gopkg.in/yaml.v2/apic.go | 739 + vendor/gopkg.in/yaml.v2/decode.go | 775 + vendor/gopkg.in/yaml.v2/emitterc.go | 1685 + vendor/gopkg.in/yaml.v2/encode.go | 390 + vendor/gopkg.in/yaml.v2/parserc.go | 1095 + vendor/gopkg.in/yaml.v2/readerc.go | 412 + vendor/gopkg.in/yaml.v2/resolve.go | 258 + vendor/gopkg.in/yaml.v2/scannerc.go | 2696 + vendor/gopkg.in/yaml.v2/sorter.go | 113 + vendor/gopkg.in/yaml.v2/writerc.go | 26 + vendor/gopkg.in/yaml.v2/yaml.go | 466 + vendor/gopkg.in/yaml.v2/yamlh.go | 738 + vendor/gopkg.in/yaml.v2/yamlprivateh.go | 173 + vendor/k8s.io/api/LICENSE | 202 + vendor/k8s.io/api/admission/v1beta1/doc.go | 23 + .../api/admission/v1beta1/generated.pb.go | 1769 + .../k8s.io/api/admission/v1beta1/register.go | 51 + vendor/k8s.io/api/admission/v1beta1/types.go | 162 + .../v1beta1/types_swagger_doc_generated.go | 77 + .../v1beta1/zz_generated.deepcopy.go | 136 + .../api/admissionregistration/v1/doc.go | 26 + .../admissionregistration/v1/generated.pb.go | 3469 + .../api/admissionregistration/v1/register.go | 53 + .../api/admissionregistration/v1/types.go | 551 + .../v1/types_swagger_doc_generated.go | 151 + .../v1/zz_generated.deepcopy.go | 396 + .../api/admissionregistration/v1beta1/doc.go | 26 + .../v1beta1/generated.pb.go | 3470 + .../admissionregistration/v1beta1/register.go | 53 + .../admissionregistration/v1beta1/types.go | 559 + .../v1beta1/types_swagger_doc_generated.go | 151 + .../v1beta1/zz_generated.deepcopy.go | 396 + vendor/k8s.io/api/apps/v1/doc.go | 21 + vendor/k8s.io/api/apps/v1/generated.pb.go | 8264 ++ vendor/k8s.io/api/apps/v1/register.go | 60 + vendor/k8s.io/api/apps/v1/types.go | 826 + .../apps/v1/types_swagger_doc_generated.go | 365 + .../api/apps/v1/zz_generated.deepcopy.go | 772 + vendor/k8s.io/api/apps/v1beta1/doc.go | 21 + .../k8s.io/api/apps/v1beta1/generated.pb.go | 6272 ++ vendor/k8s.io/api/apps/v1beta1/register.go | 58 + vendor/k8s.io/api/apps/v1beta1/types.go | 567 + .../v1beta1/types_swagger_doc_generated.go | 273 + .../api/apps/v1beta1/zz_generated.deepcopy.go | 594 + vendor/k8s.io/api/apps/v1beta2/doc.go | 21 + .../k8s.io/api/apps/v1beta2/generated.pb.go | 9040 ++ vendor/k8s.io/api/apps/v1beta2/register.go | 61 + vendor/k8s.io/api/apps/v1beta2/types.go | 876 + .../v1beta2/types_swagger_doc_generated.go | 396 + .../api/apps/v1beta2/zz_generated.deepcopy.go | 839 + .../api/auditregistration/v1alpha1/doc.go | 23 + .../v1alpha1/generated.pb.go | 2056 + .../auditregistration/v1alpha1/register.go | 56 + .../api/auditregistration/v1alpha1/types.go | 198 + .../v1alpha1/types_swagger_doc_generated.go | 111 + .../v1alpha1/zz_generated.deepcopy.go | 229 + vendor/k8s.io/api/authentication/v1/doc.go | 22 + .../api/authentication/v1/generated.pb.go | 2607 + .../k8s.io/api/authentication/v1/register.go | 52 + vendor/k8s.io/api/authentication/v1/types.go | 189 + .../v1/types_swagger_doc_generated.go | 115 + .../v1/zz_generated.deepcopy.go | 244 + .../k8s.io/api/authentication/v1beta1/doc.go | 22 + .../authentication/v1beta1/generated.pb.go | 1584 + .../api/authentication/v1beta1/register.go | 51 + .../api/authentication/v1beta1/types.go | 110 + .../v1beta1/types_swagger_doc_generated.go | 74 + .../v1beta1/zz_generated.deepcopy.go | 152 + vendor/k8s.io/api/authorization/v1/doc.go | 23 + .../api/authorization/v1/generated.pb.go | 4113 + .../k8s.io/api/authorization/v1/register.go | 55 + vendor/k8s.io/api/authorization/v1/types.go | 268 + .../v1/types_swagger_doc_generated.go | 173 + .../authorization/v1/zz_generated.deepcopy.go | 385 + .../k8s.io/api/authorization/v1beta1/doc.go | 23 + .../api/authorization/v1beta1/generated.pb.go | 4113 + .../api/authorization/v1beta1/register.go | 55 + .../k8s.io/api/authorization/v1beta1/types.go | 268 + .../v1beta1/types_swagger_doc_generated.go | 173 + .../v1beta1/zz_generated.deepcopy.go | 385 + vendor/k8s.io/api/autoscaling/v1/doc.go | 21 + .../k8s.io/api/autoscaling/v1/generated.pb.go | 5596 ++ vendor/k8s.io/api/autoscaling/v1/register.go | 53 + vendor/k8s.io/api/autoscaling/v1/types.go | 432 + .../v1/types_swagger_doc_generated.go | 250 + .../autoscaling/v1/zz_generated.deepcopy.go | 515 + vendor/k8s.io/api/autoscaling/v2beta1/doc.go | 21 + .../api/autoscaling/v2beta1/generated.pb.go | 5121 ++ .../api/autoscaling/v2beta1/register.go | 52 + .../k8s.io/api/autoscaling/v2beta1/types.go | 408 + .../v2beta1/types_swagger_doc_generated.go | 221 + .../v2beta1/zz_generated.deepcopy.go | 466 + vendor/k8s.io/api/autoscaling/v2beta2/doc.go | 21 + .../api/autoscaling/v2beta2/generated.pb.go | 5324 ++ .../api/autoscaling/v2beta2/register.go | 50 + .../k8s.io/api/autoscaling/v2beta2/types.go | 396 + .../v2beta2/types_swagger_doc_generated.go | 240 + .../v2beta2/zz_generated.deepcopy.go | 487 + vendor/k8s.io/api/batch/v1/doc.go | 21 + vendor/k8s.io/api/batch/v1/generated.pb.go | 1880 + vendor/k8s.io/api/batch/v1/register.go | 52 + vendor/k8s.io/api/batch/v1/types.go | 193 + .../batch/v1/types_swagger_doc_generated.go | 95 + .../api/batch/v1/zz_generated.deepcopy.go | 188 + vendor/k8s.io/api/batch/v1beta1/doc.go | 21 + .../k8s.io/api/batch/v1beta1/generated.pb.go | 1769 + vendor/k8s.io/api/batch/v1beta1/register.go | 53 + vendor/k8s.io/api/batch/v1beta1/types.go | 158 + .../v1beta1/types_swagger_doc_generated.go | 96 + .../batch/v1beta1/zz_generated.deepcopy.go | 194 + vendor/k8s.io/api/batch/v2alpha1/doc.go | 21 + .../k8s.io/api/batch/v2alpha1/generated.pb.go | 1769 + vendor/k8s.io/api/batch/v2alpha1/register.go | 53 + vendor/k8s.io/api/batch/v2alpha1/types.go | 156 + .../v2alpha1/types_swagger_doc_generated.go | 96 + .../batch/v2alpha1/zz_generated.deepcopy.go | 194 + vendor/k8s.io/api/certificates/v1beta1/doc.go | 23 + .../api/certificates/v1beta1/generated.pb.go | 1936 + .../api/certificates/v1beta1/register.go | 59 + .../k8s.io/api/certificates/v1beta1/types.go | 155 + .../v1beta1/types_swagger_doc_generated.go | 74 + .../v1beta1/zz_generated.deepcopy.go | 197 + vendor/k8s.io/api/coordination/v1/doc.go | 23 + .../api/coordination/v1/generated.pb.go | 1002 + vendor/k8s.io/api/coordination/v1/register.go | 53 + vendor/k8s.io/api/coordination/v1/types.go | 74 + .../v1/types_swagger_doc_generated.go | 63 + .../coordination/v1/zz_generated.deepcopy.go | 124 + vendor/k8s.io/api/coordination/v1beta1/doc.go | 23 + .../api/coordination/v1beta1/generated.pb.go | 1002 + .../api/coordination/v1beta1/register.go | 53 + .../k8s.io/api/coordination/v1beta1/types.go | 74 + .../v1beta1/types_swagger_doc_generated.go | 63 + .../v1beta1/zz_generated.deepcopy.go | 124 + .../api/core/v1/annotation_key_constants.go | 106 + vendor/k8s.io/api/core/v1/doc.go | 22 + vendor/k8s.io/api/core/v1/generated.pb.go | 66336 ++++++++++++++ vendor/k8s.io/api/core/v1/objectreference.go | 33 + vendor/k8s.io/api/core/v1/register.go | 100 + vendor/k8s.io/api/core/v1/resource.go | 56 + vendor/k8s.io/api/core/v1/taint.go | 39 + vendor/k8s.io/api/core/v1/toleration.go | 56 + vendor/k8s.io/api/core/v1/types.go | 5846 ++ .../core/v1/types_swagger_doc_generated.go | 2466 + .../k8s.io/api/core/v1/well_known_labels.go | 42 + .../api/core/v1/zz_generated.deepcopy.go | 5771 ++ vendor/k8s.io/api/discovery/v1alpha1/doc.go | 22 + .../api/discovery/v1alpha1/generated.pb.go | 1689 + .../k8s.io/api/discovery/v1alpha1/register.go | 56 + vendor/k8s.io/api/discovery/v1alpha1/types.go | 144 + .../v1alpha1/types_swagger_doc_generated.go | 85 + .../discovery/v1alpha1/well_known_labels.go | 22 + .../v1alpha1/zz_generated.deepcopy.go | 195 + vendor/k8s.io/api/events/v1beta1/doc.go | 23 + .../k8s.io/api/events/v1beta1/generated.pb.go | 1474 + vendor/k8s.io/api/events/v1beta1/register.go | 53 + vendor/k8s.io/api/events/v1beta1/types.go | 123 + .../v1beta1/types_swagger_doc_generated.go | 73 + .../events/v1beta1/zz_generated.deepcopy.go | 117 + vendor/k8s.io/api/extensions/v1beta1/doc.go | 21 + .../api/extensions/v1beta1/generated.pb.go | 15318 ++++ .../k8s.io/api/extensions/v1beta1/register.go | 66 + vendor/k8s.io/api/extensions/v1beta1/types.go | 1397 + .../v1beta1/types_swagger_doc_generated.go | 661 + .../v1beta1/zz_generated.deepcopy.go | 1497 + vendor/k8s.io/api/networking/v1/doc.go | 22 + .../k8s.io/api/networking/v1/generated.pb.go | 2228 + vendor/k8s.io/api/networking/v1/register.go | 53 + vendor/k8s.io/api/networking/v1/types.go | 203 + .../v1/types_swagger_doc_generated.go | 113 + .../networking/v1/zz_generated.deepcopy.go | 262 + vendor/k8s.io/api/networking/v1beta1/doc.go | 22 + .../api/networking/v1beta1/generated.pb.go | 2394 + .../k8s.io/api/networking/v1beta1/register.go | 56 + vendor/k8s.io/api/networking/v1beta1/types.go | 192 + .../v1beta1/types_swagger_doc_generated.go | 127 + .../v1beta1/zz_generated.deepcopy.go | 252 + vendor/k8s.io/api/node/v1alpha1/doc.go | 23 + .../k8s.io/api/node/v1alpha1/generated.pb.go | 1609 + vendor/k8s.io/api/node/v1alpha1/register.go | 52 + vendor/k8s.io/api/node/v1alpha1/types.go | 116 + .../v1alpha1/types_swagger_doc_generated.go | 80 + .../node/v1alpha1/zz_generated.deepcopy.go | 165 + vendor/k8s.io/api/node/v1beta1/doc.go | 23 + .../k8s.io/api/node/v1beta1/generated.pb.go | 1438 + vendor/k8s.io/api/node/v1beta1/register.go | 52 + vendor/k8s.io/api/node/v1beta1/types.go | 106 + .../v1beta1/types_swagger_doc_generated.go | 71 + .../api/node/v1beta1/zz_generated.deepcopy.go | 148 + vendor/k8s.io/api/policy/v1beta1/doc.go | 24 + .../k8s.io/api/policy/v1beta1/generated.pb.go | 5587 ++ vendor/k8s.io/api/policy/v1beta1/register.go | 56 + vendor/k8s.io/api/policy/v1beta1/types.go | 489 + .../v1beta1/types_swagger_doc_generated.go | 243 + .../policy/v1beta1/zz_generated.deepcopy.go | 540 + vendor/k8s.io/api/rbac/v1/doc.go | 23 + vendor/k8s.io/api/rbac/v1/generated.pb.go | 3292 + vendor/k8s.io/api/rbac/v1/register.go | 58 + vendor/k8s.io/api/rbac/v1/types.go | 237 + .../rbac/v1/types_swagger_doc_generated.go | 158 + .../api/rbac/v1/zz_generated.deepcopy.go | 389 + vendor/k8s.io/api/rbac/v1alpha1/doc.go | 23 + .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 3293 + vendor/k8s.io/api/rbac/v1alpha1/register.go | 58 + vendor/k8s.io/api/rbac/v1alpha1/types.go | 239 + .../v1alpha1/types_swagger_doc_generated.go | 158 + .../rbac/v1alpha1/zz_generated.deepcopy.go | 389 + vendor/k8s.io/api/rbac/v1beta1/doc.go | 23 + .../k8s.io/api/rbac/v1beta1/generated.pb.go | 3292 + vendor/k8s.io/api/rbac/v1beta1/register.go | 58 + vendor/k8s.io/api/rbac/v1beta1/types.go | 237 + .../v1beta1/types_swagger_doc_generated.go | 158 + .../api/rbac/v1beta1/zz_generated.deepcopy.go | 389 + vendor/k8s.io/api/scheduling/v1/doc.go | 23 + .../k8s.io/api/scheduling/v1/generated.pb.go | 761 + vendor/k8s.io/api/scheduling/v1/register.go | 55 + vendor/k8s.io/api/scheduling/v1/types.go | 74 + .../v1/types_swagger_doc_generated.go | 53 + .../scheduling/v1/zz_generated.deepcopy.go | 90 + vendor/k8s.io/api/scheduling/v1alpha1/doc.go | 23 + .../api/scheduling/v1alpha1/generated.pb.go | 761 + .../api/scheduling/v1alpha1/register.go | 52 + .../k8s.io/api/scheduling/v1alpha1/types.go | 75 + .../v1alpha1/types_swagger_doc_generated.go | 53 + .../v1alpha1/zz_generated.deepcopy.go | 90 + vendor/k8s.io/api/scheduling/v1beta1/doc.go | 23 + .../api/scheduling/v1beta1/generated.pb.go | 761 + .../k8s.io/api/scheduling/v1beta1/register.go | 52 + vendor/k8s.io/api/scheduling/v1beta1/types.go | 75 + .../v1beta1/types_swagger_doc_generated.go | 53 + .../v1beta1/zz_generated.deepcopy.go | 90 + vendor/k8s.io/api/settings/v1alpha1/doc.go | 23 + .../api/settings/v1alpha1/generated.pb.go | 1079 + .../k8s.io/api/settings/v1alpha1/register.go | 52 + vendor/k8s.io/api/settings/v1alpha1/types.go | 70 + .../v1alpha1/types_swagger_doc_generated.go | 61 + .../v1alpha1/zz_generated.deepcopy.go | 131 + vendor/k8s.io/api/storage/v1/doc.go | 22 + vendor/k8s.io/api/storage/v1/generated.pb.go | 2699 + vendor/k8s.io/api/storage/v1/register.go | 56 + vendor/k8s.io/api/storage/v1/types.go | 218 + .../storage/v1/types_swagger_doc_generated.go | 119 + .../api/storage/v1/zz_generated.deepcopy.go | 273 + vendor/k8s.io/api/storage/v1alpha1/doc.go | 22 + .../api/storage/v1alpha1/generated.pb.go | 1839 + .../k8s.io/api/storage/v1alpha1/register.go | 50 + vendor/k8s.io/api/storage/v1alpha1/types.go | 136 + .../v1alpha1/types_swagger_doc_generated.go | 93 + .../storage/v1alpha1/zz_generated.deepcopy.go | 180 + vendor/k8s.io/api/storage/v1beta1/doc.go | 22 + .../api/storage/v1beta1/generated.pb.go | 4487 + vendor/k8s.io/api/storage/v1beta1/register.go | 62 + vendor/k8s.io/api/storage/v1beta1/types.go | 438 + .../v1beta1/types_swagger_doc_generated.go | 200 + .../storage/v1beta1/zz_generated.deepcopy.go | 494 + vendor/k8s.io/apiextensions-apiserver/LICENSE | 202 + .../pkg/apis/apiextensions/deepcopy.go | 294 + .../pkg/apis/apiextensions/doc.go | 21 + .../pkg/apis/apiextensions/helpers.go | 257 + .../pkg/apis/apiextensions/register.go | 51 + .../pkg/apis/apiextensions/types.go | 411 + .../apis/apiextensions/types_jsonschema.go | 164 + .../apis/apiextensions/v1beta1/conversion.go | 59 + .../apis/apiextensions/v1beta1/deepcopy.go | 270 + .../apis/apiextensions/v1beta1/defaults.go | 82 + .../pkg/apis/apiextensions/v1beta1/doc.go | 25 + .../apiextensions/v1beta1/generated.pb.go | 9051 ++ .../pkg/apis/apiextensions/v1beta1/marshal.go | 135 + .../apis/apiextensions/v1beta1/register.go | 62 + .../pkg/apis/apiextensions/v1beta1/types.go | 496 + .../apiextensions/v1beta1/types_jsonschema.go | 254 + .../v1beta1/zz_generated.conversion.go | 1327 + .../v1beta1/zz_generated.deepcopy.go | 662 + .../v1beta1/zz_generated.defaults.go | 55 + .../apiextensions/zz_generated.deepcopy.go | 554 + vendor/k8s.io/apimachinery/LICENSE | 202 + .../apimachinery/pkg/api/equality/semantic.go | 49 + .../k8s.io/apimachinery/pkg/api/errors/doc.go | 18 + .../apimachinery/pkg/api/errors/errors.go | 668 + .../k8s.io/apimachinery/pkg/api/meta/doc.go | 19 + .../apimachinery/pkg/api/meta/errors.go | 121 + .../pkg/api/meta/firsthit_restmapper.go | 97 + .../k8s.io/apimachinery/pkg/api/meta/help.go | 264 + .../apimachinery/pkg/api/meta/interfaces.go | 134 + .../k8s.io/apimachinery/pkg/api/meta/lazy.go | 104 + .../k8s.io/apimachinery/pkg/api/meta/meta.go | 648 + .../pkg/api/meta/multirestmapper.go | 210 + .../apimachinery/pkg/api/meta/priority.go | 222 + .../apimachinery/pkg/api/meta/restmapper.go | 518 + .../apimachinery/pkg/api/resource/amount.go | 299 + .../pkg/api/resource/generated.pb.go | 89 + .../apimachinery/pkg/api/resource/math.go | 314 + .../apimachinery/pkg/api/resource/quantity.go | 728 + .../pkg/api/resource/quantity_proto.go | 288 + .../pkg/api/resource/scale_int.go | 95 + .../apimachinery/pkg/api/resource/suffix.go | 198 + .../pkg/api/resource/zz_generated.deepcopy.go | 27 + .../apimachinery/pkg/api/validation/doc.go | 18 + .../pkg/api/validation/generic.go | 85 + .../pkg/api/validation/objectmeta.go | 263 + .../pkg/apis/meta/internalversion/doc.go | 20 + .../pkg/apis/meta/internalversion/register.go | 110 + .../pkg/apis/meta/internalversion/types.go | 76 + .../zz_generated.conversion.go | 143 + .../internalversion/zz_generated.deepcopy.go | 96 + .../pkg/apis/meta/v1/controller_ref.go | 54 + .../pkg/apis/meta/v1/conversion.go | 329 + .../apimachinery/pkg/apis/meta/v1/deepcopy.go | 46 + .../apimachinery/pkg/apis/meta/v1/doc.go | 23 + .../apimachinery/pkg/apis/meta/v1/duration.go | 60 + .../pkg/apis/meta/v1/generated.pb.go | 11113 +++ .../pkg/apis/meta/v1/group_version.go | 148 + .../apimachinery/pkg/apis/meta/v1/helpers.go | 280 + .../apimachinery/pkg/apis/meta/v1/labels.go | 55 + .../apimachinery/pkg/apis/meta/v1/meta.go | 178 + .../pkg/apis/meta/v1/micro_time.go | 196 + .../pkg/apis/meta/v1/micro_time_proto.go | 80 + .../apimachinery/pkg/apis/meta/v1/register.go | 116 + .../apimachinery/pkg/apis/meta/v1/time.go | 187 + .../pkg/apis/meta/v1/time_proto.go | 100 + .../apimachinery/pkg/apis/meta/v1/types.go | 1298 + .../meta/v1/types_swagger_doc_generated.go | 442 + .../pkg/apis/meta/v1/unstructured/helpers.go | 476 + .../apis/meta/v1/unstructured/unstructured.go | 496 + .../meta/v1/unstructured/unstructured_list.go | 210 + .../v1/unstructured/zz_generated.deepcopy.go | 55 + .../pkg/apis/meta/v1/validation/validation.go | 186 + .../apimachinery/pkg/apis/meta/v1/watch.go | 89 + .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 1173 + .../pkg/apis/meta/v1/zz_generated.defaults.go | 32 + .../pkg/apis/meta/v1beta1/conversion.go | 27 + .../pkg/apis/meta/v1beta1/deepcopy.go | 17 + .../apimachinery/pkg/apis/meta/v1beta1/doc.go | 23 + .../pkg/apis/meta/v1beta1/generated.pb.go | 442 + .../pkg/apis/meta/v1beta1/register.go | 61 + .../pkg/apis/meta/v1beta1/types.go | 84 + .../v1beta1/types_swagger_doc_generated.go | 40 + .../meta/v1beta1/zz_generated.deepcopy.go | 59 + .../meta/v1beta1/zz_generated.defaults.go | 32 + .../apimachinery/pkg/conversion/converter.go | 898 + .../apimachinery/pkg/conversion/deep_equal.go | 36 + .../k8s.io/apimachinery/pkg/conversion/doc.go | 24 + .../apimachinery/pkg/conversion/helper.go | 39 + .../pkg/conversion/queryparams/convert.go | 194 + .../pkg/conversion/queryparams/doc.go | 19 + vendor/k8s.io/apimachinery/pkg/fields/doc.go | 19 + .../k8s.io/apimachinery/pkg/fields/fields.go | 62 + .../apimachinery/pkg/fields/requirements.go | 30 + .../apimachinery/pkg/fields/selector.go | 476 + vendor/k8s.io/apimachinery/pkg/labels/doc.go | 19 + .../k8s.io/apimachinery/pkg/labels/labels.go | 181 + .../apimachinery/pkg/labels/selector.go | 891 + .../pkg/labels/zz_generated.deepcopy.go | 42 + .../k8s.io/apimachinery/pkg/runtime/codec.go | 332 + .../apimachinery/pkg/runtime/codec_check.go | 48 + .../apimachinery/pkg/runtime/conversion.go | 113 + .../apimachinery/pkg/runtime/converter.go | 805 + vendor/k8s.io/apimachinery/pkg/runtime/doc.go | 51 + .../apimachinery/pkg/runtime/embedded.go | 142 + .../k8s.io/apimachinery/pkg/runtime/error.go | 151 + .../apimachinery/pkg/runtime/extension.go | 51 + .../apimachinery/pkg/runtime/generated.pb.go | 881 + .../k8s.io/apimachinery/pkg/runtime/helper.go | 259 + .../apimachinery/pkg/runtime/interfaces.go | 278 + .../k8s.io/apimachinery/pkg/runtime/mapper.go | 98 + .../apimachinery/pkg/runtime/register.go | 61 + .../pkg/runtime/schema/generated.pb.go | 59 + .../pkg/runtime/schema/group_version.go | 300 + .../pkg/runtime/schema/interfaces.go | 40 + .../k8s.io/apimachinery/pkg/runtime/scheme.go | 754 + .../pkg/runtime/scheme_builder.go | 48 + .../pkg/runtime/serializer/codec_factory.go | 324 + .../pkg/runtime/serializer/json/json.go | 388 + .../pkg/runtime/serializer/json/meta.go | 63 + .../runtime/serializer/negotiated_codec.go | 43 + .../pkg/runtime/serializer/protobuf/doc.go | 18 + .../runtime/serializer/protobuf/protobuf.go | 475 + .../serializer/recognizer/recognizer.go | 127 + .../runtime/serializer/streaming/streaming.go | 137 + .../serializer/versioning/versioning.go | 232 + .../pkg/runtime/swagger_doc_generator.go | 262 + .../k8s.io/apimachinery/pkg/runtime/types.go | 139 + .../apimachinery/pkg/runtime/types_proto.go | 89 + .../pkg/runtime/zz_generated.deepcopy.go | 108 + .../apimachinery/pkg/selection/operator.go | 33 + vendor/k8s.io/apimachinery/pkg/types/doc.go | 18 + .../apimachinery/pkg/types/namespacedname.go | 43 + .../k8s.io/apimachinery/pkg/types/nodename.go | 43 + vendor/k8s.io/apimachinery/pkg/types/patch.go | 29 + vendor/k8s.io/apimachinery/pkg/types/uid.go | 22 + .../apimachinery/pkg/util/cache/cache.go | 83 + .../pkg/util/cache/lruexpirecache.go | 102 + .../apimachinery/pkg/util/clock/clock.go | 384 + .../k8s.io/apimachinery/pkg/util/diff/diff.go | 118 + .../apimachinery/pkg/util/errors/doc.go | 18 + .../apimachinery/pkg/util/errors/errors.go | 229 + .../apimachinery/pkg/util/framer/framer.go | 167 + .../pkg/util/intstr/generated.pb.go | 398 + .../apimachinery/pkg/util/intstr/intstr.go | 184 + .../k8s.io/apimachinery/pkg/util/json/json.go | 131 + .../pkg/util/mergepatch/errors.go | 102 + .../apimachinery/pkg/util/mergepatch/util.go | 133 + .../pkg/util/naming/from_stack.go | 93 + .../k8s.io/apimachinery/pkg/util/net/http.go | 463 + .../apimachinery/pkg/util/net/interface.go | 416 + .../apimachinery/pkg/util/net/port_range.go | 149 + .../apimachinery/pkg/util/net/port_split.go | 77 + .../k8s.io/apimachinery/pkg/util/net/util.go | 73 + .../apimachinery/pkg/util/runtime/runtime.go | 173 + .../k8s.io/apimachinery/pkg/util/sets/byte.go | 205 + .../k8s.io/apimachinery/pkg/util/sets/doc.go | 20 + .../apimachinery/pkg/util/sets/empty.go | 23 + .../k8s.io/apimachinery/pkg/util/sets/int.go | 205 + .../apimachinery/pkg/util/sets/int32.go | 205 + .../apimachinery/pkg/util/sets/int64.go | 205 + .../apimachinery/pkg/util/sets/string.go | 205 + .../pkg/util/strategicpatch/errors.go | 49 + .../pkg/util/strategicpatch/meta.go | 194 + .../pkg/util/strategicpatch/patch.go | 2174 + .../pkg/util/strategicpatch/types.go | 193 + .../k8s.io/apimachinery/pkg/util/uuid/uuid.go | 27 + .../pkg/util/validation/field/errors.go | 272 + .../pkg/util/validation/field/path.go | 91 + .../pkg/util/validation/validation.go | 416 + .../k8s.io/apimachinery/pkg/util/wait/doc.go | 19 + .../k8s.io/apimachinery/pkg/util/wait/wait.go | 512 + .../apimachinery/pkg/util/yaml/decoder.go | 344 + vendor/k8s.io/apimachinery/pkg/version/doc.go | 20 + .../apimachinery/pkg/version/helpers.go | 88 + .../k8s.io/apimachinery/pkg/version/types.go | 37 + vendor/k8s.io/apimachinery/pkg/watch/doc.go | 19 + .../k8s.io/apimachinery/pkg/watch/filter.go | 105 + vendor/k8s.io/apimachinery/pkg/watch/mux.go | 260 + .../apimachinery/pkg/watch/streamwatcher.go | 132 + vendor/k8s.io/apimachinery/pkg/watch/watch.go | 322 + .../pkg/watch/zz_generated.deepcopy.go | 40 + .../third_party/forked/golang/json/fields.go | 513 + .../forked/golang/reflect/deep_equal.go | 388 + vendor/k8s.io/client-go/LICENSE | 202 + .../client-go/discovery/discovery_client.go | 508 + vendor/k8s.io/client-go/discovery/doc.go | 19 + .../client-go/discovery/fake/discovery.go | 160 + vendor/k8s.io/client-go/discovery/helper.go | 125 + vendor/k8s.io/client-go/dynamic/interface.go | 59 + vendor/k8s.io/client-go/dynamic/scheme.go | 102 + vendor/k8s.io/client-go/dynamic/simple.go | 355 + .../admissionregistration/interface.go | 54 + .../admissionregistration/v1/interface.go | 52 + .../v1/mutatingwebhookconfiguration.go | 88 + .../v1/validatingwebhookconfiguration.go | 88 + .../v1beta1/interface.go | 52 + .../v1beta1/mutatingwebhookconfiguration.go | 88 + .../v1beta1/validatingwebhookconfiguration.go | 88 + .../client-go/informers/apps/interface.go | 62 + .../informers/apps/v1/controllerrevision.go | 89 + .../client-go/informers/apps/v1/daemonset.go | 89 + .../client-go/informers/apps/v1/deployment.go | 89 + .../client-go/informers/apps/v1/interface.go | 73 + .../client-go/informers/apps/v1/replicaset.go | 89 + .../informers/apps/v1/statefulset.go | 89 + .../apps/v1beta1/controllerrevision.go | 89 + .../informers/apps/v1beta1/deployment.go | 89 + .../informers/apps/v1beta1/interface.go | 59 + .../informers/apps/v1beta1/statefulset.go | 89 + .../apps/v1beta2/controllerrevision.go | 89 + .../informers/apps/v1beta2/daemonset.go | 89 + .../informers/apps/v1beta2/deployment.go | 89 + .../informers/apps/v1beta2/interface.go | 73 + .../informers/apps/v1beta2/replicaset.go | 89 + .../informers/apps/v1beta2/statefulset.go | 89 + .../informers/auditregistration/interface.go | 46 + .../auditregistration/v1alpha1/auditsink.go | 88 + .../auditregistration/v1alpha1/interface.go | 45 + .../informers/autoscaling/interface.go | 62 + .../autoscaling/v1/horizontalpodautoscaler.go | 89 + .../informers/autoscaling/v1/interface.go | 45 + .../v2beta1/horizontalpodautoscaler.go | 89 + .../autoscaling/v2beta1/interface.go | 45 + .../v2beta2/horizontalpodautoscaler.go | 89 + .../autoscaling/v2beta2/interface.go | 45 + .../client-go/informers/batch/interface.go | 62 + .../client-go/informers/batch/v1/interface.go | 45 + .../client-go/informers/batch/v1/job.go | 89 + .../informers/batch/v1beta1/cronjob.go | 89 + .../informers/batch/v1beta1/interface.go | 45 + .../informers/batch/v2alpha1/cronjob.go | 89 + .../informers/batch/v2alpha1/interface.go | 45 + .../informers/certificates/interface.go | 46 + .../v1beta1/certificatesigningrequest.go | 88 + .../certificates/v1beta1/interface.go | 45 + .../informers/coordination/interface.go | 54 + .../informers/coordination/v1/interface.go | 45 + .../informers/coordination/v1/lease.go | 89 + .../coordination/v1beta1/interface.go | 45 + .../informers/coordination/v1beta1/lease.go | 89 + .../client-go/informers/core/interface.go | 46 + .../informers/core/v1/componentstatus.go | 88 + .../client-go/informers/core/v1/configmap.go | 89 + .../client-go/informers/core/v1/endpoints.go | 89 + .../client-go/informers/core/v1/event.go | 89 + .../client-go/informers/core/v1/interface.go | 150 + .../client-go/informers/core/v1/limitrange.go | 89 + .../client-go/informers/core/v1/namespace.go | 88 + .../client-go/informers/core/v1/node.go | 88 + .../informers/core/v1/persistentvolume.go | 88 + .../core/v1/persistentvolumeclaim.go | 89 + .../k8s.io/client-go/informers/core/v1/pod.go | 89 + .../informers/core/v1/podtemplate.go | 89 + .../core/v1/replicationcontroller.go | 89 + .../informers/core/v1/resourcequota.go | 89 + .../client-go/informers/core/v1/secret.go | 89 + .../client-go/informers/core/v1/service.go | 89 + .../informers/core/v1/serviceaccount.go | 89 + .../informers/discovery/interface.go | 46 + .../discovery/v1alpha1/endpointslice.go | 89 + .../informers/discovery/v1alpha1/interface.go | 45 + .../client-go/informers/events/interface.go | 46 + .../informers/events/v1beta1/event.go | 89 + .../informers/events/v1beta1/interface.go | 45 + .../informers/extensions/interface.go | 46 + .../informers/extensions/v1beta1/daemonset.go | 89 + .../extensions/v1beta1/deployment.go | 89 + .../informers/extensions/v1beta1/ingress.go | 89 + .../informers/extensions/v1beta1/interface.go | 80 + .../extensions/v1beta1/networkpolicy.go | 89 + .../extensions/v1beta1/podsecuritypolicy.go | 88 + .../extensions/v1beta1/replicaset.go | 89 + vendor/k8s.io/client-go/informers/factory.go | 282 + vendor/k8s.io/client-go/informers/generic.go | 319 + .../internalinterfaces/factory_interfaces.go | 40 + .../informers/networking/interface.go | 54 + .../informers/networking/v1/interface.go | 45 + .../informers/networking/v1/networkpolicy.go | 89 + .../informers/networking/v1beta1/ingress.go | 89 + .../informers/networking/v1beta1/interface.go | 45 + .../client-go/informers/node/interface.go | 54 + .../informers/node/v1alpha1/interface.go | 45 + .../informers/node/v1alpha1/runtimeclass.go | 88 + .../informers/node/v1beta1/interface.go | 45 + .../informers/node/v1beta1/runtimeclass.go | 88 + .../client-go/informers/policy/interface.go | 46 + .../informers/policy/v1beta1/interface.go | 52 + .../policy/v1beta1/poddisruptionbudget.go | 89 + .../policy/v1beta1/podsecuritypolicy.go | 88 + .../client-go/informers/rbac/interface.go | 62 + .../informers/rbac/v1/clusterrole.go | 88 + .../informers/rbac/v1/clusterrolebinding.go | 88 + .../client-go/informers/rbac/v1/interface.go | 66 + .../client-go/informers/rbac/v1/role.go | 89 + .../informers/rbac/v1/rolebinding.go | 89 + .../informers/rbac/v1alpha1/clusterrole.go | 88 + .../rbac/v1alpha1/clusterrolebinding.go | 88 + .../informers/rbac/v1alpha1/interface.go | 66 + .../client-go/informers/rbac/v1alpha1/role.go | 89 + .../informers/rbac/v1alpha1/rolebinding.go | 89 + .../informers/rbac/v1beta1/clusterrole.go | 88 + .../rbac/v1beta1/clusterrolebinding.go | 88 + .../informers/rbac/v1beta1/interface.go | 66 + .../client-go/informers/rbac/v1beta1/role.go | 89 + .../informers/rbac/v1beta1/rolebinding.go | 89 + .../informers/scheduling/interface.go | 62 + .../informers/scheduling/v1/interface.go | 45 + .../informers/scheduling/v1/priorityclass.go | 88 + .../scheduling/v1alpha1/interface.go | 45 + .../scheduling/v1alpha1/priorityclass.go | 88 + .../informers/scheduling/v1beta1/interface.go | 45 + .../scheduling/v1beta1/priorityclass.go | 88 + .../client-go/informers/settings/interface.go | 46 + .../informers/settings/v1alpha1/interface.go | 45 + .../informers/settings/v1alpha1/podpreset.go | 89 + .../client-go/informers/storage/interface.go | 62 + .../informers/storage/v1/interface.go | 52 + .../informers/storage/v1/storageclass.go | 88 + .../informers/storage/v1/volumeattachment.go | 88 + .../informers/storage/v1alpha1/interface.go | 45 + .../storage/v1alpha1/volumeattachment.go | 88 + .../informers/storage/v1beta1/csidriver.go | 88 + .../informers/storage/v1beta1/csinode.go | 88 + .../informers/storage/v1beta1/interface.go | 66 + .../informers/storage/v1beta1/storageclass.go | 88 + .../storage/v1beta1/volumeattachment.go | 88 + .../k8s.io/client-go/kubernetes/clientset.go | 615 + vendor/k8s.io/client-go/kubernetes/doc.go | 20 + vendor/k8s.io/client-go/kubernetes/import.go | 19 + .../k8s.io/client-go/kubernetes/scheme/doc.go | 20 + .../client-go/kubernetes/scheme/register.go | 130 + .../v1/admissionregistration_client.go | 94 + .../typed/admissionregistration/v1/doc.go | 20 + .../v1/generated_expansion.go | 23 + .../v1/mutatingwebhookconfiguration.go | 164 + .../v1/validatingwebhookconfiguration.go | 164 + .../v1beta1/admissionregistration_client.go | 94 + .../admissionregistration/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go | 23 + .../v1beta1/mutatingwebhookconfiguration.go | 164 + .../v1beta1/validatingwebhookconfiguration.go | 164 + .../kubernetes/typed/apps/v1/apps_client.go | 109 + .../typed/apps/v1/controllerrevision.go | 174 + .../kubernetes/typed/apps/v1/daemonset.go | 191 + .../kubernetes/typed/apps/v1/deployment.go | 223 + .../client-go/kubernetes/typed/apps/v1/doc.go | 20 + .../typed/apps/v1/generated_expansion.go | 29 + .../kubernetes/typed/apps/v1/replicaset.go | 223 + .../kubernetes/typed/apps/v1/statefulset.go | 223 + .../typed/apps/v1beta1/apps_client.go | 99 + .../typed/apps/v1beta1/controllerrevision.go | 174 + .../typed/apps/v1beta1/deployment.go | 191 + .../kubernetes/typed/apps/v1beta1/doc.go | 20 + .../typed/apps/v1beta1/generated_expansion.go | 25 + .../typed/apps/v1beta1/statefulset.go | 191 + .../typed/apps/v1beta2/apps_client.go | 109 + .../typed/apps/v1beta2/controllerrevision.go | 174 + .../typed/apps/v1beta2/daemonset.go | 191 + .../typed/apps/v1beta2/deployment.go | 191 + .../kubernetes/typed/apps/v1beta2/doc.go | 20 + .../typed/apps/v1beta2/generated_expansion.go | 29 + .../typed/apps/v1beta2/replicaset.go | 191 + .../typed/apps/v1beta2/statefulset.go | 222 + .../v1alpha1/auditregistration_client.go | 89 + .../auditregistration/v1alpha1/auditsink.go | 164 + .../typed/auditregistration/v1alpha1/doc.go | 20 + .../v1alpha1/generated_expansion.go | 21 + .../v1/authentication_client.go | 89 + .../kubernetes/typed/authentication/v1/doc.go | 20 + .../authentication/v1/generated_expansion.go | 19 + .../typed/authentication/v1/tokenreview.go | 46 + .../v1/tokenreview_expansion.go | 35 + .../v1beta1/authentication_client.go | 89 + .../typed/authentication/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go | 19 + .../authentication/v1beta1/tokenreview.go | 46 + .../v1beta1/tokenreview_expansion.go | 35 + .../authorization/v1/authorization_client.go | 104 + .../kubernetes/typed/authorization/v1/doc.go | 20 + .../authorization/v1/generated_expansion.go | 19 + .../v1/localsubjectaccessreview.go | 48 + .../v1/localsubjectaccessreview_expansion.go | 36 + .../v1/selfsubjectaccessreview.go | 46 + .../v1/selfsubjectaccessreview_expansion.go | 35 + .../v1/selfsubjectrulesreview.go | 46 + .../v1/selfsubjectrulesreview_expansion.go | 35 + .../authorization/v1/subjectaccessreview.go | 46 + .../v1/subjectaccessreview_expansion.go | 36 + .../v1beta1/authorization_client.go | 104 + .../typed/authorization/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go | 19 + .../v1beta1/localsubjectaccessreview.go | 48 + .../localsubjectaccessreview_expansion.go | 36 + .../v1beta1/selfsubjectaccessreview.go | 46 + .../selfsubjectaccessreview_expansion.go | 35 + .../v1beta1/selfsubjectrulesreview.go | 46 + .../selfsubjectrulesreview_expansion.go | 35 + .../v1beta1/subjectaccessreview.go | 46 + .../v1beta1/subjectaccessreview_expansion.go | 36 + .../autoscaling/v1/autoscaling_client.go | 89 + .../kubernetes/typed/autoscaling/v1/doc.go | 20 + .../autoscaling/v1/generated_expansion.go | 21 + .../autoscaling/v1/horizontalpodautoscaler.go | 191 + .../autoscaling/v2beta1/autoscaling_client.go | 89 + .../typed/autoscaling/v2beta1/doc.go | 20 + .../v2beta1/generated_expansion.go | 21 + .../v2beta1/horizontalpodautoscaler.go | 191 + .../autoscaling/v2beta2/autoscaling_client.go | 89 + .../typed/autoscaling/v2beta2/doc.go | 20 + .../v2beta2/generated_expansion.go | 21 + .../v2beta2/horizontalpodautoscaler.go | 191 + .../kubernetes/typed/batch/v1/batch_client.go | 89 + .../kubernetes/typed/batch/v1/doc.go | 20 + .../typed/batch/v1/generated_expansion.go | 21 + .../kubernetes/typed/batch/v1/job.go | 191 + .../typed/batch/v1beta1/batch_client.go | 89 + .../kubernetes/typed/batch/v1beta1/cronjob.go | 191 + .../kubernetes/typed/batch/v1beta1/doc.go | 20 + .../batch/v1beta1/generated_expansion.go | 21 + .../typed/batch/v2alpha1/batch_client.go | 89 + .../typed/batch/v2alpha1/cronjob.go | 191 + .../kubernetes/typed/batch/v2alpha1/doc.go | 20 + .../batch/v2alpha1/generated_expansion.go | 21 + .../v1beta1/certificates_client.go | 89 + .../v1beta1/certificatesigningrequest.go | 180 + .../certificatesigningrequest_expansion.go | 37 + .../typed/certificates/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go | 19 + .../coordination/v1/coordination_client.go | 89 + .../kubernetes/typed/coordination/v1/doc.go | 20 + .../coordination/v1/generated_expansion.go | 21 + .../kubernetes/typed/coordination/v1/lease.go | 174 + .../v1beta1/coordination_client.go | 89 + .../typed/coordination/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go | 21 + .../typed/coordination/v1beta1/lease.go | 174 + .../typed/core/v1/componentstatus.go | 164 + .../kubernetes/typed/core/v1/configmap.go | 174 + .../kubernetes/typed/core/v1/core_client.go | 164 + .../client-go/kubernetes/typed/core/v1/doc.go | 20 + .../kubernetes/typed/core/v1/endpoints.go | 174 + .../kubernetes/typed/core/v1/event.go | 174 + .../typed/core/v1/event_expansion.go | 164 + .../typed/core/v1/generated_expansion.go | 39 + .../kubernetes/typed/core/v1/limitrange.go | 174 + .../kubernetes/typed/core/v1/namespace.go | 164 + .../typed/core/v1/namespace_expansion.go | 31 + .../kubernetes/typed/core/v1/node.go | 180 + .../typed/core/v1/node_expansion.go | 43 + .../typed/core/v1/persistentvolume.go | 180 + .../typed/core/v1/persistentvolumeclaim.go | 191 + .../client-go/kubernetes/typed/core/v1/pod.go | 222 + .../kubernetes/typed/core/v1/pod_expansion.go | 45 + .../kubernetes/typed/core/v1/podtemplate.go | 174 + .../typed/core/v1/replicationcontroller.go | 223 + .../kubernetes/typed/core/v1/resourcequota.go | 191 + .../kubernetes/typed/core/v1/secret.go | 174 + .../kubernetes/typed/core/v1/service.go | 174 + .../typed/core/v1/service_expansion.go | 41 + .../typed/core/v1/serviceaccount.go | 174 + .../typed/core/v1/serviceaccount_expansion.go | 41 + .../discovery/v1alpha1/discovery_client.go | 89 + .../typed/discovery/v1alpha1/doc.go | 20 + .../typed/discovery/v1alpha1/endpointslice.go | 174 + .../discovery/v1alpha1/generated_expansion.go | 21 + .../kubernetes/typed/events/v1beta1/doc.go | 20 + .../kubernetes/typed/events/v1beta1/event.go | 174 + .../typed/events/v1beta1/event_expansion.go | 98 + .../typed/events/v1beta1/events_client.go | 89 + .../events/v1beta1/generated_expansion.go | 19 + .../typed/extensions/v1beta1/daemonset.go | 191 + .../typed/extensions/v1beta1/deployment.go | 222 + .../v1beta1/deployment_expansion.go | 29 + .../typed/extensions/v1beta1/doc.go | 20 + .../extensions/v1beta1/extensions_client.go | 114 + .../extensions/v1beta1/generated_expansion.go | 29 + .../typed/extensions/v1beta1/ingress.go | 191 + .../typed/extensions/v1beta1/networkpolicy.go | 174 + .../extensions/v1beta1/podsecuritypolicy.go | 164 + .../typed/extensions/v1beta1/replicaset.go | 222 + .../kubernetes/typed/networking/v1/doc.go | 20 + .../networking/v1/generated_expansion.go | 21 + .../typed/networking/v1/networking_client.go | 89 + .../typed/networking/v1/networkpolicy.go | 174 + .../typed/networking/v1beta1/doc.go | 20 + .../networking/v1beta1/generated_expansion.go | 21 + .../typed/networking/v1beta1/ingress.go | 191 + .../networking/v1beta1/networking_client.go | 89 + .../kubernetes/typed/node/v1alpha1/doc.go | 20 + .../node/v1alpha1/generated_expansion.go | 21 + .../typed/node/v1alpha1/node_client.go | 89 + .../typed/node/v1alpha1/runtimeclass.go | 164 + .../kubernetes/typed/node/v1beta1/doc.go | 20 + .../typed/node/v1beta1/generated_expansion.go | 21 + .../typed/node/v1beta1/node_client.go | 89 + .../typed/node/v1beta1/runtimeclass.go | 164 + .../kubernetes/typed/policy/v1beta1/doc.go | 20 + .../typed/policy/v1beta1/eviction.go | 48 + .../policy/v1beta1/eviction_expansion.go | 38 + .../policy/v1beta1/generated_expansion.go | 23 + .../policy/v1beta1/poddisruptionbudget.go | 191 + .../typed/policy/v1beta1/podsecuritypolicy.go | 164 + .../typed/policy/v1beta1/policy_client.go | 99 + .../kubernetes/typed/rbac/v1/clusterrole.go | 164 + .../typed/rbac/v1/clusterrolebinding.go | 164 + .../client-go/kubernetes/typed/rbac/v1/doc.go | 20 + .../typed/rbac/v1/generated_expansion.go | 27 + .../kubernetes/typed/rbac/v1/rbac_client.go | 104 + .../kubernetes/typed/rbac/v1/role.go | 174 + .../kubernetes/typed/rbac/v1/rolebinding.go | 174 + .../typed/rbac/v1alpha1/clusterrole.go | 164 + .../typed/rbac/v1alpha1/clusterrolebinding.go | 164 + .../kubernetes/typed/rbac/v1alpha1/doc.go | 20 + .../rbac/v1alpha1/generated_expansion.go | 27 + .../typed/rbac/v1alpha1/rbac_client.go | 104 + .../kubernetes/typed/rbac/v1alpha1/role.go | 174 + .../typed/rbac/v1alpha1/rolebinding.go | 174 + .../typed/rbac/v1beta1/clusterrole.go | 164 + .../typed/rbac/v1beta1/clusterrolebinding.go | 164 + .../kubernetes/typed/rbac/v1beta1/doc.go | 20 + .../typed/rbac/v1beta1/generated_expansion.go | 27 + .../typed/rbac/v1beta1/rbac_client.go | 104 + .../kubernetes/typed/rbac/v1beta1/role.go | 174 + .../typed/rbac/v1beta1/rolebinding.go | 174 + .../kubernetes/typed/scheduling/v1/doc.go | 20 + .../scheduling/v1/generated_expansion.go | 21 + .../typed/scheduling/v1/priorityclass.go | 164 + .../typed/scheduling/v1/scheduling_client.go | 89 + .../typed/scheduling/v1alpha1/doc.go | 20 + .../v1alpha1/generated_expansion.go | 21 + .../scheduling/v1alpha1/priorityclass.go | 164 + .../scheduling/v1alpha1/scheduling_client.go | 89 + .../typed/scheduling/v1beta1/doc.go | 20 + .../scheduling/v1beta1/generated_expansion.go | 21 + .../typed/scheduling/v1beta1/priorityclass.go | 164 + .../scheduling/v1beta1/scheduling_client.go | 89 + .../kubernetes/typed/settings/v1alpha1/doc.go | 20 + .../settings/v1alpha1/generated_expansion.go | 21 + .../typed/settings/v1alpha1/podpreset.go | 174 + .../settings/v1alpha1/settings_client.go | 89 + .../kubernetes/typed/storage/v1/doc.go | 20 + .../typed/storage/v1/generated_expansion.go | 23 + .../typed/storage/v1/storage_client.go | 94 + .../typed/storage/v1/storageclass.go | 164 + .../typed/storage/v1/volumeattachment.go | 180 + .../kubernetes/typed/storage/v1alpha1/doc.go | 20 + .../storage/v1alpha1/generated_expansion.go | 21 + .../typed/storage/v1alpha1/storage_client.go | 89 + .../storage/v1alpha1/volumeattachment.go | 180 + .../typed/storage/v1beta1/csidriver.go | 164 + .../typed/storage/v1beta1/csinode.go | 164 + .../kubernetes/typed/storage/v1beta1/doc.go | 20 + .../storage/v1beta1/generated_expansion.go | 27 + .../typed/storage/v1beta1/storage_client.go | 104 + .../typed/storage/v1beta1/storageclass.go | 164 + .../typed/storage/v1beta1/volumeattachment.go | 180 + .../v1/expansion_generated.go | 27 + .../v1/mutatingwebhookconfiguration.go | 65 + .../v1/validatingwebhookconfiguration.go | 65 + .../v1beta1/expansion_generated.go | 27 + .../v1beta1/mutatingwebhookconfiguration.go | 65 + .../v1beta1/validatingwebhookconfiguration.go | 65 + .../listers/apps/v1/controllerrevision.go | 94 + .../client-go/listers/apps/v1/daemonset.go | 94 + .../listers/apps/v1/daemonset_expansion.go | 113 + .../client-go/listers/apps/v1/deployment.go | 94 + .../listers/apps/v1/deployment_expansion.go | 70 + .../listers/apps/v1/expansion_generated.go | 27 + .../client-go/listers/apps/v1/replicaset.go | 94 + .../listers/apps/v1/replicaset_expansion.go | 73 + .../client-go/listers/apps/v1/statefulset.go | 94 + .../listers/apps/v1/statefulset_expansion.go | 77 + .../apps/v1beta1/controllerrevision.go | 94 + .../listers/apps/v1beta1/deployment.go | 94 + .../apps/v1beta1/expansion_generated.go | 35 + .../listers/apps/v1beta1/statefulset.go | 94 + .../apps/v1beta1/statefulset_expansion.go | 77 + .../apps/v1beta2/controllerrevision.go | 94 + .../listers/apps/v1beta2/daemonset.go | 94 + .../apps/v1beta2/daemonset_expansion.go | 113 + .../listers/apps/v1beta2/deployment.go | 94 + .../apps/v1beta2/deployment_expansion.go | 70 + .../apps/v1beta2/expansion_generated.go | 27 + .../listers/apps/v1beta2/replicaset.go | 94 + .../apps/v1beta2/replicaset_expansion.go | 73 + .../listers/apps/v1beta2/statefulset.go | 94 + .../apps/v1beta2/statefulset_expansion.go | 77 + .../auditregistration/v1alpha1/auditsink.go | 65 + .../v1alpha1/expansion_generated.go | 23 + .../autoscaling/v1/expansion_generated.go | 27 + .../autoscaling/v1/horizontalpodautoscaler.go | 94 + .../v2beta1/expansion_generated.go | 27 + .../v2beta1/horizontalpodautoscaler.go | 94 + .../v2beta2/expansion_generated.go | 27 + .../v2beta2/horizontalpodautoscaler.go | 94 + .../listers/batch/v1/expansion_generated.go | 19 + .../k8s.io/client-go/listers/batch/v1/job.go | 94 + .../listers/batch/v1/job_expansion.go | 68 + .../listers/batch/v1beta1/cronjob.go | 94 + .../batch/v1beta1/expansion_generated.go | 27 + .../listers/batch/v2alpha1/cronjob.go | 94 + .../batch/v2alpha1/expansion_generated.go | 27 + .../v1beta1/certificatesigningrequest.go | 65 + .../v1beta1/expansion_generated.go | 23 + .../coordination/v1/expansion_generated.go | 27 + .../listers/coordination/v1/lease.go | 94 + .../v1beta1/expansion_generated.go | 27 + .../listers/coordination/v1beta1/lease.go | 94 + .../listers/core/v1/componentstatus.go | 65 + .../client-go/listers/core/v1/configmap.go | 94 + .../client-go/listers/core/v1/endpoints.go | 94 + .../k8s.io/client-go/listers/core/v1/event.go | 94 + .../listers/core/v1/expansion_generated.go | 111 + .../client-go/listers/core/v1/limitrange.go | 94 + .../client-go/listers/core/v1/namespace.go | 65 + .../k8s.io/client-go/listers/core/v1/node.go | 65 + .../listers/core/v1/node_expansion.go | 48 + .../listers/core/v1/persistentvolume.go | 65 + .../listers/core/v1/persistentvolumeclaim.go | 94 + .../k8s.io/client-go/listers/core/v1/pod.go | 94 + .../client-go/listers/core/v1/podtemplate.go | 94 + .../listers/core/v1/replicationcontroller.go | 94 + .../v1/replicationcontroller_expansion.go | 66 + .../listers/core/v1/resourcequota.go | 94 + .../client-go/listers/core/v1/secret.go | 94 + .../client-go/listers/core/v1/service.go | 94 + .../listers/core/v1/service_expansion.go | 56 + .../listers/core/v1/serviceaccount.go | 94 + .../discovery/v1alpha1/endpointslice.go | 94 + .../discovery/v1alpha1/expansion_generated.go | 27 + .../client-go/listers/events/v1beta1/event.go | 94 + .../events/v1beta1/expansion_generated.go | 27 + .../listers/extensions/v1beta1/daemonset.go | 94 + .../extensions/v1beta1/daemonset_expansion.go | 114 + .../listers/extensions/v1beta1/deployment.go | 94 + .../v1beta1/deployment_expansion.go | 70 + .../extensions/v1beta1/expansion_generated.go | 39 + .../listers/extensions/v1beta1/ingress.go | 94 + .../extensions/v1beta1/networkpolicy.go | 94 + .../extensions/v1beta1/podsecuritypolicy.go | 65 + .../listers/extensions/v1beta1/replicaset.go | 94 + .../v1beta1/replicaset_expansion.go | 73 + .../networking/v1/expansion_generated.go | 27 + .../listers/networking/v1/networkpolicy.go | 94 + .../networking/v1beta1/expansion_generated.go | 27 + .../listers/networking/v1beta1/ingress.go | 94 + .../node/v1alpha1/expansion_generated.go | 23 + .../listers/node/v1alpha1/runtimeclass.go | 65 + .../node/v1beta1/expansion_generated.go | 23 + .../listers/node/v1beta1/runtimeclass.go | 65 + .../listers/policy/v1beta1/eviction.go | 94 + .../policy/v1beta1/expansion_generated.go | 31 + .../policy/v1beta1/poddisruptionbudget.go | 94 + .../v1beta1/poddisruptionbudget_expansion.go | 74 + .../policy/v1beta1/podsecuritypolicy.go | 65 + .../client-go/listers/rbac/v1/clusterrole.go | 65 + .../listers/rbac/v1/clusterrolebinding.go | 65 + .../listers/rbac/v1/expansion_generated.go | 43 + .../k8s.io/client-go/listers/rbac/v1/role.go | 94 + .../client-go/listers/rbac/v1/rolebinding.go | 94 + .../listers/rbac/v1alpha1/clusterrole.go | 65 + .../rbac/v1alpha1/clusterrolebinding.go | 65 + .../rbac/v1alpha1/expansion_generated.go | 43 + .../client-go/listers/rbac/v1alpha1/role.go | 94 + .../listers/rbac/v1alpha1/rolebinding.go | 94 + .../listers/rbac/v1beta1/clusterrole.go | 65 + .../rbac/v1beta1/clusterrolebinding.go | 65 + .../rbac/v1beta1/expansion_generated.go | 43 + .../client-go/listers/rbac/v1beta1/role.go | 94 + .../listers/rbac/v1beta1/rolebinding.go | 94 + .../scheduling/v1/expansion_generated.go | 23 + .../listers/scheduling/v1/priorityclass.go | 65 + .../v1alpha1/expansion_generated.go | 23 + .../scheduling/v1alpha1/priorityclass.go | 65 + .../scheduling/v1beta1/expansion_generated.go | 23 + .../scheduling/v1beta1/priorityclass.go | 65 + .../settings/v1alpha1/expansion_generated.go | 27 + .../listers/settings/v1alpha1/podpreset.go | 94 + .../listers/storage/v1/expansion_generated.go | 27 + .../listers/storage/v1/storageclass.go | 65 + .../listers/storage/v1/volumeattachment.go | 65 + .../storage/v1alpha1/expansion_generated.go | 23 + .../storage/v1alpha1/volumeattachment.go | 65 + .../listers/storage/v1beta1/csidriver.go | 65 + .../listers/storage/v1beta1/csinode.go | 65 + .../storage/v1beta1/expansion_generated.go | 35 + .../listers/storage/v1beta1/storageclass.go | 65 + .../storage/v1beta1/volumeattachment.go | 65 + .../pkg/apis/clientauthentication/doc.go | 20 + .../pkg/apis/clientauthentication/register.go | 50 + .../pkg/apis/clientauthentication/types.go | 77 + .../apis/clientauthentication/v1alpha1/doc.go | 24 + .../clientauthentication/v1alpha1/register.go | 55 + .../clientauthentication/v1alpha1/types.go | 78 + .../v1alpha1/zz_generated.conversion.go | 176 + .../v1alpha1/zz_generated.deepcopy.go | 128 + .../v1alpha1/zz_generated.defaults.go | 32 + .../v1beta1/conversion.go | 26 + .../apis/clientauthentication/v1beta1/doc.go | 24 + .../clientauthentication/v1beta1/register.go | 55 + .../clientauthentication/v1beta1/types.go | 59 + .../v1beta1/zz_generated.conversion.go | 142 + .../v1beta1/zz_generated.deepcopy.go | 92 + .../v1beta1/zz_generated.defaults.go | 32 + .../zz_generated.deepcopy.go | 128 + vendor/k8s.io/client-go/pkg/version/base.go | 63 + vendor/k8s.io/client-go/pkg/version/doc.go | 21 + .../k8s.io/client-go/pkg/version/version.go | 42 + .../plugin/pkg/client/auth/exec/exec.go | 360 + vendor/k8s.io/client-go/rest/client.go | 258 + vendor/k8s.io/client-go/rest/config.go | 564 + vendor/k8s.io/client-go/rest/plugin.go | 73 + vendor/k8s.io/client-go/rest/request.go | 1227 + vendor/k8s.io/client-go/rest/transport.go | 120 + vendor/k8s.io/client-go/rest/url_utils.go | 97 + vendor/k8s.io/client-go/rest/urlbackoff.go | 107 + vendor/k8s.io/client-go/rest/watch/decoder.go | 72 + vendor/k8s.io/client-go/rest/watch/encoder.go | 56 + .../client-go/rest/zz_generated.deepcopy.go | 57 + vendor/k8s.io/client-go/testing/actions.go | 671 + vendor/k8s.io/client-go/testing/fake.go | 216 + vendor/k8s.io/client-go/testing/fixture.go | 570 + .../k8s.io/client-go/tools/auth/clientauth.go | 126 + .../client-go/tools/cache/controller.go | 383 + .../client-go/tools/cache/delta_fifo.go | 642 + vendor/k8s.io/client-go/tools/cache/doc.go | 24 + .../client-go/tools/cache/expiration_cache.go | 215 + .../tools/cache/expiration_cache_fakes.go | 57 + .../tools/cache/fake_custom_store.go | 102 + vendor/k8s.io/client-go/tools/cache/fifo.go | 359 + vendor/k8s.io/client-go/tools/cache/heap.go | 325 + vendor/k8s.io/client-go/tools/cache/index.go | 98 + .../k8s.io/client-go/tools/cache/listers.go | 183 + .../k8s.io/client-go/tools/cache/listwatch.go | 114 + .../client-go/tools/cache/mutation_cache.go | 262 + .../tools/cache/mutation_detector.go | 132 + .../k8s.io/client-go/tools/cache/reflector.go | 399 + .../tools/cache/reflector_metrics.go | 102 + .../client-go/tools/cache/shared_informer.go | 701 + vendor/k8s.io/client-go/tools/cache/store.go | 244 + .../tools/cache/thread_safe_store.go | 312 + .../client-go/tools/cache/undelta_store.go | 89 + .../client-go/tools/clientcmd/api/doc.go | 19 + .../client-go/tools/clientcmd/api/helpers.go | 188 + .../tools/clientcmd/api/latest/latest.go | 61 + .../client-go/tools/clientcmd/api/register.go | 46 + .../client-go/tools/clientcmd/api/types.go | 262 + .../tools/clientcmd/api/v1/conversion.go | 244 + .../client-go/tools/clientcmd/api/v1/doc.go | 19 + .../tools/clientcmd/api/v1/register.go | 56 + .../client-go/tools/clientcmd/api/v1/types.go | 203 + .../clientcmd/api/v1/zz_generated.deepcopy.go | 348 + .../clientcmd/api/zz_generated.deepcopy.go | 324 + .../client-go/tools/clientcmd/auth_loaders.go | 111 + .../tools/clientcmd/client_config.go | 561 + .../client-go/tools/clientcmd/config.go | 490 + .../k8s.io/client-go/tools/clientcmd/doc.go | 37 + .../k8s.io/client-go/tools/clientcmd/flag.go | 49 + .../client-go/tools/clientcmd/helpers.go | 35 + .../client-go/tools/clientcmd/loader.go | 649 + .../tools/clientcmd/merged_client_builder.go | 173 + .../client-go/tools/clientcmd/overrides.go | 247 + .../client-go/tools/clientcmd/validation.go | 299 + .../tools/leaderelection/healthzadaptor.go | 69 + .../tools/leaderelection/leaderelection.go | 397 + .../client-go/tools/leaderelection/metrics.go | 109 + .../resourcelock/configmaplock.go | 112 + .../resourcelock/endpointslock.go | 107 + .../leaderelection/resourcelock/interface.go | 126 + .../leaderelection/resourcelock/leaselock.go | 124 + .../k8s.io/client-go/tools/metrics/metrics.go | 61 + vendor/k8s.io/client-go/tools/pager/pager.go | 231 + vendor/k8s.io/client-go/tools/record/doc.go | 18 + vendor/k8s.io/client-go/tools/record/event.go | 367 + .../client-go/tools/record/events_cache.go | 508 + vendor/k8s.io/client-go/tools/record/fake.go | 58 + .../client-go/tools/record/util/util.go | 44 + .../k8s.io/client-go/tools/reference/ref.go | 109 + vendor/k8s.io/client-go/transport/cache.go | 123 + vendor/k8s.io/client-go/transport/config.go | 136 + .../client-go/transport/round_trippers.go | 569 + .../client-go/transport/token_source.go | 158 + .../k8s.io/client-go/transport/transport.go | 245 + vendor/k8s.io/client-go/util/cert/cert.go | 206 + vendor/k8s.io/client-go/util/cert/csr.go | 75 + vendor/k8s.io/client-go/util/cert/io.go | 98 + vendor/k8s.io/client-go/util/cert/pem.go | 61 + .../util/connrotation/connrotation.go | 105 + .../client-go/util/flowcontrol/backoff.go | 149 + .../client-go/util/flowcontrol/throttle.go | 159 + .../k8s.io/client-go/util/homedir/homedir.go | 92 + vendor/k8s.io/client-go/util/keyutil/key.go | 323 + vendor/k8s.io/client-go/util/retry/util.go | 84 + .../util/workqueue/default_rate_limiters.go | 211 + .../util/workqueue/delaying_queue.go | 261 + vendor/k8s.io/client-go/util/workqueue/doc.go | 26 + .../client-go/util/workqueue/metrics.go | 268 + .../client-go/util/workqueue/parallelizer.go | 63 + .../k8s.io/client-go/util/workqueue/queue.go | 212 + .../util/workqueue/rate_limiting_queue.go | 69 + .../.github/PULL_REQUEST_TEMPLATE.md | 2 + vendor/k8s.io/code-generator/CONTRIBUTING.md | 7 + .../k8s.io/code-generator/Godeps/Godeps.json | 234 + vendor/k8s.io/code-generator/Godeps/Readme | 5 + vendor/k8s.io/code-generator/LICENSE | 202 + vendor/k8s.io/code-generator/README.md | 24 + .../k8s.io/code-generator/SECURITY_CONTACTS | 17 + .../HyphenGroup/apis/example/v1/doc.go | 21 + .../HyphenGroup/apis/example/v1/register.go | 59 + .../HyphenGroup/apis/example/v1/types.go | 74 + .../apis/example/v1/zz_generated.deepcopy.go | 177 + .../apis/example/v1/zz_generated.defaults.go | 32 + .../clientset/versioned/clientset.go | 97 + .../HyphenGroup/clientset/versioned/doc.go | 20 + .../versioned/fake/clientset_generated.go | 82 + .../clientset/versioned/fake/doc.go | 20 + .../clientset/versioned/fake/register.go | 56 + .../clientset/versioned/scheme/doc.go | 20 + .../clientset/versioned/scheme/register.go | 56 + .../typed/example/v1/clustertesttype.go | 210 + .../versioned/typed/example/v1/doc.go | 20 + .../typed/example/v1/example_client.go | 94 + .../versioned/typed/example/v1/fake/doc.go | 20 + .../example/v1/fake/fake_clustertesttype.go | 152 + .../example/v1/fake/fake_example_client.go | 44 + .../typed/example/v1/fake/fake_testtype.go | 140 + .../typed/example/v1/generated_expansion.go | 23 + .../versioned/typed/example/v1/testtype.go | 191 + .../externalversions/example/interface.go | 46 + .../example/v1/clustertesttype.go | 88 + .../externalversions/example/v1/interface.go | 52 + .../externalversions/example/v1/testtype.go | 89 + .../informers/externalversions/factory.go | 180 + .../informers/externalversions/generic.go | 64 + .../internalinterfaces/factory_interfaces.go | 40 + .../listers/example/v1/clustertesttype.go | 65 + .../listers/example/v1/expansion_generated.go | 31 + .../listers/example/v1/testtype.go | 94 + .../MixedCase/apis/example/v1/doc.go | 20 + .../MixedCase/apis/example/v1/register.go | 59 + .../MixedCase/apis/example/v1/types.go | 74 + .../apis/example/v1/zz_generated.deepcopy.go | 177 + .../apis/example/v1/zz_generated.defaults.go | 32 + .../clientset/versioned/clientset.go | 97 + .../MixedCase/clientset/versioned/doc.go | 20 + .../versioned/fake/clientset_generated.go | 82 + .../MixedCase/clientset/versioned/fake/doc.go | 20 + .../clientset/versioned/fake/register.go | 56 + .../clientset/versioned/scheme/doc.go | 20 + .../clientset/versioned/scheme/register.go | 56 + .../typed/example/v1/clustertesttype.go | 210 + .../versioned/typed/example/v1/doc.go | 20 + .../typed/example/v1/example_client.go | 94 + .../versioned/typed/example/v1/fake/doc.go | 20 + .../example/v1/fake/fake_clustertesttype.go | 152 + .../example/v1/fake/fake_example_client.go | 44 + .../typed/example/v1/fake/fake_testtype.go | 140 + .../typed/example/v1/generated_expansion.go | 23 + .../versioned/typed/example/v1/testtype.go | 191 + .../externalversions/example/interface.go | 46 + .../example/v1/clustertesttype.go | 88 + .../externalversions/example/v1/interface.go | 52 + .../externalversions/example/v1/testtype.go | 89 + .../informers/externalversions/factory.go | 180 + .../informers/externalversions/generic.go | 64 + .../internalinterfaces/factory_interfaces.go | 40 + .../listers/example/v1/clustertesttype.go | 65 + .../listers/example/v1/expansion_generated.go | 31 + .../MixedCase/listers/example/v1/testtype.go | 94 + .../_examples/apiserver/apis/example/doc.go | 20 + .../apiserver/apis/example/install/install.go | 33 + .../apiserver/apis/example/register.go | 45 + .../_examples/apiserver/apis/example/types.go | 44 + .../apiserver/apis/example/v1/doc.go | 23 + .../apiserver/apis/example/v1/register.go | 59 + .../apiserver/apis/example/v1/types.go | 47 + .../example/v1/zz_generated.conversion.go | 137 + .../apis/example/v1/zz_generated.deepcopy.go | 101 + .../apis/example/v1/zz_generated.defaults.go | 32 + .../apis/example/zz_generated.deepcopy.go | 101 + .../_examples/apiserver/apis/example2/doc.go | 21 + .../apis/example2/install/install.go | 33 + .../apiserver/apis/example2/register.go | 45 + .../apiserver/apis/example2/types.go | 44 + .../apiserver/apis/example2/v1/doc.go | 24 + .../apiserver/apis/example2/v1/register.go | 59 + .../apiserver/apis/example2/v1/types.go | 47 + .../example2/v1/zz_generated.conversion.go | 137 + .../apis/example2/v1/zz_generated.deepcopy.go | 101 + .../apis/example2/v1/zz_generated.defaults.go | 32 + .../apis/example2/zz_generated.deepcopy.go | 101 + .../apiserver/apis/example3.io/doc.go | 21 + .../apis/example3.io/install/install.go | 33 + .../apiserver/apis/example3.io/register.go | 45 + .../apiserver/apis/example3.io/types.go | 44 + .../apiserver/apis/example3.io/v1/doc.go | 24 + .../apiserver/apis/example3.io/v1/register.go | 59 + .../apiserver/apis/example3.io/v1/types.go | 47 + .../example3.io/v1/zz_generated.conversion.go | 137 + .../example3.io/v1/zz_generated.deepcopy.go | 101 + .../example3.io/v1/zz_generated.defaults.go | 32 + .../apis/example3.io/zz_generated.deepcopy.go | 101 + .../clientset/internalversion/clientset.go | 125 + .../clientset/internalversion/doc.go | 20 + .../fake/clientset_generated.go | 96 + .../clientset/internalversion/fake/doc.go | 20 + .../internalversion/fake/register.go | 60 + .../clientset/internalversion/scheme/doc.go | 20 + .../internalversion/scheme/register.go | 45 + .../typed/example/internalversion/doc.go | 20 + .../example/internalversion/example_client.go | 96 + .../typed/example/internalversion/fake/doc.go | 20 + .../fake/fake_example_client.go | 40 + .../internalversion/fake/fake_testtype.go | 140 + .../internalversion/generated_expansion.go | 21 + .../typed/example/internalversion/testtype.go | 191 + .../typed/example2/internalversion/doc.go | 20 + .../internalversion/example2_client.go | 96 + .../example2/internalversion/fake/doc.go | 20 + .../fake/fake_example2_client.go | 40 + .../internalversion/fake/fake_testtype.go | 140 + .../internalversion/generated_expansion.go | 21 + .../example2/internalversion/testtype.go | 191 + .../typed/example3.io/internalversion/doc.go | 20 + .../internalversion/example3.io_client.go | 96 + .../example3.io/internalversion/fake/doc.go | 20 + .../fake/fake_example3.io_client.go | 40 + .../internalversion/fake/fake_testtype.go | 140 + .../internalversion/generated_expansion.go | 21 + .../example3.io/internalversion/testtype.go | 191 + .../clientset/versioned/clientset.go | 125 + .../apiserver/clientset/versioned/doc.go | 20 + .../versioned/fake/clientset_generated.go | 96 + .../apiserver/clientset/versioned/fake/doc.go | 20 + .../clientset/versioned/fake/register.go | 60 + .../clientset/versioned/scheme/doc.go | 20 + .../clientset/versioned/scheme/register.go | 60 + .../versioned/typed/example/v1/doc.go | 20 + .../typed/example/v1/example_client.go | 89 + .../versioned/typed/example/v1/fake/doc.go | 20 + .../example/v1/fake/fake_example_client.go | 40 + .../typed/example/v1/fake/fake_testtype.go | 140 + .../typed/example/v1/generated_expansion.go | 21 + .../versioned/typed/example/v1/testtype.go | 191 + .../versioned/typed/example2/v1/doc.go | 20 + .../typed/example2/v1/example2_client.go | 89 + .../versioned/typed/example2/v1/fake/doc.go | 20 + .../example2/v1/fake/fake_example2_client.go | 40 + .../typed/example2/v1/fake/fake_testtype.go | 140 + .../typed/example2/v1/generated_expansion.go | 21 + .../versioned/typed/example2/v1/testtype.go | 191 + .../versioned/typed/example3.io/v1/doc.go | 20 + .../example3.io/v1/example3.io_client.go | 89 + .../typed/example3.io/v1/fake/doc.go | 20 + .../v1/fake/fake_example3.io_client.go | 40 + .../example3.io/v1/fake/fake_testtype.go | 140 + .../example3.io/v1/generated_expansion.go | 21 + .../typed/example3.io/v1/testtype.go | 191 + .../externalversions/example/interface.go | 46 + .../externalversions/example/v1/interface.go | 45 + .../externalversions/example/v1/testtype.go | 89 + .../externalversions/example2/interface.go | 46 + .../externalversions/example2/v1/interface.go | 45 + .../externalversions/example2/v1/testtype.go | 89 + .../externalversions/example3.io/interface.go | 46 + .../example3.io/v1/interface.go | 45 + .../example3.io/v1/testtype.go | 89 + .../informers/externalversions/factory.go | 192 + .../informers/externalversions/generic.go | 72 + .../internalinterfaces/factory_interfaces.go | 40 + .../internalversion/example/interface.go | 46 + .../example/internalversion/interface.go | 45 + .../example/internalversion/testtype.go | 89 + .../internalversion/example2/interface.go | 46 + .../example2/internalversion/interface.go | 45 + .../example2/internalversion/testtype.go | 89 + .../internalversion/example3.io/interface.go | 46 + .../example3.io/internalversion/interface.go | 45 + .../example3.io/internalversion/testtype.go | 89 + .../informers/internalversion/factory.go | 192 + .../informers/internalversion/generic.go | 72 + .../internalinterfaces/factory_interfaces.go | 40 + .../internalversion/expansion_generated.go | 27 + .../example/internalversion/testtype.go | 94 + .../listers/example/v1/expansion_generated.go | 27 + .../apiserver/listers/example/v1/testtype.go | 94 + .../internalversion/expansion_generated.go | 27 + .../example2/internalversion/testtype.go | 94 + .../example2/v1/expansion_generated.go | 27 + .../apiserver/listers/example2/v1/testtype.go | 94 + .../internalversion/expansion_generated.go | 27 + .../example3.io/internalversion/testtype.go | 94 + .../example3.io/v1/expansion_generated.go | 27 + .../listers/example3.io/v1/testtype.go | 94 + .../apiserver/openapi/zz_generated.openapi.go | 2635 + .../_examples/crd/apis/example/v1/doc.go | 21 + .../_examples/crd/apis/example/v1/register.go | 59 + .../_examples/crd/apis/example/v1/types.go | 74 + .../apis/example/v1/zz_generated.deepcopy.go | 177 + .../apis/example/v1/zz_generated.defaults.go | 32 + .../_examples/crd/apis/example2/v1/doc.go | 22 + .../crd/apis/example2/v1/register.go | 59 + .../_examples/crd/apis/example2/v1/types.go | 47 + .../apis/example2/v1/zz_generated.deepcopy.go | 101 + .../apis/example2/v1/zz_generated.defaults.go | 32 + .../crd/clientset/versioned/clientset.go | 111 + .../_examples/crd/clientset/versioned/doc.go | 20 + .../versioned/fake/clientset_generated.go | 89 + .../crd/clientset/versioned/fake/doc.go | 20 + .../crd/clientset/versioned/fake/register.go | 58 + .../crd/clientset/versioned/scheme/doc.go | 20 + .../clientset/versioned/scheme/register.go | 58 + .../typed/example/v1/clustertesttype.go | 210 + .../versioned/typed/example/v1/doc.go | 20 + .../typed/example/v1/example_client.go | 94 + .../versioned/typed/example/v1/fake/doc.go | 20 + .../example/v1/fake/fake_clustertesttype.go | 152 + .../example/v1/fake/fake_example_client.go | 44 + .../typed/example/v1/fake/fake_testtype.go | 140 + .../typed/example/v1/generated_expansion.go | 23 + .../versioned/typed/example/v1/testtype.go | 191 + .../versioned/typed/example2/v1/doc.go | 20 + .../typed/example2/v1/example2_client.go | 89 + .../versioned/typed/example2/v1/fake/doc.go | 20 + .../example2/v1/fake/fake_example2_client.go | 40 + .../typed/example2/v1/fake/fake_testtype.go | 140 + .../typed/example2/v1/generated_expansion.go | 21 + .../versioned/typed/example2/v1/testtype.go | 191 + .../externalversions/example/interface.go | 46 + .../example/v1/clustertesttype.go | 88 + .../externalversions/example/v1/interface.go | 52 + .../externalversions/example/v1/testtype.go | 89 + .../externalversions/example2/interface.go | 46 + .../externalversions/example2/v1/interface.go | 45 + .../externalversions/example2/v1/testtype.go | 89 + .../crd/informers/externalversions/factory.go | 186 + .../crd/informers/externalversions/generic.go | 69 + .../internalinterfaces/factory_interfaces.go | 40 + .../crd/listers/example/v1/clustertesttype.go | 65 + .../listers/example/v1/expansion_generated.go | 31 + .../crd/listers/example/v1/testtype.go | 94 + .../example2/v1/expansion_generated.go | 27 + .../crd/listers/example2/v1/testtype.go | 94 + .../code-generator/cmd/client-gen/README.md | 4 + .../cmd/client-gen/args/args.go | 120 + .../cmd/client-gen/args/gvpackages.go | 183 + .../cmd/client-gen/args/gvtype.go | 110 + .../client-gen/generators/client_generator.go | 403 + .../generators/fake/fake_client_generator.go | 130 + .../fake/generator_fake_for_clientset.go | 174 + .../fake/generator_fake_for_group.go | 130 + .../fake/generator_fake_for_type.go | 479 + .../generators/generator_for_clientset.go | 183 + .../generators/generator_for_expansion.go | 54 + .../generators/generator_for_group.go | 246 + .../generators/generator_for_type.go | 599 + .../generators/scheme/generator_for_scheme.go | 186 + .../cmd/client-gen/generators/util/tags.go | 341 + .../code-generator/cmd/client-gen/main.go | 66 + .../cmd/client-gen/path/path.go | 31 + .../cmd/client-gen/types/helpers.go | 121 + .../cmd/client-gen/types/types.go | 75 + .../cmd/conversion-gen/args/args.go | 83 + .../conversion-gen/generators/conversion.go | 984 + .../code-generator/cmd/conversion-gen/main.go | 116 + .../cmd/deepcopy-gen/args/args.go | 54 + .../code-generator/cmd/deepcopy-gen/main.go | 85 + .../cmd/defaulter-gen/args/args.go | 54 + .../code-generator/cmd/defaulter-gen/main.go | 84 + .../cmd/go-to-protobuf/.gitignore | 1 + .../code-generator/cmd/go-to-protobuf/main.go | 39 + .../cmd/go-to-protobuf/protobuf/cmd.go | 428 + .../cmd/go-to-protobuf/protobuf/generator.go | 773 + .../go-to-protobuf/protobuf/import_tracker.go | 50 + .../cmd/go-to-protobuf/protobuf/namer.go | 208 + .../cmd/go-to-protobuf/protobuf/package.go | 215 + .../cmd/go-to-protobuf/protobuf/parser.go | 452 + .../cmd/go-to-protobuf/protobuf/tags.go | 33 + .../go-to-protobuf/protoc-gen-gogo/main.go | 32 + .../code-generator/cmd/import-boss/.gitignore | 1 + .../code-generator/cmd/import-boss/main.go | 96 + .../cmd/informer-gen/args/args.go | 77 + .../cmd/informer-gen/generators/factory.go | 258 + .../generators/factoryinterface.go | 90 + .../cmd/informer-gen/generators/generic.go | 184 + .../informer-gen/generators/groupinterface.go | 118 + .../cmd/informer-gen/generators/informer.go | 186 + .../cmd/informer-gen/generators/packages.go | 352 + .../cmd/informer-gen/generators/types.go | 42 + .../generators/versioninterface.go | 109 + .../code-generator/cmd/informer-gen/main.go | 63 + .../cmd/lister-gen/.import-restrictions | 1 + .../cmd/lister-gen/args/args.go | 56 + .../cmd/lister-gen/generators/expansion.go | 67 + .../cmd/lister-gen/generators/lister.go | 371 + .../code-generator/cmd/lister-gen/main.go | 60 + .../code-generator/cmd/openapi-gen/main.go | 57 + .../cmd/register-gen/args/args.go | 39 + .../cmd/register-gen/generators/packages.go | 137 + .../generators/register_external.go | 117 + .../code-generator/cmd/register-gen/main.go | 53 + .../code-generator/cmd/set-gen/.gitignore | 1 + .../k8s.io/code-generator/cmd/set-gen/main.go | 56 + .../k8s.io/code-generator/code-of-conduct.md | 3 + .../k8s.io/code-generator/generate-groups.sh | 92 + .../generate-internal-groups.sh | 122 + vendor/k8s.io/code-generator/go.mod | 29 + vendor/k8s.io/code-generator/go.sum | 123 + .../code-generator/hack/boilerplate.go.txt | 16 + .../code-generator/hack/update-codegen.sh | 47 + .../code-generator/hack/verify-codegen.sh | 55 + .../code-generator/pkg/namer/tag-override.go | 58 + .../k8s.io/code-generator/pkg/util/build.go | 61 + .../third_party/forked/golang/reflect/type.go | 91 + vendor/k8s.io/code-generator/tools.go | 35 + vendor/k8s.io/gengo/LICENSE | 202 + vendor/k8s.io/gengo/args/args.go | 199 + .../deepcopy-gen/generators/deepcopy.go | 924 + .../defaulter-gen/generators/defaulter.go | 828 + .../gengo/examples/set-gen/sets/byte.go | 203 + .../k8s.io/gengo/examples/set-gen/sets/doc.go | 20 + .../gengo/examples/set-gen/sets/empty.go | 23 + .../k8s.io/gengo/examples/set-gen/sets/int.go | 203 + .../gengo/examples/set-gen/sets/int64.go | 203 + .../gengo/examples/set-gen/sets/string.go | 203 + .../gengo/generator/default_generator.go | 62 + .../k8s.io/gengo/generator/default_package.go | 72 + vendor/k8s.io/gengo/generator/doc.go | 31 + .../k8s.io/gengo/generator/error_tracker.go | 50 + vendor/k8s.io/gengo/generator/execute.go | 312 + vendor/k8s.io/gengo/generator/generator.go | 219 + .../k8s.io/gengo/generator/import_tracker.go | 64 + .../k8s.io/gengo/generator/snippet_writer.go | 154 + vendor/k8s.io/gengo/namer/doc.go | 31 + vendor/k8s.io/gengo/namer/import_tracker.go | 112 + vendor/k8s.io/gengo/namer/namer.go | 383 + vendor/k8s.io/gengo/namer/order.go | 69 + vendor/k8s.io/gengo/namer/plural_namer.go | 120 + vendor/k8s.io/gengo/parser/doc.go | 19 + vendor/k8s.io/gengo/parser/parse.go | 813 + vendor/k8s.io/gengo/types/comments.go | 82 + vendor/k8s.io/gengo/types/doc.go | 19 + vendor/k8s.io/gengo/types/flatten.go | 57 + vendor/k8s.io/gengo/types/types.go | 499 + vendor/k8s.io/klog/LICENSE | 191 + vendor/k8s.io/klog/klog.go | 1241 + vendor/k8s.io/klog/klog_file.go | 126 + vendor/k8s.io/kube-openapi/LICENSE | 202 + .../k8s.io/kube-openapi/pkg/util/proto/doc.go | 19 + .../kube-openapi/pkg/util/proto/document.go | 318 + .../kube-openapi/pkg/util/proto/openapi.go | 278 + vendor/k8s.io/utils/LICENSE | 202 + vendor/k8s.io/utils/buffer/ring_growing.go | 72 + vendor/k8s.io/utils/inotify/LICENSE | 27 + vendor/k8s.io/utils/inotify/PATENTS | 22 + vendor/k8s.io/utils/integer/integer.go | 73 + vendor/k8s.io/utils/pointer/pointer.go | 86 + .../utils/third_party/forked/golang/LICENSE | 27 + .../utils/third_party/forked/golang/PATENTS | 22 + vendor/k8s.io/utils/trace/trace.go | 131 + vendor/knative.dev/pkg/.gitattributes | 9 + .../PULL_REQUEST_TEMPLATE/breaking-change.md | 22 + .../.github/PULL_REQUEST_TEMPLATE/bug-fix.md | 10 + .../PULL_REQUEST_TEMPLATE/normal-change.md | 8 + .../knative.dev/pkg/.github/issue-template.md | 32 + vendor/knative.dev/pkg/.gitignore | 17 + vendor/knative.dev/pkg/CONTRIBUTING.md | 5 + vendor/knative.dev/pkg/DEVELOPMENT.md | 70 + vendor/knative.dev/pkg/Gopkg.lock | 1550 + vendor/knative.dev/pkg/Gopkg.toml | 98 + vendor/knative.dev/pkg/LICENSE | 201 + vendor/knative.dev/pkg/OWNERS_ALIASES | 69 + vendor/knative.dev/pkg/README.md | 13 + vendor/knative.dev/pkg/RELEASING.md | 100 + .../storageversion/cmd/migrate/config.go | 76 + .../storageversion/cmd/migrate/main.go | 84 + .../apiextensions/storageversion/migrator.go | 120 + vendor/knative.dev/pkg/apis/condition_set.go | 445 + .../knative.dev/pkg/apis/condition_types.go | 125 + vendor/knative.dev/pkg/apis/contexts.go | 213 + vendor/knative.dev/pkg/apis/convert.go | 47 + vendor/knative.dev/pkg/apis/deprecated.go | 180 + vendor/knative.dev/pkg/apis/doc.go | 18 + vendor/knative.dev/pkg/apis/duck/ABOUT.md | 325 + vendor/knative.dev/pkg/apis/duck/README.md | 128 + vendor/knative.dev/pkg/apis/duck/cached.go | 72 + vendor/knative.dev/pkg/apis/duck/const.go | 33 + vendor/knative.dev/pkg/apis/duck/doc.go | 23 + vendor/knative.dev/pkg/apis/duck/enqueue.go | 44 + .../pkg/apis/duck/images/Knative-Duck0.png | Bin 0 -> 135014 bytes vendor/knative.dev/pkg/apis/duck/interface.go | 69 + vendor/knative.dev/pkg/apis/duck/patch.go | 73 + vendor/knative.dev/pkg/apis/duck/proxy.go | 74 + vendor/knative.dev/pkg/apis/duck/register.go | 21 + vendor/knative.dev/pkg/apis/duck/typed.go | 139 + .../knative.dev/pkg/apis/duck/unstructured.go | 62 + .../pkg/apis/duck/v1/addressable_types.go | 115 + .../pkg/apis/duck/v1/destination.go | 79 + vendor/knative.dev/pkg/apis/duck/v1/doc.go | 23 + .../pkg/apis/duck/v1/knative_reference.go | 88 + .../pkg/apis/duck/v1/podspec_types.go | 93 + .../knative.dev/pkg/apis/duck/v1/register.go | 59 + .../pkg/apis/duck/v1/source_types.go | 175 + .../pkg/apis/duck/v1/status_types.go | 156 + .../pkg/apis/duck/v1/zz_generated.deepcopy.go | 519 + .../apis/duck/v1alpha1/addressable_types.go | 158 + .../pkg/apis/duck/v1alpha1/binding_types.go | 92 + .../knative.dev/pkg/apis/duck/v1alpha1/doc.go | 23 + .../duck/v1alpha1/legacy_targetable_types.go | 96 + .../pkg/apis/duck/v1alpha1/register.go | 57 + .../duck/v1alpha1/retired_targetable_types.go | 100 + .../duck/v1alpha1/zz_generated.deepcopy.go | 373 + .../apis/duck/v1beta1/addressable_types.go | 128 + .../pkg/apis/duck/v1beta1/destination.go | 161 + .../knative.dev/pkg/apis/duck/v1beta1/doc.go | 23 + .../pkg/apis/duck/v1beta1/register.go | 55 + .../pkg/apis/duck/v1beta1/source_types.go | 156 + .../pkg/apis/duck/v1beta1/status_types.go | 141 + .../duck/v1beta1/zz_generated.deepcopy.go | 388 + vendor/knative.dev/pkg/apis/duck/verify.go | 113 + vendor/knative.dev/pkg/apis/field_error.go | 388 + vendor/knative.dev/pkg/apis/interfaces.go | 66 + vendor/knative.dev/pkg/apis/kind2resource.go | 47 + .../pkg/apis/metadata_validation.go | 89 + .../pkg/apis/test/example/register.go | 21 + .../pkg/apis/test/example/v1alpha1/doc.go | 19 + .../apis/test/example/v1alpha1/fiz_types.go | 94 + .../apis/test/example/v1alpha1/foo_types.go | 93 + .../apis/test/example/v1alpha1/register.go | 52 + .../example/v1alpha1/zz_generated.deepcopy.go | 213 + .../knative.dev/pkg/apis/test/pub/register.go | 21 + .../pkg/apis/test/pub/v1alpha1/bar_types.go | 93 + .../pkg/apis/test/pub/v1alpha1/doc.go | 19 + .../pkg/apis/test/pub/v1alpha1/register.go | 52 + .../pub/v1alpha1/zz_generated.deepcopy.go | 119 + .../pkg/apis/testing/conditions.go | 60 + .../pkg/apis/testing/fuzzer/fuzzer.go | 103 + .../pkg/apis/testing/roundtrip/roundtrip.go | 256 + vendor/knative.dev/pkg/apis/url.go | 140 + vendor/knative.dev/pkg/apis/volatile_time.go | 46 + .../pkg/apis/zz_generated.deepcopy.go | 130 + vendor/knative.dev/pkg/changeset/commit.go | 66 + vendor/knative.dev/pkg/changeset/doc.go | 23 + .../knative.dev/pkg/changeset/testdata/HEAD | 1 + .../pkg/changeset/testdata/garbage/HEAD | 1 + .../pkg/changeset/testdata/noncommitted/HEAD | 1 + .../pkg/changeset/testdata/with-refs/HEAD | 1 + .../testdata/with-refs/refs/heads/branch-name | 1 + .../injection/apiextensions/client/client.go | 49 + .../apiextensions/client/fake/fake.go | 54 + .../customresourcedefinition.go | 52 + .../customresourcedefinition/fake/fake.go | 40 + .../informers/factory/factory.go | 56 + .../informers/factory/fake/fake.go | 45 + .../customresourcedefinition/controller.go | 97 + .../customresourcedefinition/reconciler.go | 339 + .../stub/controller.go | 54 + .../stub/reconciler.go | 66 + .../pkg/client/injection/client/client.go | 19 + .../pkg/client/injection/client/fake/fake.go | 19 + .../ducks/duck/v1/addressable/addressable.go | 60 + .../ducks/duck/v1/addressable/fake/fake.go | 30 + .../ducks/duck/v1/conditions/conditions.go | 60 + .../ducks/duck/v1/conditions/fake/fake.go | 30 + .../ducks/duck/v1/podspecable/fake/fake.go | 30 + .../ducks/duck/v1/podspecable/podspecable.go | 60 + .../ducks/duck/v1/source/fake/fake.go | 30 + .../injection/ducks/duck/v1/source/source.go | 60 + .../duck/v1alpha1/addressable/addressable.go | 60 + .../duck/v1alpha1/addressable/fake/fake.go | 30 + .../ducks/duck/v1alpha1/binding/binding.go | 60 + .../ducks/duck/v1alpha1/binding/fake/fake.go | 30 + .../v1alpha1/legacytargetable/fake/fake.go | 30 + .../legacytargetable/legacytargetable.go | 60 + .../duck/v1alpha1/targetable/fake/fake.go | 30 + .../duck/v1alpha1/targetable/targetable.go | 60 + .../duck/v1beta1/addressable/addressable.go | 60 + .../duck/v1beta1/addressable/fake/fake.go | 30 + .../duck/v1beta1/conditions/conditions.go | 60 + .../duck/v1beta1/conditions/fake/fake.go | 30 + .../ducks/duck/v1beta1/source/fake/fake.go | 30 + .../ducks/duck/v1beta1/source/source.go | 60 + .../injection/informers/factory/factory.go | 19 + .../injection/informers/factory/fake/fake.go | 19 + .../client/injection/kube/client/client.go | 49 + .../client/injection/kube/client/fake/fake.go | 54 + .../mutatingwebhookconfiguration/fake/fake.go | 40 + .../mutatingwebhookconfiguration.go | 52 + .../fake/fake.go | 40 + .../validatingwebhookconfiguration.go | 52 + .../controllerrevision/controllerrevision.go | 52 + .../apps/v1/controllerrevision/fake/fake.go | 40 + .../informers/apps/v1/daemonset/daemonset.go | 52 + .../informers/apps/v1/daemonset/fake/fake.go | 40 + .../apps/v1/deployment/deployment.go | 52 + .../informers/apps/v1/deployment/fake/fake.go | 40 + .../informers/apps/v1/replicaset/fake/fake.go | 40 + .../apps/v1/replicaset/replicaset.go | 52 + .../apps/v1/statefulset/fake/fake.go | 40 + .../apps/v1/statefulset/statefulset.go | 52 + .../v1/horizontalpodautoscaler/fake/fake.go | 40 + .../horizontalpodautoscaler.go | 52 + .../horizontalpodautoscaler/fake/fake.go | 40 + .../horizontalpodautoscaler.go | 52 + .../kube/informers/batch/v1/job/fake/fake.go | 40 + .../kube/informers/batch/v1/job/job.go | 52 + .../batch/v1beta1/cronjob/cronjob.go | 52 + .../batch/v1beta1/cronjob/fake/fake.go | 40 + .../v1/componentstatus/componentstatus.go | 52 + .../core/v1/componentstatus/fake/fake.go | 40 + .../informers/core/v1/configmap/configmap.go | 52 + .../informers/core/v1/configmap/fake/fake.go | 40 + .../informers/core/v1/endpoints/endpoints.go | 52 + .../informers/core/v1/endpoints/fake/fake.go | 40 + .../kube/informers/core/v1/event/event.go | 52 + .../kube/informers/core/v1/event/fake/fake.go | 40 + .../informers/core/v1/limitrange/fake/fake.go | 40 + .../core/v1/limitrange/limitrange.go | 52 + .../informers/core/v1/namespace/fake/fake.go | 40 + .../informers/core/v1/namespace/namespace.go | 52 + .../kube/informers/core/v1/node/fake/fake.go | 40 + .../kube/informers/core/v1/node/node.go | 52 + .../core/v1/persistentvolume/fake/fake.go | 40 + .../v1/persistentvolume/persistentvolume.go | 52 + .../v1/persistentvolumeclaim/fake/fake.go | 40 + .../persistentvolumeclaim.go | 52 + .../kube/informers/core/v1/pod/fake/fake.go | 40 + .../kube/informers/core/v1/pod/pod.go | 52 + .../core/v1/podtemplate/fake/fake.go | 40 + .../core/v1/podtemplate/podtemplate.go | 52 + .../v1/replicationcontroller/fake/fake.go | 40 + .../replicationcontroller.go | 52 + .../core/v1/resourcequota/fake/fake.go | 40 + .../core/v1/resourcequota/resourcequota.go | 52 + .../informers/core/v1/secret/fake/fake.go | 40 + .../kube/informers/core/v1/secret/secret.go | 52 + .../informers/core/v1/service/fake/fake.go | 40 + .../kube/informers/core/v1/service/service.go | 52 + .../core/v1/serviceaccount/fake/fake.go | 40 + .../core/v1/serviceaccount/serviceaccount.go | 52 + .../kube/informers/factory/factory.go | 56 + .../kube/informers/factory/fake/fake.go | 45 + .../rbac/v1/clusterrole/clusterrole.go | 52 + .../rbac/v1/clusterrole/fake/fake.go | 40 + .../clusterrolebinding/clusterrolebinding.go | 52 + .../rbac/v1/clusterrolebinding/fake/fake.go | 40 + .../kube/informers/rbac/v1/role/fake/fake.go | 40 + .../kube/informers/rbac/v1/role/role.go | 52 + .../rbac/v1/rolebinding/fake/fake.go | 40 + .../rbac/v1/rolebinding/rolebinding.go | 52 + .../core/v1/namespace/controller.go | 95 + .../core/v1/namespace/reconciler.go | 338 + .../core/v1/namespace/stub/controller.go | 54 + .../core/v1/namespace/stub/reconciler.go | 65 + vendor/knative.dev/pkg/code-of-conduct.md | 75 + .../codegen/cmd/injection-gen/args/args.go | 65 + .../cmd/injection-gen/generators/client.go | 106 + .../cmd/injection-gen/generators/duck.go | 134 + .../cmd/injection-gen/generators/factory.go | 118 + .../injection-gen/generators/fakeclient.go | 115 + .../cmd/injection-gen/generators/fakeduck.go | 104 + .../injection-gen/generators/fakefactory.go | 109 + .../injection-gen/generators/fakeinformer.go | 117 + .../cmd/injection-gen/generators/informer.go | 127 + .../injection-gen/generators/namesystems.go | 101 + .../cmd/injection-gen/generators/packages.go | 612 + .../generators/reconciler_controller.go | 219 + .../generators/reconciler_controller_stub.go | 147 + .../generators/reconciler_reconciler.go | 496 + .../generators/reconciler_reconciler_stub.go | 134 + .../pkg/codegen/cmd/injection-gen/main.go | 59 + vendor/knative.dev/pkg/configmap/doc.go | 21 + vendor/knative.dev/pkg/configmap/filter.go | 74 + .../pkg/configmap/informed_watcher.go | 214 + vendor/knative.dev/pkg/configmap/load.go | 58 + .../pkg/configmap/manual_watcher.go | 70 + .../pkg/configmap/static_watcher.go | 58 + vendor/knative.dev/pkg/configmap/store.go | 165 + .../pkg/configmap/testing/configmap.go | 98 + vendor/knative.dev/pkg/configmap/watcher.go | 49 + .../knative.dev/pkg/controller/controller.go | 584 + vendor/knative.dev/pkg/controller/helper.go | 52 + vendor/knative.dev/pkg/controller/options.go | 31 + .../pkg/controller/stats_reporter.go | 250 + .../controller/testing/fake_stats_reporter.go | 65 + .../pkg/hack/boilerplate/boilerplate.go.txt | 15 + .../knative.dev/pkg/hack/generate-knative.sh | 99 + vendor/knative.dev/pkg/hack/update-codegen.sh | 79 + vendor/knative.dev/pkg/hack/update-deps.sh | 48 + vendor/knative.dev/pkg/hack/verify-codegen.sh | 79 + vendor/knative.dev/pkg/injection/README.md | 477 + vendor/knative.dev/pkg/injection/clients.go | 42 + .../clients/dynamicclient/dynamicclient.go | 49 + .../clients/dynamicclient/fake/fake.go | 53 + .../informers/core/v1/secret/fake/fake.go | 38 + .../informers/core/v1/secret/secret.go | 50 + .../informers/factory/factory.go | 53 + .../informers/factory/fake/fake.go | 42 + vendor/knative.dev/pkg/injection/context.go | 49 + vendor/knative.dev/pkg/injection/doc.go | 105 + vendor/knative.dev/pkg/injection/ducks.go | 40 + vendor/knative.dev/pkg/injection/factories.go | 40 + vendor/knative.dev/pkg/injection/informers.go | 74 + vendor/knative.dev/pkg/injection/interface.go | 91 + .../pkg/injection/sharedmain/main.go | 480 + vendor/knative.dev/pkg/kmeta/accessor.go | 75 + vendor/knative.dev/pkg/kmeta/doc.go | 19 + vendor/knative.dev/pkg/kmeta/labels.go | 114 + vendor/knative.dev/pkg/kmeta/map.go | 54 + vendor/knative.dev/pkg/kmeta/names.go | 64 + .../knative.dev/pkg/kmeta/owner_references.go | 38 + .../pkg/kmeta/ownerrefable_accessor.go | 25 + vendor/knative.dev/pkg/kmp/diff.go | 92 + vendor/knative.dev/pkg/kmp/doc.go | 19 + vendor/knative.dev/pkg/kmp/reporters.go | 148 + vendor/knative.dev/pkg/kvstore/kvstore.go | 35 + vendor/knative.dev/pkg/kvstore/kvstore_cm.go | 123 + .../knative.dev/pkg/leaderelection/config.go | 156 + vendor/knative.dev/pkg/logging/config.go | 272 + vendor/knative.dev/pkg/logging/logger.go | 57 + .../pkg/logging/logkey/constants.go | 65 + .../knative.dev/pkg/logging/testing/util.go | 45 + .../pkg/logging/zz_generated.deepcopy.go | 48 + vendor/knative.dev/pkg/metrics/README.md | 107 + vendor/knative.dev/pkg/metrics/client.go | 62 + vendor/knative.dev/pkg/metrics/config.go | 342 + .../pkg/metrics/config_observability.go | 109 + vendor/knative.dev/pkg/metrics/doc.go | 16 + vendor/knative.dev/pkg/metrics/exporter.go | 253 + .../knative.dev/pkg/metrics/gcp_metadata.go | 53 + vendor/knative.dev/pkg/metrics/memstats.go | 539 + vendor/knative.dev/pkg/metrics/metrics.go | 173 + .../pkg/metrics/metricskey/constants.go | 47 + .../metrics/metricskey/constants_eventing.go | 104 + .../metrics/metricskey/constants_serving.go | 72 + .../pkg/metrics/metricstest/metricstest.go | 196 + .../pkg/metrics/monitored_resources.go | 34 + .../metrics/monitored_resources_eventing.go | 159 + .../metrics/monitored_resources_serving.go | 73 + .../pkg/metrics/opencensus_exporter.go | 78 + .../pkg/metrics/prometheus_exporter.go | 74 + vendor/knative.dev/pkg/metrics/record.go | 57 + vendor/knative.dev/pkg/metrics/reflector.go | 176 + .../pkg/metrics/stackdriver_exporter.go | 263 + .../pkg/metrics/testdata/README.md | 16 + .../pkg/metrics/testdata/client-cert.pem | 16 + .../pkg/metrics/testdata/client-key.pem | 9 + .../pkg/metrics/testdata/server-cert.pem | 17 + .../pkg/metrics/testdata/server-key.pem | 28 + .../knative.dev/pkg/metrics/testing/config.go | 27 + vendor/knative.dev/pkg/metrics/utils.go | 26 + vendor/knative.dev/pkg/metrics/workqueue.go | 179 + .../pkg/metrics/zz_generated.deepcopy.go | 37 + vendor/knative.dev/pkg/network/doc.go | 19 + vendor/knative.dev/pkg/network/domain.go | 75 + .../knative.dev/pkg/network/error_handler.go | 43 + vendor/knative.dev/pkg/network/h2c.go | 54 + vendor/knative.dev/pkg/network/network.go | 45 + vendor/knative.dev/pkg/network/prober/doc.go | 18 + .../knative.dev/pkg/network/prober/prober.go | 200 + vendor/knative.dev/pkg/network/transports.go | 120 + vendor/knative.dev/pkg/profiling/server.go | 116 + vendor/knative.dev/pkg/ptr/doc.go | 18 + vendor/knative.dev/pkg/ptr/ptr.go | 55 + .../knative.dev/pkg/reconciler/configstore.go | 25 + vendor/knative.dev/pkg/reconciler/events.go | 93 + vendor/knative.dev/pkg/reconciler/filter.go | 100 + vendor/knative.dev/pkg/reconciler/retry.go | 31 + .../pkg/reconciler/testing/actions.go | 76 + .../pkg/reconciler/testing/clock.go | 29 + .../pkg/reconciler/testing/context.go | 45 + .../pkg/reconciler/testing/events.go | 44 + .../testing/generate_name_reactor.go | 84 + .../pkg/reconciler/testing/hooks.go | 183 + .../pkg/reconciler/testing/reactions.go | 66 + .../pkg/reconciler/testing/sorter.go | 93 + .../pkg/reconciler/testing/table.go | 399 + .../pkg/reconciler/testing/tracker.go | 67 + .../pkg/reconciler/testing/util.go | 85 + .../pkg/resolver/addressable_resolver.go | 195 + vendor/knative.dev/pkg/resolver/doc.go | 18 + vendor/knative.dev/pkg/signals/signal.go | 83 + .../knative.dev/pkg/signals/signal_posix.go | 26 + .../knative.dev/pkg/signals/signal_windows.go | 23 + vendor/knative.dev/pkg/source/doc.go | 18 + .../knative.dev/pkg/source/source_labels.go | 29 + .../pkg/source/source_stats_reporter.go | 131 + vendor/knative.dev/pkg/system/clock.go | 32 + vendor/knative.dev/pkg/system/env.go | 59 + .../knative.dev/pkg/system/testing/names.go | 27 + vendor/knative.dev/pkg/test/README.md | 218 + vendor/knative.dev/pkg/test/cleanup.go | 40 + vendor/knative.dev/pkg/test/clients.go | 114 + vendor/knative.dev/pkg/test/cmd/command.go | 150 + vendor/knative.dev/pkg/test/cmd/error.go | 28 + vendor/knative.dev/pkg/test/crd.go | 95 + vendor/knative.dev/pkg/test/e2e_flags.go | 121 + vendor/knative.dev/pkg/test/gcs/gcs.go | 224 + vendor/knative.dev/pkg/test/ghutil/client.go | 156 + .../pkg/test/ghutil/fakeghutil/fakeghutil.go | 388 + vendor/knative.dev/pkg/test/ghutil/issue.go | 254 + .../pkg/test/ghutil/pullrequest.go | 210 + vendor/knative.dev/pkg/test/gke/addon.go | 55 + vendor/knative.dev/pkg/test/gke/client.go | 126 + vendor/knative.dev/pkg/test/gke/endpoint.go | 56 + .../knative.dev/pkg/test/gke/fake/client.go | 205 + .../pkg/test/gke/fake/credentials.json | 6 + vendor/knative.dev/pkg/test/gke/location.go | 44 + vendor/knative.dev/pkg/test/gke/request.go | 170 + vendor/knative.dev/pkg/test/gke/wait.go | 77 + vendor/knative.dev/pkg/test/helpers/dir.go | 62 + vendor/knative.dev/pkg/test/helpers/dryrun.go | 32 + vendor/knative.dev/pkg/test/helpers/error.go | 41 + vendor/knative.dev/pkg/test/helpers/name.go | 99 + .../knative.dev/pkg/test/ingress/ingress.go | 72 + vendor/knative.dev/pkg/test/junit/junit.go | 146 + vendor/knative.dev/pkg/test/kube_checks.go | 178 + .../pkg/test/logging/.gitattributes | 1 + vendor/knative.dev/pkg/test/logging/doc.go | 49 + vendor/knative.dev/pkg/test/logging/error.go | 91 + vendor/knative.dev/pkg/test/logging/logger.go | 76 + .../knative.dev/pkg/test/logging/logging.go | 177 + .../pkg/test/logging/memory_encoder.go | 74 + .../pkg/test/logging/spew_encoder.go | 196 + vendor/knative.dev/pkg/test/logging/sugar.go | 114 + .../knative.dev/pkg/test/logging/tlogger.go | 368 + vendor/knative.dev/pkg/test/logging/zapr.go | 47 + vendor/knative.dev/pkg/test/logstream/doc.go | 21 + .../pkg/test/logstream/interface.go | 52 + .../pkg/test/logstream/kubelogs.go | 182 + vendor/knative.dev/pkg/test/logstream/null.go | 28 + vendor/knative.dev/pkg/test/mako/README.md | 8 + .../pkg/test/mako/alerter/alerter.go | 85 + .../pkg/test/mako/alerter/github/issue.go | 288 + .../pkg/test/mako/alerter/slack/message.go | 129 + vendor/knative.dev/pkg/test/mako/analyzer.go | 35 + .../pkg/test/mako/config/benchmark.go | 75 + .../pkg/test/mako/config/configmap.go | 93 + .../pkg/test/mako/config/environment.go | 66 + .../knative.dev/pkg/test/mako/config/slack.go | 56 + .../mako/config/testdata/config-mako.yaml | 50 + vendor/knative.dev/pkg/test/mako/sidecar.go | 188 + .../pkg/test/mako/stub-sidecar/main.go | 168 + .../test/mako/stub-sidecar/read_results.sh | 74 + vendor/knative.dev/pkg/test/mako/time.go | 26 + vendor/knative.dev/pkg/test/monitoring/doc.go | 32 + .../pkg/test/monitoring/monitoring.go | 85 + .../pkg/test/performance/performance.go | 39 + .../knative.dev/pkg/test/presubmit-tests.sh | 38 + .../pkg/test/prometheus/prometheus.go | 135 + vendor/knative.dev/pkg/test/prow/env.go | 59 + vendor/knative.dev/pkg/test/prow/prow.go | 340 + vendor/knative.dev/pkg/test/request.go | 191 + .../slackutil/fakeslackutil/fakeslackutil.go | 71 + vendor/knative.dev/pkg/test/slackutil/http.go | 53 + .../pkg/test/slackutil/message_read.go | 95 + .../pkg/test/slackutil/message_write.go | 77 + .../pkg/test/spoof/error_checks.go | 53 + vendor/knative.dev/pkg/test/spoof/spoof.go | 281 + .../pkg/test/test-reconciler-codegen.sh | 62 + .../knative.dev/pkg/test/testgrid/testgrid.go | 62 + vendor/knative.dev/pkg/test/tinterface.go | 35 + .../pkg/test/vegeta/pacers/combined_pacer.go | 118 + .../pkg/test/vegeta/pacers/steady_up_pacer.go | 137 + .../coveragecalculator/README.md | 23 + .../coveragecalculator/calculator.go | 77 + .../coveragecalculator/coveragedata.go | 60 + .../coveragecalculator/ignorefields.go | 81 + .../resourcetree/README.md | 60 + .../resourcetree/arraykindnode.go | 71 + .../resourcetree/basictypekindnode.go | 95 + .../webhook-apicoverage/resourcetree/node.go | 69 + .../resourcetree/otherkindnode.go | 53 + .../resourcetree/ptrkindnode.go | 67 + .../resourcetree/resourceforest.go | 80 + .../resourcetree/resourcetree.go | 97 + .../webhook-apicoverage/resourcetree/rule.go | 49 + .../resourcetree/structkindnode.go | 109 + .../resourcetree/test_util.go | 400 + .../resourcetree/timetypenode.go | 57 + .../test/webhook-apicoverage/tools/README.md | 21 + .../test/webhook-apicoverage/tools/tools.go | 249 + .../test/webhook-apicoverage/view/README.md | 45 + .../webhook-apicoverage/view/html_display.go | 68 + .../webhook-apicoverage/view/html_template.go | 111 + .../pkg/test/webhook-apicoverage/view/rule.go | 27 + .../webhook-apicoverage/view/xml_display.go | 42 + .../webhook-apicoverage/view/xml_template.go | 41 + .../webhook-apicoverage/webhook/README.md | 45 + .../webhook/apicoverage_recorder.go | 263 + .../webhook-apicoverage/webhook/webhook.go | 247 + vendor/knative.dev/pkg/test/zipkin/doc.go | 41 + vendor/knative.dev/pkg/test/zipkin/util.go | 189 + vendor/knative.dev/pkg/testing/doc.go | 19 + vendor/knative.dev/pkg/testing/duck/doc.go | 19 + .../knative.dev/pkg/testing/duck/register.go | 42 + .../pkg/testing/duck/testbindable.go | 169 + .../pkg/testing/duck/zz_generated.deepcopy.go | 120 + .../pkg/testing/inner_default_resource.go | 157 + vendor/knative.dev/pkg/testing/register.go | 42 + vendor/knative.dev/pkg/testing/resource.go | 148 + .../pkg/testing/zz_generated.deepcopy.go | 285 + vendor/knative.dev/pkg/testutils/README.md | 9 + .../clustermanager/e2e-tests/boskos/boskos.go | 100 + .../e2e-tests/boskos/fake/fake.go | 83 + .../clustermanager/e2e-tests/client.go | 29 + .../clustermanager/e2e-tests/common/common.go | 51 + .../clustermanager/e2e-tests/config.go | 53 + .../testutils/clustermanager/e2e-tests/doc.go | 22 + .../testutils/clustermanager/e2e-tests/gke.go | 283 + .../clustermanager/e2e-tests/setup.go | 132 + .../clustermanager/e2e-tests/util.go | 87 + .../clustermanager/perf-tests/main.go | 67 + .../perf-tests/pkg/benchmark.go | 157 + .../clustermanager/perf-tests/pkg/cluster.go | 282 + .../pkg/testdir/test-benchmark1/cluster.yaml | 21 + .../pkg/testdir/test-benchmark2/cluster.yaml | 17 + .../pkg/testdir/test-benchmark3/cluster.yaml | 19 + .../pkg/testdir/test-benchmark4/noop.yaml | 16 + .../prow-cluster-operation/README.md | 54 + .../prow-cluster-operation/actions/create.go | 114 + .../prow-cluster-operation/actions/delete.go | 52 + .../prow-cluster-operation/actions/get.go | 31 + .../prow-cluster-operation/main.go | 60 + .../prow-cluster-operation/options/options.go | 64 + .../pkg/testutils/junithelper/README.md | 22 + .../pkg/testutils/junithelper/main.go | 57 + .../pkg/testutils/metahelper/client/client.go | 109 + .../pkg/testutils/metahelper/main.go | 66 + .../knative.dev/pkg/third_party/mako/LICENSE | 204 + .../pkg/third_party/mako/README.md | 5 + .../third_party/mako/proto/quickstore.proto | 76 + .../quickstore_go_proto/quickstore.pb.go | 374 + vendor/knative.dev/pkg/tracing/config/doc.go | 21 + .../knative.dev/pkg/tracing/config/tracing.go | 134 + .../tracing/config/zz_generated.deepcopy.go | 37 + vendor/knative.dev/pkg/tracing/http.go | 55 + vendor/knative.dev/pkg/tracing/opencensus.go | 171 + .../knative.dev/pkg/tracing/testing/zipkin.go | 46 + vendor/knative.dev/pkg/tracing/zipkin.go | 68 + vendor/knative.dev/pkg/tracker/doc.go | 23 + vendor/knative.dev/pkg/tracker/enqueue.go | 277 + vendor/knative.dev/pkg/tracker/interface.go | 170 + .../pkg/tracker/zz_generated.deepcopy.go | 46 + vendor/knative.dev/pkg/version/version.go | 79 + vendor/knative.dev/pkg/webhook/README.md | 102 + vendor/knative.dev/pkg/webhook/admission.go | 116 + .../pkg/webhook/certificates/certificates.go | 98 + .../pkg/webhook/certificates/controller.go | 67 + .../webhook/certificates/resources/certs.go | 166 + .../webhook/certificates/resources/secret.go | 59 + .../pkg/webhook/configmaps/configmaps.go | 210 + .../pkg/webhook/configmaps/controller.go | 84 + vendor/knative.dev/pkg/webhook/context.go | 39 + vendor/knative.dev/pkg/webhook/conversion.go | 71 + .../pkg/webhook/psbinding/README.md | 233 + .../pkg/webhook/psbinding/controller.go | 110 + .../knative.dev/pkg/webhook/psbinding/doc.go | 43 + .../pkg/webhook/psbinding/index.go | 81 + .../pkg/webhook/psbinding/psbinding.go | 371 + .../pkg/webhook/psbinding/reconciler.go | 376 + .../conversion/controller.go | 130 + .../conversion/conversion.go | 195 + .../conversion/internal/types.go | 278 + .../internal/zz_generated.deepcopy.go | 131 + .../conversion/reconciler.go | 108 + .../defaulting/controller.go | 84 + .../defaulting/defaulting.go | 343 + .../resourcesemantics/defaulting/user_info.go | 52 + .../webhook/resourcesemantics/interface.go | 30 + .../validation/controller.go | 99 + .../validation/reconcile_config.go | 156 + .../validation/validation_admit.go | 209 + .../knative.dev/pkg/webhook/stats_reporter.go | 139 + .../pkg/webhook/testing/factory.go | 146 + .../pkg/webhook/testing/listers.go | 153 + .../pkg/webhook/testing/testing.go | 114 + vendor/knative.dev/pkg/webhook/webhook.go | 227 + .../knative.dev/pkg/websocket/connection.go | 324 + vendor/knative.dev/pkg/websocket/hijack.go | 32 + vendor/knative.dev/test-infra/LICENSE | 202 + .../knative.dev/test-infra/scripts/README.md | 356 + .../knative.dev/test-infra/scripts/dummy.go | 26 + .../test-infra/scripts/e2e-tests.sh | 504 + .../knative.dev/test-infra/scripts/library.sh | 670 + .../scripts/markdown-link-check-config.rc | 5 + .../scripts/markdown-lint-config.rc | 5 + .../test-infra/scripts/performance-tests.sh | 156 + .../test-infra/scripts/presubmit-tests.sh | 391 + .../knative.dev/test-infra/scripts/release.sh | 608 + .../test-infra/tools/dep-collector/README.md | 91 + .../test-infra/tools/dep-collector/gobuild.go | 88 + .../test-infra/tools/dep-collector/imports.go | 100 + .../tools/dep-collector/licenses.go | 199 + .../test-infra/tools/dep-collector/main.go | 81 + vendor/sigs.k8s.io/yaml/LICENSE | 50 + vendor/sigs.k8s.io/yaml/fields.go | 502 + vendor/sigs.k8s.io/yaml/yaml.go | 319 + vendor/sigs.k8s.io/yaml/yaml_go110.go | 14 + 3425 files changed, 1053631 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 DEVELOPMENT.md create mode 100644 Gopkg.lock create mode 100644 Gopkg.toml create mode 100644 LICENSE create mode 100644 OWNERS create mode 100644 OWNERS_ALIASES create mode 100644 README.md create mode 120000 cmd/controller/kodata/HEAD create mode 120000 cmd/controller/kodata/LICENSE create mode 120000 cmd/controller/kodata/VENDOR-LICENSE create mode 120000 cmd/controller/kodata/refs create mode 100644 cmd/controller/main.go create mode 120000 cmd/webhook/kodata/HEAD create mode 120000 cmd/webhook/kodata/LICENSE create mode 120000 cmd/webhook/kodata/VENDOR-LICENSE create mode 120000 cmd/webhook/kodata/refs create mode 100644 cmd/webhook/main.go create mode 100644 code-of-conduct.md create mode 100644 config/100-namespace.yaml create mode 100644 config/200-clusterrole.yaml create mode 100644 config/200-serviceaccount.yaml create mode 100644 config/201-clusterrolebinding.yaml create mode 100644 config/300-addressableservice.yaml create mode 100644 config/400-webhook-service.yaml create mode 100644 config/500-webhook-configuration.yaml create mode 100644 config/config-logging.yaml create mode 100644 config/config-observability.yaml create mode 100644 config/controller.yaml create mode 100644 config/webhook.yaml create mode 100644 example.yaml create mode 100644 hack/OWNERS create mode 100755 hack/boilerplate/add-boilerplate.sh create mode 100644 hack/boilerplate/boilerplate.go.txt create mode 100755 hack/boilerplate/boilerplate.sh.txt create mode 100755 hack/update-codegen.sh create mode 100755 hack/update-deps.sh create mode 100755 hack/verify-codegen.sh create mode 100644 pkg/apis/samples/register.go create mode 100644 pkg/apis/samples/v1alpha1/addressable_service_defaults.go create mode 100644 pkg/apis/samples/v1alpha1/addressable_service_lifecycle.go create mode 100644 pkg/apis/samples/v1alpha1/addressable_service_types.go create mode 100644 pkg/apis/samples/v1alpha1/addressable_service_validation.go create mode 100644 pkg/apis/samples/v1alpha1/doc.go create mode 100644 pkg/apis/samples/v1alpha1/register.go create mode 100644 pkg/apis/samples/v1alpha1/register_test.go create mode 100644 pkg/apis/samples/v1alpha1/zz_generated.deepcopy.go create mode 100644 pkg/client/clientset/versioned/clientset.go create mode 100644 pkg/client/clientset/versioned/doc.go create mode 100644 pkg/client/clientset/versioned/fake/clientset_generated.go create mode 100644 pkg/client/clientset/versioned/fake/doc.go create mode 100644 pkg/client/clientset/versioned/fake/register.go create mode 100644 pkg/client/clientset/versioned/scheme/doc.go create mode 100644 pkg/client/clientset/versioned/scheme/register.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/addressableservice.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/doc.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/doc.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_addressableservice.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_samples_client.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/generated_expansion.go create mode 100644 pkg/client/clientset/versioned/typed/samples/v1alpha1/samples_client.go create mode 100644 pkg/client/informers/externalversions/factory.go create mode 100644 pkg/client/informers/externalversions/generic.go create mode 100644 pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go create mode 100644 pkg/client/informers/externalversions/samples/interface.go create mode 100644 pkg/client/informers/externalversions/samples/v1alpha1/addressableservice.go create mode 100644 pkg/client/informers/externalversions/samples/v1alpha1/interface.go create mode 100644 pkg/client/injection/client/client.go create mode 100644 pkg/client/injection/client/fake/fake.go create mode 100644 pkg/client/injection/informers/factory/factory.go create mode 100644 pkg/client/injection/informers/factory/fake/fake.go create mode 100644 pkg/client/injection/informers/samples/v1alpha1/addressableservice/addressableservice.go create mode 100644 pkg/client/injection/informers/samples/v1alpha1/addressableservice/fake/fake.go create mode 100644 pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/controller.go create mode 100644 pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/reconciler.go create mode 100644 pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/controller.go create mode 100644 pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/reconciler.go create mode 100644 pkg/client/listers/samples/v1alpha1/addressableservice.go create mode 100644 pkg/client/listers/samples/v1alpha1/expansion_generated.go create mode 100644 pkg/reconciler/addressableservice/addressableservice.go create mode 100644 pkg/reconciler/addressableservice/controller.go create mode 100644 test/OWNERS create mode 100755 test/presubmit-tests.sh create mode 100644 third_party/VENDOR-LICENSE create mode 100644 vendor/cloud.google.com/go/LICENSE create mode 100644 vendor/cloud.google.com/go/compute/metadata/metadata.go create mode 100644 vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go create mode 100644 vendor/cloud.google.com/go/container/apiv1/doc.go create mode 100644 vendor/cloud.google.com/go/internal/version/version.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/doc.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/group_client.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go create mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go create mode 100644 vendor/cloud.google.com/go/trace/apiv2/doc.go create mode 100644 vendor/cloud.google.com/go/trace/apiv2/path_funcs.go create mode 100644 vendor/cloud.google.com/go/trace/apiv2/trace_client.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/LICENSE create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/common.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/connection.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/nodeinfo.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/ocagent.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/options.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/transform_spans.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/transform_stats_to_metrics.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/ocagent/version.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/LICENSE create mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go create mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go create mode 100644 vendor/github.com/aws/aws-sdk-go/LICENSE.txt create mode 100644 vendor/github.com/aws/aws-sdk-go/NOTICE.txt create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/client.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/logger.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/config.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/convert_types.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/errors.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/logger.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/validation.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/session.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/types.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/url.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go create mode 100644 vendor/github.com/aws/aws-sdk-go/aws/version.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go create mode 100644 vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/host.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go create mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go create mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/api.go create mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/errors.go create mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/service.go create mode 100644 vendor/github.com/beorn7/perks/LICENSE create mode 100644 vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 vendor/github.com/blang/semver/LICENSE create mode 100644 vendor/github.com/blang/semver/json.go create mode 100644 vendor/github.com/blang/semver/range.go create mode 100644 vendor/github.com/blang/semver/semver.go create mode 100644 vendor/github.com/blang/semver/sort.go create mode 100644 vendor/github.com/blang/semver/sql.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/LICENSE create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace.pb.go create mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace_config.pb.go create mode 100644 vendor/github.com/davecgh/go-spew/LICENSE create mode 100644 vendor/github.com/davecgh/go-spew/spew/bypass.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/bypasssafe.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/common.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/config.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/doc.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/dump.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/format.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/spew.go create mode 100644 vendor/github.com/evanphx/json-patch/LICENSE create mode 100644 vendor/github.com/evanphx/json-patch/errors.go create mode 100644 vendor/github.com/evanphx/json-patch/merge.go create mode 100644 vendor/github.com/evanphx/json-patch/patch.go create mode 100644 vendor/github.com/gobuffalo/envy/LICENSE create mode 100644 vendor/github.com/gobuffalo/envy/LICENSE.txt create mode 100644 vendor/github.com/gobuffalo/envy/envy.go create mode 100644 vendor/github.com/gobuffalo/envy/version.go create mode 100644 vendor/github.com/gogo/protobuf/AUTHORS create mode 100644 vendor/github.com/gogo/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS create mode 100644 vendor/github.com/gogo/protobuf/LICENSE create mode 100644 vendor/github.com/gogo/protobuf/proto/clone.go create mode 100644 vendor/github.com/gogo/protobuf/proto/custom_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/decode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/discard.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/equal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/message_set.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/skip_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_merge.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_parser.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go create mode 100644 vendor/github.com/golang/groupcache/LICENSE create mode 100644 vendor/github.com/golang/groupcache/lru/lru.go create mode 100644 vendor/github.com/golang/protobuf/AUTHORS create mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/golang/protobuf/LICENSE create mode 100644 vendor/github.com/golang/protobuf/descriptor/descriptor.go create mode 100644 vendor/github.com/golang/protobuf/jsonpb/jsonpb.go create mode 100644 vendor/github.com/golang/protobuf/proto/clone.go create mode 100644 vendor/github.com/golang/protobuf/proto/decode.go create mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go create mode 100644 vendor/github.com/golang/protobuf/proto/discard.go create mode 100644 vendor/github.com/golang/protobuf/proto/encode.go create mode 100644 vendor/github.com/golang/protobuf/proto/equal.go create mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go create mode 100644 vendor/github.com/golang/protobuf/proto/lib.go create mode 100644 vendor/github.com/golang/protobuf/proto/message_set.go create mode 100644 vendor/github.com/golang/protobuf/proto/pointer_reflect.go create mode 100644 vendor/github.com/golang/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/github.com/golang/protobuf/proto/properties.go create mode 100644 vendor/github.com/golang/protobuf/proto/table_marshal.go create mode 100644 vendor/github.com/golang/protobuf/proto/table_merge.go create mode 100644 vendor/github.com/golang/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/golang/protobuf/proto/text.go create mode 100644 vendor/github.com/golang/protobuf/proto/text_parser.go create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go create mode 100644 vendor/github.com/google/go-cmp/LICENSE create mode 100644 vendor/github.com/google/go-cmp/cmp/compare.go create mode 100644 vendor/github.com/google/go-cmp/cmp/export_panic.go create mode 100644 vendor/github.com/google/go-cmp/cmp/export_unsafe.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/function/func.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/sort.go create mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/zero.go create mode 100644 vendor/github.com/google/go-cmp/cmp/options.go create mode 100644 vendor/github.com/google/go-cmp/cmp/path.go create mode 100644 vendor/github.com/google/go-cmp/cmp/report.go create mode 100644 vendor/github.com/google/go-cmp/cmp/report_compare.go create mode 100644 vendor/github.com/google/go-cmp/cmp/report_reflect.go create mode 100644 vendor/github.com/google/go-cmp/cmp/report_slices.go create mode 100644 vendor/github.com/google/go-cmp/cmp/report_text.go create mode 100644 vendor/github.com/google/go-cmp/cmp/report_value.go create mode 100644 vendor/github.com/google/gofuzz/LICENSE create mode 100644 vendor/github.com/google/gofuzz/doc.go create mode 100644 vendor/github.com/google/gofuzz/fuzz.go create mode 100644 vendor/github.com/google/licenseclassifier/LICENSE create mode 100644 vendor/github.com/google/licenseclassifier/classifier.go create mode 100644 vendor/github.com/google/licenseclassifier/file_system_resources.go create mode 100644 vendor/github.com/google/licenseclassifier/forbidden.go create mode 100644 vendor/github.com/google/licenseclassifier/internal/sets/sets.go create mode 100644 vendor/github.com/google/licenseclassifier/internal/sets/stringset.go create mode 100644 vendor/github.com/google/licenseclassifier/license_type.go create mode 100644 vendor/github.com/google/licenseclassifier/licenses/Unlicense.txt create mode 100644 vendor/github.com/google/licenseclassifier/licenses/licenses.db create mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE create mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go create mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go create mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go create mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go create mode 100644 vendor/github.com/google/uuid/CONTRIBUTORS create mode 100644 vendor/github.com/google/uuid/LICENSE create mode 100644 vendor/github.com/google/uuid/dce.go create mode 100644 vendor/github.com/google/uuid/doc.go create mode 100644 vendor/github.com/google/uuid/hash.go create mode 100644 vendor/github.com/google/uuid/marshal.go create mode 100644 vendor/github.com/google/uuid/node.go create mode 100644 vendor/github.com/google/uuid/node_js.go create mode 100644 vendor/github.com/google/uuid/node_net.go create mode 100644 vendor/github.com/google/uuid/sql.go create mode 100644 vendor/github.com/google/uuid/time.go create mode 100644 vendor/github.com/google/uuid/util.go create mode 100644 vendor/github.com/google/uuid/uuid.go create mode 100644 vendor/github.com/google/uuid/version1.go create mode 100644 vendor/github.com/google/uuid/version4.go create mode 100644 vendor/github.com/googleapis/gax-go/LICENSE create mode 100644 vendor/github.com/googleapis/gax-go/v2/call_option.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/gax.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/header.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/invoke.go create mode 100644 vendor/github.com/googleapis/gnostic/LICENSE create mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go create mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go create mode 100644 vendor/github.com/googleapis/gnostic/compiler/context.go create mode 100644 vendor/github.com/googleapis/gnostic/compiler/error.go create mode 100644 vendor/github.com/googleapis/gnostic/compiler/extension-handler.go create mode 100644 vendor/github.com/googleapis/gnostic/compiler/helpers.go create mode 100644 vendor/github.com/googleapis/gnostic/compiler/main.go create mode 100644 vendor/github.com/googleapis/gnostic/compiler/reader.go create mode 100644 vendor/github.com/googleapis/gnostic/extensions/extension.pb.go create mode 100644 vendor/github.com/googleapis/gnostic/extensions/extensions.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/LICENSE.txt create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/internal/stream_chunk.pb.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_httpbodyproto.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/LICENSE create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/doc.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/pattern.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/readerfactory.go create mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/trie.go create mode 100644 vendor/github.com/hashicorp/golang-lru/2q.go create mode 100644 vendor/github.com/hashicorp/golang-lru/LICENSE create mode 100644 vendor/github.com/hashicorp/golang-lru/arc.go create mode 100644 vendor/github.com/hashicorp/golang-lru/doc.go create mode 100644 vendor/github.com/hashicorp/golang-lru/lru.go create mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru.go create mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go create mode 100644 vendor/github.com/imdario/mergo/LICENSE create mode 100644 vendor/github.com/imdario/mergo/doc.go create mode 100644 vendor/github.com/imdario/mergo/map.go create mode 100644 vendor/github.com/imdario/mergo/merge.go create mode 100644 vendor/github.com/imdario/mergo/mergo.go create mode 100644 vendor/github.com/imdario/mergo/testdata/license.yml create mode 100644 vendor/github.com/jmespath/go-jmespath/LICENSE create mode 100644 vendor/github.com/jmespath/go-jmespath/api.go create mode 100644 vendor/github.com/jmespath/go-jmespath/astnodetype_string.go create mode 100644 vendor/github.com/jmespath/go-jmespath/functions.go create mode 100644 vendor/github.com/jmespath/go-jmespath/interpreter.go create mode 100644 vendor/github.com/jmespath/go-jmespath/lexer.go create mode 100644 vendor/github.com/jmespath/go-jmespath/parser.go create mode 100644 vendor/github.com/jmespath/go-jmespath/toktype_string.go create mode 100644 vendor/github.com/jmespath/go-jmespath/util.go create mode 100644 vendor/github.com/joho/godotenv/LICENCE create mode 100644 vendor/github.com/joho/godotenv/godotenv.go create mode 100644 vendor/github.com/json-iterator/go/LICENSE create mode 100644 vendor/github.com/json-iterator/go/adapter.go create mode 100644 vendor/github.com/json-iterator/go/any.go create mode 100644 vendor/github.com/json-iterator/go/any_array.go create mode 100644 vendor/github.com/json-iterator/go/any_bool.go create mode 100644 vendor/github.com/json-iterator/go/any_float.go create mode 100644 vendor/github.com/json-iterator/go/any_int32.go create mode 100644 vendor/github.com/json-iterator/go/any_int64.go create mode 100644 vendor/github.com/json-iterator/go/any_invalid.go create mode 100644 vendor/github.com/json-iterator/go/any_nil.go create mode 100644 vendor/github.com/json-iterator/go/any_number.go create mode 100644 vendor/github.com/json-iterator/go/any_object.go create mode 100644 vendor/github.com/json-iterator/go/any_str.go create mode 100644 vendor/github.com/json-iterator/go/any_uint32.go create mode 100644 vendor/github.com/json-iterator/go/any_uint64.go create mode 100644 vendor/github.com/json-iterator/go/config.go create mode 100644 vendor/github.com/json-iterator/go/iter.go create mode 100644 vendor/github.com/json-iterator/go/iter_array.go create mode 100644 vendor/github.com/json-iterator/go/iter_float.go create mode 100644 vendor/github.com/json-iterator/go/iter_int.go create mode 100644 vendor/github.com/json-iterator/go/iter_object.go create mode 100644 vendor/github.com/json-iterator/go/iter_skip.go create mode 100644 vendor/github.com/json-iterator/go/iter_skip_sloppy.go create mode 100644 vendor/github.com/json-iterator/go/iter_skip_strict.go create mode 100644 vendor/github.com/json-iterator/go/iter_str.go create mode 100644 vendor/github.com/json-iterator/go/jsoniter.go create mode 100644 vendor/github.com/json-iterator/go/pool.go create mode 100644 vendor/github.com/json-iterator/go/reflect.go create mode 100644 vendor/github.com/json-iterator/go/reflect_array.go create mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go create mode 100644 vendor/github.com/json-iterator/go/reflect_extension.go create mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go create mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go create mode 100644 vendor/github.com/json-iterator/go/reflect_map.go create mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go create mode 100644 vendor/github.com/json-iterator/go/reflect_native.go create mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go create mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go create mode 100644 vendor/github.com/json-iterator/go/reflect_struct_decoder.go create mode 100644 vendor/github.com/json-iterator/go/reflect_struct_encoder.go create mode 100644 vendor/github.com/json-iterator/go/stream.go create mode 100644 vendor/github.com/json-iterator/go/stream_float.go create mode 100644 vendor/github.com/json-iterator/go/stream_int.go create mode 100644 vendor/github.com/json-iterator/go/stream_str.go create mode 100644 vendor/github.com/markbates/inflect/LICENCE create mode 100644 vendor/github.com/markbates/inflect/helpers.go create mode 100644 vendor/github.com/markbates/inflect/inflect.go create mode 100644 vendor/github.com/markbates/inflect/name.go create mode 100644 vendor/github.com/markbates/inflect/version.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 vendor/github.com/modern-go/concurrent/LICENSE create mode 100644 vendor/github.com/modern-go/concurrent/executor.go create mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go create mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go create mode 100644 vendor/github.com/modern-go/concurrent/log.go create mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go create mode 100644 vendor/github.com/modern-go/reflect2/LICENSE create mode 100644 vendor/github.com/modern-go/reflect2/go_above_17.go create mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go create mode 100644 vendor/github.com/modern-go/reflect2/go_below_17.go create mode 100644 vendor/github.com/modern-go/reflect2/go_below_19.go create mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go create mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s create mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s create mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go create mode 100644 vendor/github.com/modern-go/reflect2/type_map.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go create mode 100644 vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/http.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go create mode 100644 vendor/github.com/prometheus/client_model/LICENSE create mode 100644 vendor/github.com/prometheus/client_model/NOTICE create mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 vendor/github.com/prometheus/client_model/ruby/LICENSE create mode 100644 vendor/github.com/prometheus/common/LICENSE create mode 100644 vendor/github.com/prometheus/common/NOTICE create mode 100644 vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 vendor/github.com/prometheus/common/model/alert.go create mode 100644 vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 vendor/github.com/prometheus/common/model/fnv.go create mode 100644 vendor/github.com/prometheus/common/model/labels.go create mode 100644 vendor/github.com/prometheus/common/model/labelset.go create mode 100644 vendor/github.com/prometheus/common/model/metric.go create mode 100644 vendor/github.com/prometheus/common/model/model.go create mode 100644 vendor/github.com/prometheus/common/model/signature.go create mode 100644 vendor/github.com/prometheus/common/model/silence.go create mode 100644 vendor/github.com/prometheus/common/model/time.go create mode 100644 vendor/github.com/prometheus/common/model/value.go create mode 100644 vendor/github.com/prometheus/procfs/LICENSE create mode 100644 vendor/github.com/prometheus/procfs/NOTICE create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 vendor/github.com/prometheus/procfs/doc.go create mode 100644 vendor/github.com/prometheus/procfs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/internal/fs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 vendor/github.com/prometheus/procfs/net_dev.go create mode 100644 vendor/github.com/prometheus/procfs/proc.go create mode 100644 vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go create mode 100644 vendor/github.com/prometheus/procfs/proc_psi.go create mode 100644 vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 vendor/github.com/prometheus/procfs/proc_status.go create mode 100644 vendor/github.com/prometheus/procfs/stat.go create mode 100644 vendor/github.com/prometheus/procfs/xfrm.go create mode 100644 vendor/github.com/rogpeppe/go-internal/LICENSE create mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go create mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/print.go create mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/read.go create mode 100644 vendor/github.com/rogpeppe/go-internal/modfile/rule.go create mode 100644 vendor/github.com/rogpeppe/go-internal/module/module.go create mode 100644 vendor/github.com/rogpeppe/go-internal/semver/semver.go create mode 100644 vendor/github.com/sergi/go-diff/AUTHORS create mode 100644 vendor/github.com/sergi/go-diff/CONTRIBUTORS create mode 100644 vendor/github.com/sergi/go-diff/LICENSE create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/match.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/mathutil.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go create mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go create mode 100644 vendor/github.com/spf13/pflag/LICENSE create mode 100644 vendor/github.com/spf13/pflag/bool.go create mode 100644 vendor/github.com/spf13/pflag/bool_slice.go create mode 100644 vendor/github.com/spf13/pflag/bytes.go create mode 100644 vendor/github.com/spf13/pflag/count.go create mode 100644 vendor/github.com/spf13/pflag/duration.go create mode 100644 vendor/github.com/spf13/pflag/duration_slice.go create mode 100644 vendor/github.com/spf13/pflag/flag.go create mode 100644 vendor/github.com/spf13/pflag/float32.go create mode 100644 vendor/github.com/spf13/pflag/float64.go create mode 100644 vendor/github.com/spf13/pflag/golangflag.go create mode 100644 vendor/github.com/spf13/pflag/int.go create mode 100644 vendor/github.com/spf13/pflag/int16.go create mode 100644 vendor/github.com/spf13/pflag/int32.go create mode 100644 vendor/github.com/spf13/pflag/int64.go create mode 100644 vendor/github.com/spf13/pflag/int8.go create mode 100644 vendor/github.com/spf13/pflag/int_slice.go create mode 100644 vendor/github.com/spf13/pflag/ip.go create mode 100644 vendor/github.com/spf13/pflag/ip_slice.go create mode 100644 vendor/github.com/spf13/pflag/ipmask.go create mode 100644 vendor/github.com/spf13/pflag/ipnet.go create mode 100644 vendor/github.com/spf13/pflag/string.go create mode 100644 vendor/github.com/spf13/pflag/string_array.go create mode 100644 vendor/github.com/spf13/pflag/string_slice.go create mode 100644 vendor/github.com/spf13/pflag/string_to_int.go create mode 100644 vendor/github.com/spf13/pflag/string_to_string.go create mode 100644 vendor/github.com/spf13/pflag/uint.go create mode 100644 vendor/github.com/spf13/pflag/uint16.go create mode 100644 vendor/github.com/spf13/pflag/uint32.go create mode 100644 vendor/github.com/spf13/pflag/uint64.go create mode 100644 vendor/github.com/spf13/pflag/uint8.go create mode 100644 vendor/github.com/spf13/pflag/uint_slice.go create mode 100644 vendor/go.opencensus.io/AUTHORS create mode 100644 vendor/go.opencensus.io/LICENSE create mode 100644 vendor/go.opencensus.io/internal/internal.go create mode 100644 vendor/go.opencensus.io/internal/sanitize.go create mode 100644 vendor/go.opencensus.io/internal/tagencoding/tagencoding.go create mode 100644 vendor/go.opencensus.io/internal/traceinternals.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/doc.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/exemplar.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/label.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/metric.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/point.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/type_string.go create mode 100644 vendor/go.opencensus.io/metric/metricdata/unit.go create mode 100644 vendor/go.opencensus.io/metric/metricexport/doc.go create mode 100644 vendor/go.opencensus.io/metric/metricexport/export.go create mode 100644 vendor/go.opencensus.io/metric/metricexport/reader.go create mode 100644 vendor/go.opencensus.io/metric/metricproducer/manager.go create mode 100644 vendor/go.opencensus.io/metric/metricproducer/producer.go create mode 100644 vendor/go.opencensus.io/opencensus.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/client.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/client_metrics.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/client_stats_handler.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/doc.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/server.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/server_metrics.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/server_stats_handler.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/stats_common.go create mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/trace_common.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/client.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/client_stats.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/doc.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/route.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/server.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/stats.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/trace.go create mode 100644 vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go create mode 100644 vendor/go.opencensus.io/resource/resource.go create mode 100644 vendor/go.opencensus.io/resource/resourcekeys/const.go create mode 100644 vendor/go.opencensus.io/stats/doc.go create mode 100644 vendor/go.opencensus.io/stats/internal/record.go create mode 100644 vendor/go.opencensus.io/stats/measure.go create mode 100644 vendor/go.opencensus.io/stats/measure_float64.go create mode 100644 vendor/go.opencensus.io/stats/measure_int64.go create mode 100644 vendor/go.opencensus.io/stats/record.go create mode 100644 vendor/go.opencensus.io/stats/units.go create mode 100644 vendor/go.opencensus.io/stats/view/aggregation.go create mode 100644 vendor/go.opencensus.io/stats/view/aggregation_data.go create mode 100644 vendor/go.opencensus.io/stats/view/collector.go create mode 100644 vendor/go.opencensus.io/stats/view/doc.go create mode 100644 vendor/go.opencensus.io/stats/view/export.go create mode 100644 vendor/go.opencensus.io/stats/view/view.go create mode 100644 vendor/go.opencensus.io/stats/view/view_to_metric.go create mode 100644 vendor/go.opencensus.io/stats/view/worker.go create mode 100644 vendor/go.opencensus.io/stats/view/worker_commands.go create mode 100644 vendor/go.opencensus.io/tag/context.go create mode 100644 vendor/go.opencensus.io/tag/doc.go create mode 100644 vendor/go.opencensus.io/tag/key.go create mode 100644 vendor/go.opencensus.io/tag/map.go create mode 100644 vendor/go.opencensus.io/tag/map_codec.go create mode 100644 vendor/go.opencensus.io/tag/metadata.go create mode 100644 vendor/go.opencensus.io/tag/profile_19.go create mode 100644 vendor/go.opencensus.io/tag/profile_not19.go create mode 100644 vendor/go.opencensus.io/tag/validate.go create mode 100644 vendor/go.opencensus.io/trace/basetypes.go create mode 100644 vendor/go.opencensus.io/trace/config.go create mode 100644 vendor/go.opencensus.io/trace/doc.go create mode 100644 vendor/go.opencensus.io/trace/evictedqueue.go create mode 100644 vendor/go.opencensus.io/trace/export.go create mode 100644 vendor/go.opencensus.io/trace/internal/internal.go create mode 100644 vendor/go.opencensus.io/trace/lrumap.go create mode 100644 vendor/go.opencensus.io/trace/propagation/propagation.go create mode 100644 vendor/go.opencensus.io/trace/sampling.go create mode 100644 vendor/go.opencensus.io/trace/spanbucket.go create mode 100644 vendor/go.opencensus.io/trace/spanstore.go create mode 100644 vendor/go.opencensus.io/trace/status_codes.go create mode 100644 vendor/go.opencensus.io/trace/trace.go create mode 100644 vendor/go.opencensus.io/trace/trace_go11.go create mode 100644 vendor/go.opencensus.io/trace/trace_nongo11.go create mode 100644 vendor/go.opencensus.io/trace/tracestate/tracestate.go create mode 100644 vendor/go.uber.org/atomic/LICENSE.txt create mode 100644 vendor/go.uber.org/atomic/atomic.go create mode 100644 vendor/go.uber.org/atomic/error.go create mode 100644 vendor/go.uber.org/atomic/string.go create mode 100644 vendor/go.uber.org/multierr/LICENSE.txt create mode 100644 vendor/go.uber.org/multierr/error.go create mode 100644 vendor/go.uber.org/zap/LICENSE.txt create mode 100644 vendor/go.uber.org/zap/array.go create mode 100644 vendor/go.uber.org/zap/buffer/buffer.go create mode 100644 vendor/go.uber.org/zap/buffer/pool.go create mode 100644 vendor/go.uber.org/zap/config.go create mode 100644 vendor/go.uber.org/zap/doc.go create mode 100644 vendor/go.uber.org/zap/encoder.go create mode 100644 vendor/go.uber.org/zap/error.go create mode 100644 vendor/go.uber.org/zap/field.go create mode 100644 vendor/go.uber.org/zap/flag.go create mode 100644 vendor/go.uber.org/zap/global.go create mode 100644 vendor/go.uber.org/zap/http_handler.go create mode 100644 vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go create mode 100644 vendor/go.uber.org/zap/internal/color/color.go create mode 100644 vendor/go.uber.org/zap/internal/exit/exit.go create mode 100644 vendor/go.uber.org/zap/level.go create mode 100644 vendor/go.uber.org/zap/logger.go create mode 100644 vendor/go.uber.org/zap/options.go create mode 100644 vendor/go.uber.org/zap/sink.go create mode 100644 vendor/go.uber.org/zap/stacktrace.go create mode 100644 vendor/go.uber.org/zap/sugar.go create mode 100644 vendor/go.uber.org/zap/time.go create mode 100644 vendor/go.uber.org/zap/writer.go create mode 100644 vendor/go.uber.org/zap/zapcore/console_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/core.go create mode 100644 vendor/go.uber.org/zap/zapcore/doc.go create mode 100644 vendor/go.uber.org/zap/zapcore/encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/entry.go create mode 100644 vendor/go.uber.org/zap/zapcore/error.go create mode 100644 vendor/go.uber.org/zap/zapcore/field.go create mode 100644 vendor/go.uber.org/zap/zapcore/hook.go create mode 100644 vendor/go.uber.org/zap/zapcore/json_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/level.go create mode 100644 vendor/go.uber.org/zap/zapcore/level_strings.go create mode 100644 vendor/go.uber.org/zap/zapcore/marshaler.go create mode 100644 vendor/go.uber.org/zap/zapcore/memory_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/sampler.go create mode 100644 vendor/go.uber.org/zap/zapcore/tee.go create mode 100644 vendor/go.uber.org/zap/zapcore/write_syncer.go create mode 100644 vendor/golang.org/x/crypto/AUTHORS create mode 100644 vendor/golang.org/x/crypto/CONTRIBUTORS create mode 100644 vendor/golang.org/x/crypto/LICENSE create mode 100644 vendor/golang.org/x/crypto/PATENTS create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/terminal.go create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util.go create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_linux.go create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go create mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_windows.go create mode 100644 vendor/golang.org/x/net/AUTHORS create mode 100644 vendor/golang.org/x/net/CONTRIBUTORS create mode 100644 vendor/golang.org/x/net/LICENSE create mode 100644 vendor/golang.org/x/net/PATENTS create mode 100644 vendor/golang.org/x/net/context/context.go create mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go create mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go create mode 100644 vendor/golang.org/x/net/context/go17.go create mode 100644 vendor/golang.org/x/net/context/go19.go create mode 100644 vendor/golang.org/x/net/context/pre_go17.go create mode 100644 vendor/golang.org/x/net/context/pre_go19.go create mode 100644 vendor/golang.org/x/net/http/httpguts/guts.go create mode 100644 vendor/golang.org/x/net/http/httpguts/httplex.go create mode 100644 vendor/golang.org/x/net/http2/ciphers.go create mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go create mode 100644 vendor/golang.org/x/net/http2/configure_transport.go create mode 100644 vendor/golang.org/x/net/http2/databuffer.go create mode 100644 vendor/golang.org/x/net/http2/errors.go create mode 100644 vendor/golang.org/x/net/http2/flow.go create mode 100644 vendor/golang.org/x/net/http2/frame.go create mode 100644 vendor/golang.org/x/net/http2/go111.go create mode 100644 vendor/golang.org/x/net/http2/go16.go create mode 100644 vendor/golang.org/x/net/http2/go17.go create mode 100644 vendor/golang.org/x/net/http2/go17_not18.go create mode 100644 vendor/golang.org/x/net/http2/go18.go create mode 100644 vendor/golang.org/x/net/http2/go19.go create mode 100644 vendor/golang.org/x/net/http2/gotrack.go create mode 100644 vendor/golang.org/x/net/http2/h2c/h2c.go create mode 100644 vendor/golang.org/x/net/http2/headermap.go create mode 100644 vendor/golang.org/x/net/http2/hpack/encode.go create mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go create mode 100644 vendor/golang.org/x/net/http2/hpack/huffman.go create mode 100644 vendor/golang.org/x/net/http2/hpack/tables.go create mode 100644 vendor/golang.org/x/net/http2/http2.go create mode 100644 vendor/golang.org/x/net/http2/not_go111.go create mode 100644 vendor/golang.org/x/net/http2/not_go16.go create mode 100644 vendor/golang.org/x/net/http2/not_go17.go create mode 100644 vendor/golang.org/x/net/http2/not_go18.go create mode 100644 vendor/golang.org/x/net/http2/not_go19.go create mode 100644 vendor/golang.org/x/net/http2/pipe.go create mode 100644 vendor/golang.org/x/net/http2/server.go create mode 100644 vendor/golang.org/x/net/http2/transport.go create mode 100644 vendor/golang.org/x/net/http2/write.go create mode 100644 vendor/golang.org/x/net/http2/writesched.go create mode 100644 vendor/golang.org/x/net/http2/writesched_priority.go create mode 100644 vendor/golang.org/x/net/http2/writesched_random.go create mode 100644 vendor/golang.org/x/net/idna/idna.go create mode 100644 vendor/golang.org/x/net/idna/punycode.go create mode 100644 vendor/golang.org/x/net/idna/tables.go create mode 100644 vendor/golang.org/x/net/idna/trie.go create mode 100644 vendor/golang.org/x/net/idna/trieval.go create mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go create mode 100644 vendor/golang.org/x/net/trace/events.go create mode 100644 vendor/golang.org/x/net/trace/histogram.go create mode 100644 vendor/golang.org/x/net/trace/trace.go create mode 100644 vendor/golang.org/x/net/trace/trace_go16.go create mode 100644 vendor/golang.org/x/net/trace/trace_go17.go create mode 100644 vendor/golang.org/x/oauth2/AUTHORS create mode 100644 vendor/golang.org/x/oauth2/CONTRIBUTORS create mode 100644 vendor/golang.org/x/oauth2/LICENSE create mode 100644 vendor/golang.org/x/oauth2/google/appengine.go create mode 100644 vendor/golang.org/x/oauth2/google/appengine_gen1.go create mode 100644 vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go create mode 100644 vendor/golang.org/x/oauth2/google/default.go create mode 100644 vendor/golang.org/x/oauth2/google/doc.go create mode 100644 vendor/golang.org/x/oauth2/google/google.go create mode 100644 vendor/golang.org/x/oauth2/google/jwt.go create mode 100644 vendor/golang.org/x/oauth2/google/sdk.go create mode 100644 vendor/golang.org/x/oauth2/internal/client_appengine.go create mode 100644 vendor/golang.org/x/oauth2/internal/doc.go create mode 100644 vendor/golang.org/x/oauth2/internal/oauth2.go create mode 100644 vendor/golang.org/x/oauth2/internal/token.go create mode 100644 vendor/golang.org/x/oauth2/internal/transport.go create mode 100644 vendor/golang.org/x/oauth2/jws/jws.go create mode 100644 vendor/golang.org/x/oauth2/jwt/jwt.go create mode 100644 vendor/golang.org/x/oauth2/oauth2.go create mode 100644 vendor/golang.org/x/oauth2/token.go create mode 100644 vendor/golang.org/x/oauth2/transport.go create mode 100644 vendor/golang.org/x/sync/AUTHORS create mode 100644 vendor/golang.org/x/sync/CONTRIBUTORS create mode 100644 vendor/golang.org/x/sync/LICENSE create mode 100644 vendor/golang.org/x/sync/PATENTS create mode 100644 vendor/golang.org/x/sync/errgroup/errgroup.go create mode 100644 vendor/golang.org/x/sync/semaphore/semaphore.go create mode 100644 vendor/golang.org/x/sys/AUTHORS create mode 100644 vendor/golang.org/x/sys/CONTRIBUTORS create mode 100644 vendor/golang.org/x/sys/LICENSE create mode 100644 vendor/golang.org/x/sys/PATENTS create mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go create mode 100644 vendor/golang.org/x/sys/unix/aliases.go create mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/constants.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dirent.go create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl.go create mode 100644 vendor/golang.org/x/sys/unix/mkpost.go create mode 100644 vendor/golang.org/x/sys/unix/openbsd_pledge.go create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 vendor/golang.org/x/sys/unix/race.go create mode 100644 vendor/golang.org/x/sys/unix/race0.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 vendor/golang.org/x/sys/unix/str.go create mode 100644 vendor/golang.org/x/sys/unix/syscall.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go create mode 100644 vendor/golang.org/x/sys/unix/types_aix.go create mode 100644 vendor/golang.org/x/sys/unix/types_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/types_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/types_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/types_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/types_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/types_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace386_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptracearm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptracemips_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptracemipsle_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/windows/aliases.go create mode 100644 vendor/golang.org/x/sys/windows/asm_windows_386.s create mode 100644 vendor/golang.org/x/sys/windows/asm_windows_amd64.s create mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/race.go create mode 100644 vendor/golang.org/x/sys/windows/race0.go create mode 100644 vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 vendor/golang.org/x/sys/windows/service.go create mode 100644 vendor/golang.org/x/sys/windows/str.go create mode 100644 vendor/golang.org/x/sys/windows/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go create mode 100644 vendor/golang.org/x/text/AUTHORS create mode 100644 vendor/golang.org/x/text/CONTRIBUTORS create mode 100644 vendor/golang.org/x/text/LICENSE create mode 100644 vendor/golang.org/x/text/PATENTS create mode 100644 vendor/golang.org/x/text/collate/build/builder.go create mode 100644 vendor/golang.org/x/text/collate/build/colelem.go create mode 100644 vendor/golang.org/x/text/collate/build/contract.go create mode 100644 vendor/golang.org/x/text/collate/build/order.go create mode 100644 vendor/golang.org/x/text/collate/build/table.go create mode 100644 vendor/golang.org/x/text/collate/build/trie.go create mode 100644 vendor/golang.org/x/text/collate/collate.go create mode 100644 vendor/golang.org/x/text/collate/index.go create mode 100644 vendor/golang.org/x/text/collate/maketables.go create mode 100644 vendor/golang.org/x/text/collate/option.go create mode 100644 vendor/golang.org/x/text/collate/sort.go create mode 100644 vendor/golang.org/x/text/collate/tables.go create mode 100644 vendor/golang.org/x/text/internal/colltab/collelem.go create mode 100644 vendor/golang.org/x/text/internal/colltab/colltab.go create mode 100644 vendor/golang.org/x/text/internal/colltab/contract.go create mode 100644 vendor/golang.org/x/text/internal/colltab/iter.go create mode 100644 vendor/golang.org/x/text/internal/colltab/numeric.go create mode 100644 vendor/golang.org/x/text/internal/colltab/table.go create mode 100644 vendor/golang.org/x/text/internal/colltab/trie.go create mode 100644 vendor/golang.org/x/text/internal/colltab/weighter.go create mode 100644 vendor/golang.org/x/text/internal/gen/code.go create mode 100644 vendor/golang.org/x/text/internal/gen/gen.go create mode 100644 vendor/golang.org/x/text/internal/tag/tag.go create mode 100644 vendor/golang.org/x/text/internal/triegen/compact.go create mode 100644 vendor/golang.org/x/text/internal/triegen/print.go create mode 100644 vendor/golang.org/x/text/internal/triegen/triegen.go create mode 100644 vendor/golang.org/x/text/internal/ucd/ucd.go create mode 100644 vendor/golang.org/x/text/language/common.go create mode 100644 vendor/golang.org/x/text/language/coverage.go create mode 100644 vendor/golang.org/x/text/language/doc.go create mode 100644 vendor/golang.org/x/text/language/gen.go create mode 100644 vendor/golang.org/x/text/language/gen_common.go create mode 100644 vendor/golang.org/x/text/language/gen_index.go create mode 100644 vendor/golang.org/x/text/language/go1_1.go create mode 100644 vendor/golang.org/x/text/language/go1_2.go create mode 100644 vendor/golang.org/x/text/language/index.go create mode 100644 vendor/golang.org/x/text/language/language.go create mode 100644 vendor/golang.org/x/text/language/lookup.go create mode 100644 vendor/golang.org/x/text/language/match.go create mode 100644 vendor/golang.org/x/text/language/parse.go create mode 100644 vendor/golang.org/x/text/language/tables.go create mode 100644 vendor/golang.org/x/text/language/tags.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go create mode 100644 vendor/golang.org/x/text/transform/transform.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/gen.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_ranges.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_trieval.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/base.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/cldr.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/collate.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/decode.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/makexml.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/resolve.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/slice.go create mode 100644 vendor/golang.org/x/text/unicode/cldr/xml.go create mode 100644 vendor/golang.org/x/text/unicode/norm/composition.go create mode 100644 vendor/golang.org/x/text/unicode/norm/forminfo.go create mode 100644 vendor/golang.org/x/text/unicode/norm/input.go create mode 100644 vendor/golang.org/x/text/unicode/norm/iter.go create mode 100644 vendor/golang.org/x/text/unicode/norm/maketables.go create mode 100644 vendor/golang.org/x/text/unicode/norm/normalize.go create mode 100644 vendor/golang.org/x/text/unicode/norm/readwriter.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/transform.go create mode 100644 vendor/golang.org/x/text/unicode/norm/trie.go create mode 100644 vendor/golang.org/x/text/unicode/norm/triegen.go create mode 100644 vendor/golang.org/x/text/unicode/rangetable/gen.go create mode 100644 vendor/golang.org/x/text/unicode/rangetable/merge.go create mode 100644 vendor/golang.org/x/text/unicode/rangetable/rangetable.go create mode 100644 vendor/golang.org/x/text/unicode/rangetable/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/rangetable/tables9.0.0.go create mode 100644 vendor/golang.org/x/time/AUTHORS create mode 100644 vendor/golang.org/x/time/CONTRIBUTORS create mode 100644 vendor/golang.org/x/time/LICENSE create mode 100644 vendor/golang.org/x/time/PATENTS create mode 100644 vendor/golang.org/x/time/rate/rate.go create mode 100644 vendor/golang.org/x/time/rate/rate_go16.go create mode 100644 vendor/golang.org/x/time/rate/rate_go17.go create mode 100644 vendor/golang.org/x/tools/AUTHORS create mode 100644 vendor/golang.org/x/tools/CONTRIBUTORS create mode 100644 vendor/golang.org/x/tools/LICENSE create mode 100644 vendor/golang.org/x/tools/PATENTS create mode 100644 vendor/golang.org/x/tools/cmd/getgo/LICENSE create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/enclosing.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/imports.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/rewrite.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/util.go create mode 100644 vendor/golang.org/x/tools/imports/fix.go create mode 100644 vendor/golang.org/x/tools/imports/imports.go create mode 100644 vendor/golang.org/x/tools/imports/mkindex.go create mode 100644 vendor/golang.org/x/tools/imports/mkstdlib.go create mode 100644 vendor/golang.org/x/tools/imports/sortimports.go create mode 100644 vendor/golang.org/x/tools/imports/zstdlib.go create mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go create mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go create mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go create mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go create mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go create mode 100644 vendor/golang.org/x/tools/third_party/moduleloader/LICENSE create mode 100644 vendor/golang.org/x/tools/third_party/typescript/LICENSE create mode 100644 vendor/golang.org/x/tools/third_party/webcomponents/LICENSE create mode 100644 vendor/gomodules.xyz/jsonpatch/LICENSE create mode 100644 vendor/gomodules.xyz/jsonpatch/v2/jsonpatch.go create mode 100644 vendor/google.golang.org/api/AUTHORS create mode 100644 vendor/google.golang.org/api/CONTRIBUTORS create mode 100644 vendor/google.golang.org/api/LICENSE create mode 100644 vendor/google.golang.org/api/googleapi/internal/uritemplates/LICENSE create mode 100644 vendor/google.golang.org/api/googleapi/transport/apikey.go create mode 100644 vendor/google.golang.org/api/internal/creds.go create mode 100644 vendor/google.golang.org/api/internal/pool.go create mode 100644 vendor/google.golang.org/api/internal/settings.go create mode 100644 vendor/google.golang.org/api/iterator/iterator.go create mode 100644 vendor/google.golang.org/api/option/credentials_go19.go create mode 100644 vendor/google.golang.org/api/option/credentials_notgo19.go create mode 100644 vendor/google.golang.org/api/option/option.go create mode 100644 vendor/google.golang.org/api/support/bundler/bundler.go create mode 100644 vendor/google.golang.org/api/transport/dial.go create mode 100644 vendor/google.golang.org/api/transport/doc.go create mode 100644 vendor/google.golang.org/api/transport/go19.go create mode 100644 vendor/google.golang.org/api/transport/grpc/dial.go create mode 100644 vendor/google.golang.org/api/transport/grpc/dial_appengine.go create mode 100644 vendor/google.golang.org/api/transport/http/dial.go create mode 100644 vendor/google.golang.org/api/transport/http/dial_appengine.go create mode 100644 vendor/google.golang.org/api/transport/http/internal/propagation/http.go create mode 100644 vendor/google.golang.org/api/transport/not_go19.go create mode 100644 vendor/google.golang.org/appengine/LICENSE create mode 100644 vendor/google.golang.org/appengine/appengine.go create mode 100644 vendor/google.golang.org/appengine/appengine_vm.go create mode 100644 vendor/google.golang.org/appengine/errors.go create mode 100644 vendor/google.golang.org/appengine/identity.go create mode 100644 vendor/google.golang.org/appengine/internal/api.go create mode 100644 vendor/google.golang.org/appengine/internal/api_classic.go create mode 100644 vendor/google.golang.org/appengine/internal/api_common.go create mode 100644 vendor/google.golang.org/appengine/internal/app_id.go create mode 100644 vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/identity.go create mode 100644 vendor/google.golang.org/appengine/internal/identity_classic.go create mode 100644 vendor/google.golang.org/appengine/internal/identity_flex.go create mode 100644 vendor/google.golang.org/appengine/internal/identity_vm.go create mode 100644 vendor/google.golang.org/appengine/internal/internal.go create mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/main.go create mode 100644 vendor/google.golang.org/appengine/internal/main_common.go create mode 100644 vendor/google.golang.org/appengine/internal/main_vm.go create mode 100644 vendor/google.golang.org/appengine/internal/metadata.go create mode 100644 vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/net.go create mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/socket/socket_service.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/transaction.go create mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go create mode 100644 vendor/google.golang.org/appengine/namespace.go create mode 100644 vendor/google.golang.org/appengine/socket/doc.go create mode 100644 vendor/google.golang.org/appengine/socket/socket_classic.go create mode 100644 vendor/google.golang.org/appengine/socket/socket_vm.go create mode 100644 vendor/google.golang.org/appengine/timeout.go create mode 100644 vendor/google.golang.org/appengine/urlfetch/urlfetch.go create mode 100644 vendor/google.golang.org/genproto/LICENSE create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/authorization_config.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/distribution/distribution.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/experimental.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/httpbody/httpbody.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/label/label.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/metric/metric.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/container/v1/cluster_service.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/trace.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/tracing.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert_service.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/common.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/dropped_labels.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/group.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/group_service.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric_service.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/mutation_record.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification_service.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/span_context.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime_service.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go create mode 100644 vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.pb.go create mode 100644 vendor/google.golang.org/grpc/AUTHORS create mode 100644 vendor/google.golang.org/grpc/LICENSE create mode 100644 vendor/google.golang.org/grpc/backoff.go create mode 100644 vendor/google.golang.org/grpc/balancer.go create mode 100644 vendor/google.golang.org/grpc/balancer/balancer.go create mode 100644 vendor/google.golang.org/grpc/balancer/base/balancer.go create mode 100644 vendor/google.golang.org/grpc/balancer/base/base.go create mode 100644 vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go create mode 100644 vendor/google.golang.org/grpc/balancer_conn_wrappers.go create mode 100644 vendor/google.golang.org/grpc/balancer_v1_wrapper.go create mode 100644 vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go create mode 100644 vendor/google.golang.org/grpc/call.go create mode 100644 vendor/google.golang.org/grpc/clientconn.go create mode 100644 vendor/google.golang.org/grpc/codec.go create mode 100644 vendor/google.golang.org/grpc/codes/code_string.go create mode 100644 vendor/google.golang.org/grpc/codes/codes.go create mode 100644 vendor/google.golang.org/grpc/connectivity/connectivity.go create mode 100644 vendor/google.golang.org/grpc/credentials/credentials.go create mode 100644 vendor/google.golang.org/grpc/credentials/internal/syscallconn.go create mode 100644 vendor/google.golang.org/grpc/credentials/internal/syscallconn_appengine.go create mode 100644 vendor/google.golang.org/grpc/credentials/oauth/oauth.go create mode 100644 vendor/google.golang.org/grpc/credentials/tls13.go create mode 100644 vendor/google.golang.org/grpc/dialoptions.go create mode 100644 vendor/google.golang.org/grpc/doc.go create mode 100644 vendor/google.golang.org/grpc/encoding/encoding.go create mode 100644 vendor/google.golang.org/grpc/encoding/proto/proto.go create mode 100644 vendor/google.golang.org/grpc/grpclog/grpclog.go create mode 100644 vendor/google.golang.org/grpc/grpclog/logger.go create mode 100644 vendor/google.golang.org/grpc/grpclog/loggerv2.go create mode 100644 vendor/google.golang.org/grpc/interceptor.go create mode 100644 vendor/google.golang.org/grpc/internal/backoff/backoff.go create mode 100644 vendor/google.golang.org/grpc/internal/balancerload/load.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/env_config.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/method_logger.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/sink.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/util.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/funcs.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_linux.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_linux.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go create mode 100644 vendor/google.golang.org/grpc/internal/envconfig/envconfig.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/event.go create mode 100644 vendor/google.golang.org/grpc/internal/internal.go create mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go create mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/controlbuf.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/defaults.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/flowcontrol.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/handler_server.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_client.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_server.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/http_util.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/log.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/transport.go create mode 100644 vendor/google.golang.org/grpc/keepalive/keepalive.go create mode 100644 vendor/google.golang.org/grpc/metadata/metadata.go create mode 100644 vendor/google.golang.org/grpc/naming/dns_resolver.go create mode 100644 vendor/google.golang.org/grpc/naming/naming.go create mode 100644 vendor/google.golang.org/grpc/peer/peer.go create mode 100644 vendor/google.golang.org/grpc/picker_wrapper.go create mode 100644 vendor/google.golang.org/grpc/pickfirst.go create mode 100644 vendor/google.golang.org/grpc/preloader.go create mode 100644 vendor/google.golang.org/grpc/proxy.go create mode 100644 vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go create mode 100644 vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go create mode 100644 vendor/google.golang.org/grpc/resolver/resolver.go create mode 100644 vendor/google.golang.org/grpc/resolver_conn_wrapper.go create mode 100644 vendor/google.golang.org/grpc/rpc_util.go create mode 100644 vendor/google.golang.org/grpc/server.go create mode 100644 vendor/google.golang.org/grpc/service_config.go create mode 100644 vendor/google.golang.org/grpc/stats/handlers.go create mode 100644 vendor/google.golang.org/grpc/stats/stats.go create mode 100644 vendor/google.golang.org/grpc/status/status.go create mode 100644 vendor/google.golang.org/grpc/stream.go create mode 100644 vendor/google.golang.org/grpc/tap/tap.go create mode 100644 vendor/google.golang.org/grpc/trace.go create mode 100644 vendor/google.golang.org/grpc/version.go create mode 100644 vendor/gopkg.in/inf.v0/LICENSE create mode 100644 vendor/gopkg.in/inf.v0/dec.go create mode 100644 vendor/gopkg.in/inf.v0/rounder.go create mode 100644 vendor/gopkg.in/yaml.v2/LICENSE create mode 100644 vendor/gopkg.in/yaml.v2/LICENSE.libyaml create mode 100644 vendor/gopkg.in/yaml.v2/NOTICE create mode 100644 vendor/gopkg.in/yaml.v2/apic.go create mode 100644 vendor/gopkg.in/yaml.v2/decode.go create mode 100644 vendor/gopkg.in/yaml.v2/emitterc.go create mode 100644 vendor/gopkg.in/yaml.v2/encode.go create mode 100644 vendor/gopkg.in/yaml.v2/parserc.go create mode 100644 vendor/gopkg.in/yaml.v2/readerc.go create mode 100644 vendor/gopkg.in/yaml.v2/resolve.go create mode 100644 vendor/gopkg.in/yaml.v2/scannerc.go create mode 100644 vendor/gopkg.in/yaml.v2/sorter.go create mode 100644 vendor/gopkg.in/yaml.v2/writerc.go create mode 100644 vendor/gopkg.in/yaml.v2/yaml.go create mode 100644 vendor/gopkg.in/yaml.v2/yamlh.go create mode 100644 vendor/gopkg.in/yaml.v2/yamlprivateh.go create mode 100644 vendor/k8s.io/api/LICENSE create mode 100644 vendor/k8s.io/api/admission/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/admission/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/admission/v1beta1/register.go create mode 100644 vendor/k8s.io/api/admission/v1beta1/types.go create mode 100644 vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1/doc.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1/register.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1/types.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/register.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/types.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/apps/v1/doc.go create mode 100644 vendor/k8s.io/api/apps/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/apps/v1/register.go create mode 100644 vendor/k8s.io/api/apps/v1/types.go create mode 100644 vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/apps/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/apps/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/apps/v1beta1/register.go create mode 100644 vendor/k8s.io/api/apps/v1beta1/types.go create mode 100644 vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/apps/v1beta2/doc.go create mode 100644 vendor/k8s.io/api/apps/v1beta2/generated.pb.go create mode 100644 vendor/k8s.io/api/apps/v1beta2/register.go create mode 100644 vendor/k8s.io/api/apps/v1beta2/types.go create mode 100644 vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/authentication/v1/doc.go create mode 100644 vendor/k8s.io/api/authentication/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/authentication/v1/register.go create mode 100644 vendor/k8s.io/api/authentication/v1/types.go create mode 100644 vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/authentication/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/authentication/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/authentication/v1beta1/register.go create mode 100644 vendor/k8s.io/api/authentication/v1beta1/types.go create mode 100644 vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/authorization/v1/doc.go create mode 100644 vendor/k8s.io/api/authorization/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/authorization/v1/register.go create mode 100644 vendor/k8s.io/api/authorization/v1/types.go create mode 100644 vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/authorization/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/authorization/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/authorization/v1beta1/register.go create mode 100644 vendor/k8s.io/api/authorization/v1beta1/types.go create mode 100644 vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/autoscaling/v1/doc.go create mode 100644 vendor/k8s.io/api/autoscaling/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/autoscaling/v1/register.go create mode 100644 vendor/k8s.io/api/autoscaling/v1/types.go create mode 100644 vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/doc.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/register.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/types.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/doc.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/register.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/batch/v1/doc.go create mode 100644 vendor/k8s.io/api/batch/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/batch/v1/register.go create mode 100644 vendor/k8s.io/api/batch/v1/types.go create mode 100644 vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/batch/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/batch/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/batch/v1beta1/register.go create mode 100644 vendor/k8s.io/api/batch/v1beta1/types.go create mode 100644 vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/batch/v2alpha1/doc.go create mode 100644 vendor/k8s.io/api/batch/v2alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/batch/v2alpha1/register.go create mode 100644 vendor/k8s.io/api/batch/v2alpha1/types.go create mode 100644 vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/certificates/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/certificates/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/certificates/v1beta1/register.go create mode 100644 vendor/k8s.io/api/certificates/v1beta1/types.go create mode 100644 vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/coordination/v1/doc.go create mode 100644 vendor/k8s.io/api/coordination/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/coordination/v1/register.go create mode 100644 vendor/k8s.io/api/coordination/v1/types.go create mode 100644 vendor/k8s.io/api/coordination/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/coordination/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/register.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/types.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/core/v1/annotation_key_constants.go create mode 100644 vendor/k8s.io/api/core/v1/doc.go create mode 100644 vendor/k8s.io/api/core/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/core/v1/objectreference.go create mode 100644 vendor/k8s.io/api/core/v1/register.go create mode 100644 vendor/k8s.io/api/core/v1/resource.go create mode 100644 vendor/k8s.io/api/core/v1/taint.go create mode 100644 vendor/k8s.io/api/core/v1/toleration.go create mode 100644 vendor/k8s.io/api/core/v1/types.go create mode 100644 vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/core/v1/well_known_labels.go create mode 100644 vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/well_known_labels.go create mode 100644 vendor/k8s.io/api/discovery/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/events/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/events/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/events/v1beta1/register.go create mode 100644 vendor/k8s.io/api/events/v1beta1/types.go create mode 100644 vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/extensions/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/extensions/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/extensions/v1beta1/register.go create mode 100644 vendor/k8s.io/api/extensions/v1beta1/types.go create mode 100644 vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/networking/v1/doc.go create mode 100644 vendor/k8s.io/api/networking/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/networking/v1/register.go create mode 100644 vendor/k8s.io/api/networking/v1/types.go create mode 100644 vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/networking/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/networking/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/networking/v1beta1/register.go create mode 100644 vendor/k8s.io/api/networking/v1beta1/types.go create mode 100644 vendor/k8s.io/api/networking/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/networking/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/node/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/node/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/node/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/node/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/node/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/node/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/node/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/node/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/node/v1beta1/register.go create mode 100644 vendor/k8s.io/api/node/v1beta1/types.go create mode 100644 vendor/k8s.io/api/node/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/node/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/policy/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/policy/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/policy/v1beta1/register.go create mode 100644 vendor/k8s.io/api/policy/v1beta1/types.go create mode 100644 vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/rbac/v1/doc.go create mode 100644 vendor/k8s.io/api/rbac/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/rbac/v1/register.go create mode 100644 vendor/k8s.io/api/rbac/v1/types.go create mode 100644 vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/rbac/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/rbac/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/rbac/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/rbac/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/rbac/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/rbac/v1beta1/register.go create mode 100644 vendor/k8s.io/api/rbac/v1beta1/types.go create mode 100644 vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/scheduling/v1/doc.go create mode 100644 vendor/k8s.io/api/scheduling/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/scheduling/v1/register.go create mode 100644 vendor/k8s.io/api/scheduling/v1/types.go create mode 100644 vendor/k8s.io/api/scheduling/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/scheduling/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/register.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/types.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/settings/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/settings/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/settings/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/settings/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/settings/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/settings/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/storage/v1/doc.go create mode 100644 vendor/k8s.io/api/storage/v1/generated.pb.go create mode 100644 vendor/k8s.io/api/storage/v1/register.go create mode 100644 vendor/k8s.io/api/storage/v1/types.go create mode 100644 vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/storage/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/storage/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/storage/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/storage/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/storage/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/storage/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/storage/v1beta1/register.go create mode 100644 vendor/k8s.io/api/storage/v1beta1/types.go create mode 100644 vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/LICENSE create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/doc.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/register.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types_jsonschema.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/conversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/doc.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/register.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/LICENSE create mode 100644 vendor/k8s.io/apimachinery/pkg/api/equality/semantic.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/errors.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/errors.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/firsthit_restmapper.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/help.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/lazy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/meta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/multirestmapper.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/priority.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/amount.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/math.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/scale_int.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/suffix.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/generic.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/types.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/labels.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_proto.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_proto.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/watch.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/conversion.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/register.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/converter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/deep_equal.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/helper.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/fields/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/fields/fields.go create mode 100644 vendor/k8s.io/apimachinery/pkg/fields/requirements.go create mode 100644 vendor/k8s.io/apimachinery/pkg/fields/selector.go create mode 100644 vendor/k8s.io/apimachinery/pkg/labels/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/labels/labels.go create mode 100644 vendor/k8s.io/apimachinery/pkg/labels/selector.go create mode 100644 vendor/k8s.io/apimachinery/pkg/labels/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/codec.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/conversion.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/converter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/embedded.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/error.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/extension.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/helper.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/mapper.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/register.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/scheme.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/scheme_builder.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/meta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/negotiated_codec.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/recognizer.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/streaming.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/swagger_doc_generator.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/types.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/selection/operator.go create mode 100644 vendor/k8s.io/apimachinery/pkg/types/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/types/namespacedname.go create mode 100644 vendor/k8s.io/apimachinery/pkg/types/nodename.go create mode 100644 vendor/k8s.io/apimachinery/pkg/types/patch.go create mode 100644 vendor/k8s.io/apimachinery/pkg/types/uid.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/cache.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/clock/clock.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/diff.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/errors.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/framer/framer.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/json/json.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/mergepatch/errors.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/http.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/interface.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/port_range.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/port_split.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/util.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/byte.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/empty.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/int.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/int32.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/int64.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/string.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/errors.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/types.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/uuid/uuid.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/validation.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/wait.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go create mode 100644 vendor/k8s.io/apimachinery/pkg/version/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/version/helpers.go create mode 100644 vendor/k8s.io/apimachinery/pkg/version/types.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/doc.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/filter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/mux.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/watch.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go create mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go create mode 100644 vendor/k8s.io/client-go/LICENSE create mode 100644 vendor/k8s.io/client-go/discovery/discovery_client.go create mode 100644 vendor/k8s.io/client-go/discovery/doc.go create mode 100644 vendor/k8s.io/client-go/discovery/fake/discovery.go create mode 100644 vendor/k8s.io/client-go/discovery/helper.go create mode 100644 vendor/k8s.io/client-go/dynamic/interface.go create mode 100644 vendor/k8s.io/client-go/dynamic/scheme.go create mode 100644 vendor/k8s.io/client-go/dynamic/simple.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/interface.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/informers/apps/interface.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1/daemonset.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1/deployment.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1/replicaset.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1/statefulset.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/interface.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go create mode 100644 vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go create mode 100644 vendor/k8s.io/client-go/informers/auditregistration/interface.go create mode 100644 vendor/k8s.io/client-go/informers/auditregistration/v1alpha1/auditsink.go create mode 100644 vendor/k8s.io/client-go/informers/auditregistration/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/interface.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/interface.go create mode 100644 vendor/k8s.io/client-go/informers/batch/interface.go create mode 100644 vendor/k8s.io/client-go/informers/batch/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/batch/v1/job.go create mode 100644 vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go create mode 100644 vendor/k8s.io/client-go/informers/batch/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go create mode 100644 vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/certificates/interface.go create mode 100644 vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go create mode 100644 vendor/k8s.io/client-go/informers/certificates/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1/lease.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/informers/core/interface.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/componentstatus.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/configmap.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/endpoints.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/event.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/limitrange.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/namespace.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/node.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/pod.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/podtemplate.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/resourcequota.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/secret.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/service.go create mode 100644 vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go create mode 100644 vendor/k8s.io/client-go/informers/discovery/interface.go create mode 100644 vendor/k8s.io/client-go/informers/discovery/v1alpha1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/informers/discovery/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/events/interface.go create mode 100644 vendor/k8s.io/client-go/informers/events/v1beta1/event.go create mode 100644 vendor/k8s.io/client-go/informers/events/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/interface.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go create mode 100644 vendor/k8s.io/client-go/informers/factory.go create mode 100644 vendor/k8s.io/client-go/informers/generic.go create mode 100644 vendor/k8s.io/client-go/informers/internalinterfaces/factory_interfaces.go create mode 100644 vendor/k8s.io/client-go/informers/networking/interface.go create mode 100644 vendor/k8s.io/client-go/informers/networking/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/informers/networking/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/informers/networking/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/node/interface.go create mode 100644 vendor/k8s.io/client-go/informers/node/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/node/v1alpha1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/informers/node/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/node/v1beta1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/informers/policy/interface.go create mode 100644 vendor/k8s.io/client-go/informers/policy/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/interface.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1/role.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go create mode 100644 vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/interface.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/informers/settings/interface.go create mode 100644 vendor/k8s.io/client-go/informers/settings/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go create mode 100644 vendor/k8s.io/client-go/informers/storage/interface.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1/storageclass.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/csidriver.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/csinode.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/clientset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/import.go create mode 100644 vendor/k8s.io/client-go/kubernetes/scheme/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/scheme/register.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/admissionregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/apps_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/apps_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/apps_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/auditregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/auditsink.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/authentication_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/authorization_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/authorization_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/autoscaling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/batch_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificates_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/coordination_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1/lease.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/coordination_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/core_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/event_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/node_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/service_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/discovery_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/events_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networking_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1beta1/networking_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/node_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1alpha1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/node_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/node/v1beta1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/policy_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rbac_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rbac_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1/scheduling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/scheduling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/scheduling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/podpreset.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/settings_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storage_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csidriver.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/csinode.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/validatingwebhookconfiguration.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/daemonset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/daemonset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/deployment.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/deployment_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/replicaset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/replicaset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/statefulset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1/statefulset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta1/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta1/statefulset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta1/statefulset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/controllerrevision.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/daemonset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/daemonset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/deployment.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/deployment_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/replicaset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/replicaset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/statefulset.go create mode 100644 vendor/k8s.io/client-go/listers/apps/v1beta2/statefulset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/auditregistration/v1alpha1/auditsink.go create mode 100644 vendor/k8s.io/client-go/listers/auditregistration/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta1/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v1/job.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v1/job_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v1beta1/cronjob.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go create mode 100644 vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/certificates/v1beta1/certificatesigningrequest.go create mode 100644 vendor/k8s.io/client-go/listers/certificates/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1/lease.go create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/componentstatus.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/configmap.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/endpoints.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/event.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/limitrange.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/namespace.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/node.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/node_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/persistentvolume.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/persistentvolumeclaim.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/pod.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/podtemplate.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/replicationcontroller.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/replicationcontroller_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/resourcequota.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/secret.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/service.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/service_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/core/v1/serviceaccount.go create mode 100644 vendor/k8s.io/client-go/listers/discovery/v1alpha1/endpointslice.go create mode 100644 vendor/k8s.io/client-go/listers/discovery/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/events/v1beta1/event.go create mode 100644 vendor/k8s.io/client-go/listers/events/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/deployment.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/deployment_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/replicaset.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/replicaset_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/networking/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/networking/v1/networkpolicy.go create mode 100644 vendor/k8s.io/client-go/listers/networking/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/networking/v1beta1/ingress.go create mode 100644 vendor/k8s.io/client-go/listers/node/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/node/v1alpha1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/listers/node/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/node/v1beta1/runtimeclass.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/eviction.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget_expansion.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1/role.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1alpha1/role.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1alpha1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrole.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrolebinding.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1beta1/role.go create mode 100644 vendor/k8s.io/client-go/listers/rbac/v1beta1/rolebinding.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1alpha1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/scheduling/v1beta1/priorityclass.go create mode 100644 vendor/k8s.io/client-go/listers/settings/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/settings/v1alpha1/podpreset.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1/storageclass.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1alpha1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/csidriver.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/csinode.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/storageclass.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/pkg/version/base.go create mode 100644 vendor/k8s.io/client-go/pkg/version/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/version/version.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go create mode 100644 vendor/k8s.io/client-go/rest/client.go create mode 100644 vendor/k8s.io/client-go/rest/config.go create mode 100644 vendor/k8s.io/client-go/rest/plugin.go create mode 100644 vendor/k8s.io/client-go/rest/request.go create mode 100644 vendor/k8s.io/client-go/rest/transport.go create mode 100644 vendor/k8s.io/client-go/rest/url_utils.go create mode 100644 vendor/k8s.io/client-go/rest/urlbackoff.go create mode 100644 vendor/k8s.io/client-go/rest/watch/decoder.go create mode 100644 vendor/k8s.io/client-go/rest/watch/encoder.go create mode 100644 vendor/k8s.io/client-go/rest/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/testing/actions.go create mode 100644 vendor/k8s.io/client-go/testing/fake.go create mode 100644 vendor/k8s.io/client-go/testing/fixture.go create mode 100644 vendor/k8s.io/client-go/tools/auth/clientauth.go create mode 100644 vendor/k8s.io/client-go/tools/cache/controller.go create mode 100644 vendor/k8s.io/client-go/tools/cache/delta_fifo.go create mode 100644 vendor/k8s.io/client-go/tools/cache/doc.go create mode 100644 vendor/k8s.io/client-go/tools/cache/expiration_cache.go create mode 100644 vendor/k8s.io/client-go/tools/cache/expiration_cache_fakes.go create mode 100644 vendor/k8s.io/client-go/tools/cache/fake_custom_store.go create mode 100644 vendor/k8s.io/client-go/tools/cache/fifo.go create mode 100644 vendor/k8s.io/client-go/tools/cache/heap.go create mode 100644 vendor/k8s.io/client-go/tools/cache/index.go create mode 100644 vendor/k8s.io/client-go/tools/cache/listers.go create mode 100644 vendor/k8s.io/client-go/tools/cache/listwatch.go create mode 100644 vendor/k8s.io/client-go/tools/cache/mutation_cache.go create mode 100644 vendor/k8s.io/client-go/tools/cache/mutation_detector.go create mode 100644 vendor/k8s.io/client-go/tools/cache/reflector.go create mode 100644 vendor/k8s.io/client-go/tools/cache/reflector_metrics.go create mode 100644 vendor/k8s.io/client-go/tools/cache/shared_informer.go create mode 100644 vendor/k8s.io/client-go/tools/cache/store.go create mode 100644 vendor/k8s.io/client-go/tools/cache/thread_safe_store.go create mode 100644 vendor/k8s.io/client-go/tools/cache/undelta_store.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/doc.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/helpers.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/latest/latest.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/register.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/types.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/conversion.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/doc.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/register.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/types.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/client_config.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/config.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/doc.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/flag.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/helpers.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/loader.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/merged_client_builder.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/overrides.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/validation.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/healthzadaptor.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/metrics.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/resourcelock/configmaplock.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/resourcelock/endpointslock.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/resourcelock/interface.go create mode 100644 vendor/k8s.io/client-go/tools/leaderelection/resourcelock/leaselock.go create mode 100644 vendor/k8s.io/client-go/tools/metrics/metrics.go create mode 100644 vendor/k8s.io/client-go/tools/pager/pager.go create mode 100644 vendor/k8s.io/client-go/tools/record/doc.go create mode 100644 vendor/k8s.io/client-go/tools/record/event.go create mode 100644 vendor/k8s.io/client-go/tools/record/events_cache.go create mode 100644 vendor/k8s.io/client-go/tools/record/fake.go create mode 100644 vendor/k8s.io/client-go/tools/record/util/util.go create mode 100644 vendor/k8s.io/client-go/tools/reference/ref.go create mode 100644 vendor/k8s.io/client-go/transport/cache.go create mode 100644 vendor/k8s.io/client-go/transport/config.go create mode 100644 vendor/k8s.io/client-go/transport/round_trippers.go create mode 100644 vendor/k8s.io/client-go/transport/token_source.go create mode 100644 vendor/k8s.io/client-go/transport/transport.go create mode 100644 vendor/k8s.io/client-go/util/cert/cert.go create mode 100644 vendor/k8s.io/client-go/util/cert/csr.go create mode 100644 vendor/k8s.io/client-go/util/cert/io.go create mode 100644 vendor/k8s.io/client-go/util/cert/pem.go create mode 100644 vendor/k8s.io/client-go/util/connrotation/connrotation.go create mode 100644 vendor/k8s.io/client-go/util/flowcontrol/backoff.go create mode 100644 vendor/k8s.io/client-go/util/flowcontrol/throttle.go create mode 100644 vendor/k8s.io/client-go/util/homedir/homedir.go create mode 100644 vendor/k8s.io/client-go/util/keyutil/key.go create mode 100644 vendor/k8s.io/client-go/util/retry/util.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/default_rate_limiters.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/delaying_queue.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/doc.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/metrics.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/parallelizer.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/queue.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/rate_limiting_queue.go create mode 100644 vendor/k8s.io/code-generator/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/k8s.io/code-generator/CONTRIBUTING.md create mode 100644 vendor/k8s.io/code-generator/Godeps/Godeps.json create mode 100644 vendor/k8s.io/code-generator/Godeps/Readme create mode 100644 vendor/k8s.io/code-generator/LICENSE create mode 100644 vendor/k8s.io/code-generator/README.md create mode 100644 vendor/k8s.io/code-generator/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/apis/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/apis/example/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/apis/example/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/apis/example/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/apis/example/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/clientset.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/fake/clientset_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/fake/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/scheme/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/scheme/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/fake/fake_clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/fake/fake_example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/clientset/versioned/typed/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/example/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/example/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/factory.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/generic.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/informers/externalversions/internalinterfaces/factory_interfaces.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/listers/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/listers/example/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/HyphenGroup/listers/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/apis/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/apis/example/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/apis/example/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/apis/example/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/apis/example/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/clientset.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/fake/clientset_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/fake/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/scheme/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/scheme/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/fake/fake_clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/fake/fake_example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/clientset/versioned/typed/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/example/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/example/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/factory.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/generic.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/informers/externalversions/internalinterfaces/factory_interfaces.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/listers/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/listers/example/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/MixedCase/listers/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/install/install.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/v1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/install/install.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/v1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/apis/example3.io/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/clientset.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/clientset_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/example2_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/fake/fake_example2_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example2/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/example3.io_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/fake/fake_example3.io_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example3.io/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/clientset.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/clientset_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/example2_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/fake/fake_example2_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example2/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/example3.io_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/fake/fake_example3.io_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example3.io/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example2/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example2/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example2/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example3.io/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example3.io/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example3.io/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/factory.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/generic.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces/factory_interfaces.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example2/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example2/internalversion/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example2/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example3.io/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example3.io/internalversion/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example3.io/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/factory.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/generic.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces/factory_interfaces.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example2/internalversion/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example2/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example2/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example2/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example3.io/internalversion/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example3.io/internalversion/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example3.io/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/listers/example3.io/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/apiserver/openapi/zz_generated.openapi.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example2/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example2/v1/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example2/v1/types.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example2/v1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/apis/example2/v1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/clientset.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/clientset_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/register.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_example_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/example2_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/fake/doc.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/fake/fake_example2_client.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/fake/fake_testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/generated_expansion.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example2/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example2/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example2/v1/interface.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/example2/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/factory.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/generic.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces/factory_interfaces.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/listers/example/v1/clustertesttype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/listers/example/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/listers/example/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/listers/example2/v1/expansion_generated.go create mode 100644 vendor/k8s.io/code-generator/_examples/crd/listers/example2/v1/testtype.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/README.md create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/args/gvpackages.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/args/gvtype.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/generator_for_expansion.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/generators/util/tags.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/path/path.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/types/helpers.go create mode 100644 vendor/k8s.io/code-generator/cmd/client-gen/types/types.go create mode 100644 vendor/k8s.io/code-generator/cmd/conversion-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go create mode 100644 vendor/k8s.io/code-generator/cmd/conversion-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/deepcopy-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/defaulter-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/defaulter-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/.gitignore create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/cmd.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/generator.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/import_tracker.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/namer.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/package.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/tags.go create mode 100644 vendor/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/import-boss/.gitignore create mode 100644 vendor/k8s.io/code-generator/cmd/import-boss/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/factory.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/factoryinterface.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/generic.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/informer.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/packages.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/types.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/generators/versioninterface.go create mode 100644 vendor/k8s.io/code-generator/cmd/informer-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/.import-restrictions create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/generators/lister.go create mode 100644 vendor/k8s.io/code-generator/cmd/lister-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/openapi-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/register-gen/args/args.go create mode 100644 vendor/k8s.io/code-generator/cmd/register-gen/generators/packages.go create mode 100644 vendor/k8s.io/code-generator/cmd/register-gen/generators/register_external.go create mode 100644 vendor/k8s.io/code-generator/cmd/register-gen/main.go create mode 100644 vendor/k8s.io/code-generator/cmd/set-gen/.gitignore create mode 100644 vendor/k8s.io/code-generator/cmd/set-gen/main.go create mode 100644 vendor/k8s.io/code-generator/code-of-conduct.md create mode 100755 vendor/k8s.io/code-generator/generate-groups.sh create mode 100755 vendor/k8s.io/code-generator/generate-internal-groups.sh create mode 100644 vendor/k8s.io/code-generator/go.mod create mode 100644 vendor/k8s.io/code-generator/go.sum create mode 100644 vendor/k8s.io/code-generator/hack/boilerplate.go.txt create mode 100755 vendor/k8s.io/code-generator/hack/update-codegen.sh create mode 100755 vendor/k8s.io/code-generator/hack/verify-codegen.sh create mode 100644 vendor/k8s.io/code-generator/pkg/namer/tag-override.go create mode 100644 vendor/k8s.io/code-generator/pkg/util/build.go create mode 100644 vendor/k8s.io/code-generator/third_party/forked/golang/reflect/type.go create mode 100644 vendor/k8s.io/code-generator/tools.go create mode 100644 vendor/k8s.io/gengo/LICENSE create mode 100644 vendor/k8s.io/gengo/args/args.go create mode 100644 vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go create mode 100644 vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go create mode 100644 vendor/k8s.io/gengo/examples/set-gen/sets/byte.go create mode 100644 vendor/k8s.io/gengo/examples/set-gen/sets/doc.go create mode 100644 vendor/k8s.io/gengo/examples/set-gen/sets/empty.go create mode 100644 vendor/k8s.io/gengo/examples/set-gen/sets/int.go create mode 100644 vendor/k8s.io/gengo/examples/set-gen/sets/int64.go create mode 100644 vendor/k8s.io/gengo/examples/set-gen/sets/string.go create mode 100644 vendor/k8s.io/gengo/generator/default_generator.go create mode 100644 vendor/k8s.io/gengo/generator/default_package.go create mode 100644 vendor/k8s.io/gengo/generator/doc.go create mode 100644 vendor/k8s.io/gengo/generator/error_tracker.go create mode 100644 vendor/k8s.io/gengo/generator/execute.go create mode 100644 vendor/k8s.io/gengo/generator/generator.go create mode 100644 vendor/k8s.io/gengo/generator/import_tracker.go create mode 100644 vendor/k8s.io/gengo/generator/snippet_writer.go create mode 100644 vendor/k8s.io/gengo/namer/doc.go create mode 100644 vendor/k8s.io/gengo/namer/import_tracker.go create mode 100644 vendor/k8s.io/gengo/namer/namer.go create mode 100644 vendor/k8s.io/gengo/namer/order.go create mode 100644 vendor/k8s.io/gengo/namer/plural_namer.go create mode 100644 vendor/k8s.io/gengo/parser/doc.go create mode 100644 vendor/k8s.io/gengo/parser/parse.go create mode 100644 vendor/k8s.io/gengo/types/comments.go create mode 100644 vendor/k8s.io/gengo/types/doc.go create mode 100644 vendor/k8s.io/gengo/types/flatten.go create mode 100644 vendor/k8s.io/gengo/types/types.go create mode 100644 vendor/k8s.io/klog/LICENSE create mode 100644 vendor/k8s.io/klog/klog.go create mode 100644 vendor/k8s.io/klog/klog_file.go create mode 100644 vendor/k8s.io/kube-openapi/LICENSE create mode 100644 vendor/k8s.io/kube-openapi/pkg/util/proto/doc.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/util/proto/document.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/util/proto/openapi.go create mode 100644 vendor/k8s.io/utils/LICENSE create mode 100644 vendor/k8s.io/utils/buffer/ring_growing.go create mode 100644 vendor/k8s.io/utils/inotify/LICENSE create mode 100644 vendor/k8s.io/utils/inotify/PATENTS create mode 100644 vendor/k8s.io/utils/integer/integer.go create mode 100644 vendor/k8s.io/utils/pointer/pointer.go create mode 100644 vendor/k8s.io/utils/third_party/forked/golang/LICENSE create mode 100644 vendor/k8s.io/utils/third_party/forked/golang/PATENTS create mode 100644 vendor/k8s.io/utils/trace/trace.go create mode 100644 vendor/knative.dev/pkg/.gitattributes create mode 100644 vendor/knative.dev/pkg/.github/PULL_REQUEST_TEMPLATE/breaking-change.md create mode 100644 vendor/knative.dev/pkg/.github/PULL_REQUEST_TEMPLATE/bug-fix.md create mode 100644 vendor/knative.dev/pkg/.github/PULL_REQUEST_TEMPLATE/normal-change.md create mode 100644 vendor/knative.dev/pkg/.github/issue-template.md create mode 100644 vendor/knative.dev/pkg/.gitignore create mode 100644 vendor/knative.dev/pkg/CONTRIBUTING.md create mode 100644 vendor/knative.dev/pkg/DEVELOPMENT.md create mode 100644 vendor/knative.dev/pkg/Gopkg.lock create mode 100644 vendor/knative.dev/pkg/Gopkg.toml create mode 100644 vendor/knative.dev/pkg/LICENSE create mode 100644 vendor/knative.dev/pkg/OWNERS_ALIASES create mode 100644 vendor/knative.dev/pkg/README.md create mode 100644 vendor/knative.dev/pkg/RELEASING.md create mode 100644 vendor/knative.dev/pkg/apiextensions/storageversion/cmd/migrate/config.go create mode 100644 vendor/knative.dev/pkg/apiextensions/storageversion/cmd/migrate/main.go create mode 100644 vendor/knative.dev/pkg/apiextensions/storageversion/migrator.go create mode 100644 vendor/knative.dev/pkg/apis/condition_set.go create mode 100644 vendor/knative.dev/pkg/apis/condition_types.go create mode 100644 vendor/knative.dev/pkg/apis/contexts.go create mode 100644 vendor/knative.dev/pkg/apis/convert.go create mode 100644 vendor/knative.dev/pkg/apis/deprecated.go create mode 100644 vendor/knative.dev/pkg/apis/doc.go create mode 100644 vendor/knative.dev/pkg/apis/duck/ABOUT.md create mode 100644 vendor/knative.dev/pkg/apis/duck/README.md create mode 100644 vendor/knative.dev/pkg/apis/duck/cached.go create mode 100644 vendor/knative.dev/pkg/apis/duck/const.go create mode 100644 vendor/knative.dev/pkg/apis/duck/doc.go create mode 100644 vendor/knative.dev/pkg/apis/duck/enqueue.go create mode 100644 vendor/knative.dev/pkg/apis/duck/images/Knative-Duck0.png create mode 100644 vendor/knative.dev/pkg/apis/duck/interface.go create mode 100644 vendor/knative.dev/pkg/apis/duck/patch.go create mode 100644 vendor/knative.dev/pkg/apis/duck/proxy.go create mode 100644 vendor/knative.dev/pkg/apis/duck/register.go create mode 100644 vendor/knative.dev/pkg/apis/duck/typed.go create mode 100644 vendor/knative.dev/pkg/apis/duck/unstructured.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/addressable_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/destination.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/doc.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/knative_reference.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/podspec_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/register.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/source_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/status_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/addressable_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/binding_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/doc.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/legacy_targetable_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/register.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/retired_targetable_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/addressable_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/destination.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/doc.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/register.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/source_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/status_types.go create mode 100644 vendor/knative.dev/pkg/apis/duck/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/apis/duck/verify.go create mode 100644 vendor/knative.dev/pkg/apis/field_error.go create mode 100644 vendor/knative.dev/pkg/apis/interfaces.go create mode 100644 vendor/knative.dev/pkg/apis/kind2resource.go create mode 100644 vendor/knative.dev/pkg/apis/metadata_validation.go create mode 100644 vendor/knative.dev/pkg/apis/test/example/register.go create mode 100644 vendor/knative.dev/pkg/apis/test/example/v1alpha1/doc.go create mode 100644 vendor/knative.dev/pkg/apis/test/example/v1alpha1/fiz_types.go create mode 100644 vendor/knative.dev/pkg/apis/test/example/v1alpha1/foo_types.go create mode 100644 vendor/knative.dev/pkg/apis/test/example/v1alpha1/register.go create mode 100644 vendor/knative.dev/pkg/apis/test/example/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/apis/test/pub/register.go create mode 100644 vendor/knative.dev/pkg/apis/test/pub/v1alpha1/bar_types.go create mode 100644 vendor/knative.dev/pkg/apis/test/pub/v1alpha1/doc.go create mode 100644 vendor/knative.dev/pkg/apis/test/pub/v1alpha1/register.go create mode 100644 vendor/knative.dev/pkg/apis/test/pub/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/apis/testing/conditions.go create mode 100644 vendor/knative.dev/pkg/apis/testing/fuzzer/fuzzer.go create mode 100644 vendor/knative.dev/pkg/apis/testing/roundtrip/roundtrip.go create mode 100644 vendor/knative.dev/pkg/apis/url.go create mode 100644 vendor/knative.dev/pkg/apis/volatile_time.go create mode 100644 vendor/knative.dev/pkg/apis/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/changeset/commit.go create mode 100644 vendor/knative.dev/pkg/changeset/doc.go create mode 100644 vendor/knative.dev/pkg/changeset/testdata/HEAD create mode 100644 vendor/knative.dev/pkg/changeset/testdata/garbage/HEAD create mode 100644 vendor/knative.dev/pkg/changeset/testdata/noncommitted/HEAD create mode 100644 vendor/knative.dev/pkg/changeset/testdata/with-refs/HEAD create mode 100644 vendor/knative.dev/pkg/changeset/testdata/with-refs/refs/heads/branch-name create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/client/client.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/client/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/informers/apiextensions/v1beta1/customresourcedefinition/customresourcedefinition.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/informers/apiextensions/v1beta1/customresourcedefinition/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/informers/factory/factory.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/informers/factory/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/controller.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/reconciler.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/stub/controller.go create mode 100644 vendor/knative.dev/pkg/client/injection/apiextensions/reconciler/apiextensions/v1beta1/customresourcedefinition/stub/reconciler.go create mode 100644 vendor/knative.dev/pkg/client/injection/client/client.go create mode 100644 vendor/knative.dev/pkg/client/injection/client/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/addressable/addressable.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/addressable/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/conditions/conditions.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/conditions/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/podspecable/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/podspecable/podspecable.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/source/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1/source/source.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/addressable/addressable.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/addressable/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/binding/binding.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/binding/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/legacytargetable/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/legacytargetable/legacytargetable.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/targetable/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1alpha1/targetable/targetable.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1beta1/addressable/addressable.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1beta1/addressable/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1beta1/conditions/conditions.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1beta1/conditions/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1beta1/source/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/ducks/duck/v1beta1/source/source.go create mode 100644 vendor/knative.dev/pkg/client/injection/informers/factory/factory.go create mode 100644 vendor/knative.dev/pkg/client/injection/informers/factory/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/client/client.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/client/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration/mutatingwebhookconfiguration.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1beta1/validatingwebhookconfiguration/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/admissionregistration/v1beta1/validatingwebhookconfiguration/validatingwebhookconfiguration.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/controllerrevision/controllerrevision.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/controllerrevision/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/daemonset/daemonset.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/daemonset/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/deployment/deployment.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/deployment/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/replicaset/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/replicaset/replicaset.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/statefulset/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/apps/v1/statefulset/statefulset.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/autoscaling/v1/horizontalpodautoscaler/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/autoscaling/v1/horizontalpodautoscaler/horizontalpodautoscaler.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/autoscaling/v2beta1/horizontalpodautoscaler/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/autoscaling/v2beta1/horizontalpodautoscaler/horizontalpodautoscaler.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/batch/v1/job/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/batch/v1/job/job.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/batch/v1beta1/cronjob/cronjob.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/batch/v1beta1/cronjob/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/componentstatus/componentstatus.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/componentstatus/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/configmap/configmap.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/configmap/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/endpoints/endpoints.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/endpoints/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/event/event.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/event/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/limitrange/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/limitrange/limitrange.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/namespace/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/namespace/namespace.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/node/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/node/node.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/persistentvolume/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/persistentvolume/persistentvolume.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/persistentvolumeclaim/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/persistentvolumeclaim/persistentvolumeclaim.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/pod/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/pod/pod.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/podtemplate/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/podtemplate/podtemplate.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/replicationcontroller/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/replicationcontroller/replicationcontroller.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/resourcequota/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/resourcequota/resourcequota.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/secret/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/secret/secret.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/service/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/service/service.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/serviceaccount/serviceaccount.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/factory/factory.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/factory/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/clusterrole/clusterrole.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/clusterrole/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/clusterrolebinding/clusterrolebinding.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/clusterrolebinding/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/role/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/role/role.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/rolebinding/fake/fake.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/informers/rbac/v1/rolebinding/rolebinding.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/reconciler/core/v1/namespace/controller.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/reconciler/core/v1/namespace/reconciler.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/reconciler/core/v1/namespace/stub/controller.go create mode 100644 vendor/knative.dev/pkg/client/injection/kube/reconciler/core/v1/namespace/stub/reconciler.go create mode 100644 vendor/knative.dev/pkg/code-of-conduct.md create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/args/args.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/client.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/duck.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/factory.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fakeclient.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fakeduck.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fakefactory.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/fakeinformer.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/informer.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/namesystems.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/packages.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_controller_stub.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/generators/reconciler_reconciler_stub.go create mode 100644 vendor/knative.dev/pkg/codegen/cmd/injection-gen/main.go create mode 100644 vendor/knative.dev/pkg/configmap/doc.go create mode 100644 vendor/knative.dev/pkg/configmap/filter.go create mode 100644 vendor/knative.dev/pkg/configmap/informed_watcher.go create mode 100644 vendor/knative.dev/pkg/configmap/load.go create mode 100644 vendor/knative.dev/pkg/configmap/manual_watcher.go create mode 100644 vendor/knative.dev/pkg/configmap/static_watcher.go create mode 100644 vendor/knative.dev/pkg/configmap/store.go create mode 100644 vendor/knative.dev/pkg/configmap/testing/configmap.go create mode 100644 vendor/knative.dev/pkg/configmap/watcher.go create mode 100644 vendor/knative.dev/pkg/controller/controller.go create mode 100644 vendor/knative.dev/pkg/controller/helper.go create mode 100644 vendor/knative.dev/pkg/controller/options.go create mode 100644 vendor/knative.dev/pkg/controller/stats_reporter.go create mode 100644 vendor/knative.dev/pkg/controller/testing/fake_stats_reporter.go create mode 100644 vendor/knative.dev/pkg/hack/boilerplate/boilerplate.go.txt create mode 100755 vendor/knative.dev/pkg/hack/generate-knative.sh create mode 100755 vendor/knative.dev/pkg/hack/update-codegen.sh create mode 100755 vendor/knative.dev/pkg/hack/update-deps.sh create mode 100755 vendor/knative.dev/pkg/hack/verify-codegen.sh create mode 100644 vendor/knative.dev/pkg/injection/README.md create mode 100644 vendor/knative.dev/pkg/injection/clients.go create mode 100644 vendor/knative.dev/pkg/injection/clients/dynamicclient/dynamicclient.go create mode 100644 vendor/knative.dev/pkg/injection/clients/dynamicclient/fake/fake.go create mode 100644 vendor/knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/fake/fake.go create mode 100644 vendor/knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/secret/secret.go create mode 100644 vendor/knative.dev/pkg/injection/clients/namespacedkube/informers/factory/factory.go create mode 100644 vendor/knative.dev/pkg/injection/clients/namespacedkube/informers/factory/fake/fake.go create mode 100644 vendor/knative.dev/pkg/injection/context.go create mode 100644 vendor/knative.dev/pkg/injection/doc.go create mode 100644 vendor/knative.dev/pkg/injection/ducks.go create mode 100644 vendor/knative.dev/pkg/injection/factories.go create mode 100644 vendor/knative.dev/pkg/injection/informers.go create mode 100644 vendor/knative.dev/pkg/injection/interface.go create mode 100644 vendor/knative.dev/pkg/injection/sharedmain/main.go create mode 100644 vendor/knative.dev/pkg/kmeta/accessor.go create mode 100644 vendor/knative.dev/pkg/kmeta/doc.go create mode 100644 vendor/knative.dev/pkg/kmeta/labels.go create mode 100644 vendor/knative.dev/pkg/kmeta/map.go create mode 100644 vendor/knative.dev/pkg/kmeta/names.go create mode 100644 vendor/knative.dev/pkg/kmeta/owner_references.go create mode 100644 vendor/knative.dev/pkg/kmeta/ownerrefable_accessor.go create mode 100644 vendor/knative.dev/pkg/kmp/diff.go create mode 100644 vendor/knative.dev/pkg/kmp/doc.go create mode 100644 vendor/knative.dev/pkg/kmp/reporters.go create mode 100644 vendor/knative.dev/pkg/kvstore/kvstore.go create mode 100644 vendor/knative.dev/pkg/kvstore/kvstore_cm.go create mode 100644 vendor/knative.dev/pkg/leaderelection/config.go create mode 100644 vendor/knative.dev/pkg/logging/config.go create mode 100644 vendor/knative.dev/pkg/logging/logger.go create mode 100644 vendor/knative.dev/pkg/logging/logkey/constants.go create mode 100644 vendor/knative.dev/pkg/logging/testing/util.go create mode 100644 vendor/knative.dev/pkg/logging/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/metrics/README.md create mode 100644 vendor/knative.dev/pkg/metrics/client.go create mode 100644 vendor/knative.dev/pkg/metrics/config.go create mode 100644 vendor/knative.dev/pkg/metrics/config_observability.go create mode 100644 vendor/knative.dev/pkg/metrics/doc.go create mode 100644 vendor/knative.dev/pkg/metrics/exporter.go create mode 100644 vendor/knative.dev/pkg/metrics/gcp_metadata.go create mode 100644 vendor/knative.dev/pkg/metrics/memstats.go create mode 100644 vendor/knative.dev/pkg/metrics/metrics.go create mode 100644 vendor/knative.dev/pkg/metrics/metricskey/constants.go create mode 100644 vendor/knative.dev/pkg/metrics/metricskey/constants_eventing.go create mode 100644 vendor/knative.dev/pkg/metrics/metricskey/constants_serving.go create mode 100644 vendor/knative.dev/pkg/metrics/metricstest/metricstest.go create mode 100644 vendor/knative.dev/pkg/metrics/monitored_resources.go create mode 100644 vendor/knative.dev/pkg/metrics/monitored_resources_eventing.go create mode 100644 vendor/knative.dev/pkg/metrics/monitored_resources_serving.go create mode 100644 vendor/knative.dev/pkg/metrics/opencensus_exporter.go create mode 100644 vendor/knative.dev/pkg/metrics/prometheus_exporter.go create mode 100644 vendor/knative.dev/pkg/metrics/record.go create mode 100644 vendor/knative.dev/pkg/metrics/reflector.go create mode 100644 vendor/knative.dev/pkg/metrics/stackdriver_exporter.go create mode 100644 vendor/knative.dev/pkg/metrics/testdata/README.md create mode 100644 vendor/knative.dev/pkg/metrics/testdata/client-cert.pem create mode 100644 vendor/knative.dev/pkg/metrics/testdata/client-key.pem create mode 100644 vendor/knative.dev/pkg/metrics/testdata/server-cert.pem create mode 100644 vendor/knative.dev/pkg/metrics/testdata/server-key.pem create mode 100644 vendor/knative.dev/pkg/metrics/testing/config.go create mode 100644 vendor/knative.dev/pkg/metrics/utils.go create mode 100644 vendor/knative.dev/pkg/metrics/workqueue.go create mode 100644 vendor/knative.dev/pkg/metrics/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/network/doc.go create mode 100644 vendor/knative.dev/pkg/network/domain.go create mode 100644 vendor/knative.dev/pkg/network/error_handler.go create mode 100644 vendor/knative.dev/pkg/network/h2c.go create mode 100644 vendor/knative.dev/pkg/network/network.go create mode 100644 vendor/knative.dev/pkg/network/prober/doc.go create mode 100644 vendor/knative.dev/pkg/network/prober/prober.go create mode 100644 vendor/knative.dev/pkg/network/transports.go create mode 100644 vendor/knative.dev/pkg/profiling/server.go create mode 100644 vendor/knative.dev/pkg/ptr/doc.go create mode 100644 vendor/knative.dev/pkg/ptr/ptr.go create mode 100644 vendor/knative.dev/pkg/reconciler/configstore.go create mode 100644 vendor/knative.dev/pkg/reconciler/events.go create mode 100644 vendor/knative.dev/pkg/reconciler/filter.go create mode 100644 vendor/knative.dev/pkg/reconciler/retry.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/actions.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/clock.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/context.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/events.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/generate_name_reactor.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/hooks.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/reactions.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/sorter.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/table.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/tracker.go create mode 100644 vendor/knative.dev/pkg/reconciler/testing/util.go create mode 100644 vendor/knative.dev/pkg/resolver/addressable_resolver.go create mode 100644 vendor/knative.dev/pkg/resolver/doc.go create mode 100644 vendor/knative.dev/pkg/signals/signal.go create mode 100644 vendor/knative.dev/pkg/signals/signal_posix.go create mode 100644 vendor/knative.dev/pkg/signals/signal_windows.go create mode 100644 vendor/knative.dev/pkg/source/doc.go create mode 100644 vendor/knative.dev/pkg/source/source_labels.go create mode 100644 vendor/knative.dev/pkg/source/source_stats_reporter.go create mode 100644 vendor/knative.dev/pkg/system/clock.go create mode 100644 vendor/knative.dev/pkg/system/env.go create mode 100644 vendor/knative.dev/pkg/system/testing/names.go create mode 100644 vendor/knative.dev/pkg/test/README.md create mode 100644 vendor/knative.dev/pkg/test/cleanup.go create mode 100644 vendor/knative.dev/pkg/test/clients.go create mode 100644 vendor/knative.dev/pkg/test/cmd/command.go create mode 100644 vendor/knative.dev/pkg/test/cmd/error.go create mode 100644 vendor/knative.dev/pkg/test/crd.go create mode 100644 vendor/knative.dev/pkg/test/e2e_flags.go create mode 100644 vendor/knative.dev/pkg/test/gcs/gcs.go create mode 100644 vendor/knative.dev/pkg/test/ghutil/client.go create mode 100644 vendor/knative.dev/pkg/test/ghutil/fakeghutil/fakeghutil.go create mode 100644 vendor/knative.dev/pkg/test/ghutil/issue.go create mode 100644 vendor/knative.dev/pkg/test/ghutil/pullrequest.go create mode 100644 vendor/knative.dev/pkg/test/gke/addon.go create mode 100644 vendor/knative.dev/pkg/test/gke/client.go create mode 100644 vendor/knative.dev/pkg/test/gke/endpoint.go create mode 100644 vendor/knative.dev/pkg/test/gke/fake/client.go create mode 100644 vendor/knative.dev/pkg/test/gke/fake/credentials.json create mode 100644 vendor/knative.dev/pkg/test/gke/location.go create mode 100644 vendor/knative.dev/pkg/test/gke/request.go create mode 100644 vendor/knative.dev/pkg/test/gke/wait.go create mode 100644 vendor/knative.dev/pkg/test/helpers/dir.go create mode 100644 vendor/knative.dev/pkg/test/helpers/dryrun.go create mode 100644 vendor/knative.dev/pkg/test/helpers/error.go create mode 100644 vendor/knative.dev/pkg/test/helpers/name.go create mode 100644 vendor/knative.dev/pkg/test/ingress/ingress.go create mode 100644 vendor/knative.dev/pkg/test/junit/junit.go create mode 100644 vendor/knative.dev/pkg/test/kube_checks.go create mode 100644 vendor/knative.dev/pkg/test/logging/.gitattributes create mode 100644 vendor/knative.dev/pkg/test/logging/doc.go create mode 100644 vendor/knative.dev/pkg/test/logging/error.go create mode 100644 vendor/knative.dev/pkg/test/logging/logger.go create mode 100644 vendor/knative.dev/pkg/test/logging/logging.go create mode 100644 vendor/knative.dev/pkg/test/logging/memory_encoder.go create mode 100644 vendor/knative.dev/pkg/test/logging/spew_encoder.go create mode 100644 vendor/knative.dev/pkg/test/logging/sugar.go create mode 100644 vendor/knative.dev/pkg/test/logging/tlogger.go create mode 100644 vendor/knative.dev/pkg/test/logging/zapr.go create mode 100644 vendor/knative.dev/pkg/test/logstream/doc.go create mode 100644 vendor/knative.dev/pkg/test/logstream/interface.go create mode 100644 vendor/knative.dev/pkg/test/logstream/kubelogs.go create mode 100644 vendor/knative.dev/pkg/test/logstream/null.go create mode 100644 vendor/knative.dev/pkg/test/mako/README.md create mode 100644 vendor/knative.dev/pkg/test/mako/alerter/alerter.go create mode 100644 vendor/knative.dev/pkg/test/mako/alerter/github/issue.go create mode 100644 vendor/knative.dev/pkg/test/mako/alerter/slack/message.go create mode 100644 vendor/knative.dev/pkg/test/mako/analyzer.go create mode 100644 vendor/knative.dev/pkg/test/mako/config/benchmark.go create mode 100644 vendor/knative.dev/pkg/test/mako/config/configmap.go create mode 100644 vendor/knative.dev/pkg/test/mako/config/environment.go create mode 100644 vendor/knative.dev/pkg/test/mako/config/slack.go create mode 100644 vendor/knative.dev/pkg/test/mako/config/testdata/config-mako.yaml create mode 100644 vendor/knative.dev/pkg/test/mako/sidecar.go create mode 100644 vendor/knative.dev/pkg/test/mako/stub-sidecar/main.go create mode 100644 vendor/knative.dev/pkg/test/mako/stub-sidecar/read_results.sh create mode 100644 vendor/knative.dev/pkg/test/mako/time.go create mode 100644 vendor/knative.dev/pkg/test/monitoring/doc.go create mode 100644 vendor/knative.dev/pkg/test/monitoring/monitoring.go create mode 100644 vendor/knative.dev/pkg/test/performance/performance.go create mode 100755 vendor/knative.dev/pkg/test/presubmit-tests.sh create mode 100644 vendor/knative.dev/pkg/test/prometheus/prometheus.go create mode 100644 vendor/knative.dev/pkg/test/prow/env.go create mode 100644 vendor/knative.dev/pkg/test/prow/prow.go create mode 100644 vendor/knative.dev/pkg/test/request.go create mode 100644 vendor/knative.dev/pkg/test/slackutil/fakeslackutil/fakeslackutil.go create mode 100644 vendor/knative.dev/pkg/test/slackutil/http.go create mode 100644 vendor/knative.dev/pkg/test/slackutil/message_read.go create mode 100644 vendor/knative.dev/pkg/test/slackutil/message_write.go create mode 100644 vendor/knative.dev/pkg/test/spoof/error_checks.go create mode 100644 vendor/knative.dev/pkg/test/spoof/spoof.go create mode 100755 vendor/knative.dev/pkg/test/test-reconciler-codegen.sh create mode 100644 vendor/knative.dev/pkg/test/testgrid/testgrid.go create mode 100644 vendor/knative.dev/pkg/test/tinterface.go create mode 100644 vendor/knative.dev/pkg/test/vegeta/pacers/combined_pacer.go create mode 100644 vendor/knative.dev/pkg/test/vegeta/pacers/steady_up_pacer.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/coveragecalculator/README.md create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/coveragecalculator/calculator.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/coveragecalculator/coveragedata.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/coveragecalculator/ignorefields.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/README.md create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/arraykindnode.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/basictypekindnode.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/node.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/otherkindnode.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/ptrkindnode.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/resourceforest.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/resourcetree.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/rule.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/structkindnode.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/test_util.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/resourcetree/timetypenode.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/tools/README.md create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/tools/tools.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/view/README.md create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/view/html_display.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/view/html_template.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/view/rule.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/view/xml_display.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/view/xml_template.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/webhook/README.md create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/webhook/apicoverage_recorder.go create mode 100644 vendor/knative.dev/pkg/test/webhook-apicoverage/webhook/webhook.go create mode 100644 vendor/knative.dev/pkg/test/zipkin/doc.go create mode 100644 vendor/knative.dev/pkg/test/zipkin/util.go create mode 100644 vendor/knative.dev/pkg/testing/doc.go create mode 100644 vendor/knative.dev/pkg/testing/duck/doc.go create mode 100644 vendor/knative.dev/pkg/testing/duck/register.go create mode 100644 vendor/knative.dev/pkg/testing/duck/testbindable.go create mode 100644 vendor/knative.dev/pkg/testing/duck/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/testing/inner_default_resource.go create mode 100644 vendor/knative.dev/pkg/testing/register.go create mode 100644 vendor/knative.dev/pkg/testing/resource.go create mode 100644 vendor/knative.dev/pkg/testing/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/testutils/README.md create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/boskos/boskos.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/boskos/fake/fake.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/client.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/common/common.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/config.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/doc.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/gke.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/setup.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/e2e-tests/util.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/main.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/benchmark.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/cluster.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/testdir/test-benchmark1/cluster.yaml create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/testdir/test-benchmark2/cluster.yaml create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/testdir/test-benchmark3/cluster.yaml create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/perf-tests/pkg/testdir/test-benchmark4/noop.yaml create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/prow-cluster-operation/README.md create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/prow-cluster-operation/actions/create.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/prow-cluster-operation/actions/delete.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/prow-cluster-operation/actions/get.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/prow-cluster-operation/main.go create mode 100644 vendor/knative.dev/pkg/testutils/clustermanager/prow-cluster-operation/options/options.go create mode 100644 vendor/knative.dev/pkg/testutils/junithelper/README.md create mode 100644 vendor/knative.dev/pkg/testutils/junithelper/main.go create mode 100644 vendor/knative.dev/pkg/testutils/metahelper/client/client.go create mode 100644 vendor/knative.dev/pkg/testutils/metahelper/main.go create mode 100644 vendor/knative.dev/pkg/third_party/mako/LICENSE create mode 100644 vendor/knative.dev/pkg/third_party/mako/README.md create mode 100644 vendor/knative.dev/pkg/third_party/mako/proto/quickstore.proto create mode 100644 vendor/knative.dev/pkg/third_party/mako/proto/quickstore_go_proto/quickstore.pb.go create mode 100644 vendor/knative.dev/pkg/tracing/config/doc.go create mode 100644 vendor/knative.dev/pkg/tracing/config/tracing.go create mode 100644 vendor/knative.dev/pkg/tracing/config/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/tracing/http.go create mode 100644 vendor/knative.dev/pkg/tracing/opencensus.go create mode 100644 vendor/knative.dev/pkg/tracing/testing/zipkin.go create mode 100644 vendor/knative.dev/pkg/tracing/zipkin.go create mode 100644 vendor/knative.dev/pkg/tracker/doc.go create mode 100644 vendor/knative.dev/pkg/tracker/enqueue.go create mode 100644 vendor/knative.dev/pkg/tracker/interface.go create mode 100644 vendor/knative.dev/pkg/tracker/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/version/version.go create mode 100644 vendor/knative.dev/pkg/webhook/README.md create mode 100644 vendor/knative.dev/pkg/webhook/admission.go create mode 100644 vendor/knative.dev/pkg/webhook/certificates/certificates.go create mode 100644 vendor/knative.dev/pkg/webhook/certificates/controller.go create mode 100644 vendor/knative.dev/pkg/webhook/certificates/resources/certs.go create mode 100644 vendor/knative.dev/pkg/webhook/certificates/resources/secret.go create mode 100644 vendor/knative.dev/pkg/webhook/configmaps/configmaps.go create mode 100644 vendor/knative.dev/pkg/webhook/configmaps/controller.go create mode 100644 vendor/knative.dev/pkg/webhook/context.go create mode 100644 vendor/knative.dev/pkg/webhook/conversion.go create mode 100644 vendor/knative.dev/pkg/webhook/psbinding/README.md create mode 100644 vendor/knative.dev/pkg/webhook/psbinding/controller.go create mode 100644 vendor/knative.dev/pkg/webhook/psbinding/doc.go create mode 100644 vendor/knative.dev/pkg/webhook/psbinding/index.go create mode 100644 vendor/knative.dev/pkg/webhook/psbinding/psbinding.go create mode 100644 vendor/knative.dev/pkg/webhook/psbinding/reconciler.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/controller.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/conversion.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/internal/types.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/internal/zz_generated.deepcopy.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/conversion/reconciler.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/controller.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/defaulting.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/defaulting/user_info.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/interface.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/validation/controller.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/validation/reconcile_config.go create mode 100644 vendor/knative.dev/pkg/webhook/resourcesemantics/validation/validation_admit.go create mode 100644 vendor/knative.dev/pkg/webhook/stats_reporter.go create mode 100644 vendor/knative.dev/pkg/webhook/testing/factory.go create mode 100644 vendor/knative.dev/pkg/webhook/testing/listers.go create mode 100644 vendor/knative.dev/pkg/webhook/testing/testing.go create mode 100644 vendor/knative.dev/pkg/webhook/webhook.go create mode 100644 vendor/knative.dev/pkg/websocket/connection.go create mode 100644 vendor/knative.dev/pkg/websocket/hijack.go create mode 100644 vendor/knative.dev/test-infra/LICENSE create mode 100644 vendor/knative.dev/test-infra/scripts/README.md create mode 100644 vendor/knative.dev/test-infra/scripts/dummy.go create mode 100755 vendor/knative.dev/test-infra/scripts/e2e-tests.sh create mode 100755 vendor/knative.dev/test-infra/scripts/library.sh create mode 100644 vendor/knative.dev/test-infra/scripts/markdown-link-check-config.rc create mode 100644 vendor/knative.dev/test-infra/scripts/markdown-lint-config.rc create mode 100755 vendor/knative.dev/test-infra/scripts/performance-tests.sh create mode 100755 vendor/knative.dev/test-infra/scripts/presubmit-tests.sh create mode 100755 vendor/knative.dev/test-infra/scripts/release.sh create mode 100644 vendor/knative.dev/test-infra/tools/dep-collector/README.md create mode 100644 vendor/knative.dev/test-infra/tools/dep-collector/gobuild.go create mode 100644 vendor/knative.dev/test-infra/tools/dep-collector/imports.go create mode 100644 vendor/knative.dev/test-infra/tools/dep-collector/licenses.go create mode 100644 vendor/knative.dev/test-infra/tools/dep-collector/main.go create mode 100644 vendor/sigs.k8s.io/yaml/LICENSE create mode 100644 vendor/sigs.k8s.io/yaml/fields.go create mode 100644 vendor/sigs.k8s.io/yaml/yaml.go create mode 100644 vendor/sigs.k8s.io/yaml/yaml_go110.go diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..2aa7c69c1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +# This file is documented at https://git-scm.com/docs/gitattributes. +# Linguist-specific attributes are documented at +# https://github.com/github/linguist. + +**/zz_generated.*.go linguist-generated=true +/pkg/client/** linguist-generated=true +/test/client/** linguist-generated=true + +# coverage-excluded is an attribute used to explicitly exclude a path from being included in code +# coverage. If a path is marked as linguist-generated already, it will be implicitly excluded and +# there is no need to add the coverage-excluded attribute +/pkg/**/testing/** coverage-excluded=true +/vendor/** coverage-excluded=true +/test/** coverage-excluded=true +/cmd/**/main.go coverage-excluded=true diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..85baa82ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Operating system temporary files +.DS_Store + +# Editor/IDE specific settings +.idea +.vscode/ +*.iml + +# Temporary output of build tools +bazel-* +*.out diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..1622af7ed --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contribution guidelines + +So you want to hack on Knative `sample-controller`? Yay! Please refer to +Knative's overall +[contribution guidelines](https://www.knative.dev/contributing/) to find out how +you can help. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 000000000..f698641c4 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,73 @@ +# Development + +This doc explains how to setup a development environment so you can get started +[contributing](https://www.knative.dev/contributing/) to Knative +`sample-controller`. Also take a look at: + +- [The pull request workflow](https://knative.dev/community/contributing/reviewing/) + +## Getting started + +1. Create [a GitHub account](https://github.com/join) +1. Setup + [GitHub access via SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) +1. Install [requirements](#requirements) +1. Set up your [shell environment](#environment-setup) +1. [Create and checkout a repo fork](#checkout-your-fork) + +Before submitting a PR, see also [CONTRIBUTING.md](./CONTRIBUTING.md). + +### Requirements + +You must install these tools: + +1. [`go`](https://golang.org/doc/install): The language Knative + `sample-controller` is built in +1. [`git`](https://help.github.com/articles/set-up-git/): For source control +1. [`dep`](https://github.com/golang/dep): For managing external dependencies. + +### Environment setup + +To get started you'll need to set these environment variables (we recommend +adding them to your `.bashrc`): + +1. `GOPATH`: If you don't have one, simply pick a directory and add + `export GOPATH=...` + +1. `$GOPATH/bin` on `PATH`: This is so that tooling installed via `go get` will + work properly. + +`.bashrc` example: + +```shell +export GOPATH="$HOME/go" +export PATH="${PATH}:${GOPATH}/bin" +``` + +### Checkout your fork + +The Go tools require that you clone the repository to the +`src/knative.dev/sample-controller` directory in your +[`GOPATH`](https://github.com/golang/go/wiki/SettingGOPATH). + +To check out this repository: + +1. Create your own + [fork of this repo](https://help.github.com/articles/fork-a-repo/) + +1. Clone it to your machine: + +```shell +mkdir -p ${GOPATH}/src/knative.dev +cd ${GOPATH}/src/knative.dev +git clone git@github.com:${YOUR_GITHUB_USERNAME}/sample-controller.git +cd sample-controller +git remote add upstream https://knative.dev/sample-controller.git +git remote set-url --push upstream no_push +``` + +_Adding the `upstream` remote sets you up nicely for regularly +[syncing your fork](https://help.github.com/articles/syncing-a-fork/)._ + +Once you reach this point you are ready to do a full build and deploy as +described below. diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 000000000..ef758262b --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,1170 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:f35566aa630edc74e86b7988a724dbdfe0c5bef21b7cbd401338328cbc233cd5" + name = "cloud.google.com/go" + packages = [ + "compute/metadata", + "container/apiv1", + "internal/version", + "monitoring/apiv3", + "trace/apiv2", + ] + pruneopts = "NUT" + revision = "775730d6e48254a2430366162cf6298e5368833c" + version = "v0.39.0" + +[[projects]] + digest = "1:0a936e17f4fc0c65615913199ce0a387a67a4c72e017747b6f38c898168b1b75" + name = "contrib.go.opencensus.io/exporter/ocagent" + packages = ["."] + pruneopts = "NUT" + revision = "a8a6f458bbc1d5042322ad1f9b65eeb0b69be9ea" + version = "v0.6.0" + +[[projects]] + digest = "1:642cf8e80572f9dc0677b0f241c8ab2e715c9dccc215270ea873c86ddca0062c" + name = "contrib.go.opencensus.io/exporter/prometheus" + packages = ["."] + pruneopts = "NUT" + revision = "f4a2c1e53ec45636355d35fb9022b64e4bdd4a91" + version = "v0.1.0" + +[[projects]] + digest = "1:c3fd5ddaad733530174bba5dd787d98a45d181851a95a0b7362be7bce7144f56" + name = "contrib.go.opencensus.io/exporter/stackdriver" + packages = [ + ".", + "monitoredresource", + ] + pruneopts = "NUT" + revision = "59d068f8d8ff5b653916aa30cdc4e13c7f15d56e" + +[[projects]] + digest = "1:85376cc88e62d7c0e5a3fd50d6737e6dfe3f0aa840e35859aebadf65a408f7c8" + name = "github.com/aws/aws-sdk-go" + packages = [ + "aws", + "aws/awserr", + "aws/awsutil", + "aws/client", + "aws/client/metadata", + "aws/corehandlers", + "aws/credentials", + "aws/credentials/ec2rolecreds", + "aws/credentials/endpointcreds", + "aws/credentials/processcreds", + "aws/credentials/stscreds", + "aws/csm", + "aws/defaults", + "aws/ec2metadata", + "aws/endpoints", + "aws/request", + "aws/session", + "aws/signer/v4", + "internal/ini", + "internal/sdkio", + "internal/sdkrand", + "internal/sdkuri", + "internal/shareddefaults", + "private/protocol", + "private/protocol/json/jsonutil", + "private/protocol/query", + "private/protocol/query/queryutil", + "private/protocol/rest", + "private/protocol/xml/xmlutil", + "service/sts", + ] + pruneopts = "NUT" + revision = "8943f83bb1e98c94710f767576fe17cc29adb4dd" + version = "v1.19.38" + +[[projects]] + digest = "1:707ebe952a8b3d00b343c01536c79c73771d100f63ec6babeaed5c79e2b8a8dd" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "NUT" + revision = "4b2b341e8d7715fae06375aa633dbb6e91b3fb46" + version = "v1.0.0" + +[[projects]] + digest = "1:45c41cd27a8d986998680bfc86da0bbff5fa4f90d0f446c00636c8b099028ffe" + name = "github.com/blang/semver" + packages = ["."] + pruneopts = "NUT" + revision = "ba2c2ddd89069b46a7011d4106f6868f17ee1705" + version = "v3.6.1" + +[[projects]] + digest = "1:8f5acd4d4462b5136af644d25101f0968a7a94ee90fcb2059cec5b7cc42e0b20" + name = "github.com/census-instrumentation/opencensus-proto" + packages = [ + "gen-go/agent/common/v1", + "gen-go/agent/metrics/v1", + "gen-go/agent/trace/v1", + "gen-go/metrics/v1", + "gen-go/resource/v1", + "gen-go/trace/v1", + ] + pruneopts = "NUT" + revision = "d89fa54de508111353cb0b06403c00569be780d8" + version = "v0.2.1" + +[[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "NUT" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:db115eee0ae265dab922fecbb7966c3fcdc4eae3c2e9caae302fdcba3ba422c7" + name = "github.com/evanphx/json-patch" + packages = ["."] + pruneopts = "NUT" + revision = "5858425f75500d40c52783dce87d085a483ce135" + version = "v4.2.0" + +[[projects]] + digest = "1:fcd8ddc48ce648d5fbb36029fe3dd98f29c03377eea5c4a3c436701b0e3f2774" + name = "github.com/gobuffalo/envy" + packages = ["."] + pruneopts = "NUT" + revision = "909ea676d4c90832fefbf55a5a4fb04d8bef8931" + version = "v1.7.1" + +[[projects]] + digest = "1:abea725bcf0210887f5da19d804fffa1dd45a42a56bdf5f02322345e3fee4f0d" + name = "github.com/gogo/protobuf" + packages = [ + "proto", + "sortkeys", + ] + pruneopts = "NUT" + revision = "4cbf7e384e768b4e01799441fdf2a706a5635ae7" + version = "v1.2.0" + +[[projects]] + branch = "master" + digest = "1:b7cb6054d3dff43b38ad2e92492f220f57ae6087ee797dca298139776749ace8" + name = "github.com/golang/groupcache" + packages = ["lru"] + pruneopts = "NUT" + revision = "5b532d6fd5efaf7fa130d4e859a2fde0fc3a9e1b" + +[[projects]] + digest = "1:a677057cef8b68b66003c2775ed1126bbd7e9e372b54b7c1a7c5201a2f1f3eb0" + name = "github.com/golang/protobuf" + packages = [ + "descriptor", + "jsonpb", + "proto", + "protoc-gen-go/descriptor", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/empty", + "ptypes/struct", + "ptypes/timestamp", + "ptypes/wrappers", + ] + pruneopts = "NUT" + revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" + version = "v1.3.2" + +[[projects]] + digest = "1:0aeda02073125667ac6c9df50c7921cb22c08a4accdc54589c697a7e76be65c2" + name = "github.com/google/go-cmp" + packages = [ + "cmp", + "cmp/internal/diff", + "cmp/internal/flags", + "cmp/internal/function", + "cmp/internal/value", + ] + pruneopts = "NUT" + revision = "5a6f75716e1203a923a78c9efb94089d857df0f6" + version = "v0.4.0" + +[[projects]] + branch = "master" + digest = "1:52c5834e2bebac9030c97cc0798ac11c3aa8a39f098aeb419f142533da6cd3cc" + name = "github.com/google/gofuzz" + packages = ["."] + pruneopts = "NUT" + revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" + +[[projects]] + branch = "master" + digest = "1:b6b3bd1c08338cb397623d1b9dedde711eccc2d3408fe9017a495d815065d869" + name = "github.com/google/licenseclassifier" + packages = [ + ".", + "internal/sets", + "stringclassifier", + "stringclassifier/internal/pq", + "stringclassifier/searchset", + "stringclassifier/searchset/tokenizer", + ] + pruneopts = "NUT" + revision = "c2a262e3078ad90718f59866f1ec18601b2fee1b" + +[[projects]] + digest = "1:ab3ec1fe3e39bac4b3ab63390767766622be35b7cab03f47f787f9ec60522a53" + name = "github.com/google/uuid" + packages = ["."] + pruneopts = "NUT" + revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" + version = "v1.1.1" + +[[projects]] + digest = "1:fa300677001e58a995e10afe4e251d2a6e30d3815a234d553b5810db7795d5a2" + name = "github.com/googleapis/gax-go" + packages = ["v2"] + pruneopts = "NUT" + revision = "beaecbbdd8af86aa3acf14180d53828ce69400b2" + version = "v2.0.4" + +[[projects]] + digest = "1:06a7dadb7b760767341ffb6c8d377238d68a1226f2b21b5d497d2e3f6ecf6b4e" + name = "github.com/googleapis/gnostic" + packages = [ + "OpenAPIv2", + "compiler", + "extensions", + ] + pruneopts = "NUT" + revision = "7c663266750e7d82587642f65e60bc4083f1f84e" + version = "v0.2.0" + +[[projects]] + digest = "1:aad54f418843097fa40957329625da7662b2916b7d07e2fda181935273167ec1" + name = "github.com/grpc-ecosystem/grpc-gateway" + packages = [ + "internal", + "runtime", + "utilities", + ] + pruneopts = "NUT" + revision = "e16fcd495a18ea01dbc6f5b6ac2956a94e1981a2" + version = "v1.12.2" + +[[projects]] + digest = "1:b42cde0e1f3c816dd57f57f7bbcf05ca40263ad96f168714c130c611fc0856a6" + name = "github.com/hashicorp/golang-lru" + packages = [ + ".", + "simplelru", + ] + pruneopts = "NUT" + revision = "20f1fb78b0740ba8c3cb143a61e86ba5c8669768" + version = "v0.5.0" + +[[projects]] + digest = "1:aaa38889f11896ee3644d77e17dc7764cc47f5f3d3b488268df2af2b52541c5f" + name = "github.com/imdario/mergo" + packages = ["."] + pruneopts = "NUT" + revision = "7c29201646fa3de8506f701213473dd407f19646" + version = "v0.3.7" + +[[projects]] + digest = "1:1f2aebae7e7c856562355ec0198d8ca2fa222fb05e5b1b66632a1fce39631885" + name = "github.com/jmespath/go-jmespath" + packages = ["."] + pruneopts = "NUT" + revision = "c2b33e84" + +[[projects]] + digest = "1:da62aa6632d04e080b8a8b85a59ed9ed1550842a0099a55f3ae3a20d02a3745a" + name = "github.com/joho/godotenv" + packages = ["."] + pruneopts = "NUT" + revision = "23d116af351c84513e1946b527c88823e476be13" + version = "v1.3.0" + +[[projects]] + digest = "1:0243cffa4a3410f161ee613dfdd903a636d07e838a42d341da95d81f42cd1d41" + name = "github.com/json-iterator/go" + packages = ["."] + pruneopts = "NUT" + revision = "f2b4162afba35581b6d4a50d3b8f34e33c144682" + +[[projects]] + digest = "1:56dbf15e091bf7926cb33a57cb6bdfc658fc6d3498d2f76f10a97ce7856f1fde" + name = "github.com/markbates/inflect" + packages = ["."] + pruneopts = "NUT" + revision = "24b83195037b3bc61fcda2d28b7b0518bce293b6" + version = "v1.0.4" + +[[projects]] + digest = "1:5985ef4caf91ece5d54817c11ea25f182697534f8ae6521eadcd628c142ac4b6" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "NUT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + digest = "1:2f42fa12d6911c7b7659738758631bec870b7e9b4c6be5444f963cdcfccc191f" + name = "github.com/modern-go/concurrent" + packages = ["."] + pruneopts = "NUT" + revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + version = "1.0.3" + +[[projects]] + digest = "1:c6aca19413b13dc59c220ad7430329e2ec454cc310bc6d8de2c7e2b93c18a0f6" + name = "github.com/modern-go/reflect2" + packages = ["."] + pruneopts = "NUT" + revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" + version = "1.0.1" + +[[projects]] + digest = "1:09fd8d3e830bac0a0e2d1f7009fe33a0c435ee14ae818be9cc9ceb5f77da18ae" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/internal", + "prometheus/promhttp", + ] + pruneopts = "NUT" + revision = "50c4339db732beb2165735d2cde0bff78eb3c5a5" + version = "v0.9.3" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "NUT" + revision = "fd36f4220a901265f90734c3183c5f0c91daa0b8" + +[[projects]] + digest = "1:d03ca24670416dc8fccc78b05d6736ec655416ca7db0a028e8fb92cfdfe3b55e" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "NUT" + revision = "17f5ca1748182ddf24fc33a5a7caaaf790a52fcc" + version = "v0.4.1" + +[[projects]] + branch = "master" + digest = "1:faf5688d03dc097b63b91bcfe02ad54ab2caaefe0b43ee5c4a67cc8653b9719f" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/fs", + ] + pruneopts = "NUT" + revision = "a7aeb8df3389edaf53efcc319ad0063cb27c3960" + +[[projects]] + digest = "1:e09ada96a5a41deda4748b1659cc8953961799e798aea557257b56baee4ecaf3" + name = "github.com/rogpeppe/go-internal" + packages = [ + "modfile", + "module", + "semver", + ] + pruneopts = "NUT" + revision = "438578804ca6f31be148c27683afc419ce47c06e" + version = "v1.3.0" + +[[projects]] + digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" + name = "github.com/sergi/go-diff" + packages = ["diffmatchpatch"] + pruneopts = "NUT" + revision = "1744e2970ca51c86172c8190fadad617561ed6e7" + version = "v1.0.0" + +[[projects]] + digest = "1:9d8420bbf131d1618bde6530af37c3799340d3762cc47210c1d9532a4c3a2779" + name = "github.com/spf13/pflag" + packages = ["."] + pruneopts = "NUT" + revision = "298182f68c66c05229eb03ac171abe6e309ee79a" + version = "v1.0.3" + +[[projects]] + digest = "1:0e3fd52087079d1289983e4fef32268ca965973f5370b69204e2934185527baa" + name = "go.opencensus.io" + packages = [ + ".", + "internal", + "internal/tagencoding", + "metric/metricdata", + "metric/metricexport", + "metric/metricproducer", + "plugin/ocgrpc", + "plugin/ochttp", + "plugin/ochttp/propagation/b3", + "resource", + "resource/resourcekeys", + "stats", + "stats/internal", + "stats/view", + "tag", + "trace", + "trace/internal", + "trace/propagation", + "trace/tracestate", + ] + pruneopts = "NUT" + revision = "9c377598961b706d1542bd2d84d538b5094d596e" + version = "v0.22.0" + +[[projects]] + digest = "1:cc9d86ec4e6e3bdf87e3a421273bfeed003cf8e21351c0302fe8b0eb7b10efe6" + name = "go.uber.org/atomic" + packages = ["."] + pruneopts = "NUT" + revision = "df976f2515e274675050de7b3f42545de80594fd" + version = "v1.4.0" + +[[projects]] + digest = "1:58ca93bdf81bac106ded02226b5395a0595d5346cdc4caa8d9c1f3a5f8f9976e" + name = "go.uber.org/multierr" + packages = ["."] + pruneopts = "NUT" + revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" + version = "v1.1.0" + +[[projects]] + digest = "1:85674ac609b704fd4e9f463553b6ffc3a3527a993ae0ba550eb56beaabdfe094" + name = "go.uber.org/zap" + packages = [ + ".", + "buffer", + "internal/bufferpool", + "internal/color", + "internal/exit", + "zapcore", + ] + pruneopts = "NUT" + revision = "67bc79d13d155c02fd008f721863ff8cc5f30659" + +[[projects]] + branch = "master" + digest = "1:3f3a05ae0b95893d90b9b3b5afdb79a9b3d96e4e36e099d841ae602e4aca0da8" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "NUT" + revision = "182538f80094b6a8efaade63a8fd8e0d9d5843dd" + +[[projects]] + branch = "master" + digest = "1:7f857c743b73800b187068d383071cbb28020958089ba0e47d80f4d4a76ff7ad" + name = "golang.org/x/net" + packages = [ + "context", + "context/ctxhttp", + "http/httpguts", + "http2", + "http2/h2c", + "http2/hpack", + "idna", + "internal/timeseries", + "trace", + ] + pruneopts = "NUT" + revision = "8a410e7b638dca158bf9e766925842f6651ff828" + +[[projects]] + branch = "master" + digest = "1:17ee74a4d9b6078611784b873cdbfe91892d2c73052c430724e66fcc015b6c7b" + name = "golang.org/x/oauth2" + packages = [ + ".", + "google", + "internal", + "jws", + "jwt", + ] + pruneopts = "NUT" + revision = "e64efc72b421e893cbf63f17ba2221e7d6d0b0f3" + +[[projects]] + branch = "master" + digest = "1:a2fc247e64b5dafd3251f12d396ec85f163d5bb38763c4997856addddf6e78d8" + name = "golang.org/x/sync" + packages = [ + "errgroup", + "semaphore", + ] + pruneopts = "NUT" + revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + +[[projects]] + branch = "master" + digest = "1:8270f14d85e8d36e852e018872ac923f7a2067648bfe8428d01be288818aa337" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows", + ] + pruneopts = "NUT" + revision = "fa5fdf94c78965f1aa8423f0cc50b8b8d728b05a" + +[[projects]] + digest = "1:e7071ed636b5422cc51c0e3a6cebc229d6c9fffc528814b519a980641422d619" + name = "golang.org/x/text" + packages = [ + "collate", + "collate/build", + "internal/colltab", + "internal/gen", + "internal/tag", + "internal/triegen", + "internal/ucd", + "language", + "secure/bidirule", + "transform", + "unicode/bidi", + "unicode/cldr", + "unicode/norm", + "unicode/rangetable", + ] + pruneopts = "NUT" + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + branch = "master" + digest = "1:c9e7a4b4d47c0ed205d257648b0e5b0440880cb728506e318f8ac7cd36270bc4" + name = "golang.org/x/time" + packages = ["rate"] + pruneopts = "NUT" + revision = "fbb02b2291d28baffd63558aa44b4b56f178d650" + +[[projects]] + branch = "master" + digest = "1:a05bd2d296bc727082abcb63ff52615b4dcc6219d8b61e99fd83d605dc779a18" + name = "golang.org/x/tools" + packages = [ + "go/ast/astutil", + "imports", + "internal/fastwalk", + ] + pruneopts = "NUT" + revision = "7ca132754999accbaa5c1735eda29e7ce0f3bf03" + +[[projects]] + digest = "1:8392b5c29adedc5f85c66b48bb53b6c49dd91d8540f3cad5d43ef7277946718f" + name = "gomodules.xyz/jsonpatch" + packages = ["v2"] + pruneopts = "NUT" + revision = "e8422f09d27ee2c8cfb2c7f8089eb9eeb0764849" + version = "v2.0.1" + +[[projects]] + branch = "master" + digest = "1:f287c9d58e1a591510d69f14e2cebce953e003e0acdcca900bf2d7bc5627c06a" + name = "google.golang.org/api" + packages = [ + "googleapi/transport", + "internal", + "iterator", + "option", + "support/bundler", + "transport", + "transport/grpc", + "transport/http", + "transport/http/internal/propagation", + ] + pruneopts = "NUT" + revision = "9f3a303b451fc0e0f87fe8987a6b8b90e50369b8" + +[[projects]] + digest = "1:898bf528e5c601c4a1111586f75ab9515467ebe7a41ae849d5a839720d4e2580" + name = "google.golang.org/appengine" + packages = [ + ".", + "internal", + "internal/app_identity", + "internal/base", + "internal/datastore", + "internal/log", + "internal/modules", + "internal/remote_api", + "internal/socket", + "internal/urlfetch", + "socket", + "urlfetch", + ] + pruneopts = "NUT" + revision = "e9657d882bb81064595ca3b56cbe2546bbabf7b1" + version = "v1.4.0" + +[[projects]] + digest = "1:cdd51a140120ceb49a810515f07666763a30da9e2506bb592c9924401dd4ff7c" + name = "google.golang.org/genproto" + packages = [ + "googleapis/api", + "googleapis/api/annotations", + "googleapis/api/distribution", + "googleapis/api/httpbody", + "googleapis/api/label", + "googleapis/api/metric", + "googleapis/api/monitoredres", + "googleapis/container/v1", + "googleapis/devtools/cloudtrace/v2", + "googleapis/monitoring/v3", + "googleapis/rpc/status", + "protobuf/field_mask", + ] + pruneopts = "NUT" + revision = "e7d98fc518a78c9f8b5ee77be7b0b317475d89e1" + +[[projects]] + digest = "1:a9916e8c1d943e1342550bdfb64df1225a1df0b4c23fd4a6583d6861302319df" + name = "google.golang.org/grpc" + packages = [ + ".", + "balancer", + "balancer/base", + "balancer/roundrobin", + "binarylog/grpc_binarylog_v1", + "codes", + "connectivity", + "credentials", + "credentials/internal", + "credentials/oauth", + "encoding", + "encoding/proto", + "grpclog", + "internal", + "internal/backoff", + "internal/balancerload", + "internal/binarylog", + "internal/channelz", + "internal/envconfig", + "internal/grpcrand", + "internal/grpcsync", + "internal/syscall", + "internal/transport", + "keepalive", + "metadata", + "naming", + "peer", + "resolver", + "resolver/dns", + "resolver/passthrough", + "stats", + "status", + "tap", + ] + pruneopts = "NUT" + revision = "869adfc8d5a43efc0d05780ad109106f457f51e4" + version = "v1.21.0" + +[[projects]] + digest = "1:2d1fbdc6777e5408cabeb02bf336305e724b925ff4546ded0fa8715a7267922a" + name = "gopkg.in/inf.v0" + packages = ["."] + pruneopts = "NUT" + revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf" + version = "v0.9.1" + +[[projects]] + digest = "1:18108594151654e9e696b27b181b953f9a90b16bf14d253dd1b397b025a1487f" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "NUT" + revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" + version = "v2.2.2" + +[[projects]] + digest = "1:d77b48cc0ea74f3edbc8e0515a0ce2fa2154eb414137dd4fb5a642a73296d403" + name = "k8s.io/api" + packages = [ + "admission/v1beta1", + "admissionregistration/v1", + "admissionregistration/v1beta1", + "apps/v1", + "apps/v1beta1", + "apps/v1beta2", + "auditregistration/v1alpha1", + "authentication/v1", + "authentication/v1beta1", + "authorization/v1", + "authorization/v1beta1", + "autoscaling/v1", + "autoscaling/v2beta1", + "autoscaling/v2beta2", + "batch/v1", + "batch/v1beta1", + "batch/v2alpha1", + "certificates/v1beta1", + "coordination/v1", + "coordination/v1beta1", + "core/v1", + "discovery/v1alpha1", + "events/v1beta1", + "extensions/v1beta1", + "networking/v1", + "networking/v1beta1", + "node/v1alpha1", + "node/v1beta1", + "policy/v1beta1", + "rbac/v1", + "rbac/v1alpha1", + "rbac/v1beta1", + "scheduling/v1", + "scheduling/v1alpha1", + "scheduling/v1beta1", + "settings/v1alpha1", + "storage/v1", + "storage/v1alpha1", + "storage/v1beta1", + ] + pruneopts = "NUT" + revision = "2a24ef1ce092b529249c747df24d66a55fe97ad0" + version = "kubernetes-1.16.4" + +[[projects]] + digest = "1:d4cd0122df2a9cc11eb1c1865ede951c1db38db3e7505e9f0536a234440a6a78" + name = "k8s.io/apiextensions-apiserver" + packages = [ + "pkg/apis/apiextensions", + "pkg/apis/apiextensions/v1beta1", + ] + pruneopts = "NUT" + revision = "111e9ba415dac090eaeb5a7aed2b90cf94afc0d0" + version = "v0.17.2" + +[[projects]] + digest = "1:90bae9a26d98f85900a8fd7ce76ea9bc429e90b279efbcdfd8814d92b39ccfe0" + name = "k8s.io/apimachinery" + packages = [ + "pkg/api/equality", + "pkg/api/errors", + "pkg/api/meta", + "pkg/api/resource", + "pkg/api/validation", + "pkg/apis/meta/internalversion", + "pkg/apis/meta/v1", + "pkg/apis/meta/v1/unstructured", + "pkg/apis/meta/v1/validation", + "pkg/apis/meta/v1beta1", + "pkg/conversion", + "pkg/conversion/queryparams", + "pkg/fields", + "pkg/labels", + "pkg/runtime", + "pkg/runtime/schema", + "pkg/runtime/serializer", + "pkg/runtime/serializer/json", + "pkg/runtime/serializer/protobuf", + "pkg/runtime/serializer/recognizer", + "pkg/runtime/serializer/streaming", + "pkg/runtime/serializer/versioning", + "pkg/selection", + "pkg/types", + "pkg/util/cache", + "pkg/util/clock", + "pkg/util/diff", + "pkg/util/errors", + "pkg/util/framer", + "pkg/util/intstr", + "pkg/util/json", + "pkg/util/mergepatch", + "pkg/util/naming", + "pkg/util/net", + "pkg/util/runtime", + "pkg/util/sets", + "pkg/util/strategicpatch", + "pkg/util/uuid", + "pkg/util/validation", + "pkg/util/validation/field", + "pkg/util/wait", + "pkg/util/yaml", + "pkg/version", + "pkg/watch", + "third_party/forked/golang/json", + "third_party/forked/golang/reflect", + ] + pruneopts = "NUT" + revision = "72ed19daf4bb788ae595ae4103c404cb0fa09c84" + version = "kubernetes-1.16.4" + +[[projects]] + digest = "1:bc47f1dc5e4413e331a87d5412955654148df35bbf83d7057d0c45c35a3a2e09" + name = "k8s.io/client-go" + packages = [ + "discovery", + "discovery/fake", + "dynamic", + "informers", + "informers/admissionregistration", + "informers/admissionregistration/v1", + "informers/admissionregistration/v1beta1", + "informers/apps", + "informers/apps/v1", + "informers/apps/v1beta1", + "informers/apps/v1beta2", + "informers/auditregistration", + "informers/auditregistration/v1alpha1", + "informers/autoscaling", + "informers/autoscaling/v1", + "informers/autoscaling/v2beta1", + "informers/autoscaling/v2beta2", + "informers/batch", + "informers/batch/v1", + "informers/batch/v1beta1", + "informers/batch/v2alpha1", + "informers/certificates", + "informers/certificates/v1beta1", + "informers/coordination", + "informers/coordination/v1", + "informers/coordination/v1beta1", + "informers/core", + "informers/core/v1", + "informers/discovery", + "informers/discovery/v1alpha1", + "informers/events", + "informers/events/v1beta1", + "informers/extensions", + "informers/extensions/v1beta1", + "informers/internalinterfaces", + "informers/networking", + "informers/networking/v1", + "informers/networking/v1beta1", + "informers/node", + "informers/node/v1alpha1", + "informers/node/v1beta1", + "informers/policy", + "informers/policy/v1beta1", + "informers/rbac", + "informers/rbac/v1", + "informers/rbac/v1alpha1", + "informers/rbac/v1beta1", + "informers/scheduling", + "informers/scheduling/v1", + "informers/scheduling/v1alpha1", + "informers/scheduling/v1beta1", + "informers/settings", + "informers/settings/v1alpha1", + "informers/storage", + "informers/storage/v1", + "informers/storage/v1alpha1", + "informers/storage/v1beta1", + "kubernetes", + "kubernetes/scheme", + "kubernetes/typed/admissionregistration/v1", + "kubernetes/typed/admissionregistration/v1beta1", + "kubernetes/typed/apps/v1", + "kubernetes/typed/apps/v1beta1", + "kubernetes/typed/apps/v1beta2", + "kubernetes/typed/auditregistration/v1alpha1", + "kubernetes/typed/authentication/v1", + "kubernetes/typed/authentication/v1beta1", + "kubernetes/typed/authorization/v1", + "kubernetes/typed/authorization/v1beta1", + "kubernetes/typed/autoscaling/v1", + "kubernetes/typed/autoscaling/v2beta1", + "kubernetes/typed/autoscaling/v2beta2", + "kubernetes/typed/batch/v1", + "kubernetes/typed/batch/v1beta1", + "kubernetes/typed/batch/v2alpha1", + "kubernetes/typed/certificates/v1beta1", + "kubernetes/typed/coordination/v1", + "kubernetes/typed/coordination/v1beta1", + "kubernetes/typed/core/v1", + "kubernetes/typed/discovery/v1alpha1", + "kubernetes/typed/events/v1beta1", + "kubernetes/typed/extensions/v1beta1", + "kubernetes/typed/networking/v1", + "kubernetes/typed/networking/v1beta1", + "kubernetes/typed/node/v1alpha1", + "kubernetes/typed/node/v1beta1", + "kubernetes/typed/policy/v1beta1", + "kubernetes/typed/rbac/v1", + "kubernetes/typed/rbac/v1alpha1", + "kubernetes/typed/rbac/v1beta1", + "kubernetes/typed/scheduling/v1", + "kubernetes/typed/scheduling/v1alpha1", + "kubernetes/typed/scheduling/v1beta1", + "kubernetes/typed/settings/v1alpha1", + "kubernetes/typed/storage/v1", + "kubernetes/typed/storage/v1alpha1", + "kubernetes/typed/storage/v1beta1", + "listers/admissionregistration/v1", + "listers/admissionregistration/v1beta1", + "listers/apps/v1", + "listers/apps/v1beta1", + "listers/apps/v1beta2", + "listers/auditregistration/v1alpha1", + "listers/autoscaling/v1", + "listers/autoscaling/v2beta1", + "listers/autoscaling/v2beta2", + "listers/batch/v1", + "listers/batch/v1beta1", + "listers/batch/v2alpha1", + "listers/certificates/v1beta1", + "listers/coordination/v1", + "listers/coordination/v1beta1", + "listers/core/v1", + "listers/discovery/v1alpha1", + "listers/events/v1beta1", + "listers/extensions/v1beta1", + "listers/networking/v1", + "listers/networking/v1beta1", + "listers/node/v1alpha1", + "listers/node/v1beta1", + "listers/policy/v1beta1", + "listers/rbac/v1", + "listers/rbac/v1alpha1", + "listers/rbac/v1beta1", + "listers/scheduling/v1", + "listers/scheduling/v1alpha1", + "listers/scheduling/v1beta1", + "listers/settings/v1alpha1", + "listers/storage/v1", + "listers/storage/v1alpha1", + "listers/storage/v1beta1", + "pkg/apis/clientauthentication", + "pkg/apis/clientauthentication/v1alpha1", + "pkg/apis/clientauthentication/v1beta1", + "pkg/version", + "plugin/pkg/client/auth/exec", + "rest", + "rest/watch", + "testing", + "tools/auth", + "tools/cache", + "tools/clientcmd", + "tools/clientcmd/api", + "tools/clientcmd/api/latest", + "tools/clientcmd/api/v1", + "tools/leaderelection", + "tools/leaderelection/resourcelock", + "tools/metrics", + "tools/pager", + "tools/record", + "tools/record/util", + "tools/reference", + "transport", + "util/cert", + "util/connrotation", + "util/flowcontrol", + "util/homedir", + "util/keyutil", + "util/retry", + "util/workqueue", + ] + pruneopts = "NUT" + revision = "20ea64f01e4d4026bce06d61d697368390aeda4e" + version = "kubernetes-1.16.4" + +[[projects]] + digest = "1:a6aa236db5d07dff9ea1160ef316b17e131d2b1b2ad7d177431206bf389d241e" + name = "k8s.io/code-generator" + packages = [ + "cmd/client-gen", + "cmd/client-gen/args", + "cmd/client-gen/generators", + "cmd/client-gen/generators/fake", + "cmd/client-gen/generators/scheme", + "cmd/client-gen/generators/util", + "cmd/client-gen/path", + "cmd/client-gen/types", + "cmd/deepcopy-gen", + "cmd/deepcopy-gen/args", + "cmd/defaulter-gen", + "cmd/defaulter-gen/args", + "cmd/informer-gen", + "cmd/informer-gen/args", + "cmd/informer-gen/generators", + "cmd/lister-gen", + "cmd/lister-gen/args", + "cmd/lister-gen/generators", + "pkg/namer", + "pkg/util", + ] + pruneopts = "T" + revision = "8e001e5d18949be7e823ccb9cfe9b60026e7bda0" + version = "kubernetes-1.16.4" + +[[projects]] + digest = "1:39912eb5f8eaf46486faae0839586c27c93423e552f76875defa048f52c15c15" + name = "k8s.io/gengo" + packages = [ + "args", + "examples/deepcopy-gen/generators", + "examples/defaulter-gen/generators", + "examples/set-gen/sets", + "generator", + "namer", + "parser", + "types", + ] + pruneopts = "NUT" + revision = "e17681d19d3ac4837a019ece36c2a0ec31ffe985" + +[[projects]] + digest = "1:c263611800c3a97991dbcf9d3bc4de390f6224aaa8ca0a7226a9d734f65a416a" + name = "k8s.io/klog" + packages = ["."] + pruneopts = "NUT" + revision = "71442cd4037d612096940ceb0f3fec3f7fff66e0" + version = "v0.2.0" + +[[projects]] + branch = "master" + digest = "1:42674e29bf0cf4662d49bd9528e24b9ecc4895b32d0be281f9cf04d3a7671846" + name = "k8s.io/kube-openapi" + packages = ["pkg/util/proto"] + pruneopts = "NUT" + revision = "a01b7d5d6c2258c80a4a10070f3dee9cd575d9c7" + +[[projects]] + branch = "master" + digest = "1:99dbf7ef753ca02399778c93a4ed4b689b28668317134ecd1fabeb07be70f354" + name = "k8s.io/utils" + packages = [ + "buffer", + "integer", + "pointer", + "trace", + ] + pruneopts = "NUT" + revision = "5008bf6f8cd62f4b52816cfa99163fedb053d0be" + +[[projects]] + branch = "release-0.14" + digest = "1:f806eb7e5629d594362dc18905d092888b1d56fbfe026a597d25b86e846f2d53" + name = "knative.dev/pkg" + packages = [ + "apis", + "apis/duck", + "apis/duck/v1", + "changeset", + "client/injection/kube/client", + "client/injection/kube/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration", + "client/injection/kube/informers/admissionregistration/v1beta1/validatingwebhookconfiguration", + "client/injection/kube/informers/core/v1/service", + "client/injection/kube/informers/factory", + "codegen/cmd/injection-gen", + "codegen/cmd/injection-gen/args", + "codegen/cmd/injection-gen/generators", + "configmap", + "controller", + "injection", + "injection/clients/namespacedkube/informers/core/v1/secret", + "injection/clients/namespacedkube/informers/factory", + "injection/sharedmain", + "kmeta", + "kmp", + "leaderelection", + "logging", + "logging/logkey", + "metrics", + "metrics/metricskey", + "network", + "profiling", + "ptr", + "reconciler", + "signals", + "system", + "tracker", + "version", + "webhook", + "webhook/certificates", + "webhook/certificates/resources", + "webhook/configmaps", + "webhook/resourcesemantics", + "webhook/resourcesemantics/defaulting", + "webhook/resourcesemantics/validation", + ] + pruneopts = "T" + revision = "2a1db869228ceaca9df34790b49cdf4893a5d39d" + +[[projects]] + branch = "master" + digest = "1:dc73d65f40ea05b1d0db96ae5491b6ebc162bb59b3ac5a252cdf87848bc7a4b7" + name = "knative.dev/test-infra" + packages = [ + "scripts", + "tools/dep-collector", + ] + pruneopts = "UT" + revision = "74b24ca44778c3a69ecc193250cdddb5d0e64b88" + +[[projects]] + digest = "1:8730e0150dfb2b7e173890c8b9868e7a273082ef8e39f4940e3506a481cf895c" + name = "sigs.k8s.io/yaml" + packages = ["."] + pruneopts = "NUT" + revision = "fd68e9863619f6ec2fdd8625fe1f02e7c877e480" + version = "v1.1.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "go.uber.org/zap", + "k8s.io/api/core/v1", + "k8s.io/apimachinery/pkg/api/equality", + "k8s.io/apimachinery/pkg/api/errors", + "k8s.io/apimachinery/pkg/apis/meta/v1", + "k8s.io/apimachinery/pkg/labels", + "k8s.io/apimachinery/pkg/runtime", + "k8s.io/apimachinery/pkg/runtime/schema", + "k8s.io/apimachinery/pkg/runtime/serializer", + "k8s.io/apimachinery/pkg/types", + "k8s.io/apimachinery/pkg/util/runtime", + "k8s.io/apimachinery/pkg/util/sets", + "k8s.io/apimachinery/pkg/watch", + "k8s.io/client-go/discovery", + "k8s.io/client-go/discovery/fake", + "k8s.io/client-go/kubernetes/scheme", + "k8s.io/client-go/kubernetes/typed/core/v1", + "k8s.io/client-go/listers/core/v1", + "k8s.io/client-go/rest", + "k8s.io/client-go/testing", + "k8s.io/client-go/tools/cache", + "k8s.io/client-go/tools/record", + "k8s.io/client-go/util/flowcontrol", + "k8s.io/code-generator/cmd/client-gen", + "k8s.io/code-generator/cmd/deepcopy-gen", + "k8s.io/code-generator/cmd/defaulter-gen", + "k8s.io/code-generator/cmd/informer-gen", + "k8s.io/code-generator/cmd/lister-gen", + "knative.dev/pkg/apis", + "knative.dev/pkg/apis/duck/v1", + "knative.dev/pkg/client/injection/kube/client", + "knative.dev/pkg/client/injection/kube/informers/core/v1/service", + "knative.dev/pkg/codegen/cmd/injection-gen", + "knative.dev/pkg/configmap", + "knative.dev/pkg/controller", + "knative.dev/pkg/injection", + "knative.dev/pkg/injection/sharedmain", + "knative.dev/pkg/kmeta", + "knative.dev/pkg/logging", + "knative.dev/pkg/metrics", + "knative.dev/pkg/network", + "knative.dev/pkg/reconciler", + "knative.dev/pkg/signals", + "knative.dev/pkg/system", + "knative.dev/pkg/tracker", + "knative.dev/pkg/webhook", + "knative.dev/pkg/webhook/certificates", + "knative.dev/pkg/webhook/configmaps", + "knative.dev/pkg/webhook/resourcesemantics", + "knative.dev/pkg/webhook/resourcesemantics/defaulting", + "knative.dev/pkg/webhook/resourcesemantics/validation", + "knative.dev/test-infra/scripts", + "knative.dev/test-infra/tools/dep-collector", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 000000000..6fd481f50 --- /dev/null +++ b/Gopkg.toml @@ -0,0 +1,69 @@ +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. + +required = [ + "k8s.io/code-generator/cmd/deepcopy-gen", + "k8s.io/code-generator/cmd/defaulter-gen", + "k8s.io/code-generator/cmd/client-gen", + "k8s.io/code-generator/cmd/lister-gen", + "k8s.io/code-generator/cmd/informer-gen", + "knative.dev/pkg/codegen/cmd/injection-gen", + "knative.dev/test-infra/scripts", + "knative.dev/test-infra/tools/dep-collector", +] + +[[override]] + name = "k8s.io/klog" + version = "v0.2.0" + +[[override]] + name = "k8s.io/gengo" + revision = "e17681d19d3ac4837a019ece36c2a0ec31ffe985" + +[[override]] + name = "k8s.io/api" + version = "kubernetes-1.16.4" + +[[override]] + name = "k8s.io/apimachinery" + version = "kubernetes-1.16.4" + +[[override]] + name = "k8s.io/code-generator" + version = "kubernetes-1.16.4" + +[[override]] + name = "k8s.io/client-go" + version = "kubernetes-1.16.4" + +[[override]] + name = "knative.dev/pkg" + branch = "release-0.14" + +[[override]] + name = "google.golang.org/genproto" + revision = "e7d98fc518a78c9f8b5ee77be7b0b317475d89e1" + +[[override]] + name = "go.opencensus.io" + # Needed because this includes the appropriate version of metricsdata + version = "v0.22.0" + +[prune] + go-tests = true + unused-packages = true + non-go = true + +[[prune.project]] + name = "knative.dev/pkg" + unused-packages = false + non-go = false + +[[prune.project]] + name = "k8s.io/code-generator" + unused-packages = false + non-go = false + +[[prune.project]] + name = "knative.dev/test-infra" + non-go = false diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/OWNERS b/OWNERS new file mode 100644 index 000000000..f87086d40 --- /dev/null +++ b/OWNERS @@ -0,0 +1,7 @@ +# The OWNERS file is used by prow to automatically merge approved PRs. + +approvers: +- mattmoor +- n3wscott +- vaikas-google +- vaikas diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES new file mode 100644 index 000000000..cf9025d0f --- /dev/null +++ b/OWNERS_ALIASES @@ -0,0 +1,11 @@ +aliases: + productivity-approvers: + - chaodaiG + - chizhg + productivity-reviewers: + - chaodaiG + - coryrc + - chizhg + - steuhs + - yt3liu + diff --git a/README.md b/README.md new file mode 100644 index 000000000..4ff38dc6b --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Knative Sample Controller + +[![GoDoc](https://godoc.org/knative.dev/sample-controller?status.svg)](https://godoc.org/knative.dev/sample-controller) +[![Go Report Card](https://goreportcard.com/badge/knative/sample-controller)](https://goreportcard.com/report/knative/sample-controller) + +Knative `sample-controller` defines a few simple resources that are validated by +webhook and managed by a controller to demonstrate the canonical style in which +Knative writes controllers. + +To learn more about Knative, please visit our +[Knative docs](https://github.com/knative/docs) repository. + +If you are interested in contributing, see [CONTRIBUTING.md](./CONTRIBUTING.md) +and [DEVELOPMENT.md](./DEVELOPMENT.md). diff --git a/cmd/controller/kodata/HEAD b/cmd/controller/kodata/HEAD new file mode 120000 index 000000000..8f63681d3 --- /dev/null +++ b/cmd/controller/kodata/HEAD @@ -0,0 +1 @@ +../../../.git/HEAD \ No newline at end of file diff --git a/cmd/controller/kodata/LICENSE b/cmd/controller/kodata/LICENSE new file mode 120000 index 000000000..5853aaea5 --- /dev/null +++ b/cmd/controller/kodata/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/cmd/controller/kodata/VENDOR-LICENSE b/cmd/controller/kodata/VENDOR-LICENSE new file mode 120000 index 000000000..3cc897645 --- /dev/null +++ b/cmd/controller/kodata/VENDOR-LICENSE @@ -0,0 +1 @@ +../../../third_party/VENDOR-LICENSE \ No newline at end of file diff --git a/cmd/controller/kodata/refs b/cmd/controller/kodata/refs new file mode 120000 index 000000000..739d35bf9 --- /dev/null +++ b/cmd/controller/kodata/refs @@ -0,0 +1 @@ +../../../.git/refs \ No newline at end of file diff --git a/cmd/controller/main.go b/cmd/controller/main.go new file mode 100644 index 000000000..b8bd1b72b --- /dev/null +++ b/cmd/controller/main.go @@ -0,0 +1,31 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + // The set of controllers this controller process runs. + "knative.dev/sample-controller/pkg/reconciler/addressableservice" + + // This defines the shared main for injected controllers. + "knative.dev/pkg/injection/sharedmain" +) + +func main() { + sharedmain.Main("controller", + addressableservice.NewController, + ) +} diff --git a/cmd/webhook/kodata/HEAD b/cmd/webhook/kodata/HEAD new file mode 120000 index 000000000..8f63681d3 --- /dev/null +++ b/cmd/webhook/kodata/HEAD @@ -0,0 +1 @@ +../../../.git/HEAD \ No newline at end of file diff --git a/cmd/webhook/kodata/LICENSE b/cmd/webhook/kodata/LICENSE new file mode 120000 index 000000000..5853aaea5 --- /dev/null +++ b/cmd/webhook/kodata/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/cmd/webhook/kodata/VENDOR-LICENSE b/cmd/webhook/kodata/VENDOR-LICENSE new file mode 120000 index 000000000..3cc897645 --- /dev/null +++ b/cmd/webhook/kodata/VENDOR-LICENSE @@ -0,0 +1 @@ +../../../third_party/VENDOR-LICENSE \ No newline at end of file diff --git a/cmd/webhook/kodata/refs b/cmd/webhook/kodata/refs new file mode 120000 index 000000000..739d35bf9 --- /dev/null +++ b/cmd/webhook/kodata/refs @@ -0,0 +1 @@ +../../../.git/refs \ No newline at end of file diff --git a/cmd/webhook/main.go b/cmd/webhook/main.go new file mode 100644 index 000000000..5c494d663 --- /dev/null +++ b/cmd/webhook/main.go @@ -0,0 +1,129 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "fmt" + + "k8s.io/apimachinery/pkg/runtime/schema" + "knative.dev/pkg/configmap" + "knative.dev/pkg/controller" + "knative.dev/pkg/injection/sharedmain" + "knative.dev/pkg/logging" + "knative.dev/pkg/metrics" + "knative.dev/pkg/signals" + "knative.dev/pkg/system" + "knative.dev/pkg/webhook" + "knative.dev/pkg/webhook/certificates" + "knative.dev/pkg/webhook/configmaps" + "knative.dev/pkg/webhook/resourcesemantics" + "knative.dev/pkg/webhook/resourcesemantics/defaulting" + "knative.dev/pkg/webhook/resourcesemantics/validation" + + "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" +) + +var types = map[schema.GroupVersionKind]resourcesemantics.GenericCRD{ + // List the types to validate. + v1alpha1.SchemeGroupVersion.WithKind("AddressableService"): &v1alpha1.AddressableService{}, +} + +var callbacks = map[schema.GroupVersionKind]validation.Callback{} + +func NewDefaultingAdmissionController(ctx context.Context, cmw configmap.Watcher) *controller.Impl { + return defaulting.NewAdmissionController(ctx, + + // Name of the resource webhook. + fmt.Sprintf("defaulting.webhook.%s.knative.dev", system.Namespace()), + + // The path on which to serve the webhook. + "/defaulting", + + // The resources to default. + types, + + // A function that infuses the context passed to Validate/SetDefaults with custom metadata. + func(ctx context.Context) context.Context { + // Here is where you would infuse the context with state + // (e.g. attach a store with configmap data) + return ctx + }, + + // Whether to disallow unknown fields. + true, + ) +} + +func NewValidationAdmissionController(ctx context.Context, cmw configmap.Watcher) *controller.Impl { + return validation.NewAdmissionController(ctx, + + // Name of the resource webhook. + fmt.Sprintf("validation.webhook.%s.knative.dev", system.Namespace()), + + // The path on which to serve the webhook. + "/resource-validation", + + // The resources to validate. + types, + + // A function that infuses the context passed to Validate/SetDefaults with custom metadata. + func(ctx context.Context) context.Context { + // Here is where you would infuse the context with state + // (e.g. attach a store with configmap data) + return ctx + }, + + // Whether to disallow unknown fields. + true, + + // Extra validating callbacks to be applied to resources. + callbacks, + ) +} + +func NewConfigValidationController(ctx context.Context, cmw configmap.Watcher) *controller.Impl { + return configmaps.NewAdmissionController(ctx, + + // Name of the configmap webhook. + fmt.Sprintf("config.webhook.%s.knative.dev", system.Namespace()), + + // The path on which to serve the webhook. + "/config-validation", + + // The configmaps to validate. + configmap.Constructors{ + logging.ConfigMapName(): logging.NewConfigFromConfigMap, + metrics.ConfigMapName(): metrics.NewObservabilityConfigFromConfigMap, + }, + ) +} + +func main() { + ctx := webhook.WithOptions(signals.NewContext(), webhook.Options{ + ServiceName: "webhook", + Port: 8443, + SecretName: "webhook-certs", + }) + + sharedmain.WebhookMainWithContext(ctx, "webhook", + certificates.NewController, + NewDefaultingAdmissionController, + NewValidationAdmissionController, + NewConfigValidationController, + ) +} diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 000000000..5f04b3187 --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,75 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of +experience, education, socio-economic status, nationality, personal appearance, +race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, or to ban temporarily or permanently any +contributor for other behaviors that they deem inappropriate, threatening, +offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at +knative-code-of-conduct@googlegroups.com. All complaints will be reviewed and +investigated and will result in a response that is deemed necessary and +appropriate to the circumstances. The project team is obligated to maintain +confidentiality with regard to the reporter of an incident. Further details of +specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.4, available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org diff --git a/config/100-namespace.yaml b/config/100-namespace.yaml new file mode 100644 index 000000000..772ecc57e --- /dev/null +++ b/config/100-namespace.yaml @@ -0,0 +1,21 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Namespace +metadata: + name: knative-samples + labels: + istio-injection: enabled + samples.knative.dev/release: devel diff --git a/config/200-clusterrole.yaml b/config/200-clusterrole.yaml new file mode 100644 index 000000000..30edcd217 --- /dev/null +++ b/config/200-clusterrole.yaml @@ -0,0 +1,35 @@ +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: knative-samples-admin + labels: + samples.knative.dev/release: devel +aggregationRule: + clusterRoleSelectors: + - matchLabels: + samples.knative.dev/controller: "true" +rules: [] # Rules are automatically filled in by the controller manager. +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: knative-samples-core + labels: + samples.knative.dev/release: devel + samples.knative.dev/controller: "true" +rules: + - apiGroups: [""] + resources: ["configmaps", "services", "secrets", "events"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + - apiGroups: ["apps"] + resources: ["deployments", "deployments/finalizers"] # finalizers are needed for the owner reference of the webhook + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + - apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + - apiGroups: ["apiextensions.k8s.io"] + resources: ["customresourcedefinitions"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + - apiGroups: ["samples.knative.dev"] + resources: ["*"] + verbs: ["get", "list", "create", "update", "delete", "deletecollection", "patch", "watch"] diff --git a/config/200-serviceaccount.yaml b/config/200-serviceaccount.yaml new file mode 100644 index 000000000..051534e44 --- /dev/null +++ b/config/200-serviceaccount.yaml @@ -0,0 +1,21 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: controller + namespace: knative-samples + labels: + samples.knative.dev/release: devel diff --git a/config/201-clusterrolebinding.yaml b/config/201-clusterrolebinding.yaml new file mode 100644 index 000000000..6b4b861d4 --- /dev/null +++ b/config/201-clusterrolebinding.yaml @@ -0,0 +1,28 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: knative-samples-controller-admin + labels: + samples.knative.dev/release: devel +subjects: + - kind: ServiceAccount + name: controller + namespace: knative-samples +roleRef: + kind: ClusterRole + name: knative-samples-admin + apiGroup: rbac.authorization.k8s.io diff --git a/config/300-addressableservice.yaml b/config/300-addressableservice.yaml new file mode 100644 index 000000000..6e23b16ee --- /dev/null +++ b/config/300-addressableservice.yaml @@ -0,0 +1,46 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: addressableservices.samples.knative.dev + labels: + samples.knative.dev/release: devel + knative.dev/crd-install: "true" +spec: + group: samples.knative.dev + version: v1alpha1 + names: + kind: AddressableService + plural: addressableservices + singular: addressableservice + categories: + - all + - knative + shortNames: + - asvc + scope: Namespaced + subresources: + status: {} + additionalPrinterColumns: + - name: Address + type: string + JSONPath: .status.address.url + - name: Ready + type: string + JSONPath: ".status.conditions[?(@.type=='Ready')].status" + - name: Reason + type: string + JSONPath: ".status.conditions[?(@.type=='Ready')].reason" diff --git a/config/400-webhook-service.yaml b/config/400-webhook-service.yaml new file mode 100644 index 000000000..dca7a7303 --- /dev/null +++ b/config/400-webhook-service.yaml @@ -0,0 +1,28 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + labels: + role: webhook + samples.knative.dev/release: devel + name: webhook + namespace: knative-samples +spec: + ports: + - port: 443 + targetPort: 8443 + selector: + role: webhook diff --git a/config/500-webhook-configuration.yaml b/config/500-webhook-configuration.yaml new file mode 100644 index 000000000..0bc8d1f61 --- /dev/null +++ b/config/500-webhook-configuration.yaml @@ -0,0 +1,74 @@ +# Copyright 2018 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: MutatingWebhookConfiguration +metadata: + name: defaulting.webhook.knative-samples.knative.dev + labels: + samples.knative.dev/release: devel +webhooks: +- admissionReviewVersions: + - v1beta1 + clientConfig: + service: + name: webhook + namespace: knative-samples + failurePolicy: Fail + name: defaulting.webhook.knative-samples.knative.dev +--- +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: ValidatingWebhookConfiguration +metadata: + name: validation.webhook.knative-samples.knative.dev + labels: + samples.knative.dev/release: devel +webhooks: +- admissionReviewVersions: + - v1beta1 + clientConfig: + service: + name: webhook + namespace: knative-samples + failurePolicy: Fail + name: validation.webhook.knative-samples.knative.dev +--- +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: ValidatingWebhookConfiguration +metadata: + name: config.webhook.knative-samples.knative.dev + labels: + serving.knative.dev/release: devel +webhooks: +- admissionReviewVersions: + - v1beta1 + clientConfig: + service: + name: webhook + namespace: knative-samples + failurePolicy: Fail + name: config.webhook.knative-samples.knative.dev + namespaceSelector: + matchExpressions: + - key: samples.knative.dev/release + operator: Exists +--- +apiVersion: v1 +kind: Secret +metadata: + name: webhook-certs + namespace: knative-samples + labels: + samples.knative.dev/release: devel +# The data is populated at install time. diff --git a/config/config-logging.yaml b/config/config-logging.yaml new file mode 100644 index 000000000..8fc84cb60 --- /dev/null +++ b/config/config-logging.yaml @@ -0,0 +1,66 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-logging + namespace: knative-samples + labels: + samples.knative.dev/release: devel + +data: + _example: | + ################################ + # # + # EXAMPLE CONFIGURATION # + # # + ################################ + + # This block is not actually functional configuration, + # but serves to illustrate the available configuration + # options and document them in a way that is accessible + # to users that `kubectl edit` this config map. + # + # These sample configuration options may be copied out of + # this example block and unindented to be in the data block + # to actually change the configuration. + + # Common configuration for all Knative codebase + zap-logger-config: | + { + "level": "info", + "development": false, + "outputPaths": ["stdout"], + "errorOutputPaths": ["stderr"], + "encoding": "json", + "encoderConfig": { + "timeKey": "ts", + "levelKey": "level", + "nameKey": "logger", + "callerKey": "caller", + "messageKey": "msg", + "stacktraceKey": "stacktrace", + "lineEnding": "", + "levelEncoder": "", + "timeEncoder": "iso8601", + "durationEncoder": "", + "callerEncoder": "" + } + } + + # Log level overrides + # Changes are be picked up immediately. + loglevel.controller: "info" + loglevel.webhook: "info" diff --git a/config/config-observability.yaml b/config/config-observability.yaml new file mode 100644 index 000000000..b1d216929 --- /dev/null +++ b/config/config-observability.yaml @@ -0,0 +1,89 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-observability + namespace: knative-samples + labels: + samples.knative.dev/release: devel + +data: + _example: | + ################################ + # # + # EXAMPLE CONFIGURATION # + # # + ################################ + + # This block is not actually functional configuration, + # but serves to illustrate the available configuration + # options and document them in a way that is accessible + # to users that `kubectl edit` this config map. + # + # These sample configuration options may be copied out of + # this example block and unindented to be in the data block + # to actually change the configuration. + + # If non-empty, this enables queue proxy writing request logs to stdout. + # The value determines the shape of the request logs and it must be a valid go text/template. + # It is important to keep this as a single line. Multiple lines are parsed as separate entities + # by most collection agents and will split the request logs into multiple records. + # + # The following fields and functions are available to the template: + # + # Request: An http.Request (see https://golang.org/pkg/net/http/#Request) + # representing an HTTP request received by the server. + # + # Response: + # struct { + # Code int // HTTP status code (see https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) + # Size int // An int representing the size of the response. + # Latency float64 // A float64 representing the latency of the response in seconds. + # } + # + # Revision: + # struct { + # Name string // Knative revision name + # Namespace string // Knative revision namespace + # Service string // Knative service name + # Configuration string // Knative configuration name + # PodName string // Name of the pod hosting the revision + # PodIP string // IP of the pod hosting the revision + # } + # + logging.request-log-template: '{"httpRequest": {"requestMethod": "{{.Request.Method}}", "requestUrl": "{{js .Request.RequestURI}}", "requestSize": "{{.Request.ContentLength}}", "status": {{.Response.Code}}, "responseSize": "{{.Response.Size}}", "userAgent": "{{js .Request.UserAgent}}", "remoteIp": "{{js .Request.RemoteAddr}}", "serverIp": "{{.Revision.PodIP}}", "referer": "{{js .Request.Referer}}", "latency": "{{.Response.Latency}}s", "protocol": "{{.Request.Proto}}"}, "traceId": "{{index .Request.Header "X-B3-Traceid"}}"}' + + # metrics.backend-destination field specifies the system metrics destination. + # It supports either prometheus (the default) or stackdriver. + # Note: Using stackdriver will incur additional charges + metrics.backend-destination: prometheus + + # metrics.request-metrics-backend-destination specifies the request metrics + # destination. If non-empty, it enables queue proxy to send request metrics. + # Currently supported values: prometheus, stackdriver. + metrics.request-metrics-backend-destination: prometheus + + # metrics.stackdriver-project-id field specifies the stackdriver project ID. This + # field is optional. When running on GCE, application default credentials will be + # used if this field is not provided. + metrics.stackdriver-project-id: "" + + # metrics.allow-stackdriver-custom-metrics indicates whether it is allowed to send metrics to + # Stackdriver using "global" resource type and custom metric type if the + # metrics are not supported by "knative_revision" resource type. Setting this + # flag to "true" could cause extra Stackdriver charge. + # If metrics.backend-destination is not Stackdriver, this is ignored. + metrics.allow-stackdriver-custom-metrics: "false" diff --git a/config/controller.yaml b/config/controller.yaml new file mode 100644 index 000000000..8ec723a2f --- /dev/null +++ b/config/controller.yaml @@ -0,0 +1,70 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller + namespace: knative-samples + labels: + samples.knative.dev/release: devel +spec: + replicas: 1 + selector: + matchLabels: + app: controller + template: + metadata: + annotations: + sidecar.istio.io/inject: "false" + labels: + app: controller + samples.knative.dev/release: devel + spec: + serviceAccountName: controller + containers: + - name: controller + # This is the Go import path for the binary that is containerized + # and substituted here. + image: ko://knative.dev/sample-controller/cmd/controller + resources: + # Request 2x what we saw running e2e + requests: + cpu: 100m + memory: 100Mi + # Limit to 10x the request (20x the observed peak during e2e) + limits: + cpu: 1000m + memory: 1000Mi + ports: + - name: metrics + containerPort: 9090 + volumeMounts: + - name: config-logging + mountPath: /etc/config-logging + env: + - name: SYSTEM_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: CONFIG_LOGGING_NAME + value: config-logging + - name: CONFIG_OBSERVABILITY_NAME + value: config-observability + - name: METRICS_DOMAIN + value: knative.dev/samples + volumes: + - name: config-logging + configMap: + name: config-logging diff --git a/config/webhook.yaml b/config/webhook.yaml new file mode 100644 index 000000000..7e4249a6b --- /dev/null +++ b/config/webhook.yaml @@ -0,0 +1,62 @@ +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webhook + namespace: knative-samples + labels: + samples.knative.dev/release: devel +spec: + replicas: 1 + selector: + matchLabels: + app: webhook + role: webhook + template: + metadata: + annotations: + sidecar.istio.io/inject: "false" + labels: + app: webhook + role: webhook + samples.knative.dev/release: devel + spec: + serviceAccountName: controller + containers: + - name: webhook + # This is the Go import path for the binary that is containerized + # and substituted here. + image: ko://knative.dev/sample-controller/cmd/webhook + resources: + # Request 2x what we saw running e2e + requests: + cpu: 20m + memory: 20Mi + # Limit to 10x the request (20x the observed peak during e2e) + limits: + cpu: 200m + memory: 200Mi + env: + - name: SYSTEM_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: CONFIG_LOGGING_NAME + value: config-logging + - name: METRICS_DOMAIN + value: knative.dev/samples + - name: WEBHOOK_NAME + value: webhook diff --git a/example.yaml b/example.yaml new file mode 100644 index 000000000..2867108a8 --- /dev/null +++ b/example.yaml @@ -0,0 +1,7 @@ +apiVersion: samples.knative.dev/v1alpha1 +kind: AddressableService +metadata: + name: make-it-addressable + namespace: knative-samples +spec: + serviceName: webhook diff --git a/hack/OWNERS b/hack/OWNERS new file mode 100644 index 000000000..c50adc849 --- /dev/null +++ b/hack/OWNERS @@ -0,0 +1,10 @@ +# The OWNERS file is used by prow to automatically merge approved PRs. + +approvers: +- productivity-approvers + +reviewers: +- productivity-reviewers + +labels: +- area/test-and-release diff --git a/hack/boilerplate/add-boilerplate.sh b/hack/boilerplate/add-boilerplate.sh new file mode 100755 index 000000000..3c926a2c0 --- /dev/null +++ b/hack/boilerplate/add-boilerplate.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +USAGE=$(cat <.txt to all . files missing it in a directory. + +Usage: (from repository root) + ./hack/boilerplate/add-boilerplate.sh + +Example: (from repository root) + ./hack/boilerplate/add-boilerplate.sh go cmd +EOF +) + +set -e + +if [[ -z $1 || -z $2 ]]; then + echo "${USAGE}" + exit 1 +fi + +grep -r -L -P "Copyright \d+ The Knative Authors" $2 \ + | grep -P "\.$1\$" \ + | xargs -I {} sh -c \ + "cat hack/boilerplate/boilerplate.$1.txt {} > /tmp/boilerplate && mv /tmp/boilerplate {}" diff --git a/hack/boilerplate/boilerplate.go.txt b/hack/boilerplate/boilerplate.go.txt new file mode 100644 index 000000000..6f818683b --- /dev/null +++ b/hack/boilerplate/boilerplate.go.txt @@ -0,0 +1,15 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ diff --git a/hack/boilerplate/boilerplate.sh.txt b/hack/boilerplate/boilerplate.sh.txt new file mode 100755 index 000000000..f2b4c078a --- /dev/null +++ b/hack/boilerplate/boilerplate.sh.txt @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# Copyright 2020 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh new file mode 100755 index 000000000..e60c19263 --- /dev/null +++ b/hack/update-codegen.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +REPO_ROOT=$(dirname ${BASH_SOURCE})/.. +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${REPO_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)} + +KNATIVE_CODEGEN_PKG=${KNATIVE_CODEGEN_PKG:-$(cd ${REPO_ROOT}; ls -d -1 ./vendor/knative.dev/pkg 2>/dev/null || echo ../pkg)} + +# generate the code with: +# --output-base because this script should also be able to run inside the vendor dir of +# k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir +# instead of the $GOPATH directly. For normal projects this can be dropped. +${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ + knative.dev/sample-controller/pkg/client knative.dev/sample-controller/pkg/apis \ + "samples:v1alpha1" \ + --go-header-file ${REPO_ROOT}/hack/boilerplate/boilerplate.go.txt + +# Knative Injection +${KNATIVE_CODEGEN_PKG}/hack/generate-knative.sh "injection" \ + knative.dev/sample-controller/pkg/client knative.dev/sample-controller/pkg/apis \ + "samples:v1alpha1" \ + --go-header-file ${REPO_ROOT}/hack/boilerplate/boilerplate.go.txt + +# Make sure our dependencies are up-to-date +${REPO_ROOT}/hack/update-deps.sh diff --git a/hack/update-deps.sh b/hack/update-deps.sh new file mode 100755 index 000000000..bc699bf0b --- /dev/null +++ b/hack/update-deps.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +readonly ROOT_DIR=$(dirname $0)/.. +source ${ROOT_DIR}/vendor/knative.dev/test-infra/scripts/library.sh + +set -o errexit +set -o nounset +set -o pipefail + +cd ${ROOT_DIR} + +# The list of dependencies that we track at HEAD and periodically +# float forward in this repository. +FLOATING_DEPS=( + "knative.dev/pkg" + "knative.dev/test-infra" +) + +# Parse flags to determine any we should pass to dep. +DEP_FLAGS=() +while [[ $# -ne 0 ]]; do + parameter=$1 + case ${parameter} in + --upgrade) DEP_FLAGS=( -update ${FLOATING_DEPS[@]} ) ;; + *) abort "unknown option ${parameter}" ;; + esac + shift +done +readonly DEP_FLAGS + +# Ensure we have everything we need under vendor/ +dep ensure ${DEP_FLAGS[@]} + +rm -rf $(find vendor/ -name 'OWNERS') +rm -rf $(find vendor/ -name '*_test.go') + +# Do this for every package under "cmd" except kodata and cmd itself. +update_licenses third_party/VENDOR-LICENSE "$(find ./cmd -type d | grep -v kodata | grep -vE 'cmd$')" diff --git a/hack/verify-codegen.sh b/hack/verify-codegen.sh new file mode 100755 index 000000000..a1cb2fd5b --- /dev/null +++ b/hack/verify-codegen.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +readonly REPO_ROOT_DIR="$(git rev-parse --show-toplevel)" +readonly TMP_DIFFROOT="$(mktemp -d -p ${REPO_ROOT_DIR})" + +cleanup() { + rm -rf "${TMP_DIFFROOT}" +} + +trap "cleanup" EXIT SIGINT + +cleanup + +# Save working tree state +mkdir -p "${TMP_DIFFROOT}/pkg" +cp -aR "${REPO_ROOT_DIR}/Gopkg.lock" "${REPO_ROOT_DIR}/pkg" "${REPO_ROOT_DIR}/vendor" "${TMP_DIFFROOT}" + +# TODO(mattmoor): We should be able to rm -rf pkg/client/ and vendor/ + +"${REPO_ROOT_DIR}/hack/update-codegen.sh" +echo "Diffing ${REPO_ROOT_DIR} against freshly generated codegen" +ret=0 +diff -Naupr "${REPO_ROOT_DIR}/pkg" "${TMP_DIFFROOT}/pkg" || ret=1 +diff -Naupr --no-dereference "${REPO_ROOT_DIR}/vendor" "${TMP_DIFFROOT}/vendor" || ret=1 + +# Restore working tree state +rm -fr "${TMP_DIFFROOT}/config" +rm -fr "${REPO_ROOT_DIR}/Gopkg.lock" "${REPO_ROOT_DIR}/pkg" "${REPO_ROOT_DIR}/vendor" +cp -aR "${TMP_DIFFROOT}"/* "${REPO_ROOT_DIR}" + +if [[ $ret -eq 0 ]] +then + echo "${REPO_ROOT_DIR} up to date." +else + echo "ERROR: ${REPO_ROOT_DIR} is out of date. Please run ./hack/update-codegen.sh" + exit 1 +fi diff --git a/pkg/apis/samples/register.go b/pkg/apis/samples/register.go new file mode 100644 index 000000000..fbf5a524f --- /dev/null +++ b/pkg/apis/samples/register.go @@ -0,0 +1,21 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package samples + +const ( + GroupName = "samples.knative.dev" +) diff --git a/pkg/apis/samples/v1alpha1/addressable_service_defaults.go b/pkg/apis/samples/v1alpha1/addressable_service_defaults.go new file mode 100644 index 000000000..529967b9f --- /dev/null +++ b/pkg/apis/samples/v1alpha1/addressable_service_defaults.go @@ -0,0 +1,26 @@ +/* +Copyright 2019 The Knative Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "context" +) + +// SetDefaults implements apis.Defaultable +func (as *AddressableService) SetDefaults(ctx context.Context) { + // Nothing to default. +} diff --git a/pkg/apis/samples/v1alpha1/addressable_service_lifecycle.go b/pkg/apis/samples/v1alpha1/addressable_service_lifecycle.go new file mode 100644 index 000000000..3426e4b2e --- /dev/null +++ b/pkg/apis/samples/v1alpha1/addressable_service_lifecycle.go @@ -0,0 +1,44 @@ +/* +Copyright 2019 The Knative Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "knative.dev/pkg/apis" +) + +var condSet = apis.NewLivingConditionSet() + +// GetGroupVersionKind implements kmeta.OwnerRefable +func (as *AddressableService) GetGroupVersionKind() schema.GroupVersionKind { + return SchemeGroupVersion.WithKind("AddressableService") +} + +func (ass *AddressableServiceStatus) InitializeConditions() { + condSet.Manage(ass).InitializeConditions() +} + +func (ass *AddressableServiceStatus) MarkServiceUnavailable(name string) { + condSet.Manage(ass).MarkFalse( + AddressableServiceConditionReady, + "ServiceUnavailable", + "Service %q wasn't found.", name) +} + +func (ass *AddressableServiceStatus) MarkServiceAvailable() { + condSet.Manage(ass).MarkTrue(AddressableServiceConditionReady) +} diff --git a/pkg/apis/samples/v1alpha1/addressable_service_types.go b/pkg/apis/samples/v1alpha1/addressable_service_types.go new file mode 100644 index 000000000..0f6466c80 --- /dev/null +++ b/pkg/apis/samples/v1alpha1/addressable_service_types.go @@ -0,0 +1,80 @@ +/* +Copyright 2019 The Knative Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "knative.dev/pkg/apis" + duckv1 "knative.dev/pkg/apis/duck/v1" + "knative.dev/pkg/kmeta" +) + +// +genclient +// +genreconciler +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AddressableService is a Knative abstraction that encapsulates the interface by which Knative +// components express a desire to have a particular image cached. +type AddressableService struct { + metav1.TypeMeta `json:",inline"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec holds the desired state of the AddressableService (from the client). + // +optional + Spec AddressableServiceSpec `json:"spec,omitempty"` + + // Status communicates the observed state of the AddressableService (from the controller). + // +optional + Status AddressableServiceStatus `json:"status,omitempty"` +} + +// Check that AddressableService can be validated and defaulted. +var _ apis.Validatable = (*AddressableService)(nil) +var _ apis.Defaultable = (*AddressableService)(nil) +var _ kmeta.OwnerRefable = (*AddressableService)(nil) + +// AddressableServiceSpec holds the desired state of the AddressableService (from the client). +type AddressableServiceSpec struct { + // ServiceName holds the name of the Kubernetes Service to expose as an "addressable". + ServiceName string `json:"serviceName"` +} + +const ( + // AddressableServiceConditionReady is set when the revision is starting to materialize + // runtime resources, and becomes true when those resources are ready. + AddressableServiceConditionReady = apis.ConditionReady +) + +// AddressableServiceStatus communicates the observed state of the AddressableService (from the controller). +type AddressableServiceStatus struct { + duckv1.Status `json:",inline"` + + // Address holds the information needed to connect this Addressable up to receive events. + // +optional + Address *duckv1.Addressable `json:"address,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AddressableServiceList is a list of AddressableService resources +type AddressableServiceList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []AddressableService `json:"items"` +} diff --git a/pkg/apis/samples/v1alpha1/addressable_service_validation.go b/pkg/apis/samples/v1alpha1/addressable_service_validation.go new file mode 100644 index 000000000..ea0115098 --- /dev/null +++ b/pkg/apis/samples/v1alpha1/addressable_service_validation.go @@ -0,0 +1,36 @@ +/* +Copyright 2019 The Knative Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "context" + + "knative.dev/pkg/apis" +) + +// Validate implements apis.Validatable +func (as *AddressableService) Validate(ctx context.Context) *apis.FieldError { + return as.Spec.Validate(ctx).ViaField("spec") +} + +// Validate implements apis.Validatable +func (ass *AddressableServiceSpec) Validate(ctx context.Context) *apis.FieldError { + if ass.ServiceName == "" { + return apis.ErrMissingField("serviceName") + } + return nil +} diff --git a/pkg/apis/samples/v1alpha1/doc.go b/pkg/apis/samples/v1alpha1/doc.go new file mode 100644 index 000000000..fb6d00b7c --- /dev/null +++ b/pkg/apis/samples/v1alpha1/doc.go @@ -0,0 +1,19 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package +// +groupName=samples.knative.dev +package v1alpha1 diff --git a/pkg/apis/samples/v1alpha1/register.go b/pkg/apis/samples/v1alpha1/register.go new file mode 100644 index 000000000..c28a26502 --- /dev/null +++ b/pkg/apis/samples/v1alpha1/register.go @@ -0,0 +1,53 @@ +/* +Copyright 2019 The Knative Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "knative.dev/sample-controller/pkg/apis/samples" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: samples.GroupName, Version: "v1alpha1"} + +// Kind takes an unqualified kind and returns back a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +// Adds the list of known types to Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &AddressableService{}, + &AddressableServiceList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/apis/samples/v1alpha1/register_test.go b/pkg/apis/samples/v1alpha1/register_test.go new file mode 100644 index 000000000..15336dd1b --- /dev/null +++ b/pkg/apis/samples/v1alpha1/register_test.go @@ -0,0 +1,41 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package v1alpha1 + +import ( + "testing" + + "k8s.io/apimachinery/pkg/runtime" +) + +func TestRegisterHelpers(t *testing.T) { + if got, want := Kind("Foo"), "Foo.samples.knative.dev"; got.String() != want { + t.Errorf("Kind(Foo) = %v, want %v", got.String(), want) + } + + if got, want := Resource("Foo"), "Foo.samples.knative.dev"; got.String() != want { + t.Errorf("Resource(Foo) = %v, want %v", got.String(), want) + } + + if got, want := SchemeGroupVersion.String(), "samples.knative.dev/v1alpha1"; got != want { + t.Errorf("SchemeGroupVersion() = %v, want %v", got, want) + } + + scheme := runtime.NewScheme() + if err := addKnownTypes(scheme); err != nil { + t.Errorf("addKnownTypes() = %v", err) + } +} diff --git a/pkg/apis/samples/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/samples/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 000000000..82314afa1 --- /dev/null +++ b/pkg/apis/samples/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,125 @@ +// +build !ignore_autogenerated + +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" + v1 "knative.dev/pkg/apis/duck/v1" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AddressableService) DeepCopyInto(out *AddressableService) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddressableService. +func (in *AddressableService) DeepCopy() *AddressableService { + if in == nil { + return nil + } + out := new(AddressableService) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AddressableService) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AddressableServiceList) DeepCopyInto(out *AddressableServiceList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]AddressableService, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddressableServiceList. +func (in *AddressableServiceList) DeepCopy() *AddressableServiceList { + if in == nil { + return nil + } + out := new(AddressableServiceList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AddressableServiceList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AddressableServiceSpec) DeepCopyInto(out *AddressableServiceSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddressableServiceSpec. +func (in *AddressableServiceSpec) DeepCopy() *AddressableServiceSpec { + if in == nil { + return nil + } + out := new(AddressableServiceSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AddressableServiceStatus) DeepCopyInto(out *AddressableServiceStatus) { + *out = *in + in.Status.DeepCopyInto(&out.Status) + if in.Address != nil { + in, out := &in.Address, &out.Address + *out = new(v1.Addressable) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddressableServiceStatus. +func (in *AddressableServiceStatus) DeepCopy() *AddressableServiceStatus { + if in == nil { + return nil + } + out := new(AddressableServiceStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/client/clientset/versioned/clientset.go b/pkg/client/clientset/versioned/clientset.go new file mode 100644 index 000000000..d34584df9 --- /dev/null +++ b/pkg/client/clientset/versioned/clientset.go @@ -0,0 +1,97 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package versioned + +import ( + "fmt" + + discovery "k8s.io/client-go/discovery" + rest "k8s.io/client-go/rest" + flowcontrol "k8s.io/client-go/util/flowcontrol" + samplesv1alpha1 "knative.dev/sample-controller/pkg/client/clientset/versioned/typed/samples/v1alpha1" +) + +type Interface interface { + Discovery() discovery.DiscoveryInterface + SamplesV1alpha1() samplesv1alpha1.SamplesV1alpha1Interface +} + +// Clientset contains the clients for groups. Each group has exactly one +// version included in a Clientset. +type Clientset struct { + *discovery.DiscoveryClient + samplesV1alpha1 *samplesv1alpha1.SamplesV1alpha1Client +} + +// SamplesV1alpha1 retrieves the SamplesV1alpha1Client +func (c *Clientset) SamplesV1alpha1() samplesv1alpha1.SamplesV1alpha1Interface { + return c.samplesV1alpha1 +} + +// Discovery retrieves the DiscoveryClient +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + if c == nil { + return nil + } + return c.DiscoveryClient +} + +// NewForConfig creates a new Clientset for the given config. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfig will generate a rate-limiter in configShallowCopy. +func NewForConfig(c *rest.Config) (*Clientset, error) { + configShallowCopy := *c + if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + if configShallowCopy.Burst <= 0 { + return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + } + configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + } + var cs Clientset + var err error + cs.samplesV1alpha1, err = samplesv1alpha1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } + + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + if err != nil { + return nil, err + } + return &cs, nil +} + +// NewForConfigOrDie creates a new Clientset for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *Clientset { + var cs Clientset + cs.samplesV1alpha1 = samplesv1alpha1.NewForConfigOrDie(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) + return &cs +} + +// New creates a new Clientset for the given RESTClient. +func New(c rest.Interface) *Clientset { + var cs Clientset + cs.samplesV1alpha1 = samplesv1alpha1.New(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClient(c) + return &cs +} diff --git a/pkg/client/clientset/versioned/doc.go b/pkg/client/clientset/versioned/doc.go new file mode 100644 index 000000000..e48c2aa44 --- /dev/null +++ b/pkg/client/clientset/versioned/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated clientset. +package versioned diff --git a/pkg/client/clientset/versioned/fake/clientset_generated.go b/pkg/client/clientset/versioned/fake/clientset_generated.go new file mode 100644 index 000000000..928c51579 --- /dev/null +++ b/pkg/client/clientset/versioned/fake/clientset_generated.go @@ -0,0 +1,82 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/discovery" + fakediscovery "k8s.io/client-go/discovery/fake" + "k8s.io/client-go/testing" + clientset "knative.dev/sample-controller/pkg/client/clientset/versioned" + samplesv1alpha1 "knative.dev/sample-controller/pkg/client/clientset/versioned/typed/samples/v1alpha1" + fakesamplesv1alpha1 "knative.dev/sample-controller/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake" +) + +// NewSimpleClientset returns a clientset that will respond with the provided objects. +// It's backed by a very simple object tracker that processes creates, updates and deletions as-is, +// without applying any validations and/or defaults. It shouldn't be considered a replacement +// for a real clientset and is mostly useful in simple unit tests. +func NewSimpleClientset(objects ...runtime.Object) *Clientset { + o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder()) + for _, obj := range objects { + if err := o.Add(obj); err != nil { + panic(err) + } + } + + cs := &Clientset{tracker: o} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + gvr := action.GetResource() + ns := action.GetNamespace() + watch, err := o.Watch(gvr, ns) + if err != nil { + return false, nil, err + } + return true, watch, nil + }) + + return cs +} + +// Clientset implements clientset.Interface. Meant to be embedded into a +// struct to get a default implementation. This makes faking out just the method +// you want to test easier. +type Clientset struct { + testing.Fake + discovery *fakediscovery.FakeDiscovery + tracker testing.ObjectTracker +} + +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + return c.discovery +} + +func (c *Clientset) Tracker() testing.ObjectTracker { + return c.tracker +} + +var _ clientset.Interface = &Clientset{} + +// SamplesV1alpha1 retrieves the SamplesV1alpha1Client +func (c *Clientset) SamplesV1alpha1() samplesv1alpha1.SamplesV1alpha1Interface { + return &fakesamplesv1alpha1.FakeSamplesV1alpha1{Fake: &c.Fake} +} diff --git a/pkg/client/clientset/versioned/fake/doc.go b/pkg/client/clientset/versioned/fake/doc.go new file mode 100644 index 000000000..2c4903250 --- /dev/null +++ b/pkg/client/clientset/versioned/fake/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated fake clientset. +package fake diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go new file mode 100644 index 000000000..944f308d6 --- /dev/null +++ b/pkg/client/clientset/versioned/fake/register.go @@ -0,0 +1,56 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + samplesv1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" +) + +var scheme = runtime.NewScheme() +var codecs = serializer.NewCodecFactory(scheme) +var parameterCodec = runtime.NewParameterCodec(scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + samplesv1alpha1.AddToScheme, +} + +// AddToScheme adds all types of this clientset into the given scheme. This allows composition +// of clientsets, like in: +// +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) +// +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// +// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types +// correctly. +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(scheme)) +} diff --git a/pkg/client/clientset/versioned/scheme/doc.go b/pkg/client/clientset/versioned/scheme/doc.go new file mode 100644 index 000000000..7acc2dcf2 --- /dev/null +++ b/pkg/client/clientset/versioned/scheme/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package contains the scheme of the automatically generated clientset. +package scheme diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go new file mode 100644 index 000000000..f19c245fb --- /dev/null +++ b/pkg/client/clientset/versioned/scheme/register.go @@ -0,0 +1,56 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package scheme + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + samplesv1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" +) + +var Scheme = runtime.NewScheme() +var Codecs = serializer.NewCodecFactory(Scheme) +var ParameterCodec = runtime.NewParameterCodec(Scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + samplesv1alpha1.AddToScheme, +} + +// AddToScheme adds all types of this clientset into the given scheme. This allows composition +// of clientsets, like in: +// +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kubernetes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) +// +// kclientset, _ := kubernetes.NewForConfig(c) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// +// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types +// correctly. +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(Scheme)) +} diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/addressableservice.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/addressableservice.go new file mode 100644 index 000000000..48506ccdc --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/addressableservice.go @@ -0,0 +1,191 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "time" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" + scheme "knative.dev/sample-controller/pkg/client/clientset/versioned/scheme" +) + +// AddressableServicesGetter has a method to return a AddressableServiceInterface. +// A group's client should implement this interface. +type AddressableServicesGetter interface { + AddressableServices(namespace string) AddressableServiceInterface +} + +// AddressableServiceInterface has methods to work with AddressableService resources. +type AddressableServiceInterface interface { + Create(*v1alpha1.AddressableService) (*v1alpha1.AddressableService, error) + Update(*v1alpha1.AddressableService) (*v1alpha1.AddressableService, error) + UpdateStatus(*v1alpha1.AddressableService) (*v1alpha1.AddressableService, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.AddressableService, error) + List(opts v1.ListOptions) (*v1alpha1.AddressableServiceList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AddressableService, err error) + AddressableServiceExpansion +} + +// addressableServices implements AddressableServiceInterface +type addressableServices struct { + client rest.Interface + ns string +} + +// newAddressableServices returns a AddressableServices +func newAddressableServices(c *SamplesV1alpha1Client, namespace string) *addressableServices { + return &addressableServices{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the addressableService, and returns the corresponding addressableService object, and an error if there is any. +func (c *addressableServices) Get(name string, options v1.GetOptions) (result *v1alpha1.AddressableService, err error) { + result = &v1alpha1.AddressableService{} + err = c.client.Get(). + Namespace(c.ns). + Resource("addressableservices"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of AddressableServices that match those selectors. +func (c *addressableServices) List(opts v1.ListOptions) (result *v1alpha1.AddressableServiceList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.AddressableServiceList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("addressableservices"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested addressableServices. +func (c *addressableServices) Watch(opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("addressableservices"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} + +// Create takes the representation of a addressableService and creates it. Returns the server's representation of the addressableService, and an error, if there is any. +func (c *addressableServices) Create(addressableService *v1alpha1.AddressableService) (result *v1alpha1.AddressableService, err error) { + result = &v1alpha1.AddressableService{} + err = c.client.Post(). + Namespace(c.ns). + Resource("addressableservices"). + Body(addressableService). + Do(). + Into(result) + return +} + +// Update takes the representation of a addressableService and updates it. Returns the server's representation of the addressableService, and an error, if there is any. +func (c *addressableServices) Update(addressableService *v1alpha1.AddressableService) (result *v1alpha1.AddressableService, err error) { + result = &v1alpha1.AddressableService{} + err = c.client.Put(). + Namespace(c.ns). + Resource("addressableservices"). + Name(addressableService.Name). + Body(addressableService). + Do(). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). + +func (c *addressableServices) UpdateStatus(addressableService *v1alpha1.AddressableService) (result *v1alpha1.AddressableService, err error) { + result = &v1alpha1.AddressableService{} + err = c.client.Put(). + Namespace(c.ns). + Resource("addressableservices"). + Name(addressableService.Name). + SubResource("status"). + Body(addressableService). + Do(). + Into(result) + return +} + +// Delete takes name of the addressableService and deletes it. Returns an error if one occurs. +func (c *addressableServices) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("addressableservices"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *addressableServices) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + var timeout time.Duration + if listOptions.TimeoutSeconds != nil { + timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("addressableservices"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Timeout(timeout). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched addressableService. +func (c *addressableServices) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AddressableService, err error) { + result = &v1alpha1.AddressableService{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("addressableservices"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/doc.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/doc.go new file mode 100644 index 000000000..41e872fe9 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1alpha1 diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/doc.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/doc.go new file mode 100644 index 000000000..c7f6e65ca --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// Package fake has the automatically generated clients. +package fake diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_addressableservice.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_addressableservice.go new file mode 100644 index 000000000..3540fba84 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_addressableservice.go @@ -0,0 +1,140 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" +) + +// FakeAddressableServices implements AddressableServiceInterface +type FakeAddressableServices struct { + Fake *FakeSamplesV1alpha1 + ns string +} + +var addressableservicesResource = schema.GroupVersionResource{Group: "samples.knative.dev", Version: "v1alpha1", Resource: "addressableservices"} + +var addressableservicesKind = schema.GroupVersionKind{Group: "samples.knative.dev", Version: "v1alpha1", Kind: "AddressableService"} + +// Get takes name of the addressableService, and returns the corresponding addressableService object, and an error if there is any. +func (c *FakeAddressableServices) Get(name string, options v1.GetOptions) (result *v1alpha1.AddressableService, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(addressableservicesResource, c.ns, name), &v1alpha1.AddressableService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.AddressableService), err +} + +// List takes label and field selectors, and returns the list of AddressableServices that match those selectors. +func (c *FakeAddressableServices) List(opts v1.ListOptions) (result *v1alpha1.AddressableServiceList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(addressableservicesResource, addressableservicesKind, c.ns, opts), &v1alpha1.AddressableServiceList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.AddressableServiceList{ListMeta: obj.(*v1alpha1.AddressableServiceList).ListMeta} + for _, item := range obj.(*v1alpha1.AddressableServiceList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested addressableServices. +func (c *FakeAddressableServices) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(addressableservicesResource, c.ns, opts)) + +} + +// Create takes the representation of a addressableService and creates it. Returns the server's representation of the addressableService, and an error, if there is any. +func (c *FakeAddressableServices) Create(addressableService *v1alpha1.AddressableService) (result *v1alpha1.AddressableService, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(addressableservicesResource, c.ns, addressableService), &v1alpha1.AddressableService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.AddressableService), err +} + +// Update takes the representation of a addressableService and updates it. Returns the server's representation of the addressableService, and an error, if there is any. +func (c *FakeAddressableServices) Update(addressableService *v1alpha1.AddressableService) (result *v1alpha1.AddressableService, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(addressableservicesResource, c.ns, addressableService), &v1alpha1.AddressableService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.AddressableService), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeAddressableServices) UpdateStatus(addressableService *v1alpha1.AddressableService) (*v1alpha1.AddressableService, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(addressableservicesResource, "status", c.ns, addressableService), &v1alpha1.AddressableService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.AddressableService), err +} + +// Delete takes name of the addressableService and deletes it. Returns an error if one occurs. +func (c *FakeAddressableServices) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(addressableservicesResource, c.ns, name), &v1alpha1.AddressableService{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeAddressableServices) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(addressableservicesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1alpha1.AddressableServiceList{}) + return err +} + +// Patch applies the patch and returns the patched addressableService. +func (c *FakeAddressableServices) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AddressableService, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(addressableservicesResource, c.ns, name, pt, data, subresources...), &v1alpha1.AddressableService{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.AddressableService), err +} diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_samples_client.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_samples_client.go new file mode 100644 index 000000000..bc5d1d16e --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/fake/fake_samples_client.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" + v1alpha1 "knative.dev/sample-controller/pkg/client/clientset/versioned/typed/samples/v1alpha1" +) + +type FakeSamplesV1alpha1 struct { + *testing.Fake +} + +func (c *FakeSamplesV1alpha1) AddressableServices(namespace string) v1alpha1.AddressableServiceInterface { + return &FakeAddressableServices{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeSamplesV1alpha1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/generated_expansion.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/generated_expansion.go new file mode 100644 index 000000000..2d16b067a --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +type AddressableServiceExpansion interface{} diff --git a/pkg/client/clientset/versioned/typed/samples/v1alpha1/samples_client.go b/pkg/client/clientset/versioned/typed/samples/v1alpha1/samples_client.go new file mode 100644 index 000000000..4bd04097a --- /dev/null +++ b/pkg/client/clientset/versioned/typed/samples/v1alpha1/samples_client.go @@ -0,0 +1,89 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + rest "k8s.io/client-go/rest" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" + "knative.dev/sample-controller/pkg/client/clientset/versioned/scheme" +) + +type SamplesV1alpha1Interface interface { + RESTClient() rest.Interface + AddressableServicesGetter +} + +// SamplesV1alpha1Client is used to interact with features provided by the samples.knative.dev group. +type SamplesV1alpha1Client struct { + restClient rest.Interface +} + +func (c *SamplesV1alpha1Client) AddressableServices(namespace string) AddressableServiceInterface { + return newAddressableServices(c, namespace) +} + +// NewForConfig creates a new SamplesV1alpha1Client for the given config. +func NewForConfig(c *rest.Config) (*SamplesV1alpha1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &SamplesV1alpha1Client{client}, nil +} + +// NewForConfigOrDie creates a new SamplesV1alpha1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *SamplesV1alpha1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new SamplesV1alpha1Client for the given RESTClient. +func New(c rest.Interface) *SamplesV1alpha1Client { + return &SamplesV1alpha1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1alpha1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *SamplesV1alpha1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/pkg/client/informers/externalversions/factory.go b/pkg/client/informers/externalversions/factory.go new file mode 100644 index 000000000..64dc3ebdb --- /dev/null +++ b/pkg/client/informers/externalversions/factory.go @@ -0,0 +1,180 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package externalversions + +import ( + reflect "reflect" + sync "sync" + time "time" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" + versioned "knative.dev/sample-controller/pkg/client/clientset/versioned" + internalinterfaces "knative.dev/sample-controller/pkg/client/informers/externalversions/internalinterfaces" + samples "knative.dev/sample-controller/pkg/client/informers/externalversions/samples" +) + +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + +type sharedInformerFactory struct { + client versioned.Interface + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc + lock sync.Mutex + defaultResync time.Duration + customResync map[reflect.Type]time.Duration + + informers map[reflect.Type]cache.SharedIndexInformer + // startedInformers is used for tracking which informers have been started. + // This allows Start() to be called multiple times safely. + startedInformers map[reflect.Type]bool +} + +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. +func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { + return NewSharedInformerFactoryWithOptions(client, defaultResync) +} + +// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. +// Listers obtained via this SharedInformerFactory will be subject to the same filters +// as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead +func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ + client: client, + namespace: v1.NamespaceAll, + defaultResync: defaultResync, + informers: make(map[reflect.Type]cache.SharedIndexInformer), + startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), + } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory +} + +// Start initializes all requested informers. +func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { + f.lock.Lock() + defer f.lock.Unlock() + + for informerType, informer := range f.informers { + if !f.startedInformers[informerType] { + go informer.Run(stopCh) + f.startedInformers[informerType] = true + } + } +} + +// WaitForCacheSync waits for all started informers' cache were synced. +func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool { + informers := func() map[reflect.Type]cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informers := map[reflect.Type]cache.SharedIndexInformer{} + for informerType, informer := range f.informers { + if f.startedInformers[informerType] { + informers[informerType] = informer + } + } + return informers + }() + + res := map[reflect.Type]bool{} + for informType, informer := range informers { + res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced) + } + return res +} + +// InternalInformerFor returns the SharedIndexInformer for obj using an internal +// client. +func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informerType := reflect.TypeOf(obj) + informer, exists := f.informers[informerType] + if exists { + return informer + } + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) + f.informers[informerType] = informer + + return informer +} + +// SharedInformerFactory provides shared informers for resources in all known +// API group versions. +type SharedInformerFactory interface { + internalinterfaces.SharedInformerFactory + ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + + Samples() samples.Interface +} + +func (f *sharedInformerFactory) Samples() samples.Interface { + return samples.New(f, f.namespace, f.tweakListOptions) +} diff --git a/pkg/client/informers/externalversions/generic.go b/pkg/client/informers/externalversions/generic.go new file mode 100644 index 000000000..57eae1961 --- /dev/null +++ b/pkg/client/informers/externalversions/generic.go @@ -0,0 +1,62 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package externalversions + +import ( + "fmt" + + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" +) + +// GenericInformer is type of SharedIndexInformer which will locate and delegate to other +// sharedInformers based on type +type GenericInformer interface { + Informer() cache.SharedIndexInformer + Lister() cache.GenericLister +} + +type genericInformer struct { + informer cache.SharedIndexInformer + resource schema.GroupResource +} + +// Informer returns the SharedIndexInformer. +func (f *genericInformer) Informer() cache.SharedIndexInformer { + return f.informer +} + +// Lister returns the GenericLister. +func (f *genericInformer) Lister() cache.GenericLister { + return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource) +} + +// ForResource gives generic access to a shared informer of the matching type +// TODO extend this to unknown resources with a client pool +func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { + switch resource { + // Group=samples.knative.dev, Version=v1alpha1 + case v1alpha1.SchemeGroupVersion.WithResource("addressableservices"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Samples().V1alpha1().AddressableServices().Informer()}, nil + + } + + return nil, fmt.Errorf("no informer found for %v", resource) +} diff --git a/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go new file mode 100644 index 000000000..c9d4e3659 --- /dev/null +++ b/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package internalinterfaces + +import ( + time "time" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + cache "k8s.io/client-go/tools/cache" + versioned "knative.dev/sample-controller/pkg/client/clientset/versioned" +) + +// NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer. +type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer + +// SharedInformerFactory a small interface to allow for adding an informer without an import cycle +type SharedInformerFactory interface { + Start(stopCh <-chan struct{}) + InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer +} + +// TweakListOptionsFunc is a function that transforms a v1.ListOptions. +type TweakListOptionsFunc func(*v1.ListOptions) diff --git a/pkg/client/informers/externalversions/samples/interface.go b/pkg/client/informers/externalversions/samples/interface.go new file mode 100644 index 000000000..c107db684 --- /dev/null +++ b/pkg/client/informers/externalversions/samples/interface.go @@ -0,0 +1,46 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package samples + +import ( + internalinterfaces "knative.dev/sample-controller/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "knative.dev/sample-controller/pkg/client/informers/externalversions/samples/v1alpha1" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1alpha1 provides access to shared informers for resources in V1alpha1. + V1alpha1() v1alpha1.Interface +} + +type group struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// V1alpha1 returns a new v1alpha1.Interface. +func (g *group) V1alpha1() v1alpha1.Interface { + return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/pkg/client/informers/externalversions/samples/v1alpha1/addressableservice.go b/pkg/client/informers/externalversions/samples/v1alpha1/addressableservice.go new file mode 100644 index 000000000..e4d2d701c --- /dev/null +++ b/pkg/client/informers/externalversions/samples/v1alpha1/addressableservice.go @@ -0,0 +1,89 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + time "time" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" + samplesv1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" + versioned "knative.dev/sample-controller/pkg/client/clientset/versioned" + internalinterfaces "knative.dev/sample-controller/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "knative.dev/sample-controller/pkg/client/listers/samples/v1alpha1" +) + +// AddressableServiceInformer provides access to a shared informer and lister for +// AddressableServices. +type AddressableServiceInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.AddressableServiceLister +} + +type addressableServiceInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewAddressableServiceInformer constructs a new informer for AddressableService type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewAddressableServiceInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredAddressableServiceInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredAddressableServiceInformer constructs a new informer for AddressableService type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredAddressableServiceInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.SamplesV1alpha1().AddressableServices(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.SamplesV1alpha1().AddressableServices(namespace).Watch(options) + }, + }, + &samplesv1alpha1.AddressableService{}, + resyncPeriod, + indexers, + ) +} + +func (f *addressableServiceInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredAddressableServiceInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *addressableServiceInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&samplesv1alpha1.AddressableService{}, f.defaultInformer) +} + +func (f *addressableServiceInformer) Lister() v1alpha1.AddressableServiceLister { + return v1alpha1.NewAddressableServiceLister(f.Informer().GetIndexer()) +} diff --git a/pkg/client/informers/externalversions/samples/v1alpha1/interface.go b/pkg/client/informers/externalversions/samples/v1alpha1/interface.go new file mode 100644 index 000000000..8abc509a5 --- /dev/null +++ b/pkg/client/informers/externalversions/samples/v1alpha1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + internalinterfaces "knative.dev/sample-controller/pkg/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // AddressableServices returns a AddressableServiceInformer. + AddressableServices() AddressableServiceInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// AddressableServices returns a AddressableServiceInformer. +func (v *version) AddressableServices() AddressableServiceInformer { + return &addressableServiceInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/pkg/client/injection/client/client.go b/pkg/client/injection/client/client.go new file mode 100644 index 000000000..c4b7f49d7 --- /dev/null +++ b/pkg/client/injection/client/client.go @@ -0,0 +1,49 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package client + +import ( + context "context" + + rest "k8s.io/client-go/rest" + injection "knative.dev/pkg/injection" + logging "knative.dev/pkg/logging" + versioned "knative.dev/sample-controller/pkg/client/clientset/versioned" +) + +func init() { + injection.Default.RegisterClient(withClient) +} + +// Key is used as the key for associating information with a context.Context. +type Key struct{} + +func withClient(ctx context.Context, cfg *rest.Config) context.Context { + return context.WithValue(ctx, Key{}, versioned.NewForConfigOrDie(cfg)) +} + +// Get extracts the versioned.Interface client from the context. +func Get(ctx context.Context) versioned.Interface { + untyped := ctx.Value(Key{}) + if untyped == nil { + logging.FromContext(ctx).Panic( + "Unable to fetch knative.dev/sample-controller/pkg/client/clientset/versioned.Interface from context.") + } + return untyped.(versioned.Interface) +} diff --git a/pkg/client/injection/client/fake/fake.go b/pkg/client/injection/client/fake/fake.go new file mode 100644 index 000000000..0bf6eaba0 --- /dev/null +++ b/pkg/client/injection/client/fake/fake.go @@ -0,0 +1,54 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package fake + +import ( + context "context" + + runtime "k8s.io/apimachinery/pkg/runtime" + rest "k8s.io/client-go/rest" + injection "knative.dev/pkg/injection" + logging "knative.dev/pkg/logging" + fake "knative.dev/sample-controller/pkg/client/clientset/versioned/fake" + client "knative.dev/sample-controller/pkg/client/injection/client" +) + +func init() { + injection.Fake.RegisterClient(withClient) +} + +func withClient(ctx context.Context, cfg *rest.Config) context.Context { + ctx, _ = With(ctx) + return ctx +} + +func With(ctx context.Context, objects ...runtime.Object) (context.Context, *fake.Clientset) { + cs := fake.NewSimpleClientset(objects...) + return context.WithValue(ctx, client.Key{}, cs), cs +} + +// Get extracts the Kubernetes client from the context. +func Get(ctx context.Context) *fake.Clientset { + untyped := ctx.Value(client.Key{}) + if untyped == nil { + logging.FromContext(ctx).Panic( + "Unable to fetch knative.dev/sample-controller/pkg/client/clientset/versioned/fake.Clientset from context.") + } + return untyped.(*fake.Clientset) +} diff --git a/pkg/client/injection/informers/factory/factory.go b/pkg/client/injection/informers/factory/factory.go new file mode 100644 index 000000000..2b2b33e6e --- /dev/null +++ b/pkg/client/injection/informers/factory/factory.go @@ -0,0 +1,56 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package factory + +import ( + context "context" + + controller "knative.dev/pkg/controller" + injection "knative.dev/pkg/injection" + logging "knative.dev/pkg/logging" + externalversions "knative.dev/sample-controller/pkg/client/informers/externalversions" + client "knative.dev/sample-controller/pkg/client/injection/client" +) + +func init() { + injection.Default.RegisterInformerFactory(withInformerFactory) +} + +// Key is used as the key for associating information with a context.Context. +type Key struct{} + +func withInformerFactory(ctx context.Context) context.Context { + c := client.Get(ctx) + opts := make([]externalversions.SharedInformerOption, 0, 1) + if injection.HasNamespaceScope(ctx) { + opts = append(opts, externalversions.WithNamespace(injection.GetNamespaceScope(ctx))) + } + return context.WithValue(ctx, Key{}, + externalversions.NewSharedInformerFactoryWithOptions(c, controller.GetResyncPeriod(ctx), opts...)) +} + +// Get extracts the InformerFactory from the context. +func Get(ctx context.Context) externalversions.SharedInformerFactory { + untyped := ctx.Value(Key{}) + if untyped == nil { + logging.FromContext(ctx).Panic( + "Unable to fetch knative.dev/sample-controller/pkg/client/informers/externalversions.SharedInformerFactory from context.") + } + return untyped.(externalversions.SharedInformerFactory) +} diff --git a/pkg/client/injection/informers/factory/fake/fake.go b/pkg/client/injection/informers/factory/fake/fake.go new file mode 100644 index 000000000..ea5af9b85 --- /dev/null +++ b/pkg/client/injection/informers/factory/fake/fake.go @@ -0,0 +1,45 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package fake + +import ( + context "context" + + controller "knative.dev/pkg/controller" + injection "knative.dev/pkg/injection" + externalversions "knative.dev/sample-controller/pkg/client/informers/externalversions" + fake "knative.dev/sample-controller/pkg/client/injection/client/fake" + factory "knative.dev/sample-controller/pkg/client/injection/informers/factory" +) + +var Get = factory.Get + +func init() { + injection.Fake.RegisterInformerFactory(withInformerFactory) +} + +func withInformerFactory(ctx context.Context) context.Context { + c := fake.Get(ctx) + opts := make([]externalversions.SharedInformerOption, 0, 1) + if injection.HasNamespaceScope(ctx) { + opts = append(opts, externalversions.WithNamespace(injection.GetNamespaceScope(ctx))) + } + return context.WithValue(ctx, factory.Key{}, + externalversions.NewSharedInformerFactoryWithOptions(c, controller.GetResyncPeriod(ctx), opts...)) +} diff --git a/pkg/client/injection/informers/samples/v1alpha1/addressableservice/addressableservice.go b/pkg/client/injection/informers/samples/v1alpha1/addressableservice/addressableservice.go new file mode 100644 index 000000000..70381bc0c --- /dev/null +++ b/pkg/client/injection/informers/samples/v1alpha1/addressableservice/addressableservice.go @@ -0,0 +1,52 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package addressableservice + +import ( + context "context" + + controller "knative.dev/pkg/controller" + injection "knative.dev/pkg/injection" + logging "knative.dev/pkg/logging" + v1alpha1 "knative.dev/sample-controller/pkg/client/informers/externalversions/samples/v1alpha1" + factory "knative.dev/sample-controller/pkg/client/injection/informers/factory" +) + +func init() { + injection.Default.RegisterInformer(withInformer) +} + +// Key is used for associating the Informer inside the context.Context. +type Key struct{} + +func withInformer(ctx context.Context) (context.Context, controller.Informer) { + f := factory.Get(ctx) + inf := f.Samples().V1alpha1().AddressableServices() + return context.WithValue(ctx, Key{}, inf), inf.Informer() +} + +// Get extracts the typed informer from the context. +func Get(ctx context.Context) v1alpha1.AddressableServiceInformer { + untyped := ctx.Value(Key{}) + if untyped == nil { + logging.FromContext(ctx).Panic( + "Unable to fetch knative.dev/sample-controller/pkg/client/informers/externalversions/samples/v1alpha1.AddressableServiceInformer from context.") + } + return untyped.(v1alpha1.AddressableServiceInformer) +} diff --git a/pkg/client/injection/informers/samples/v1alpha1/addressableservice/fake/fake.go b/pkg/client/injection/informers/samples/v1alpha1/addressableservice/fake/fake.go new file mode 100644 index 000000000..125f5a1b6 --- /dev/null +++ b/pkg/client/injection/informers/samples/v1alpha1/addressableservice/fake/fake.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package fake + +import ( + context "context" + + controller "knative.dev/pkg/controller" + injection "knative.dev/pkg/injection" + fake "knative.dev/sample-controller/pkg/client/injection/informers/factory/fake" + addressableservice "knative.dev/sample-controller/pkg/client/injection/informers/samples/v1alpha1/addressableservice" +) + +var Get = addressableservice.Get + +func init() { + injection.Fake.RegisterInformer(withInformer) +} + +func withInformer(ctx context.Context) (context.Context, controller.Informer) { + f := fake.Get(ctx) + inf := f.Samples().V1alpha1().AddressableServices() + return context.WithValue(ctx, addressableservice.Key{}, inf), inf.Informer() +} diff --git a/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/controller.go b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/controller.go new file mode 100644 index 000000000..d2bf29f59 --- /dev/null +++ b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/controller.go @@ -0,0 +1,97 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package addressableservice + +import ( + context "context" + + corev1 "k8s.io/api/core/v1" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + v1 "k8s.io/client-go/kubernetes/typed/core/v1" + record "k8s.io/client-go/tools/record" + client "knative.dev/pkg/client/injection/kube/client" + controller "knative.dev/pkg/controller" + logging "knative.dev/pkg/logging" + versionedscheme "knative.dev/sample-controller/pkg/client/clientset/versioned/scheme" + injectionclient "knative.dev/sample-controller/pkg/client/injection/client" + addressableservice "knative.dev/sample-controller/pkg/client/injection/informers/samples/v1alpha1/addressableservice" +) + +const ( + defaultControllerAgentName = "addressableservice-controller" + defaultFinalizerName = "addressableservices.samples.knative.dev" + defaultQueueName = "addressableservices" +) + +// NewImpl returns a controller.Impl that handles queuing and feeding work from +// the queue through an implementation of controller.Reconciler, delegating to +// the provided Interface and optional Finalizer methods. OptionsFn is used to return +// controller.Options to be used but the internal reconciler. +func NewImpl(ctx context.Context, r Interface, optionsFns ...controller.OptionsFn) *controller.Impl { + logger := logging.FromContext(ctx) + + // Check the options function input. It should be 0 or 1. + if len(optionsFns) > 1 { + logger.Fatalf("up to one options function is supported, found %d", len(optionsFns)) + } + + addressableserviceInformer := addressableservice.Get(ctx) + + recorder := controller.GetEventRecorder(ctx) + if recorder == nil { + // Create event broadcaster + logger.Debug("Creating event broadcaster") + eventBroadcaster := record.NewBroadcaster() + watches := []watch.Interface{ + eventBroadcaster.StartLogging(logger.Named("event-broadcaster").Infof), + eventBroadcaster.StartRecordingToSink( + &v1.EventSinkImpl{Interface: client.Get(ctx).CoreV1().Events("")}), + } + recorder = eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: defaultControllerAgentName}) + go func() { + <-ctx.Done() + for _, w := range watches { + w.Stop() + } + }() + } + + rec := &reconcilerImpl{ + Client: injectionclient.Get(ctx), + Lister: addressableserviceInformer.Lister(), + Recorder: recorder, + reconciler: r, + } + impl := controller.NewImpl(rec, logger, defaultQueueName) + + // Pass impl to the options. Save any optional results. + for _, fn := range optionsFns { + opts := fn(impl) + if opts.ConfigStore != nil { + rec.configStore = opts.ConfigStore + } + } + + return impl +} + +func init() { + versionedscheme.AddToScheme(scheme.Scheme) +} diff --git a/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/reconciler.go b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/reconciler.go new file mode 100644 index 000000000..c471ad828 --- /dev/null +++ b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/reconciler.go @@ -0,0 +1,339 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package addressableservice + +import ( + context "context" + "encoding/json" + "reflect" + + zap "go.uber.org/zap" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/equality" + errors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + sets "k8s.io/apimachinery/pkg/util/sets" + cache "k8s.io/client-go/tools/cache" + record "k8s.io/client-go/tools/record" + controller "knative.dev/pkg/controller" + logging "knative.dev/pkg/logging" + reconciler "knative.dev/pkg/reconciler" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" + versioned "knative.dev/sample-controller/pkg/client/clientset/versioned" + samplesv1alpha1 "knative.dev/sample-controller/pkg/client/listers/samples/v1alpha1" +) + +// Interface defines the strongly typed interfaces to be implemented by a +// controller reconciling v1alpha1.AddressableService. +type Interface interface { + // ReconcileKind implements custom logic to reconcile v1alpha1.AddressableService. Any changes + // to the objects .Status or .Finalizers will be propagated to the stored + // object. It is recommended that implementors do not call any update calls + // for the Kind inside of ReconcileKind, it is the responsibility of the calling + // controller to propagate those properties. The resource passed to ReconcileKind + // will always have an empty deletion timestamp. + ReconcileKind(ctx context.Context, o *v1alpha1.AddressableService) reconciler.Event +} + +// Finalizer defines the strongly typed interfaces to be implemented by a +// controller finalizing v1alpha1.AddressableService. +type Finalizer interface { + // FinalizeKind implements custom logic to finalize v1alpha1.AddressableService. Any changes + // to the objects .Status or .Finalizers will be ignored. Returning a nil or + // Normal type reconciler.Event will allow the finalizer to be deleted on + // the resource. The resource passed to FinalizeKind will always have a set + // deletion timestamp. + FinalizeKind(ctx context.Context, o *v1alpha1.AddressableService) reconciler.Event +} + +// reconcilerImpl implements controller.Reconciler for v1alpha1.AddressableService resources. +type reconcilerImpl struct { + // Client is used to write back status updates. + Client versioned.Interface + + // Listers index properties about resources + Lister samplesv1alpha1.AddressableServiceLister + + // Recorder is an event recorder for recording Event resources to the + // Kubernetes API. + Recorder record.EventRecorder + + // configStore allows for decorating a context with config maps. + // +optional + configStore reconciler.ConfigStore + + // reconciler is the implementation of the business logic of the resource. + reconciler Interface +} + +// Check that our Reconciler implements controller.Reconciler +var _ controller.Reconciler = (*reconcilerImpl)(nil) + +func NewReconciler(ctx context.Context, logger *zap.SugaredLogger, client versioned.Interface, lister samplesv1alpha1.AddressableServiceLister, recorder record.EventRecorder, r Interface, options ...controller.Options) controller.Reconciler { + // Check the options function input. It should be 0 or 1. + if len(options) > 1 { + logger.Fatalf("up to one options struct is supported, found %d", len(options)) + } + + rec := &reconcilerImpl{ + Client: client, + Lister: lister, + Recorder: recorder, + reconciler: r, + } + + for _, opts := range options { + if opts.ConfigStore != nil { + rec.configStore = opts.ConfigStore + } + } + + return rec +} + +// Reconcile implements controller.Reconciler +func (r *reconcilerImpl) Reconcile(ctx context.Context, key string) error { + logger := logging.FromContext(ctx) + + // If configStore is set, attach the frozen configuration to the context. + if r.configStore != nil { + ctx = r.configStore.ToContext(ctx) + } + + // Add the recorder to context. + ctx = controller.WithEventRecorder(ctx, r.Recorder) + + // Convert the namespace/name string into a distinct namespace and name + + namespace, name, err := cache.SplitMetaNamespaceKey(key) + + if err != nil { + logger.Errorf("invalid resource key: %s", key) + return nil + } + + // Get the resource with this namespace/name. + + getter := r.Lister.AddressableServices(namespace) + + original, err := getter.Get(name) + + if errors.IsNotFound(err) { + // The resource may no longer exist, in which case we stop processing. + logger.Errorf("resource %q no longer exists", key) + return nil + } else if err != nil { + return err + } + + // Don't modify the informers copy. + resource := original.DeepCopy() + + var reconcileEvent reconciler.Event + if resource.GetDeletionTimestamp().IsZero() { + // Append the target method to the logger. + logger = logger.With(zap.String("targetMethod", "ReconcileKind")) + + // Set and update the finalizer on resource if r.reconciler + // implements Finalizer. + if resource, err = r.setFinalizerIfFinalizer(ctx, resource); err != nil { + logger.Warnw("Failed to set finalizers", zap.Error(err)) + } + + // Reconcile this copy of the resource and then write back any status + // updates regardless of whether the reconciliation errored out. + reconcileEvent = r.reconciler.ReconcileKind(ctx, resource) + } else if fin, ok := r.reconciler.(Finalizer); ok { + // Append the target method to the logger. + logger = logger.With(zap.String("targetMethod", "FinalizeKind")) + + // For finalizing reconcilers, if this resource being marked for deletion + // and reconciled cleanly (nil or normal event), remove the finalizer. + reconcileEvent = fin.FinalizeKind(ctx, resource) + if resource, err = r.clearFinalizer(ctx, resource, reconcileEvent); err != nil { + logger.Warnw("Failed to clear finalizers", zap.Error(err)) + } + } + + // Synchronize the status. + if equality.Semantic.DeepEqual(original.Status, resource.Status) { + // If we didn't change anything then don't call updateStatus. + // This is important because the copy we loaded from the injectionInformer's + // cache may be stale and we don't want to overwrite a prior update + // to status with this stale state. + } else if err = r.updateStatus(original, resource); err != nil { + logger.Warnw("Failed to update resource status", zap.Error(err)) + r.Recorder.Eventf(resource, v1.EventTypeWarning, "UpdateFailed", + "Failed to update status for %q: %v", resource.Name, err) + return err + } + + // Report the reconciler event, if any. + if reconcileEvent != nil { + var event *reconciler.ReconcilerEvent + if reconciler.EventAs(reconcileEvent, &event) { + logger.Infow("returned an event", zap.Any("event", reconcileEvent)) + r.Recorder.Eventf(resource, event.EventType, event.Reason, event.Format, event.Args...) + return nil + } else { + logger.Errorw("returned an error", zap.Error(reconcileEvent)) + r.Recorder.Event(resource, v1.EventTypeWarning, "InternalError", reconcileEvent.Error()) + return reconcileEvent + } + } + return nil +} + +func (r *reconcilerImpl) updateStatus(existing *v1alpha1.AddressableService, desired *v1alpha1.AddressableService) error { + existing = existing.DeepCopy() + return reconciler.RetryUpdateConflicts(func(attempts int) (err error) { + // The first iteration tries to use the injectionInformer's state, subsequent attempts fetch the latest state via API. + if attempts > 0 { + + getter := r.Client.SamplesV1alpha1().AddressableServices(desired.Namespace) + + existing, err = getter.Get(desired.Name, metav1.GetOptions{}) + if err != nil { + return err + } + } + + // If there's nothing to update, just return. + if reflect.DeepEqual(existing.Status, desired.Status) { + return nil + } + + existing.Status = desired.Status + + updater := r.Client.SamplesV1alpha1().AddressableServices(existing.Namespace) + + _, err = updater.UpdateStatus(existing) + return err + }) +} + +// updateFinalizersFiltered will update the Finalizers of the resource. +// TODO: this method could be generic and sync all finalizers. For now it only +// updates defaultFinalizerName. +func (r *reconcilerImpl) updateFinalizersFiltered(ctx context.Context, resource *v1alpha1.AddressableService) (*v1alpha1.AddressableService, error) { + finalizerName := defaultFinalizerName + + getter := r.Lister.AddressableServices(resource.Namespace) + + actual, err := getter.Get(resource.Name) + if err != nil { + return resource, err + } + + // Don't modify the informers copy. + existing := actual.DeepCopy() + + var finalizers []string + + // If there's nothing to update, just return. + existingFinalizers := sets.NewString(existing.Finalizers...) + desiredFinalizers := sets.NewString(resource.Finalizers...) + + if desiredFinalizers.Has(finalizerName) { + if existingFinalizers.Has(finalizerName) { + // Nothing to do. + return resource, nil + } + // Add the finalizer. + finalizers = append(existing.Finalizers, finalizerName) + } else { + if !existingFinalizers.Has(finalizerName) { + // Nothing to do. + return resource, nil + } + // Remove the finalizer. + existingFinalizers.Delete(finalizerName) + finalizers = existingFinalizers.List() + } + + mergePatch := map[string]interface{}{ + "metadata": map[string]interface{}{ + "finalizers": finalizers, + "resourceVersion": existing.ResourceVersion, + }, + } + + patch, err := json.Marshal(mergePatch) + if err != nil { + return resource, err + } + + patcher := r.Client.SamplesV1alpha1().AddressableServices(resource.Namespace) + + resource, err = patcher.Patch(resource.Name, types.MergePatchType, patch) + if err != nil { + r.Recorder.Eventf(resource, v1.EventTypeWarning, "FinalizerUpdateFailed", + "Failed to update finalizers for %q: %v", resource.Name, err) + } else { + r.Recorder.Eventf(resource, v1.EventTypeNormal, "FinalizerUpdate", + "Updated %q finalizers", resource.GetName()) + } + return resource, err +} + +func (r *reconcilerImpl) setFinalizerIfFinalizer(ctx context.Context, resource *v1alpha1.AddressableService) (*v1alpha1.AddressableService, error) { + if _, ok := r.reconciler.(Finalizer); !ok { + return resource, nil + } + + finalizers := sets.NewString(resource.Finalizers...) + + // If this resource is not being deleted, mark the finalizer. + if resource.GetDeletionTimestamp().IsZero() { + finalizers.Insert(defaultFinalizerName) + } + + resource.Finalizers = finalizers.List() + + // Synchronize the finalizers filtered by defaultFinalizerName. + return r.updateFinalizersFiltered(ctx, resource) +} + +func (r *reconcilerImpl) clearFinalizer(ctx context.Context, resource *v1alpha1.AddressableService, reconcileEvent reconciler.Event) (*v1alpha1.AddressableService, error) { + if _, ok := r.reconciler.(Finalizer); !ok { + return resource, nil + } + if resource.GetDeletionTimestamp().IsZero() { + return resource, nil + } + + finalizers := sets.NewString(resource.Finalizers...) + + if reconcileEvent != nil { + var event *reconciler.ReconcilerEvent + if reconciler.EventAs(reconcileEvent, &event) { + if event.EventType == v1.EventTypeNormal { + finalizers.Delete(defaultFinalizerName) + } + } + } else { + finalizers.Delete(defaultFinalizerName) + } + + resource.Finalizers = finalizers.List() + + // Synchronize the finalizers filtered by defaultFinalizerName. + return r.updateFinalizersFiltered(ctx, resource) +} diff --git a/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/controller.go b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/controller.go new file mode 100644 index 000000000..c49a567cf --- /dev/null +++ b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/controller.go @@ -0,0 +1,54 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package addressableservice + +import ( + context "context" + + configmap "knative.dev/pkg/configmap" + controller "knative.dev/pkg/controller" + logging "knative.dev/pkg/logging" + addressableservice "knative.dev/sample-controller/pkg/client/injection/informers/samples/v1alpha1/addressableservice" + v1alpha1addressableservice "knative.dev/sample-controller/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice" +) + +// TODO: PLEASE COPY AND MODIFY THIS FILE AS A STARTING POINT + +// NewController creates a Reconciler for AddressableService and returns the result of NewImpl. +func NewController( + ctx context.Context, + cmw configmap.Watcher, +) *controller.Impl { + logger := logging.FromContext(ctx) + + addressableserviceInformer := addressableservice.Get(ctx) + + // TODO: setup additional informers here. + + r := &Reconciler{} + impl := v1alpha1addressableservice.NewImpl(ctx, r) + + logger.Info("Setting up event handlers.") + + addressableserviceInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) + + // TODO: add additional informer event handlers here. + + return impl +} diff --git a/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/reconciler.go b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/reconciler.go new file mode 100644 index 000000000..ac8be1aa0 --- /dev/null +++ b/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice/stub/reconciler.go @@ -0,0 +1,66 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by injection-gen. DO NOT EDIT. + +package addressableservice + +import ( + context "context" + + v1 "k8s.io/api/core/v1" + reconciler "knative.dev/pkg/reconciler" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" + addressableservice "knative.dev/sample-controller/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice" +) + +// TODO: PLEASE COPY AND MODIFY THIS FILE AS A STARTING POINT + +// newReconciledNormal makes a new reconciler event with event type Normal, and +// reason AddressableServiceReconciled. +func newReconciledNormal(namespace, name string) reconciler.Event { + return reconciler.NewEvent(v1.EventTypeNormal, "AddressableServiceReconciled", "AddressableService reconciled: \"%s/%s\"", namespace, name) +} + +// Reconciler implements controller.Reconciler for AddressableService resources. +type Reconciler struct { + // TODO: add additional requirements here. +} + +// Check that our Reconciler implements Interface +var _ addressableservice.Interface = (*Reconciler)(nil) + +// Optionally check that our Reconciler implements Finalizer +//var _ addressableservice.Finalizer = (*Reconciler)(nil) + +// ReconcileKind implements Interface.ReconcileKind. +func (r *Reconciler) ReconcileKind(ctx context.Context, o *v1alpha1.AddressableService) reconciler.Event { + // TODO: use this if the resource implements InitializeConditions. + // o.Status.InitializeConditions() + + // TODO: add custom reconciliation logic here. + + // TODO: use this if the object has .status.ObservedGeneration. + // o.Status.ObservedGeneration = o.Generation + return newReconciledNormal(o.Namespace, o.Name) +} + +// Optionally, use FinalizeKind to add finalizers. FinalizeKind will be called +// when the resource is deleted. +//func (r *Reconciler) FinalizeKind(ctx context.Context, o *v1alpha1.AddressableService) reconciler.Event { +// // TODO: add custom finalization logic here. +// return nil +//} diff --git a/pkg/client/listers/samples/v1alpha1/addressableservice.go b/pkg/client/listers/samples/v1alpha1/addressableservice.go new file mode 100644 index 000000000..6bb43f440 --- /dev/null +++ b/pkg/client/listers/samples/v1alpha1/addressableservice.go @@ -0,0 +1,94 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" + v1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" +) + +// AddressableServiceLister helps list AddressableServices. +type AddressableServiceLister interface { + // List lists all AddressableServices in the indexer. + List(selector labels.Selector) (ret []*v1alpha1.AddressableService, err error) + // AddressableServices returns an object that can list and get AddressableServices. + AddressableServices(namespace string) AddressableServiceNamespaceLister + AddressableServiceListerExpansion +} + +// addressableServiceLister implements the AddressableServiceLister interface. +type addressableServiceLister struct { + indexer cache.Indexer +} + +// NewAddressableServiceLister returns a new AddressableServiceLister. +func NewAddressableServiceLister(indexer cache.Indexer) AddressableServiceLister { + return &addressableServiceLister{indexer: indexer} +} + +// List lists all AddressableServices in the indexer. +func (s *addressableServiceLister) List(selector labels.Selector) (ret []*v1alpha1.AddressableService, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.AddressableService)) + }) + return ret, err +} + +// AddressableServices returns an object that can list and get AddressableServices. +func (s *addressableServiceLister) AddressableServices(namespace string) AddressableServiceNamespaceLister { + return addressableServiceNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// AddressableServiceNamespaceLister helps list and get AddressableServices. +type AddressableServiceNamespaceLister interface { + // List lists all AddressableServices in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1alpha1.AddressableService, err error) + // Get retrieves the AddressableService from the indexer for a given namespace and name. + Get(name string) (*v1alpha1.AddressableService, error) + AddressableServiceNamespaceListerExpansion +} + +// addressableServiceNamespaceLister implements the AddressableServiceNamespaceLister +// interface. +type addressableServiceNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all AddressableServices in the indexer for a given namespace. +func (s addressableServiceNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.AddressableService, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.AddressableService)) + }) + return ret, err +} + +// Get retrieves the AddressableService from the indexer for a given namespace and name. +func (s addressableServiceNamespaceLister) Get(name string) (*v1alpha1.AddressableService, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("addressableservice"), name) + } + return obj.(*v1alpha1.AddressableService), nil +} diff --git a/pkg/client/listers/samples/v1alpha1/expansion_generated.go b/pkg/client/listers/samples/v1alpha1/expansion_generated.go new file mode 100644 index 000000000..24ee44e17 --- /dev/null +++ b/pkg/client/listers/samples/v1alpha1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1alpha1 + +// AddressableServiceListerExpansion allows custom methods to be added to +// AddressableServiceLister. +type AddressableServiceListerExpansion interface{} + +// AddressableServiceNamespaceListerExpansion allows custom methods to be added to +// AddressableServiceNamespaceLister. +type AddressableServiceNamespaceListerExpansion interface{} diff --git a/pkg/reconciler/addressableservice/addressableservice.go b/pkg/reconciler/addressableservice/addressableservice.go new file mode 100644 index 000000000..67b899d96 --- /dev/null +++ b/pkg/reconciler/addressableservice/addressableservice.go @@ -0,0 +1,104 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package addressableservice + +import ( + "context" + + corev1 "k8s.io/api/core/v1" + apierrs "k8s.io/apimachinery/pkg/api/errors" + corev1listers "k8s.io/client-go/listers/core/v1" + + "knative.dev/pkg/apis" + duckv1 "knative.dev/pkg/apis/duck/v1" + "knative.dev/pkg/logging" + "knative.dev/pkg/network" + "knative.dev/pkg/reconciler" + "knative.dev/pkg/tracker" + samplesv1alpha1 "knative.dev/sample-controller/pkg/apis/samples/v1alpha1" + addressableservicereconciler "knative.dev/sample-controller/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice" +) + +// newReconciledNormal makes a new reconciler event with event type Normal, and +// reason AddressableServiceReconciled. +func newReconciledNormal(namespace, name string) reconciler.Event { + return reconciler.NewEvent(corev1.EventTypeNormal, "AddressableServiceReconciled", "AddressableService reconciled: \"%s/%s\"", namespace, name) +} + +// Reconciler implements addressableservicereconciler.Interface for +// AddressableService resources. +type Reconciler struct { + // Tracker builds an index of what resources are watching other resources + // so that we can immediately react to changes tracked resources. + Tracker tracker.Interface + + // Listers index properties about resources + ServiceLister corev1listers.ServiceLister +} + +// Check that our Reconciler implements Interface +var _ addressableservicereconciler.Interface = (*Reconciler)(nil) + +// ReconcileKind implements Interface.ReconcileKind. +func (r *Reconciler) ReconcileKind(ctx context.Context, o *samplesv1alpha1.AddressableService) reconciler.Event { + if o.GetDeletionTimestamp() != nil { + // Check for a DeletionTimestamp. If present, elide the normal reconcile logic. + // When a controller needs finalizer handling, it would go here. + return nil + } + o.Status.InitializeConditions() + + if err := r.reconcileForService(ctx, o); err != nil { + return err + } + + o.Status.ObservedGeneration = o.Generation + return newReconciledNormal(o.Namespace, o.Name) +} + +func (r *Reconciler) reconcileForService(ctx context.Context, asvc *samplesv1alpha1.AddressableService) error { + logger := logging.FromContext(ctx) + + if err := r.Tracker.TrackReference(tracker.Reference{ + APIVersion: "v1", + Kind: "Service", + Name: asvc.Spec.ServiceName, + Namespace: asvc.Namespace, + }, asvc); err != nil { + logger.Errorf("Error tracking service %s: %v", asvc.Spec.ServiceName, err) + return err + } + + _, err := r.ServiceLister.Services(asvc.Namespace).Get(asvc.Spec.ServiceName) + if apierrs.IsNotFound(err) { + logger.Info("Service does not yet exist:", asvc.Spec.ServiceName) + asvc.Status.MarkServiceUnavailable(asvc.Spec.ServiceName) + return nil + } else if err != nil { + logger.Errorf("Error reconciling service %s: %v", asvc.Spec.ServiceName, err) + return err + } + + asvc.Status.MarkServiceAvailable() + asvc.Status.Address = &duckv1.Addressable{ + URL: &apis.URL{ + Scheme: "http", + Host: network.GetServiceHostname(asvc.Spec.ServiceName, asvc.Namespace), + }, + } + return nil +} diff --git a/pkg/reconciler/addressableservice/controller.go b/pkg/reconciler/addressableservice/controller.go new file mode 100644 index 000000000..5072e70cc --- /dev/null +++ b/pkg/reconciler/addressableservice/controller.go @@ -0,0 +1,65 @@ +/* +Copyright 2019 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package addressableservice + +import ( + "context" + + "knative.dev/pkg/tracker" + + corev1 "k8s.io/api/core/v1" + "knative.dev/pkg/configmap" + "knative.dev/pkg/controller" + "knative.dev/pkg/logging" + + svcinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/service" + addressableserviceinformer "knative.dev/sample-controller/pkg/client/injection/informers/samples/v1alpha1/addressableservice" + addressableservicereconciler "knative.dev/sample-controller/pkg/client/injection/reconciler/samples/v1alpha1/addressableservice" +) + +// NewController creates a Reconciler and returns the result of NewImpl. +func NewController( + ctx context.Context, + cmw configmap.Watcher, +) *controller.Impl { + logger := logging.FromContext(ctx) + + addressableserviceInformer := addressableserviceinformer.Get(ctx) + svcInformer := svcinformer.Get(ctx) + + r := &Reconciler{ + ServiceLister: svcInformer.Lister(), + } + impl := addressableservicereconciler.NewImpl(ctx, r) + r.Tracker = tracker.New(impl.EnqueueKey, controller.GetTrackerLease(ctx)) + + logger.Info("Setting up event handlers.") + + addressableserviceInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) + + svcInformer.Informer().AddEventHandler(controller.HandleAll( + // Call the tracker's OnChanged method, but we've seen the objects + // coming through this path missing TypeMeta, so ensure it is properly + // populated. + controller.EnsureTypeMeta( + r.Tracker.OnChanged, + corev1.SchemeGroupVersion.WithKind("Service"), + ), + )) + + return impl +} diff --git a/test/OWNERS b/test/OWNERS new file mode 100644 index 000000000..c50adc849 --- /dev/null +++ b/test/OWNERS @@ -0,0 +1,10 @@ +# The OWNERS file is used by prow to automatically merge approved PRs. + +approvers: +- productivity-approvers + +reviewers: +- productivity-reviewers + +labels: +- area/test-and-release diff --git a/test/presubmit-tests.sh b/test/presubmit-tests.sh new file mode 100755 index 000000000..75be569bf --- /dev/null +++ b/test/presubmit-tests.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# Copyright 2019 The Knative Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script runs the presubmit tests; it is started by prow for each PR. +# For convenience, it can also be executed manually. +# Running the script without parameters, or with the --all-tests +# flag, causes all tests to be executed, in the right order. +# Use the flags --build-tests, --unit-tests and --integration-tests +# to run a specific set of tests. + +# Markdown linting failures don't show up properly in Gubernator resulting +# in a net-negative contributor experience. +export DISABLE_MD_LINTING=1 + +source $(dirname $0)/../vendor/knative.dev/test-infra/scripts/presubmit-tests.sh + +# TODO(mattmoor): integration tests + +# We use the default build, unit and integration test runners. + +main "$@" diff --git a/third_party/VENDOR-LICENSE b/third_party/VENDOR-LICENSE new file mode 100644 index 000000000..7036f22cf --- /dev/null +++ b/third_party/VENDOR-LICENSE @@ -0,0 +1,7324 @@ + +=========================================================== +Import: knative.dev/sample-controller/vendor/cloud.google.com/go + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/contrib.go.opencensus.io/exporter/ocagent + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/contrib.go.opencensus.io/exporter/prometheus + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/contrib.go.opencensus.io/exporter/stackdriver + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/aws/aws-sdk-go + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/beorn7/perks + +Copyright (C) 2013 Blake Mizerany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/blang/semver + +The MIT License + +Copyright (c) 2014 Benedikt Lang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/census-instrumentation/opencensus-proto + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/davecgh/go-spew + +ISC License + +Copyright (c) 2012-2016 Dave Collins + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/evanphx/json-patch + +Copyright (c) 2014, Evan Phoenix +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/gobuffalo/envy + +The MIT License (MIT) + +Copyright (c) 2019 Mark Bates + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/gogo/protobuf + +Copyright (c) 2013, The GoGo Authors. All rights reserved. + +Protocol Buffers for Go with Gadgets + +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/golang/groupcache + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/golang/protobuf + +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/google/go-cmp + +Copyright (c) 2017 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/google/gofuzz + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/google/uuid + +Copyright (c) 2009,2014 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/googleapis/gax-go + +Copyright 2016, Google Inc. +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/googleapis/gnostic + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/grpc-ecosystem/grpc-gateway + +Copyright (c) 2015, Gengo, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Gengo, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/hashicorp/golang-lru + +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/imdario/mergo + +Copyright (c) 2013 Dario Castañé. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/jmespath/go-jmespath + +Copyright 2015 James Saryerwinnie + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/joho/godotenv + +Copyright (c) 2013 John Barton + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/json-iterator/go + +MIT License + +Copyright (c) 2016 json-iterator + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/markbates/inflect + +Copyright (c) 2011 Chris Farmiloe + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/matttproud/golang_protobuf_extensions + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/modern-go/concurrent + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/modern-go/reflect2 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/prometheus/client_golang + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/prometheus/client_model + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/prometheus/common + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/prometheus/procfs + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/rogpeppe/go-internal + +Copyright (c) 2018 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/github.com/spf13/pflag + +Copyright (c) 2012 Alex Ogier. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/go.opencensus.io + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +=========================================================== +Import: knative.dev/sample-controller/vendor/go.uber.org/atomic + +Copyright (c) 2016 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/go.uber.org/multierr + +Copyright (c) 2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/go.uber.org/zap + +Copyright (c) 2016-2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/crypto + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/net + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/oauth2 + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/sync + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/sys + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/text + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/golang.org/x/time + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/gomodules.xyz/jsonpatch + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/google.golang.org/api + +Copyright (c) 2011 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/google.golang.org/genproto + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/google.golang.org/grpc + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/gopkg.in/inf.v0 + +Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go +Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/gopkg.in/yaml.v2 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/api + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/apiextensions-apiserver + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/apimachinery + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/client-go + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/klog + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/kube-openapi + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/k8s.io/utils + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/knative.dev/pkg + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +=========================================================== +Import: knative.dev/sample-controller/vendor/sigs.k8s.io/yaml + +The MIT License (MIT) + +Copyright (c) 2014 Sam Ghods + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/cloud.google.com/go/LICENSE b/vendor/cloud.google.com/go/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/cloud.google.com/go/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go new file mode 100644 index 000000000..125b7033c --- /dev/null +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -0,0 +1,513 @@ +// Copyright 2014 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package metadata provides access to Google Compute Engine (GCE) +// metadata and API service accounts. +// +// This package is a wrapper around the GCE metadata service, +// as documented at https://developers.google.com/compute/docs/metadata. +package metadata // import "cloud.google.com/go/compute/metadata" + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "net" + "net/http" + "net/url" + "os" + "runtime" + "strings" + "sync" + "time" +) + +const ( + // metadataIP is the documented metadata server IP address. + metadataIP = "169.254.169.254" + + // metadataHostEnv is the environment variable specifying the + // GCE metadata hostname. If empty, the default value of + // metadataIP ("169.254.169.254") is used instead. + // This is variable name is not defined by any spec, as far as + // I know; it was made up for the Go package. + metadataHostEnv = "GCE_METADATA_HOST" + + userAgent = "gcloud-golang/0.1" +) + +type cachedValue struct { + k string + trim bool + mu sync.Mutex + v string +} + +var ( + projID = &cachedValue{k: "project/project-id", trim: true} + projNum = &cachedValue{k: "project/numeric-project-id", trim: true} + instID = &cachedValue{k: "instance/id", trim: true} +) + +var ( + defaultClient = &Client{hc: &http.Client{ + Transport: &http.Transport{ + Dial: (&net.Dialer{ + Timeout: 2 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + ResponseHeaderTimeout: 2 * time.Second, + }, + }} + subscribeClient = &Client{hc: &http.Client{ + Transport: &http.Transport{ + Dial: (&net.Dialer{ + Timeout: 2 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + }, + }} +) + +// NotDefinedError is returned when requested metadata is not defined. +// +// The underlying string is the suffix after "/computeMetadata/v1/". +// +// This error is not returned if the value is defined to be the empty +// string. +type NotDefinedError string + +func (suffix NotDefinedError) Error() string { + return fmt.Sprintf("metadata: GCE metadata %q not defined", string(suffix)) +} + +func (c *cachedValue) get(cl *Client) (v string, err error) { + defer c.mu.Unlock() + c.mu.Lock() + if c.v != "" { + return c.v, nil + } + if c.trim { + v, err = cl.getTrimmed(c.k) + } else { + v, err = cl.Get(c.k) + } + if err == nil { + c.v = v + } + return +} + +var ( + onGCEOnce sync.Once + onGCE bool +) + +// OnGCE reports whether this process is running on Google Compute Engine. +func OnGCE() bool { + onGCEOnce.Do(initOnGCE) + return onGCE +} + +func initOnGCE() { + onGCE = testOnGCE() +} + +func testOnGCE() bool { + // The user explicitly said they're on GCE, so trust them. + if os.Getenv(metadataHostEnv) != "" { + return true + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + resc := make(chan bool, 2) + + // Try two strategies in parallel. + // See https://github.com/googleapis/google-cloud-go/issues/194 + go func() { + req, _ := http.NewRequest("GET", "http://"+metadataIP, nil) + req.Header.Set("User-Agent", userAgent) + res, err := defaultClient.hc.Do(req.WithContext(ctx)) + if err != nil { + resc <- false + return + } + defer res.Body.Close() + resc <- res.Header.Get("Metadata-Flavor") == "Google" + }() + + go func() { + addrs, err := net.LookupHost("metadata.google.internal") + if err != nil || len(addrs) == 0 { + resc <- false + return + } + resc <- strsContains(addrs, metadataIP) + }() + + tryHarder := systemInfoSuggestsGCE() + if tryHarder { + res := <-resc + if res { + // The first strategy succeeded, so let's use it. + return true + } + // Wait for either the DNS or metadata server probe to + // contradict the other one and say we are running on + // GCE. Give it a lot of time to do so, since the system + // info already suggests we're running on a GCE BIOS. + timer := time.NewTimer(5 * time.Second) + defer timer.Stop() + select { + case res = <-resc: + return res + case <-timer.C: + // Too slow. Who knows what this system is. + return false + } + } + + // There's no hint from the system info that we're running on + // GCE, so use the first probe's result as truth, whether it's + // true or false. The goal here is to optimize for speed for + // users who are NOT running on GCE. We can't assume that + // either a DNS lookup or an HTTP request to a blackholed IP + // address is fast. Worst case this should return when the + // metaClient's Transport.ResponseHeaderTimeout or + // Transport.Dial.Timeout fires (in two seconds). + return <-resc +} + +// systemInfoSuggestsGCE reports whether the local system (without +// doing network requests) suggests that we're running on GCE. If this +// returns true, testOnGCE tries a bit harder to reach its metadata +// server. +func systemInfoSuggestsGCE() bool { + if runtime.GOOS != "linux" { + // We don't have any non-Linux clues available, at least yet. + return false + } + slurp, _ := ioutil.ReadFile("/sys/class/dmi/id/product_name") + name := strings.TrimSpace(string(slurp)) + return name == "Google" || name == "Google Compute Engine" +} + +// Subscribe calls Client.Subscribe on a client designed for subscribing (one with no +// ResponseHeaderTimeout). +func Subscribe(suffix string, fn func(v string, ok bool) error) error { + return subscribeClient.Subscribe(suffix, fn) +} + +// Get calls Client.Get on the default client. +func Get(suffix string) (string, error) { return defaultClient.Get(suffix) } + +// ProjectID returns the current instance's project ID string. +func ProjectID() (string, error) { return defaultClient.ProjectID() } + +// NumericProjectID returns the current instance's numeric project ID. +func NumericProjectID() (string, error) { return defaultClient.NumericProjectID() } + +// InternalIP returns the instance's primary internal IP address. +func InternalIP() (string, error) { return defaultClient.InternalIP() } + +// ExternalIP returns the instance's primary external (public) IP address. +func ExternalIP() (string, error) { return defaultClient.ExternalIP() } + +// Hostname returns the instance's hostname. This will be of the form +// ".c..internal". +func Hostname() (string, error) { return defaultClient.Hostname() } + +// InstanceTags returns the list of user-defined instance tags, +// assigned when initially creating a GCE instance. +func InstanceTags() ([]string, error) { return defaultClient.InstanceTags() } + +// InstanceID returns the current VM's numeric instance ID. +func InstanceID() (string, error) { return defaultClient.InstanceID() } + +// InstanceName returns the current VM's instance ID string. +func InstanceName() (string, error) { return defaultClient.InstanceName() } + +// Zone returns the current VM's zone, such as "us-central1-b". +func Zone() (string, error) { return defaultClient.Zone() } + +// InstanceAttributes calls Client.InstanceAttributes on the default client. +func InstanceAttributes() ([]string, error) { return defaultClient.InstanceAttributes() } + +// ProjectAttributes calls Client.ProjectAttributes on the default client. +func ProjectAttributes() ([]string, error) { return defaultClient.ProjectAttributes() } + +// InstanceAttributeValue calls Client.InstanceAttributeValue on the default client. +func InstanceAttributeValue(attr string) (string, error) { + return defaultClient.InstanceAttributeValue(attr) +} + +// ProjectAttributeValue calls Client.ProjectAttributeValue on the default client. +func ProjectAttributeValue(attr string) (string, error) { + return defaultClient.ProjectAttributeValue(attr) +} + +// Scopes calls Client.Scopes on the default client. +func Scopes(serviceAccount string) ([]string, error) { return defaultClient.Scopes(serviceAccount) } + +func strsContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + +// A Client provides metadata. +type Client struct { + hc *http.Client +} + +// NewClient returns a Client that can be used to fetch metadata. All HTTP requests +// will use the given http.Client instead of the default client. +func NewClient(c *http.Client) *Client { + return &Client{hc: c} +} + +// getETag returns a value from the metadata service as well as the associated ETag. +// This func is otherwise equivalent to Get. +func (c *Client) getETag(suffix string) (value, etag string, err error) { + // Using a fixed IP makes it very difficult to spoof the metadata service in + // a container, which is an important use-case for local testing of cloud + // deployments. To enable spoofing of the metadata service, the environment + // variable GCE_METADATA_HOST is first inspected to decide where metadata + // requests shall go. + host := os.Getenv(metadataHostEnv) + if host == "" { + // Using 169.254.169.254 instead of "metadata" here because Go + // binaries built with the "netgo" tag and without cgo won't + // know the search suffix for "metadata" is + // ".google.internal", and this IP address is documented as + // being stable anyway. + host = metadataIP + } + u := "http://" + host + "/computeMetadata/v1/" + suffix + req, _ := http.NewRequest("GET", u, nil) + req.Header.Set("Metadata-Flavor", "Google") + req.Header.Set("User-Agent", userAgent) + res, err := c.hc.Do(req) + if err != nil { + return "", "", err + } + defer res.Body.Close() + if res.StatusCode == http.StatusNotFound { + return "", "", NotDefinedError(suffix) + } + all, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", err + } + if res.StatusCode != 200 { + return "", "", &Error{Code: res.StatusCode, Message: string(all)} + } + return string(all), res.Header.Get("Etag"), nil +} + +// Get returns a value from the metadata service. +// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". +// +// If the GCE_METADATA_HOST environment variable is not defined, a default of +// 169.254.169.254 will be used instead. +// +// If the requested metadata is not defined, the returned error will +// be of type NotDefinedError. +func (c *Client) Get(suffix string) (string, error) { + val, _, err := c.getETag(suffix) + return val, err +} + +func (c *Client) getTrimmed(suffix string) (s string, err error) { + s, err = c.Get(suffix) + s = strings.TrimSpace(s) + return +} + +func (c *Client) lines(suffix string) ([]string, error) { + j, err := c.Get(suffix) + if err != nil { + return nil, err + } + s := strings.Split(strings.TrimSpace(j), "\n") + for i := range s { + s[i] = strings.TrimSpace(s[i]) + } + return s, nil +} + +// ProjectID returns the current instance's project ID string. +func (c *Client) ProjectID() (string, error) { return projID.get(c) } + +// NumericProjectID returns the current instance's numeric project ID. +func (c *Client) NumericProjectID() (string, error) { return projNum.get(c) } + +// InstanceID returns the current VM's numeric instance ID. +func (c *Client) InstanceID() (string, error) { return instID.get(c) } + +// InternalIP returns the instance's primary internal IP address. +func (c *Client) InternalIP() (string, error) { + return c.getTrimmed("instance/network-interfaces/0/ip") +} + +// ExternalIP returns the instance's primary external (public) IP address. +func (c *Client) ExternalIP() (string, error) { + return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip") +} + +// Hostname returns the instance's hostname. This will be of the form +// ".c..internal". +func (c *Client) Hostname() (string, error) { + return c.getTrimmed("instance/hostname") +} + +// InstanceTags returns the list of user-defined instance tags, +// assigned when initially creating a GCE instance. +func (c *Client) InstanceTags() ([]string, error) { + var s []string + j, err := c.Get("instance/tags") + if err != nil { + return nil, err + } + if err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil { + return nil, err + } + return s, nil +} + +// InstanceName returns the current VM's instance ID string. +func (c *Client) InstanceName() (string, error) { + host, err := c.Hostname() + if err != nil { + return "", err + } + return strings.Split(host, ".")[0], nil +} + +// Zone returns the current VM's zone, such as "us-central1-b". +func (c *Client) Zone() (string, error) { + zone, err := c.getTrimmed("instance/zone") + // zone is of the form "projects//zones/". + if err != nil { + return "", err + } + return zone[strings.LastIndex(zone, "/")+1:], nil +} + +// InstanceAttributes returns the list of user-defined attributes, +// assigned when initially creating a GCE VM instance. The value of an +// attribute can be obtained with InstanceAttributeValue. +func (c *Client) InstanceAttributes() ([]string, error) { return c.lines("instance/attributes/") } + +// ProjectAttributes returns the list of user-defined attributes +// applying to the project as a whole, not just this VM. The value of +// an attribute can be obtained with ProjectAttributeValue. +func (c *Client) ProjectAttributes() ([]string, error) { return c.lines("project/attributes/") } + +// InstanceAttributeValue returns the value of the provided VM +// instance attribute. +// +// If the requested attribute is not defined, the returned error will +// be of type NotDefinedError. +// +// InstanceAttributeValue may return ("", nil) if the attribute was +// defined to be the empty string. +func (c *Client) InstanceAttributeValue(attr string) (string, error) { + return c.Get("instance/attributes/" + attr) +} + +// ProjectAttributeValue returns the value of the provided +// project attribute. +// +// If the requested attribute is not defined, the returned error will +// be of type NotDefinedError. +// +// ProjectAttributeValue may return ("", nil) if the attribute was +// defined to be the empty string. +func (c *Client) ProjectAttributeValue(attr string) (string, error) { + return c.Get("project/attributes/" + attr) +} + +// Scopes returns the service account scopes for the given account. +// The account may be empty or the string "default" to use the instance's +// main account. +func (c *Client) Scopes(serviceAccount string) ([]string, error) { + if serviceAccount == "" { + serviceAccount = "default" + } + return c.lines("instance/service-accounts/" + serviceAccount + "/scopes") +} + +// Subscribe subscribes to a value from the metadata service. +// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". +// The suffix may contain query parameters. +// +// Subscribe calls fn with the latest metadata value indicated by the provided +// suffix. If the metadata value is deleted, fn is called with the empty string +// and ok false. Subscribe blocks until fn returns a non-nil error or the value +// is deleted. Subscribe returns the error value returned from the last call to +// fn, which may be nil when ok == false. +func (c *Client) Subscribe(suffix string, fn func(v string, ok bool) error) error { + const failedSubscribeSleep = time.Second * 5 + + // First check to see if the metadata value exists at all. + val, lastETag, err := c.getETag(suffix) + if err != nil { + return err + } + + if err := fn(val, true); err != nil { + return err + } + + ok := true + if strings.ContainsRune(suffix, '?') { + suffix += "&wait_for_change=true&last_etag=" + } else { + suffix += "?wait_for_change=true&last_etag=" + } + for { + val, etag, err := c.getETag(suffix + url.QueryEscape(lastETag)) + if err != nil { + if _, deleted := err.(NotDefinedError); !deleted { + time.Sleep(failedSubscribeSleep) + continue // Retry on other errors. + } + ok = false + } + lastETag = etag + + if err := fn(val, ok); err != nil || !ok { + return err + } + } +} + +// Error contains an error response from the server. +type Error struct { + // Code is the HTTP response status code. + Code int + // Message is the server response message. + Message string +} + +func (e *Error) Error() string { + return fmt.Sprintf("compute: Received %d `%s`", e.Code, e.Message) +} diff --git a/vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go b/vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go new file mode 100644 index 000000000..22978d377 --- /dev/null +++ b/vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go @@ -0,0 +1,676 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// AUTO-GENERATED CODE. DO NOT EDIT. + +package container + +import ( + "context" + "time" + + "cloud.google.com/go/internal/version" + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/option" + "google.golang.org/api/transport" + containerpb "google.golang.org/genproto/googleapis/container/v1" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// ClusterManagerCallOptions contains the retry settings for each method of ClusterManagerClient. +type ClusterManagerCallOptions struct { + ListClusters []gax.CallOption + GetCluster []gax.CallOption + CreateCluster []gax.CallOption + UpdateCluster []gax.CallOption + UpdateNodePool []gax.CallOption + SetNodePoolAutoscaling []gax.CallOption + SetLoggingService []gax.CallOption + SetMonitoringService []gax.CallOption + SetAddonsConfig []gax.CallOption + SetLocations []gax.CallOption + UpdateMaster []gax.CallOption + SetMasterAuth []gax.CallOption + DeleteCluster []gax.CallOption + ListOperations []gax.CallOption + GetOperation []gax.CallOption + CancelOperation []gax.CallOption + GetServerConfig []gax.CallOption + ListNodePools []gax.CallOption + GetNodePool []gax.CallOption + CreateNodePool []gax.CallOption + DeleteNodePool []gax.CallOption + RollbackNodePoolUpgrade []gax.CallOption + SetNodePoolManagement []gax.CallOption + SetLabels []gax.CallOption + SetLegacyAbac []gax.CallOption + StartIPRotation []gax.CallOption + CompleteIPRotation []gax.CallOption + SetNodePoolSize []gax.CallOption + SetNetworkPolicy []gax.CallOption + SetMaintenancePolicy []gax.CallOption +} + +func defaultClusterManagerClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("container.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultClusterManagerCallOptions() *ClusterManagerCallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.DeadlineExceeded, + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 60000 * time.Millisecond, + Multiplier: 1.3, + }) + }), + }, + } + return &ClusterManagerCallOptions{ + ListClusters: retry[[2]string{"default", "idempotent"}], + GetCluster: retry[[2]string{"default", "idempotent"}], + CreateCluster: retry[[2]string{"default", "non_idempotent"}], + UpdateCluster: retry[[2]string{"default", "non_idempotent"}], + UpdateNodePool: retry[[2]string{"default", "non_idempotent"}], + SetNodePoolAutoscaling: retry[[2]string{"default", "non_idempotent"}], + SetLoggingService: retry[[2]string{"default", "non_idempotent"}], + SetMonitoringService: retry[[2]string{"default", "non_idempotent"}], + SetAddonsConfig: retry[[2]string{"default", "non_idempotent"}], + SetLocations: retry[[2]string{"default", "non_idempotent"}], + UpdateMaster: retry[[2]string{"default", "non_idempotent"}], + SetMasterAuth: retry[[2]string{"default", "non_idempotent"}], + DeleteCluster: retry[[2]string{"default", "idempotent"}], + ListOperations: retry[[2]string{"default", "idempotent"}], + GetOperation: retry[[2]string{"default", "idempotent"}], + CancelOperation: retry[[2]string{"default", "non_idempotent"}], + GetServerConfig: retry[[2]string{"default", "idempotent"}], + ListNodePools: retry[[2]string{"default", "idempotent"}], + GetNodePool: retry[[2]string{"default", "idempotent"}], + CreateNodePool: retry[[2]string{"default", "non_idempotent"}], + DeleteNodePool: retry[[2]string{"default", "idempotent"}], + RollbackNodePoolUpgrade: retry[[2]string{"default", "non_idempotent"}], + SetNodePoolManagement: retry[[2]string{"default", "non_idempotent"}], + SetLabels: retry[[2]string{"default", "non_idempotent"}], + SetLegacyAbac: retry[[2]string{"default", "non_idempotent"}], + StartIPRotation: retry[[2]string{"default", "non_idempotent"}], + CompleteIPRotation: retry[[2]string{"default", "non_idempotent"}], + SetNodePoolSize: retry[[2]string{"default", "non_idempotent"}], + SetNetworkPolicy: retry[[2]string{"default", "non_idempotent"}], + SetMaintenancePolicy: retry[[2]string{"default", "non_idempotent"}], + } +} + +// ClusterManagerClient is a client for interacting with Google Container Engine API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type ClusterManagerClient struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + clusterManagerClient containerpb.ClusterManagerClient + + // The call options for this service. + CallOptions *ClusterManagerCallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewClusterManagerClient creates a new cluster manager client. +// +// Google Container Engine Cluster Manager v1 +func NewClusterManagerClient(ctx context.Context, opts ...option.ClientOption) (*ClusterManagerClient, error) { + conn, err := transport.DialGRPC(ctx, append(defaultClusterManagerClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &ClusterManagerClient{ + conn: conn, + CallOptions: defaultClusterManagerCallOptions(), + + clusterManagerClient: containerpb.NewClusterManagerClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *ClusterManagerClient) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *ClusterManagerClient) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *ClusterManagerClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", version.Go()}, keyval...) + kv = append(kv, "gapic", version.Repo, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// ListClusters lists all clusters owned by a project in either the specified zone or all +// zones. +func (c *ClusterManagerClient) ListClusters(ctx context.Context, req *containerpb.ListClustersRequest, opts ...gax.CallOption) (*containerpb.ListClustersResponse, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.ListClusters[0:len(c.CallOptions.ListClusters):len(c.CallOptions.ListClusters)], opts...) + var resp *containerpb.ListClustersResponse + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.ListClusters(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// GetCluster gets the details of a specific cluster. +func (c *ClusterManagerClient) GetCluster(ctx context.Context, req *containerpb.GetClusterRequest, opts ...gax.CallOption) (*containerpb.Cluster, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.GetCluster[0:len(c.CallOptions.GetCluster):len(c.CallOptions.GetCluster)], opts...) + var resp *containerpb.Cluster + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.GetCluster(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateCluster creates a cluster, consisting of the specified number and type of Google +// Compute Engine instances. +// +// By default, the cluster is created in the project's +// default network (at /compute/docs/networks-and-firewalls#networks). +// +// One firewall is added for the cluster. After cluster creation, +// the cluster creates routes for each node to allow the containers +// on that node to communicate with all other instances in the +// cluster. +// +// Finally, an entry is added to the project's global metadata indicating +// which CIDR range is being used by the cluster. +func (c *ClusterManagerClient) CreateCluster(ctx context.Context, req *containerpb.CreateClusterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.CreateCluster[0:len(c.CallOptions.CreateCluster):len(c.CallOptions.CreateCluster)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.CreateCluster(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// UpdateCluster updates the settings of a specific cluster. +func (c *ClusterManagerClient) UpdateCluster(ctx context.Context, req *containerpb.UpdateClusterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.UpdateCluster[0:len(c.CallOptions.UpdateCluster):len(c.CallOptions.UpdateCluster)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.UpdateCluster(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// UpdateNodePool updates the version and/or image type of a specific node pool. +func (c *ClusterManagerClient) UpdateNodePool(ctx context.Context, req *containerpb.UpdateNodePoolRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.UpdateNodePool[0:len(c.CallOptions.UpdateNodePool):len(c.CallOptions.UpdateNodePool)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.UpdateNodePool(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetNodePoolAutoscaling sets the autoscaling settings of a specific node pool. +func (c *ClusterManagerClient) SetNodePoolAutoscaling(ctx context.Context, req *containerpb.SetNodePoolAutoscalingRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetNodePoolAutoscaling[0:len(c.CallOptions.SetNodePoolAutoscaling):len(c.CallOptions.SetNodePoolAutoscaling)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetNodePoolAutoscaling(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetLoggingService sets the logging service of a specific cluster. +func (c *ClusterManagerClient) SetLoggingService(ctx context.Context, req *containerpb.SetLoggingServiceRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetLoggingService[0:len(c.CallOptions.SetLoggingService):len(c.CallOptions.SetLoggingService)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetLoggingService(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetMonitoringService sets the monitoring service of a specific cluster. +func (c *ClusterManagerClient) SetMonitoringService(ctx context.Context, req *containerpb.SetMonitoringServiceRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetMonitoringService[0:len(c.CallOptions.SetMonitoringService):len(c.CallOptions.SetMonitoringService)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetMonitoringService(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetAddonsConfig sets the addons of a specific cluster. +func (c *ClusterManagerClient) SetAddonsConfig(ctx context.Context, req *containerpb.SetAddonsConfigRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetAddonsConfig[0:len(c.CallOptions.SetAddonsConfig):len(c.CallOptions.SetAddonsConfig)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetAddonsConfig(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetLocations sets the locations of a specific cluster. +func (c *ClusterManagerClient) SetLocations(ctx context.Context, req *containerpb.SetLocationsRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetLocations[0:len(c.CallOptions.SetLocations):len(c.CallOptions.SetLocations)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetLocations(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// UpdateMaster updates the master of a specific cluster. +func (c *ClusterManagerClient) UpdateMaster(ctx context.Context, req *containerpb.UpdateMasterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.UpdateMaster[0:len(c.CallOptions.UpdateMaster):len(c.CallOptions.UpdateMaster)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.UpdateMaster(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetMasterAuth used to set master auth materials. Currently supports :- +// Changing the admin password of a specific cluster. +// This can be either via password generation or explicitly set the password. +func (c *ClusterManagerClient) SetMasterAuth(ctx context.Context, req *containerpb.SetMasterAuthRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetMasterAuth[0:len(c.CallOptions.SetMasterAuth):len(c.CallOptions.SetMasterAuth)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetMasterAuth(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteCluster deletes the cluster, including the Kubernetes endpoint and all worker +// nodes. +// +// Firewalls and routes that were configured during cluster creation +// are also deleted. +// +// Other Google Compute Engine resources that might be in use by the cluster +// (e.g. load balancer resources) will not be deleted if they weren't present +// at the initial create time. +func (c *ClusterManagerClient) DeleteCluster(ctx context.Context, req *containerpb.DeleteClusterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.DeleteCluster[0:len(c.CallOptions.DeleteCluster):len(c.CallOptions.DeleteCluster)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.DeleteCluster(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// ListOperations lists all operations in a project in a specific zone or all zones. +func (c *ClusterManagerClient) ListOperations(ctx context.Context, req *containerpb.ListOperationsRequest, opts ...gax.CallOption) (*containerpb.ListOperationsResponse, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.ListOperations[0:len(c.CallOptions.ListOperations):len(c.CallOptions.ListOperations)], opts...) + var resp *containerpb.ListOperationsResponse + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.ListOperations(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// GetOperation gets the specified operation. +func (c *ClusterManagerClient) GetOperation(ctx context.Context, req *containerpb.GetOperationRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.GetOperation[0:len(c.CallOptions.GetOperation):len(c.CallOptions.GetOperation)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.GetOperation(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CancelOperation cancels the specified operation. +func (c *ClusterManagerClient) CancelOperation(ctx context.Context, req *containerpb.CancelOperationRequest, opts ...gax.CallOption) error { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.CancelOperation[0:len(c.CallOptions.CancelOperation):len(c.CallOptions.CancelOperation)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.clusterManagerClient.CancelOperation(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// GetServerConfig returns configuration info about the Container Engine service. +func (c *ClusterManagerClient) GetServerConfig(ctx context.Context, req *containerpb.GetServerConfigRequest, opts ...gax.CallOption) (*containerpb.ServerConfig, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.GetServerConfig[0:len(c.CallOptions.GetServerConfig):len(c.CallOptions.GetServerConfig)], opts...) + var resp *containerpb.ServerConfig + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.GetServerConfig(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// ListNodePools lists the node pools for a cluster. +func (c *ClusterManagerClient) ListNodePools(ctx context.Context, req *containerpb.ListNodePoolsRequest, opts ...gax.CallOption) (*containerpb.ListNodePoolsResponse, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.ListNodePools[0:len(c.CallOptions.ListNodePools):len(c.CallOptions.ListNodePools)], opts...) + var resp *containerpb.ListNodePoolsResponse + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.ListNodePools(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// GetNodePool retrieves the node pool requested. +func (c *ClusterManagerClient) GetNodePool(ctx context.Context, req *containerpb.GetNodePoolRequest, opts ...gax.CallOption) (*containerpb.NodePool, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.GetNodePool[0:len(c.CallOptions.GetNodePool):len(c.CallOptions.GetNodePool)], opts...) + var resp *containerpb.NodePool + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.GetNodePool(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateNodePool creates a node pool for a cluster. +func (c *ClusterManagerClient) CreateNodePool(ctx context.Context, req *containerpb.CreateNodePoolRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.CreateNodePool[0:len(c.CallOptions.CreateNodePool):len(c.CallOptions.CreateNodePool)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.CreateNodePool(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteNodePool deletes a node pool from a cluster. +func (c *ClusterManagerClient) DeleteNodePool(ctx context.Context, req *containerpb.DeleteNodePoolRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.DeleteNodePool[0:len(c.CallOptions.DeleteNodePool):len(c.CallOptions.DeleteNodePool)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.DeleteNodePool(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// RollbackNodePoolUpgrade roll back the previously Aborted or Failed NodePool upgrade. +// This will be an no-op if the last upgrade successfully completed. +func (c *ClusterManagerClient) RollbackNodePoolUpgrade(ctx context.Context, req *containerpb.RollbackNodePoolUpgradeRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.RollbackNodePoolUpgrade[0:len(c.CallOptions.RollbackNodePoolUpgrade):len(c.CallOptions.RollbackNodePoolUpgrade)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.RollbackNodePoolUpgrade(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetNodePoolManagement sets the NodeManagement options for a node pool. +func (c *ClusterManagerClient) SetNodePoolManagement(ctx context.Context, req *containerpb.SetNodePoolManagementRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetNodePoolManagement[0:len(c.CallOptions.SetNodePoolManagement):len(c.CallOptions.SetNodePoolManagement)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetNodePoolManagement(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetLabels sets labels on a cluster. +func (c *ClusterManagerClient) SetLabels(ctx context.Context, req *containerpb.SetLabelsRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetLabels[0:len(c.CallOptions.SetLabels):len(c.CallOptions.SetLabels)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetLabels(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetLegacyAbac enables or disables the ABAC authorization mechanism on a cluster. +func (c *ClusterManagerClient) SetLegacyAbac(ctx context.Context, req *containerpb.SetLegacyAbacRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetLegacyAbac[0:len(c.CallOptions.SetLegacyAbac):len(c.CallOptions.SetLegacyAbac)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetLegacyAbac(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// StartIPRotation start master IP rotation. +func (c *ClusterManagerClient) StartIPRotation(ctx context.Context, req *containerpb.StartIPRotationRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.StartIPRotation[0:len(c.CallOptions.StartIPRotation):len(c.CallOptions.StartIPRotation)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.StartIPRotation(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CompleteIPRotation completes master IP rotation. +func (c *ClusterManagerClient) CompleteIPRotation(ctx context.Context, req *containerpb.CompleteIPRotationRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.CompleteIPRotation[0:len(c.CallOptions.CompleteIPRotation):len(c.CallOptions.CompleteIPRotation)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.CompleteIPRotation(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetNodePoolSize sets the size of a specific node pool. +func (c *ClusterManagerClient) SetNodePoolSize(ctx context.Context, req *containerpb.SetNodePoolSizeRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetNodePoolSize[0:len(c.CallOptions.SetNodePoolSize):len(c.CallOptions.SetNodePoolSize)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetNodePoolSize(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetNetworkPolicy enables/Disables Network Policy for a cluster. +func (c *ClusterManagerClient) SetNetworkPolicy(ctx context.Context, req *containerpb.SetNetworkPolicyRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetNetworkPolicy[0:len(c.CallOptions.SetNetworkPolicy):len(c.CallOptions.SetNetworkPolicy)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetNetworkPolicy(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// SetMaintenancePolicy sets the maintenance policy for a cluster. +func (c *ClusterManagerClient) SetMaintenancePolicy(ctx context.Context, req *containerpb.SetMaintenancePolicyRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.SetMaintenancePolicy[0:len(c.CallOptions.SetMaintenancePolicy):len(c.CallOptions.SetMaintenancePolicy)], opts...) + var resp *containerpb.Operation + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.clusterManagerClient.SetMaintenancePolicy(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} diff --git a/vendor/cloud.google.com/go/container/apiv1/doc.go b/vendor/cloud.google.com/go/container/apiv1/doc.go new file mode 100644 index 000000000..0f995054c --- /dev/null +++ b/vendor/cloud.google.com/go/container/apiv1/doc.go @@ -0,0 +1,49 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// AUTO-GENERATED CODE. DO NOT EDIT. + +// Package container is an auto-generated package for the +// Google Container Engine API. +// +// NOTE: This package is in alpha. It is not stable, and is likely to change. +// +// The Google Kubernetes Engine API is used for building and managing +// container +// based applications, powered by the open source Kubernetes technology. +package container // import "cloud.google.com/go/container/apiv1" + +import ( + "context" + + "google.golang.org/grpc/metadata" +) + +func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { + out, _ := metadata.FromOutgoingContext(ctx) + out = out.Copy() + for _, md := range mds { + for k, v := range md { + out[k] = append(out[k], v...) + } + } + return metadata.NewOutgoingContext(ctx, out) +} + +// DefaultAuthScopes reports the default set of authentication scopes to use with this package. +func DefaultAuthScopes() []string { + return []string{ + "https://www.googleapis.com/auth/cloud-platform", + } +} diff --git a/vendor/cloud.google.com/go/internal/version/version.go b/vendor/cloud.google.com/go/internal/version/version.go new file mode 100644 index 000000000..4a2a8c19f --- /dev/null +++ b/vendor/cloud.google.com/go/internal/version/version.go @@ -0,0 +1,71 @@ +// Copyright 2016 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:generate ./update_version.sh + +// Package version contains version information for Google Cloud Client +// Libraries for Go, as reported in request headers. +package version + +import ( + "runtime" + "strings" + "unicode" +) + +// Repo is the current version of the client libraries in this +// repo. It should be a date in YYYYMMDD format. +const Repo = "20180226" + +// Go returns the Go runtime version. The returned string +// has no whitespace. +func Go() string { + return goVersion +} + +var goVersion = goVer(runtime.Version()) + +const develPrefix = "devel +" + +func goVer(s string) string { + if strings.HasPrefix(s, develPrefix) { + s = s[len(develPrefix):] + if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { + s = s[:p] + } + return s + } + + if strings.HasPrefix(s, "go1") { + s = s[2:] + var prerelease string + if p := strings.IndexFunc(s, notSemverRune); p >= 0 { + s, prerelease = s[:p], s[p:] + } + if strings.HasSuffix(s, ".") { + s += "0" + } else if strings.Count(s, ".") < 2 { + s += ".0" + } + if prerelease != "" { + s += "-" + prerelease + } + return s + } + return "" +} + +func notSemverRune(r rune) bool { + return !strings.ContainsRune("0123456789.", r) +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go new file mode 100644 index 000000000..3bed3bb53 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go @@ -0,0 +1,284 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +package monitoring + +import ( + "context" + "fmt" + "math" + "time" + + "github.com/golang/protobuf/proto" + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/api/transport" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// AlertPolicyCallOptions contains the retry settings for each method of AlertPolicyClient. +type AlertPolicyCallOptions struct { + ListAlertPolicies []gax.CallOption + GetAlertPolicy []gax.CallOption + CreateAlertPolicy []gax.CallOption + DeleteAlertPolicy []gax.CallOption + UpdateAlertPolicy []gax.CallOption +} + +func defaultAlertPolicyClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("monitoring.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultAlertPolicyCallOptions() *AlertPolicyCallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 60000 * time.Millisecond, + Multiplier: 1.3, + }) + }), + }, + } + return &AlertPolicyCallOptions{ + ListAlertPolicies: retry[[2]string{"default", "idempotent"}], + GetAlertPolicy: retry[[2]string{"default", "idempotent"}], + CreateAlertPolicy: retry[[2]string{"default", "non_idempotent"}], + DeleteAlertPolicy: retry[[2]string{"default", "idempotent"}], + UpdateAlertPolicy: retry[[2]string{"default", "non_idempotent"}], + } +} + +// AlertPolicyClient is a client for interacting with Stackdriver Monitoring API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type AlertPolicyClient struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + alertPolicyClient monitoringpb.AlertPolicyServiceClient + + // The call options for this service. + CallOptions *AlertPolicyCallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewAlertPolicyClient creates a new alert policy service client. +// +// The AlertPolicyService API is used to manage (list, create, delete, +// edit) alert policies in Stackdriver Monitoring. An alerting policy is +// a description of the conditions under which some aspect of your +// system is considered to be "unhealthy" and the ways to notify +// people or services about this state. In addition to using this API, alert +// policies can also be managed through +// Stackdriver Monitoring (at https://cloud.google.com/monitoring/docs/), +// which can be reached by clicking the "Monitoring" tab in +// Cloud Console (at https://console.cloud.google.com/). +func NewAlertPolicyClient(ctx context.Context, opts ...option.ClientOption) (*AlertPolicyClient, error) { + conn, err := transport.DialGRPC(ctx, append(defaultAlertPolicyClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &AlertPolicyClient{ + conn: conn, + CallOptions: defaultAlertPolicyCallOptions(), + + alertPolicyClient: monitoringpb.NewAlertPolicyServiceClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *AlertPolicyClient) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *AlertPolicyClient) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *AlertPolicyClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// ListAlertPolicies lists the existing alerting policies for the project. +func (c *AlertPolicyClient) ListAlertPolicies(ctx context.Context, req *monitoringpb.ListAlertPoliciesRequest, opts ...gax.CallOption) *AlertPolicyIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListAlertPolicies[0:len(c.CallOptions.ListAlertPolicies):len(c.CallOptions.ListAlertPolicies)], opts...) + it := &AlertPolicyIterator{} + req = proto.Clone(req).(*monitoringpb.ListAlertPoliciesRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.AlertPolicy, string, error) { + var resp *monitoringpb.ListAlertPoliciesResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.alertPolicyClient.ListAlertPolicies(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.AlertPolicies, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetAlertPolicy gets a single alerting policy. +func (c *AlertPolicyClient) GetAlertPolicy(ctx context.Context, req *monitoringpb.GetAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetAlertPolicy[0:len(c.CallOptions.GetAlertPolicy):len(c.CallOptions.GetAlertPolicy)], opts...) + var resp *monitoringpb.AlertPolicy + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.alertPolicyClient.GetAlertPolicy(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateAlertPolicy creates a new alerting policy. +func (c *AlertPolicyClient) CreateAlertPolicy(ctx context.Context, req *monitoringpb.CreateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateAlertPolicy[0:len(c.CallOptions.CreateAlertPolicy):len(c.CallOptions.CreateAlertPolicy)], opts...) + var resp *monitoringpb.AlertPolicy + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.alertPolicyClient.CreateAlertPolicy(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteAlertPolicy deletes an alerting policy. +func (c *AlertPolicyClient) DeleteAlertPolicy(ctx context.Context, req *monitoringpb.DeleteAlertPolicyRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.DeleteAlertPolicy[0:len(c.CallOptions.DeleteAlertPolicy):len(c.CallOptions.DeleteAlertPolicy)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.alertPolicyClient.DeleteAlertPolicy(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// UpdateAlertPolicy updates an alerting policy. You can either replace the entire policy with +// a new one or replace only certain fields in the current alerting policy by +// specifying the fields to be updated via updateMask. Returns the +// updated alerting policy. +func (c *AlertPolicyClient) UpdateAlertPolicy(ctx context.Context, req *monitoringpb.UpdateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "alert_policy.name", req.GetAlertPolicy().GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.UpdateAlertPolicy[0:len(c.CallOptions.UpdateAlertPolicy):len(c.CallOptions.UpdateAlertPolicy)], opts...) + var resp *monitoringpb.AlertPolicy + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.alertPolicyClient.UpdateAlertPolicy(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// AlertPolicyIterator manages a stream of *monitoringpb.AlertPolicy. +type AlertPolicyIterator struct { + items []*monitoringpb.AlertPolicy + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.AlertPolicy, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *AlertPolicyIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *AlertPolicyIterator) Next() (*monitoringpb.AlertPolicy, error) { + var item *monitoringpb.AlertPolicy + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *AlertPolicyIterator) bufLen() int { + return len(it.items) +} + +func (it *AlertPolicyIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/doc.go b/vendor/cloud.google.com/go/monitoring/apiv3/doc.go new file mode 100644 index 000000000..d79b7797d --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/doc.go @@ -0,0 +1,105 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +// Package monitoring is an auto-generated package for the +// Stackdriver Monitoring API. +// +// NOTE: This package is in alpha. It is not stable, and is likely to change. +// +// Manages your Stackdriver Monitoring data and configurations. Most projects +// must be associated with a Stackdriver account, with a few exceptions as +// noted on the individual method pages. +// +// Use of Context +// +// The ctx passed to NewClient is used for authentication requests and +// for creating the underlying connection, but is not used for subsequent calls. +// Individual methods on the client use the ctx given to them. +// +// To close the open connection, use the Close() method. +// +// For information about setting deadlines, reusing contexts, and more +// please visit godoc.org/cloud.google.com/go. +package monitoring // import "cloud.google.com/go/monitoring/apiv3" + +import ( + "context" + "runtime" + "strings" + "unicode" + + "google.golang.org/grpc/metadata" +) + +func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { + out, _ := metadata.FromOutgoingContext(ctx) + out = out.Copy() + for _, md := range mds { + for k, v := range md { + out[k] = append(out[k], v...) + } + } + return metadata.NewOutgoingContext(ctx, out) +} + +// DefaultAuthScopes reports the default set of authentication scopes to use with this package. +func DefaultAuthScopes() []string { + return []string{ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read", + "https://www.googleapis.com/auth/monitoring.write", + } +} + +// versionGo returns the Go runtime version. The returned string +// has no whitespace, suitable for reporting in header. +func versionGo() string { + const develPrefix = "devel +" + + s := runtime.Version() + if strings.HasPrefix(s, develPrefix) { + s = s[len(develPrefix):] + if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { + s = s[:p] + } + return s + } + + notSemverRune := func(r rune) bool { + return strings.IndexRune("0123456789.", r) < 0 + } + + if strings.HasPrefix(s, "go1") { + s = s[2:] + var prerelease string + if p := strings.IndexFunc(s, notSemverRune); p >= 0 { + s, prerelease = s[:p], s[p:] + } + if strings.HasSuffix(s, ".") { + s += "0" + } else if strings.Count(s, ".") < 2 { + s += ".0" + } + if prerelease != "" { + s += "-" + prerelease + } + return s + } + return "UNKNOWN" +} + +const versionClient = "20190508" diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/group_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/group_client.go new file mode 100644 index 000000000..4fe1eb1a9 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/group_client.go @@ -0,0 +1,369 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +package monitoring + +import ( + "context" + "fmt" + "math" + "time" + + "github.com/golang/protobuf/proto" + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/api/transport" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// GroupCallOptions contains the retry settings for each method of GroupClient. +type GroupCallOptions struct { + ListGroups []gax.CallOption + GetGroup []gax.CallOption + CreateGroup []gax.CallOption + UpdateGroup []gax.CallOption + DeleteGroup []gax.CallOption + ListGroupMembers []gax.CallOption +} + +func defaultGroupClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("monitoring.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultGroupCallOptions() *GroupCallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 60000 * time.Millisecond, + Multiplier: 1.3, + }) + }), + }, + } + return &GroupCallOptions{ + ListGroups: retry[[2]string{"default", "idempotent"}], + GetGroup: retry[[2]string{"default", "idempotent"}], + CreateGroup: retry[[2]string{"default", "non_idempotent"}], + UpdateGroup: retry[[2]string{"default", "idempotent"}], + DeleteGroup: retry[[2]string{"default", "idempotent"}], + ListGroupMembers: retry[[2]string{"default", "idempotent"}], + } +} + +// GroupClient is a client for interacting with Stackdriver Monitoring API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type GroupClient struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + groupClient monitoringpb.GroupServiceClient + + // The call options for this service. + CallOptions *GroupCallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewGroupClient creates a new group service client. +// +// The Group API lets you inspect and manage your +// groups (at #google.monitoring.v3.Group). +// +// A group is a named filter that is used to identify +// a collection of monitored resources. Groups are typically used to +// mirror the physical and/or logical topology of the environment. +// Because group membership is computed dynamically, monitored +// resources that are started in the future are automatically placed +// in matching groups. By using a group to name monitored resources in, +// for example, an alert policy, the target of that alert policy is +// updated automatically as monitored resources are added and removed +// from the infrastructure. +func NewGroupClient(ctx context.Context, opts ...option.ClientOption) (*GroupClient, error) { + conn, err := transport.DialGRPC(ctx, append(defaultGroupClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &GroupClient{ + conn: conn, + CallOptions: defaultGroupCallOptions(), + + groupClient: monitoringpb.NewGroupServiceClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *GroupClient) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *GroupClient) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *GroupClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// ListGroups lists the existing groups. +func (c *GroupClient) ListGroups(ctx context.Context, req *monitoringpb.ListGroupsRequest, opts ...gax.CallOption) *GroupIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListGroups[0:len(c.CallOptions.ListGroups):len(c.CallOptions.ListGroups)], opts...) + it := &GroupIterator{} + req = proto.Clone(req).(*monitoringpb.ListGroupsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Group, string, error) { + var resp *monitoringpb.ListGroupsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.groupClient.ListGroups(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.Group, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetGroup gets a single group. +func (c *GroupClient) GetGroup(ctx context.Context, req *monitoringpb.GetGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetGroup[0:len(c.CallOptions.GetGroup):len(c.CallOptions.GetGroup)], opts...) + var resp *monitoringpb.Group + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.groupClient.GetGroup(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateGroup creates a new group. +func (c *GroupClient) CreateGroup(ctx context.Context, req *monitoringpb.CreateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateGroup[0:len(c.CallOptions.CreateGroup):len(c.CallOptions.CreateGroup)], opts...) + var resp *monitoringpb.Group + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.groupClient.CreateGroup(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// UpdateGroup updates an existing group. +// You can change any group attributes except name. +func (c *GroupClient) UpdateGroup(ctx context.Context, req *monitoringpb.UpdateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "group.name", req.GetGroup().GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.UpdateGroup[0:len(c.CallOptions.UpdateGroup):len(c.CallOptions.UpdateGroup)], opts...) + var resp *monitoringpb.Group + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.groupClient.UpdateGroup(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteGroup deletes an existing group. +func (c *GroupClient) DeleteGroup(ctx context.Context, req *monitoringpb.DeleteGroupRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.DeleteGroup[0:len(c.CallOptions.DeleteGroup):len(c.CallOptions.DeleteGroup)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.groupClient.DeleteGroup(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// ListGroupMembers lists the monitored resources that are members of a group. +func (c *GroupClient) ListGroupMembers(ctx context.Context, req *monitoringpb.ListGroupMembersRequest, opts ...gax.CallOption) *MonitoredResourceIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListGroupMembers[0:len(c.CallOptions.ListGroupMembers):len(c.CallOptions.ListGroupMembers)], opts...) + it := &MonitoredResourceIterator{} + req = proto.Clone(req).(*monitoringpb.ListGroupMembersRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResource, string, error) { + var resp *monitoringpb.ListGroupMembersResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.groupClient.ListGroupMembers(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.Members, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GroupIterator manages a stream of *monitoringpb.Group. +type GroupIterator struct { + items []*monitoringpb.Group + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Group, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *GroupIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *GroupIterator) Next() (*monitoringpb.Group, error) { + var item *monitoringpb.Group + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *GroupIterator) bufLen() int { + return len(it.items) +} + +func (it *GroupIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// MonitoredResourceIterator manages a stream of *monitoredrespb.MonitoredResource. +type MonitoredResourceIterator struct { + items []*monitoredrespb.MonitoredResource + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResource, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *MonitoredResourceIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *MonitoredResourceIterator) Next() (*monitoredrespb.MonitoredResource, error) { + var item *monitoredrespb.MonitoredResource + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *MonitoredResourceIterator) bufLen() int { + return len(it.items) +} + +func (it *MonitoredResourceIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go new file mode 100644 index 000000000..009c32f45 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go @@ -0,0 +1,468 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +package monitoring + +import ( + "context" + "fmt" + "math" + "time" + + "github.com/golang/protobuf/proto" + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/api/transport" + metricpb "google.golang.org/genproto/googleapis/api/metric" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// MetricCallOptions contains the retry settings for each method of MetricClient. +type MetricCallOptions struct { + ListMonitoredResourceDescriptors []gax.CallOption + GetMonitoredResourceDescriptor []gax.CallOption + ListMetricDescriptors []gax.CallOption + GetMetricDescriptor []gax.CallOption + CreateMetricDescriptor []gax.CallOption + DeleteMetricDescriptor []gax.CallOption + ListTimeSeries []gax.CallOption + CreateTimeSeries []gax.CallOption +} + +func defaultMetricClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("monitoring.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultMetricCallOptions() *MetricCallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 60000 * time.Millisecond, + Multiplier: 1.3, + }) + }), + }, + } + return &MetricCallOptions{ + ListMonitoredResourceDescriptors: retry[[2]string{"default", "idempotent"}], + GetMonitoredResourceDescriptor: retry[[2]string{"default", "idempotent"}], + ListMetricDescriptors: retry[[2]string{"default", "idempotent"}], + GetMetricDescriptor: retry[[2]string{"default", "idempotent"}], + CreateMetricDescriptor: retry[[2]string{"default", "non_idempotent"}], + DeleteMetricDescriptor: retry[[2]string{"default", "idempotent"}], + ListTimeSeries: retry[[2]string{"default", "idempotent"}], + CreateTimeSeries: retry[[2]string{"default", "non_idempotent"}], + } +} + +// MetricClient is a client for interacting with Stackdriver Monitoring API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type MetricClient struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + metricClient monitoringpb.MetricServiceClient + + // The call options for this service. + CallOptions *MetricCallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewMetricClient creates a new metric service client. +// +// Manages metric descriptors, monitored resource descriptors, and +// time series data. +func NewMetricClient(ctx context.Context, opts ...option.ClientOption) (*MetricClient, error) { + conn, err := transport.DialGRPC(ctx, append(defaultMetricClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &MetricClient{ + conn: conn, + CallOptions: defaultMetricCallOptions(), + + metricClient: monitoringpb.NewMetricServiceClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *MetricClient) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *MetricClient) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *MetricClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// ListMonitoredResourceDescriptors lists monitored resource descriptors that match a filter. This method does +// not require a Stackdriver account. +func (c *MetricClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListMonitoredResourceDescriptors[0:len(c.CallOptions.ListMonitoredResourceDescriptors):len(c.CallOptions.ListMonitoredResourceDescriptors)], opts...) + it := &MonitoredResourceDescriptorIterator{} + req = proto.Clone(req).(*monitoringpb.ListMonitoredResourceDescriptorsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResourceDescriptor, string, error) { + var resp *monitoringpb.ListMonitoredResourceDescriptorsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.metricClient.ListMonitoredResourceDescriptors(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.ResourceDescriptors, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetMonitoredResourceDescriptor gets a single monitored resource descriptor. This method does not require a +// Stackdriver account. +func (c *MetricClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetMonitoredResourceDescriptor[0:len(c.CallOptions.GetMonitoredResourceDescriptor):len(c.CallOptions.GetMonitoredResourceDescriptor)], opts...) + var resp *monitoredrespb.MonitoredResourceDescriptor + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.metricClient.GetMonitoredResourceDescriptor(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// ListMetricDescriptors lists metric descriptors that match a filter. This method does not require +// a Stackdriver account. +func (c *MetricClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListMetricDescriptors[0:len(c.CallOptions.ListMetricDescriptors):len(c.CallOptions.ListMetricDescriptors)], opts...) + it := &MetricDescriptorIterator{} + req = proto.Clone(req).(*monitoringpb.ListMetricDescriptorsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*metricpb.MetricDescriptor, string, error) { + var resp *monitoringpb.ListMetricDescriptorsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.metricClient.ListMetricDescriptors(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.MetricDescriptors, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetMetricDescriptor gets a single metric descriptor. This method does not require a Stackdriver +// account. +func (c *MetricClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetMetricDescriptor[0:len(c.CallOptions.GetMetricDescriptor):len(c.CallOptions.GetMetricDescriptor)], opts...) + var resp *metricpb.MetricDescriptor + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.metricClient.GetMetricDescriptor(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateMetricDescriptor creates a new metric descriptor. +// User-created metric descriptors define +// custom metrics (at /monitoring/custom-metrics). +func (c *MetricClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateMetricDescriptor[0:len(c.CallOptions.CreateMetricDescriptor):len(c.CallOptions.CreateMetricDescriptor)], opts...) + var resp *metricpb.MetricDescriptor + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.metricClient.CreateMetricDescriptor(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteMetricDescriptor deletes a metric descriptor. Only user-created +// custom metrics (at /monitoring/custom-metrics) can be deleted. +func (c *MetricClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.DeleteMetricDescriptor[0:len(c.CallOptions.DeleteMetricDescriptor):len(c.CallOptions.DeleteMetricDescriptor)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.metricClient.DeleteMetricDescriptor(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// ListTimeSeries lists time series that match a filter. This method does not require a +// Stackdriver account. +func (c *MetricClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListTimeSeries[0:len(c.CallOptions.ListTimeSeries):len(c.CallOptions.ListTimeSeries)], opts...) + it := &TimeSeriesIterator{} + req = proto.Clone(req).(*monitoringpb.ListTimeSeriesRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeries, string, error) { + var resp *monitoringpb.ListTimeSeriesResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.metricClient.ListTimeSeries(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.TimeSeries, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// CreateTimeSeries creates or adds data to one or more time series. +// The response is empty if all time series in the request were written. +// If any time series could not be written, a corresponding failure message is +// included in the error response. +func (c *MetricClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateTimeSeries[0:len(c.CallOptions.CreateTimeSeries):len(c.CallOptions.CreateTimeSeries)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.metricClient.CreateTimeSeries(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// MetricDescriptorIterator manages a stream of *metricpb.MetricDescriptor. +type MetricDescriptorIterator struct { + items []*metricpb.MetricDescriptor + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*metricpb.MetricDescriptor, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *MetricDescriptorIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *MetricDescriptorIterator) Next() (*metricpb.MetricDescriptor, error) { + var item *metricpb.MetricDescriptor + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *MetricDescriptorIterator) bufLen() int { + return len(it.items) +} + +func (it *MetricDescriptorIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// MonitoredResourceDescriptorIterator manages a stream of *monitoredrespb.MonitoredResourceDescriptor. +type MonitoredResourceDescriptorIterator struct { + items []*monitoredrespb.MonitoredResourceDescriptor + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResourceDescriptor, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *MonitoredResourceDescriptorIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *MonitoredResourceDescriptorIterator) Next() (*monitoredrespb.MonitoredResourceDescriptor, error) { + var item *monitoredrespb.MonitoredResourceDescriptor + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *MonitoredResourceDescriptorIterator) bufLen() int { + return len(it.items) +} + +func (it *MonitoredResourceDescriptorIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// TimeSeriesIterator manages a stream of *monitoringpb.TimeSeries. +type TimeSeriesIterator struct { + items []*monitoringpb.TimeSeries + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeries, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *TimeSeriesIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *TimeSeriesIterator) Next() (*monitoringpb.TimeSeries, error) { + var item *monitoringpb.TimeSeries + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *TimeSeriesIterator) bufLen() int { + return len(it.items) +} + +func (it *TimeSeriesIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go new file mode 100644 index 000000000..31179c860 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go @@ -0,0 +1,384 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +package monitoring + +import ( + "context" + "fmt" + "math" + "time" + + "github.com/golang/protobuf/proto" + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/api/transport" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// NotificationChannelCallOptions contains the retry settings for each method of NotificationChannelClient. +type NotificationChannelCallOptions struct { + ListNotificationChannelDescriptors []gax.CallOption + GetNotificationChannelDescriptor []gax.CallOption + ListNotificationChannels []gax.CallOption + GetNotificationChannel []gax.CallOption + CreateNotificationChannel []gax.CallOption + UpdateNotificationChannel []gax.CallOption + DeleteNotificationChannel []gax.CallOption +} + +func defaultNotificationChannelClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("monitoring.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultNotificationChannelCallOptions() *NotificationChannelCallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 60000 * time.Millisecond, + Multiplier: 1.3, + }) + }), + }, + } + return &NotificationChannelCallOptions{ + ListNotificationChannelDescriptors: retry[[2]string{"default", "idempotent"}], + GetNotificationChannelDescriptor: retry[[2]string{"default", "idempotent"}], + ListNotificationChannels: retry[[2]string{"default", "idempotent"}], + GetNotificationChannel: retry[[2]string{"default", "idempotent"}], + CreateNotificationChannel: retry[[2]string{"default", "non_idempotent"}], + UpdateNotificationChannel: retry[[2]string{"default", "non_idempotent"}], + DeleteNotificationChannel: retry[[2]string{"default", "idempotent"}], + } +} + +// NotificationChannelClient is a client for interacting with Stackdriver Monitoring API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type NotificationChannelClient struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + notificationChannelClient monitoringpb.NotificationChannelServiceClient + + // The call options for this service. + CallOptions *NotificationChannelCallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewNotificationChannelClient creates a new notification channel service client. +// +// The Notification Channel API provides access to configuration that +// controls how messages related to incidents are sent. +func NewNotificationChannelClient(ctx context.Context, opts ...option.ClientOption) (*NotificationChannelClient, error) { + conn, err := transport.DialGRPC(ctx, append(defaultNotificationChannelClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &NotificationChannelClient{ + conn: conn, + CallOptions: defaultNotificationChannelCallOptions(), + + notificationChannelClient: monitoringpb.NewNotificationChannelServiceClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *NotificationChannelClient) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *NotificationChannelClient) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *NotificationChannelClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// ListNotificationChannelDescriptors lists the descriptors for supported channel types. The use of descriptors +// makes it possible for new channel types to be dynamically added. +func (c *NotificationChannelClient) ListNotificationChannelDescriptors(ctx context.Context, req *monitoringpb.ListNotificationChannelDescriptorsRequest, opts ...gax.CallOption) *NotificationChannelDescriptorIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListNotificationChannelDescriptors[0:len(c.CallOptions.ListNotificationChannelDescriptors):len(c.CallOptions.ListNotificationChannelDescriptors)], opts...) + it := &NotificationChannelDescriptorIterator{} + req = proto.Clone(req).(*monitoringpb.ListNotificationChannelDescriptorsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannelDescriptor, string, error) { + var resp *monitoringpb.ListNotificationChannelDescriptorsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.notificationChannelClient.ListNotificationChannelDescriptors(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.ChannelDescriptors, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetNotificationChannelDescriptor gets a single channel descriptor. The descriptor indicates which fields +// are expected / permitted for a notification channel of the given type. +func (c *NotificationChannelClient) GetNotificationChannelDescriptor(ctx context.Context, req *monitoringpb.GetNotificationChannelDescriptorRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetNotificationChannelDescriptor[0:len(c.CallOptions.GetNotificationChannelDescriptor):len(c.CallOptions.GetNotificationChannelDescriptor)], opts...) + var resp *monitoringpb.NotificationChannelDescriptor + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.notificationChannelClient.GetNotificationChannelDescriptor(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// ListNotificationChannels lists the notification channels that have been created for the project. +func (c *NotificationChannelClient) ListNotificationChannels(ctx context.Context, req *monitoringpb.ListNotificationChannelsRequest, opts ...gax.CallOption) *NotificationChannelIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListNotificationChannels[0:len(c.CallOptions.ListNotificationChannels):len(c.CallOptions.ListNotificationChannels)], opts...) + it := &NotificationChannelIterator{} + req = proto.Clone(req).(*monitoringpb.ListNotificationChannelsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannel, string, error) { + var resp *monitoringpb.ListNotificationChannelsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.notificationChannelClient.ListNotificationChannels(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.NotificationChannels, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetNotificationChannel gets a single notification channel. The channel includes the relevant +// configuration details with which the channel was created. However, the +// response may truncate or omit passwords, API keys, or other private key +// matter and thus the response may not be 100% identical to the information +// that was supplied in the call to the create method. +func (c *NotificationChannelClient) GetNotificationChannel(ctx context.Context, req *monitoringpb.GetNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetNotificationChannel[0:len(c.CallOptions.GetNotificationChannel):len(c.CallOptions.GetNotificationChannel)], opts...) + var resp *monitoringpb.NotificationChannel + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.notificationChannelClient.GetNotificationChannel(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateNotificationChannel creates a new notification channel, representing a single notification +// endpoint such as an email address, SMS number, or PagerDuty service. +func (c *NotificationChannelClient) CreateNotificationChannel(ctx context.Context, req *monitoringpb.CreateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateNotificationChannel[0:len(c.CallOptions.CreateNotificationChannel):len(c.CallOptions.CreateNotificationChannel)], opts...) + var resp *monitoringpb.NotificationChannel + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.notificationChannelClient.CreateNotificationChannel(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// UpdateNotificationChannel updates a notification channel. Fields not specified in the field mask +// remain unchanged. +func (c *NotificationChannelClient) UpdateNotificationChannel(ctx context.Context, req *monitoringpb.UpdateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "notification_channel.name", req.GetNotificationChannel().GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.UpdateNotificationChannel[0:len(c.CallOptions.UpdateNotificationChannel):len(c.CallOptions.UpdateNotificationChannel)], opts...) + var resp *monitoringpb.NotificationChannel + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.notificationChannelClient.UpdateNotificationChannel(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteNotificationChannel deletes a notification channel. +func (c *NotificationChannelClient) DeleteNotificationChannel(ctx context.Context, req *monitoringpb.DeleteNotificationChannelRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.DeleteNotificationChannel[0:len(c.CallOptions.DeleteNotificationChannel):len(c.CallOptions.DeleteNotificationChannel)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.notificationChannelClient.DeleteNotificationChannel(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// NotificationChannelDescriptorIterator manages a stream of *monitoringpb.NotificationChannelDescriptor. +type NotificationChannelDescriptorIterator struct { + items []*monitoringpb.NotificationChannelDescriptor + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannelDescriptor, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *NotificationChannelDescriptorIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *NotificationChannelDescriptorIterator) Next() (*monitoringpb.NotificationChannelDescriptor, error) { + var item *monitoringpb.NotificationChannelDescriptor + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *NotificationChannelDescriptorIterator) bufLen() int { + return len(it.items) +} + +func (it *NotificationChannelDescriptorIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// NotificationChannelIterator manages a stream of *monitoringpb.NotificationChannel. +type NotificationChannelIterator struct { + items []*monitoringpb.NotificationChannel + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannel, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *NotificationChannelIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *NotificationChannelIterator) Next() (*monitoringpb.NotificationChannel, error) { + var item *monitoringpb.NotificationChannel + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *NotificationChannelIterator) bufLen() int { + return len(it.items) +} + +func (it *NotificationChannelIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go b/vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go new file mode 100644 index 000000000..b2b514ba5 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go @@ -0,0 +1,107 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package monitoring + +// GroupProjectPath returns the path for the project resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s", project) +// instead. +func GroupProjectPath(project string) string { + return "" + + "projects/" + + project + + "" +} + +// GroupGroupPath returns the path for the group resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s/groups/%s", project, group) +// instead. +func GroupGroupPath(project, group string) string { + return "" + + "projects/" + + project + + "/groups/" + + group + + "" +} + +// MetricProjectPath returns the path for the project resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s", project) +// instead. +func MetricProjectPath(project string) string { + return "" + + "projects/" + + project + + "" +} + +// MetricMetricDescriptorPath returns the path for the metric descriptor resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s/metricDescriptors/%s", project, metricDescriptor) +// instead. +func MetricMetricDescriptorPath(project, metricDescriptor string) string { + return "" + + "projects/" + + project + + "/metricDescriptors/" + + metricDescriptor + + "" +} + +// MetricMonitoredResourceDescriptorPath returns the path for the monitored resource descriptor resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s/monitoredResourceDescriptors/%s", project, monitoredResourceDescriptor) +// instead. +func MetricMonitoredResourceDescriptorPath(project, monitoredResourceDescriptor string) string { + return "" + + "projects/" + + project + + "/monitoredResourceDescriptors/" + + monitoredResourceDescriptor + + "" +} + +// UptimeCheckProjectPath returns the path for the project resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s", project) +// instead. +func UptimeCheckProjectPath(project string) string { + return "" + + "projects/" + + project + + "" +} + +// UptimeCheckUptimeCheckConfigPath returns the path for the uptime check config resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s/uptimeCheckConfigs/%s", project, uptimeCheckConfig) +// instead. +func UptimeCheckUptimeCheckConfigPath(project, uptimeCheckConfig string) string { + return "" + + "projects/" + + project + + "/uptimeCheckConfigs/" + + uptimeCheckConfig + + "" +} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go new file mode 100644 index 000000000..5cb901188 --- /dev/null +++ b/vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go @@ -0,0 +1,368 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +package monitoring + +import ( + "context" + "fmt" + "math" + "time" + + "github.com/golang/protobuf/proto" + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/api/transport" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// UptimeCheckCallOptions contains the retry settings for each method of UptimeCheckClient. +type UptimeCheckCallOptions struct { + ListUptimeCheckConfigs []gax.CallOption + GetUptimeCheckConfig []gax.CallOption + CreateUptimeCheckConfig []gax.CallOption + UpdateUptimeCheckConfig []gax.CallOption + DeleteUptimeCheckConfig []gax.CallOption + ListUptimeCheckIps []gax.CallOption +} + +func defaultUptimeCheckClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("monitoring.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultUptimeCheckCallOptions() *UptimeCheckCallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 60000 * time.Millisecond, + Multiplier: 1.3, + }) + }), + }, + } + return &UptimeCheckCallOptions{ + ListUptimeCheckConfigs: retry[[2]string{"default", "idempotent"}], + GetUptimeCheckConfig: retry[[2]string{"default", "idempotent"}], + CreateUptimeCheckConfig: retry[[2]string{"default", "non_idempotent"}], + UpdateUptimeCheckConfig: retry[[2]string{"default", "non_idempotent"}], + DeleteUptimeCheckConfig: retry[[2]string{"default", "idempotent"}], + ListUptimeCheckIps: retry[[2]string{"default", "idempotent"}], + } +} + +// UptimeCheckClient is a client for interacting with Stackdriver Monitoring API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type UptimeCheckClient struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + uptimeCheckClient monitoringpb.UptimeCheckServiceClient + + // The call options for this service. + CallOptions *UptimeCheckCallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewUptimeCheckClient creates a new uptime check service client. +// +// The UptimeCheckService API is used to manage (list, create, delete, edit) +// uptime check configurations in the Stackdriver Monitoring product. An uptime +// check is a piece of configuration that determines which resources and +// services to monitor for availability. These configurations can also be +// configured interactively by navigating to the [Cloud Console] +// (http://console.cloud.google.com), selecting the appropriate project, +// clicking on "Monitoring" on the left-hand side to navigate to Stackdriver, +// and then clicking on "Uptime". +func NewUptimeCheckClient(ctx context.Context, opts ...option.ClientOption) (*UptimeCheckClient, error) { + conn, err := transport.DialGRPC(ctx, append(defaultUptimeCheckClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &UptimeCheckClient{ + conn: conn, + CallOptions: defaultUptimeCheckCallOptions(), + + uptimeCheckClient: monitoringpb.NewUptimeCheckServiceClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *UptimeCheckClient) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *UptimeCheckClient) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *UptimeCheckClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// ListUptimeCheckConfigs lists the existing valid uptime check configurations for the project, +// leaving out any invalid configurations. +func (c *UptimeCheckClient) ListUptimeCheckConfigs(ctx context.Context, req *monitoringpb.ListUptimeCheckConfigsRequest, opts ...gax.CallOption) *UptimeCheckConfigIterator { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.ListUptimeCheckConfigs[0:len(c.CallOptions.ListUptimeCheckConfigs):len(c.CallOptions.ListUptimeCheckConfigs)], opts...) + it := &UptimeCheckConfigIterator{} + req = proto.Clone(req).(*monitoringpb.ListUptimeCheckConfigsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckConfig, string, error) { + var resp *monitoringpb.ListUptimeCheckConfigsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.uptimeCheckClient.ListUptimeCheckConfigs(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.UptimeCheckConfigs, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// GetUptimeCheckConfig gets a single uptime check configuration. +func (c *UptimeCheckClient) GetUptimeCheckConfig(ctx context.Context, req *monitoringpb.GetUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.GetUptimeCheckConfig[0:len(c.CallOptions.GetUptimeCheckConfig):len(c.CallOptions.GetUptimeCheckConfig)], opts...) + var resp *monitoringpb.UptimeCheckConfig + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.uptimeCheckClient.GetUptimeCheckConfig(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// CreateUptimeCheckConfig creates a new uptime check configuration. +func (c *UptimeCheckClient) CreateUptimeCheckConfig(ctx context.Context, req *monitoringpb.CreateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", req.GetParent())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateUptimeCheckConfig[0:len(c.CallOptions.CreateUptimeCheckConfig):len(c.CallOptions.CreateUptimeCheckConfig)], opts...) + var resp *monitoringpb.UptimeCheckConfig + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.uptimeCheckClient.CreateUptimeCheckConfig(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// UpdateUptimeCheckConfig updates an uptime check configuration. You can either replace the entire +// configuration with a new one or replace only certain fields in the current +// configuration by specifying the fields to be updated via "updateMask". +// Returns the updated configuration. +func (c *UptimeCheckClient) UpdateUptimeCheckConfig(ctx context.Context, req *monitoringpb.UpdateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "uptime_check_config.name", req.GetUptimeCheckConfig().GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.UpdateUptimeCheckConfig[0:len(c.CallOptions.UpdateUptimeCheckConfig):len(c.CallOptions.UpdateUptimeCheckConfig)], opts...) + var resp *monitoringpb.UptimeCheckConfig + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.uptimeCheckClient.UpdateUptimeCheckConfig(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} + +// DeleteUptimeCheckConfig deletes an uptime check configuration. Note that this method will fail +// if the uptime check configuration is referenced by an alert policy or +// other dependent configs that would be rendered invalid by the deletion. +func (c *UptimeCheckClient) DeleteUptimeCheckConfig(ctx context.Context, req *monitoringpb.DeleteUptimeCheckConfigRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.DeleteUptimeCheckConfig[0:len(c.CallOptions.DeleteUptimeCheckConfig):len(c.CallOptions.DeleteUptimeCheckConfig)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.uptimeCheckClient.DeleteUptimeCheckConfig(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// ListUptimeCheckIps returns the list of IPs that checkers run from +func (c *UptimeCheckClient) ListUptimeCheckIps(ctx context.Context, req *monitoringpb.ListUptimeCheckIpsRequest, opts ...gax.CallOption) *UptimeCheckIpIterator { + ctx = insertMetadata(ctx, c.xGoogMetadata) + opts = append(c.CallOptions.ListUptimeCheckIps[0:len(c.CallOptions.ListUptimeCheckIps):len(c.CallOptions.ListUptimeCheckIps)], opts...) + it := &UptimeCheckIpIterator{} + req = proto.Clone(req).(*monitoringpb.ListUptimeCheckIpsRequest) + it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckIp, string, error) { + var resp *monitoringpb.ListUptimeCheckIpsResponse + req.PageToken = pageToken + if pageSize > math.MaxInt32 { + req.PageSize = math.MaxInt32 + } else { + req.PageSize = int32(pageSize) + } + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.uptimeCheckClient.ListUptimeCheckIps(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, "", err + } + return resp.UptimeCheckIps, resp.NextPageToken, nil + } + fetch := func(pageSize int, pageToken string) (string, error) { + items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) + if err != nil { + return "", err + } + it.items = append(it.items, items...) + return nextPageToken, nil + } + it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) + it.pageInfo.MaxSize = int(req.PageSize) + it.pageInfo.Token = req.PageToken + return it +} + +// UptimeCheckConfigIterator manages a stream of *monitoringpb.UptimeCheckConfig. +type UptimeCheckConfigIterator struct { + items []*monitoringpb.UptimeCheckConfig + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckConfig, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *UptimeCheckConfigIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *UptimeCheckConfigIterator) Next() (*monitoringpb.UptimeCheckConfig, error) { + var item *monitoringpb.UptimeCheckConfig + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *UptimeCheckConfigIterator) bufLen() int { + return len(it.items) +} + +func (it *UptimeCheckConfigIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} + +// UptimeCheckIpIterator manages a stream of *monitoringpb.UptimeCheckIp. +type UptimeCheckIpIterator struct { + items []*monitoringpb.UptimeCheckIp + pageInfo *iterator.PageInfo + nextFunc func() error + + // InternalFetch is for use by the Google Cloud Libraries only. + // It is not part of the stable interface of this package. + // + // InternalFetch returns results from a single call to the underlying RPC. + // The number of results is no greater than pageSize. + // If there are no more results, nextPageToken is empty and err is nil. + InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckIp, nextPageToken string, err error) +} + +// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. +func (it *UptimeCheckIpIterator) PageInfo() *iterator.PageInfo { + return it.pageInfo +} + +// Next returns the next result. Its second return value is iterator.Done if there are no more +// results. Once Next returns Done, all subsequent calls will return Done. +func (it *UptimeCheckIpIterator) Next() (*monitoringpb.UptimeCheckIp, error) { + var item *monitoringpb.UptimeCheckIp + if err := it.nextFunc(); err != nil { + return item, err + } + item = it.items[0] + it.items = it.items[1:] + return item, nil +} + +func (it *UptimeCheckIpIterator) bufLen() int { + return len(it.items) +} + +func (it *UptimeCheckIpIterator) takeBuf() interface{} { + b := it.items + it.items = nil + return b +} diff --git a/vendor/cloud.google.com/go/trace/apiv2/doc.go b/vendor/cloud.google.com/go/trace/apiv2/doc.go new file mode 100644 index 000000000..270251ee3 --- /dev/null +++ b/vendor/cloud.google.com/go/trace/apiv2/doc.go @@ -0,0 +1,105 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +// Package trace is an auto-generated package for the +// Stackdriver Trace API. +// +// NOTE: This package is in alpha. It is not stable, and is likely to change. +// +// Sends application trace data to Stackdriver Trace for viewing. Trace data +// is +// collected for all App Engine applications by default. Trace data from +// other +// applications can be provided using this API. +// +// Use of Context +// +// The ctx passed to NewClient is used for authentication requests and +// for creating the underlying connection, but is not used for subsequent calls. +// Individual methods on the client use the ctx given to them. +// +// To close the open connection, use the Close() method. +// +// For information about setting deadlines, reusing contexts, and more +// please visit godoc.org/cloud.google.com/go. +package trace // import "cloud.google.com/go/trace/apiv2" + +import ( + "context" + "runtime" + "strings" + "unicode" + + "google.golang.org/grpc/metadata" +) + +func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { + out, _ := metadata.FromOutgoingContext(ctx) + out = out.Copy() + for _, md := range mds { + for k, v := range md { + out[k] = append(out[k], v...) + } + } + return metadata.NewOutgoingContext(ctx, out) +} + +// DefaultAuthScopes reports the default set of authentication scopes to use with this package. +func DefaultAuthScopes() []string { + return []string{ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/trace.append", + } +} + +// versionGo returns the Go runtime version. The returned string +// has no whitespace, suitable for reporting in header. +func versionGo() string { + const develPrefix = "devel +" + + s := runtime.Version() + if strings.HasPrefix(s, develPrefix) { + s = s[len(develPrefix):] + if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { + s = s[:p] + } + return s + } + + notSemverRune := func(r rune) bool { + return strings.IndexRune("0123456789.", r) < 0 + } + + if strings.HasPrefix(s, "go1") { + s = s[2:] + var prerelease string + if p := strings.IndexFunc(s, notSemverRune); p >= 0 { + s, prerelease = s[:p], s[p:] + } + if strings.HasSuffix(s, ".") { + s += "0" + } else if strings.Count(s, ".") < 2 { + s += ".0" + } + if prerelease != "" { + s += "-" + prerelease + } + return s + } + return "UNKNOWN" +} + +const versionClient = "20190508" diff --git a/vendor/cloud.google.com/go/trace/apiv2/path_funcs.go b/vendor/cloud.google.com/go/trace/apiv2/path_funcs.go new file mode 100644 index 000000000..80b8d40b5 --- /dev/null +++ b/vendor/cloud.google.com/go/trace/apiv2/path_funcs.go @@ -0,0 +1,43 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trace + +// ProjectPath returns the path for the project resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s", project) +// instead. +func ProjectPath(project string) string { + return "" + + "projects/" + + project + + "" +} + +// SpanPath returns the path for the span resource. +// +// Deprecated: Use +// fmt.Sprintf("projects/%s/traces/%s/spans/%s", project, trace, span) +// instead. +func SpanPath(project, trace, span string) string { + return "" + + "projects/" + + project + + "/traces/" + + trace + + "/spans/" + + span + + "" +} diff --git a/vendor/cloud.google.com/go/trace/apiv2/trace_client.go b/vendor/cloud.google.com/go/trace/apiv2/trace_client.go new file mode 100644 index 000000000..36088401d --- /dev/null +++ b/vendor/cloud.google.com/go/trace/apiv2/trace_client.go @@ -0,0 +1,154 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by gapic-generator. DO NOT EDIT. + +package trace + +import ( + "context" + "fmt" + "time" + + gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/option" + "google.golang.org/api/transport" + cloudtracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// CallOptions contains the retry settings for each method of Client. +type CallOptions struct { + BatchWriteSpans []gax.CallOption + CreateSpan []gax.CallOption +} + +func defaultClientOptions() []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint("cloudtrace.googleapis.com:443"), + option.WithScopes(DefaultAuthScopes()...), + } +} + +func defaultCallOptions() *CallOptions { + retry := map[[2]string][]gax.CallOption{ + {"default", "idempotent"}: { + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 1000 * time.Millisecond, + Multiplier: 1.2, + }) + }), + }, + } + return &CallOptions{ + BatchWriteSpans: retry[[2]string{"default", "non_idempotent"}], + CreateSpan: retry[[2]string{"default", "idempotent"}], + } +} + +// Client is a client for interacting with Stackdriver Trace API. +// +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type Client struct { + // The connection to the service. + conn *grpc.ClientConn + + // The gRPC API client. + client cloudtracepb.TraceServiceClient + + // The call options for this service. + CallOptions *CallOptions + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD +} + +// NewClient creates a new trace service client. +// +// This file describes an API for collecting and viewing traces and spans +// within a trace. A Trace is a collection of spans corresponding to a single +// operation or set of operations for an application. A span is an individual +// timed event which forms a node of the trace tree. A single trace may +// contain span(s) from multiple services. +func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { + conn, err := transport.DialGRPC(ctx, append(defaultClientOptions(), opts...)...) + if err != nil { + return nil, err + } + c := &Client{ + conn: conn, + CallOptions: defaultCallOptions(), + + client: cloudtracepb.NewTraceServiceClient(conn), + } + c.setGoogleClientInfo() + return c, nil +} + +// Connection returns the client's connection to the API service. +func (c *Client) Connection() *grpc.ClientConn { + return c.conn +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *Client) Close() error { + return c.conn.Close() +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *Client) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// BatchWriteSpans sends new spans to new or existing traces. You cannot update +// existing spans. +func (c *Client) BatchWriteSpans(ctx context.Context, req *cloudtracepb.BatchWriteSpansRequest, opts ...gax.CallOption) error { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.BatchWriteSpans[0:len(c.CallOptions.BatchWriteSpans):len(c.CallOptions.BatchWriteSpans)], opts...) + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + _, err = c.client.BatchWriteSpans(ctx, req, settings.GRPC...) + return err + }, opts...) + return err +} + +// CreateSpan creates a new span. +func (c *Client) CreateSpan(ctx context.Context, req *cloudtracepb.Span, opts ...gax.CallOption) (*cloudtracepb.Span, error) { + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", req.GetName())) + ctx = insertMetadata(ctx, c.xGoogMetadata, md) + opts = append(c.CallOptions.CreateSpan[0:len(c.CallOptions.CreateSpan):len(c.CallOptions.CreateSpan)], opts...) + var resp *cloudtracepb.Span + err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + var err error + resp, err = c.client.CreateSpan(ctx, req, settings.GRPC...) + return err + }, opts...) + if err != nil { + return nil, err + } + return resp, nil +} diff --git a/vendor/contrib.go.opencensus.io/exporter/ocagent/LICENSE b/vendor/contrib.go.opencensus.io/exporter/ocagent/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/ocagent/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/contrib.go.opencensus.io/exporter/ocagent/common.go b/vendor/contrib.go.opencensus.io/exporter/ocagent/common.go new file mode 100644 index 000000000..297e44b6e --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/ocagent/common.go @@ -0,0 +1,38 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ocagent + +import ( + "math/rand" + "time" +) + +var randSrc = rand.New(rand.NewSource(time.Now().UnixNano())) + +// retries function fn upto n times, if fn returns an error lest it returns nil early. +// It applies exponential backoff in units of (1< 0 { + ctx = metadata.NewOutgoingContext(ctx, metadata.New(ae.headers)) + } + traceExporter, err := traceSvcClient.Export(ctx) + if err != nil { + return fmt.Errorf("Exporter.Start:: TraceServiceClient: %v", err) + } + + firstTraceMessage := &agenttracepb.ExportTraceServiceRequest{ + Node: node, + Resource: ae.resource, + } + if err := traceExporter.Send(firstTraceMessage); err != nil { + return fmt.Errorf("Exporter.Start:: Failed to initiate the Config service: %v", err) + } + + ae.mu.Lock() + ae.traceExporter = traceExporter + ae.mu.Unlock() + + // Initiate the config service by sending over node identifier info. + configStream, err := traceSvcClient.Config(context.Background()) + if err != nil { + return fmt.Errorf("Exporter.Start:: ConfigStream: %v", err) + } + firstCfgMessage := &agenttracepb.CurrentLibraryConfig{Node: node} + if err := configStream.Send(firstCfgMessage); err != nil { + return fmt.Errorf("Exporter.Start:: Failed to initiate the Config service: %v", err) + } + + // In the background, handle trace configurations that are beamed down + // by the agent, but also reply to it with the applied configuration. + go ae.handleConfigStreaming(configStream) + + return nil +} + +func (ae *Exporter) createMetricsServiceConnection(cc *grpc.ClientConn, node *commonpb.Node) error { + metricsSvcClient := agentmetricspb.NewMetricsServiceClient(cc) + metricsExporter, err := metricsSvcClient.Export(context.Background()) + if err != nil { + return fmt.Errorf("MetricsExporter: failed to start the service client: %v", err) + } + // Initiate the metrics service by sending over the first message just containing the Node and Resource. + firstMetricsMessage := &agentmetricspb.ExportMetricsServiceRequest{ + Node: node, + Resource: ae.resource, + } + if err := metricsExporter.Send(firstMetricsMessage); err != nil { + return fmt.Errorf("MetricsExporter:: failed to send the first message: %v", err) + } + + ae.mu.Lock() + ae.metricsExporter = metricsExporter + ae.mu.Unlock() + + // With that we are good to go and can start sending metrics + return nil +} + +func (ae *Exporter) dialToAgent() (*grpc.ClientConn, error) { + addr := ae.prepareAgentAddress() + var dialOpts []grpc.DialOption + if ae.clientTransportCredentials != nil { + dialOpts = append(dialOpts, grpc.WithTransportCredentials(ae.clientTransportCredentials)) + } else if ae.canDialInsecure { + dialOpts = append(dialOpts, grpc.WithInsecure()) + } + if ae.compressor != "" { + dialOpts = append(dialOpts, grpc.WithDefaultCallOptions(grpc.UseCompressor(ae.compressor))) + } + dialOpts = append(dialOpts, grpc.WithStatsHandler(&ocgrpc.ClientHandler{})) + if len(ae.grpcDialOptions) != 0 { + dialOpts = append(dialOpts, ae.grpcDialOptions...) + } + + ctx := context.Background() + if len(ae.headers) > 0 { + ctx = metadata.NewOutgoingContext(ctx, metadata.New(ae.headers)) + } + return grpc.DialContext(ctx, addr, dialOpts...) +} + +func (ae *Exporter) handleConfigStreaming(configStream agenttracepb.TraceService_ConfigClient) error { + // Note: We haven't yet implemented configuration sending so we + // should NOT be changing connection states within this function for now. + for { + recv, err := configStream.Recv() + if err != nil { + // TODO: Check if this is a transient error or exponential backoff-able. + return err + } + cfg := recv.Config + if cfg == nil { + continue + } + + // Otherwise now apply the trace configuration sent down from the agent + if psamp := cfg.GetProbabilitySampler(); psamp != nil { + trace.ApplyConfig(trace.Config{DefaultSampler: trace.ProbabilitySampler(psamp.SamplingProbability)}) + } else if csamp := cfg.GetConstantSampler(); csamp != nil { + alwaysSample := csamp.Decision == tracepb.ConstantSampler_ALWAYS_ON + if alwaysSample { + trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) + } else { + trace.ApplyConfig(trace.Config{DefaultSampler: trace.NeverSample()}) + } + } else { // TODO: Add the rate limiting sampler here + } + + // Then finally send back to upstream the newly applied configuration + err = configStream.Send(&agenttracepb.CurrentLibraryConfig{Config: &tracepb.TraceConfig{Sampler: cfg.Sampler}}) + if err != nil { + return err + } + } +} + +// Stop shuts down all the connections and resources +// related to the exporter. +func (ae *Exporter) Stop() error { + ae.mu.RLock() + cc := ae.grpcClientConn + started := ae.started + stopped := ae.stopped + ae.mu.RUnlock() + + if !started { + return errNotStarted + } + if stopped { + // TODO: tell the user that we've already stopped, so perhaps a sentinel error? + return nil + } + + ae.Flush() + + // Now close the underlying gRPC connection. + var err error + if cc != nil { + err = cc.Close() + } + + // At this point we can change the state variables: started and stopped + ae.mu.Lock() + ae.started = false + ae.stopped = true + ae.mu.Unlock() + close(ae.stopCh) + + // Ensure that the backgroundConnector returns + <-ae.backgroundConnectionDoneCh + + return err +} + +func (ae *Exporter) ExportSpan(sd *trace.SpanData) { + if sd == nil { + return + } + _ = ae.traceBundler.Add(sd, 1) +} + +func (ae *Exporter) ExportTraceServiceRequest(batch *agenttracepb.ExportTraceServiceRequest) error { + if batch == nil || len(batch.Spans) == 0 { + return nil + } + + select { + case <-ae.stopCh: + return errStopped + + default: + if lastConnectErr := ae.lastConnectError(); lastConnectErr != nil { + return fmt.Errorf("ExportTraceServiceRequest: no active connection, last connection error: %v", lastConnectErr) + } + + ae.senderMu.Lock() + err := ae.traceExporter.Send(batch) + ae.senderMu.Unlock() + if err != nil { + if err == io.EOF { + ae.recvMu.Lock() + // Perform a .Recv to try to find out why the RPC actually ended. + // See: + // * https://github.com/grpc/grpc-go/blob/d389f9fac68eea0dcc49957d0b4cca5b3a0a7171/stream.go#L98-L100 + // * https://groups.google.com/forum/#!msg/grpc-io/XcN4hA9HonI/F_UDiejTAwAJ + for { + _, err = ae.traceExporter.Recv() + if err != nil { + break + } + } + ae.recvMu.Unlock() + } + + ae.setStateDisconnected(err) + if err != io.EOF { + return err + } + } + return nil + } +} + +func (ae *Exporter) ExportView(vd *view.Data) { + if vd == nil { + return + } + _ = ae.viewDataBundler.Add(vd, 1) +} + +// ExportMetricsServiceRequest sends proto metrics with the metrics service client. +func (ae *Exporter) ExportMetricsServiceRequest(batch *agentmetricspb.ExportMetricsServiceRequest) error { + if batch == nil || len(batch.Metrics) == 0 { + return nil + } + + select { + case <-ae.stopCh: + return errStopped + + default: + if lastConnectErr := ae.lastConnectError(); lastConnectErr != nil { + return fmt.Errorf("ExportMetricsServiceRequest: no active connection, last connection error: %v", lastConnectErr) + } + + ae.senderMu.Lock() + err := ae.metricsExporter.Send(batch) + ae.senderMu.Unlock() + if err != nil { + if err == io.EOF { + ae.recvMu.Lock() + // Perform a .Recv to try to find out why the RPC actually ended. + // See: + // * https://github.com/grpc/grpc-go/blob/d389f9fac68eea0dcc49957d0b4cca5b3a0a7171/stream.go#L98-L100 + // * https://groups.google.com/forum/#!msg/grpc-io/XcN4hA9HonI/F_UDiejTAwAJ + for { + _, err = ae.metricsExporter.Recv() + if err != nil { + break + } + } + ae.recvMu.Unlock() + } + + ae.setStateDisconnected(err) + if err != io.EOF { + return err + } + } + return nil + } +} + +func ocSpanDataToPbSpans(sdl []*trace.SpanData) []*tracepb.Span { + if len(sdl) == 0 { + return nil + } + protoSpans := make([]*tracepb.Span, 0, len(sdl)) + for _, sd := range sdl { + if sd != nil { + protoSpans = append(protoSpans, ocSpanToProtoSpan(sd)) + } + } + return protoSpans +} + +func (ae *Exporter) uploadTraces(sdl []*trace.SpanData) { + select { + case <-ae.stopCh: + return + + default: + if !ae.connected() { + return + } + + protoSpans := ocSpanDataToPbSpans(sdl) + if len(protoSpans) == 0 { + return + } + ae.senderMu.Lock() + err := ae.traceExporter.Send(&agenttracepb.ExportTraceServiceRequest{ + Spans: protoSpans, + Resource: resourceProtoFromEnv(), + }) + ae.senderMu.Unlock() + if err != nil { + ae.setStateDisconnected(err) + } + } +} + +func ocViewDataToPbMetrics(vdl []*view.Data) []*metricspb.Metric { + if len(vdl) == 0 { + return nil + } + metrics := make([]*metricspb.Metric, 0, len(vdl)) + for _, vd := range vdl { + if vd != nil { + vmetric, err := viewDataToMetric(vd) + // TODO: (@odeke-em) somehow report this error, if it is non-nil. + if err == nil && vmetric != nil { + metrics = append(metrics, vmetric) + } + } + } + return metrics +} + +func (ae *Exporter) uploadViewData(vdl []*view.Data) { + protoMetrics := ocViewDataToPbMetrics(vdl) + if len(protoMetrics) == 0 { + return + } + req := &agentmetricspb.ExportMetricsServiceRequest{ + Metrics: protoMetrics, + Resource: resourceProtoFromEnv(), + // TODO:(@odeke-em) + // a) Figure out how to derive a Node from the environment + // or better letting users of the exporter configure it. + } + ae.ExportMetricsServiceRequest(req) +} + +func (ae *Exporter) Flush() { + ae.traceBundler.Flush() + ae.viewDataBundler.Flush() +} + +func resourceProtoFromEnv() *resourcepb.Resource { + rs, _ := resource.FromEnv(context.Background()) + if rs == nil { + return nil + } + return resourceToResourcePb(rs) +} + +func resourceToResourcePb(rs *resource.Resource) *resourcepb.Resource { + rprs := &resourcepb.Resource{ + Type: rs.Type, + } + if rs.Labels != nil { + rprs.Labels = make(map[string]string) + for k, v := range rs.Labels { + rprs.Labels[k] = v + } + } + return rprs +} diff --git a/vendor/contrib.go.opencensus.io/exporter/ocagent/options.go b/vendor/contrib.go.opencensus.io/exporter/ocagent/options.go new file mode 100644 index 000000000..6820216f3 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/ocagent/options.go @@ -0,0 +1,161 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ocagent + +import ( + "time" + + "go.opencensus.io/resource" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +const ( + DefaultAgentPort uint16 = 55678 + DefaultAgentHost string = "localhost" +) + +type ExporterOption interface { + withExporter(e *Exporter) +} + +type resourceDetector resource.Detector + +var _ ExporterOption = (*resourceDetector)(nil) + +func (rd resourceDetector) withExporter(e *Exporter) { + e.resourceDetector = resource.Detector(rd) +} + +// WithResourceDetector allows one to register a resource detector. Resource Detector is used +// to detect resources associated with the application. Detected resource is exported +// along with the metrics. If the detector fails then it panics. +// If a resource detector is not provided then by default it detects from the environment. +func WithResourceDetector(rd resource.Detector) ExporterOption { + return resourceDetector(rd) +} + +type insecureGrpcConnection int + +var _ ExporterOption = (*insecureGrpcConnection)(nil) + +func (igc *insecureGrpcConnection) withExporter(e *Exporter) { + e.canDialInsecure = true +} + +// WithInsecure disables client transport security for the exporter's gRPC connection +// just like grpc.WithInsecure() https://godoc.org/google.golang.org/grpc#WithInsecure +// does. Note, by default, client security is required unless WithInsecure is used. +func WithInsecure() ExporterOption { return new(insecureGrpcConnection) } + +type addressSetter string + +func (as addressSetter) withExporter(e *Exporter) { + e.agentAddress = string(as) +} + +var _ ExporterOption = (*addressSetter)(nil) + +// WithAddress allows one to set the address that the exporter will +// connect to the agent on. If unset, it will instead try to use +// connect to DefaultAgentHost:DefaultAgentPort +func WithAddress(addr string) ExporterOption { + return addressSetter(addr) +} + +type serviceNameSetter string + +func (sns serviceNameSetter) withExporter(e *Exporter) { + e.serviceName = string(sns) +} + +var _ ExporterOption = (*serviceNameSetter)(nil) + +// WithServiceName allows one to set/override the service name +// that the exporter will report to the agent. +func WithServiceName(serviceName string) ExporterOption { + return serviceNameSetter(serviceName) +} + +type reconnectionPeriod time.Duration + +func (rp reconnectionPeriod) withExporter(e *Exporter) { + e.reconnectionPeriod = time.Duration(rp) +} + +func WithReconnectionPeriod(rp time.Duration) ExporterOption { + return reconnectionPeriod(rp) +} + +type compressorSetter string + +func (c compressorSetter) withExporter(e *Exporter) { + e.compressor = string(c) +} + +// UseCompressor will set the compressor for the gRPC client to use when sending requests. +// It is the responsibility of the caller to ensure that the compressor set has been registered +// with google.golang.org/grpc/encoding. This can be done by encoding.RegisterCompressor. Some +// compressors auto-register on import, such as gzip, which can be registered by calling +// `import _ "google.golang.org/grpc/encoding/gzip"` +func UseCompressor(compressorName string) ExporterOption { + return compressorSetter(compressorName) +} + +type headerSetter map[string]string + +func (h headerSetter) withExporter(e *Exporter) { + e.headers = map[string]string(h) +} + +// WithHeaders will send the provided headers when the gRPC stream connection +// is instantiated +func WithHeaders(headers map[string]string) ExporterOption { + return headerSetter(headers) +} + +type clientCredentials struct { + credentials.TransportCredentials +} + +var _ ExporterOption = (*clientCredentials)(nil) + +// WithTLSCredentials allows the connection to use TLS credentials +// when talking to the server. It takes in grpc.TransportCredentials instead +// of say a Certificate file or a tls.Certificate, because the retrieving +// these credentials can be done in many ways e.g. plain file, in code tls.Config +// or by certificate rotation, so it is up to the caller to decide what to use. +func WithTLSCredentials(creds credentials.TransportCredentials) ExporterOption { + return &clientCredentials{TransportCredentials: creds} +} + +func (cc *clientCredentials) withExporter(e *Exporter) { + e.clientTransportCredentials = cc.TransportCredentials +} + +type grpcDialOptions []grpc.DialOption + +var _ ExporterOption = (*grpcDialOptions)(nil) + +// WithGRPCDialOption opens support to any grpc.DialOption to be used. If it conflicts +// with some other configuration the GRPC specified via the agent the ones here will +// take preference since they are set last. +func WithGRPCDialOption(opts ...grpc.DialOption) ExporterOption { + return grpcDialOptions(opts) +} + +func (opts grpcDialOptions) withExporter(e *Exporter) { + e.grpcDialOptions = opts +} diff --git a/vendor/contrib.go.opencensus.io/exporter/ocagent/transform_spans.go b/vendor/contrib.go.opencensus.io/exporter/ocagent/transform_spans.go new file mode 100644 index 000000000..983ebe7b7 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/ocagent/transform_spans.go @@ -0,0 +1,248 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ocagent + +import ( + "math" + "time" + + "go.opencensus.io/trace" + "go.opencensus.io/trace/tracestate" + + tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1" + "github.com/golang/protobuf/ptypes/timestamp" +) + +const ( + maxAnnotationEventsPerSpan = 32 + maxMessageEventsPerSpan = 128 +) + +func ocSpanToProtoSpan(sd *trace.SpanData) *tracepb.Span { + if sd == nil { + return nil + } + var namePtr *tracepb.TruncatableString + if sd.Name != "" { + namePtr = &tracepb.TruncatableString{Value: sd.Name} + } + return &tracepb.Span{ + TraceId: sd.TraceID[:], + SpanId: sd.SpanID[:], + ParentSpanId: sd.ParentSpanID[:], + Status: ocStatusToProtoStatus(sd.Status), + StartTime: timeToTimestamp(sd.StartTime), + EndTime: timeToTimestamp(sd.EndTime), + Links: ocLinksToProtoLinks(sd.Links), + Kind: ocSpanKindToProtoSpanKind(sd.SpanKind), + Name: namePtr, + Attributes: ocAttributesToProtoAttributes(sd.Attributes), + TimeEvents: ocTimeEventsToProtoTimeEvents(sd.Annotations, sd.MessageEvents), + Tracestate: ocTracestateToProtoTracestate(sd.Tracestate), + } +} + +var blankStatus trace.Status + +func ocStatusToProtoStatus(status trace.Status) *tracepb.Status { + if status == blankStatus { + return nil + } + return &tracepb.Status{ + Code: status.Code, + Message: status.Message, + } +} + +func ocLinksToProtoLinks(links []trace.Link) *tracepb.Span_Links { + if len(links) == 0 { + return nil + } + + sl := make([]*tracepb.Span_Link, 0, len(links)) + for _, ocLink := range links { + // This redefinition is necessary to prevent ocLink.*ID[:] copies + // being reused -- in short we need a new ocLink per iteration. + ocLink := ocLink + + sl = append(sl, &tracepb.Span_Link{ + TraceId: ocLink.TraceID[:], + SpanId: ocLink.SpanID[:], + Type: ocLinkTypeToProtoLinkType(ocLink.Type), + }) + } + + return &tracepb.Span_Links{ + Link: sl, + } +} + +func ocLinkTypeToProtoLinkType(oct trace.LinkType) tracepb.Span_Link_Type { + switch oct { + case trace.LinkTypeChild: + return tracepb.Span_Link_CHILD_LINKED_SPAN + case trace.LinkTypeParent: + return tracepb.Span_Link_PARENT_LINKED_SPAN + default: + return tracepb.Span_Link_TYPE_UNSPECIFIED + } +} + +func ocAttributesToProtoAttributes(attrs map[string]interface{}) *tracepb.Span_Attributes { + if len(attrs) == 0 { + return nil + } + outMap := make(map[string]*tracepb.AttributeValue) + for k, v := range attrs { + switch v := v.(type) { + case bool: + outMap[k] = &tracepb.AttributeValue{Value: &tracepb.AttributeValue_BoolValue{BoolValue: v}} + + case int: + outMap[k] = &tracepb.AttributeValue{Value: &tracepb.AttributeValue_IntValue{IntValue: int64(v)}} + + case int64: + outMap[k] = &tracepb.AttributeValue{Value: &tracepb.AttributeValue_IntValue{IntValue: v}} + + case string: + outMap[k] = &tracepb.AttributeValue{ + Value: &tracepb.AttributeValue_StringValue{ + StringValue: &tracepb.TruncatableString{Value: v}, + }, + } + } + } + return &tracepb.Span_Attributes{ + AttributeMap: outMap, + } +} + +// This code is mostly copied from +// https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/blob/master/trace_proto.go#L46 +func ocTimeEventsToProtoTimeEvents(as []trace.Annotation, es []trace.MessageEvent) *tracepb.Span_TimeEvents { + if len(as) == 0 && len(es) == 0 { + return nil + } + + timeEvents := &tracepb.Span_TimeEvents{} + var annotations, droppedAnnotationsCount int + var messageEvents, droppedMessageEventsCount int + + // Transform annotations + for i, a := range as { + if annotations >= maxAnnotationEventsPerSpan { + droppedAnnotationsCount = len(as) - i + break + } + annotations++ + timeEvents.TimeEvent = append(timeEvents.TimeEvent, + &tracepb.Span_TimeEvent{ + Time: timeToTimestamp(a.Time), + Value: transformAnnotationToTimeEvent(&a), + }, + ) + } + + // Transform message events + for i, e := range es { + if messageEvents >= maxMessageEventsPerSpan { + droppedMessageEventsCount = len(es) - i + break + } + messageEvents++ + timeEvents.TimeEvent = append(timeEvents.TimeEvent, + &tracepb.Span_TimeEvent{ + Time: timeToTimestamp(e.Time), + Value: transformMessageEventToTimeEvent(&e), + }, + ) + } + + // Process dropped counter + timeEvents.DroppedAnnotationsCount = clip32(droppedAnnotationsCount) + timeEvents.DroppedMessageEventsCount = clip32(droppedMessageEventsCount) + + return timeEvents +} + +func transformAnnotationToTimeEvent(a *trace.Annotation) *tracepb.Span_TimeEvent_Annotation_ { + return &tracepb.Span_TimeEvent_Annotation_{ + Annotation: &tracepb.Span_TimeEvent_Annotation{ + Description: &tracepb.TruncatableString{Value: a.Message}, + Attributes: ocAttributesToProtoAttributes(a.Attributes), + }, + } +} + +func transformMessageEventToTimeEvent(e *trace.MessageEvent) *tracepb.Span_TimeEvent_MessageEvent_ { + return &tracepb.Span_TimeEvent_MessageEvent_{ + MessageEvent: &tracepb.Span_TimeEvent_MessageEvent{ + Type: tracepb.Span_TimeEvent_MessageEvent_Type(e.EventType), + Id: uint64(e.MessageID), + UncompressedSize: uint64(e.UncompressedByteSize), + CompressedSize: uint64(e.CompressedByteSize), + }, + } +} + +// clip32 clips an int to the range of an int32. +func clip32(x int) int32 { + if x < math.MinInt32 { + return math.MinInt32 + } + if x > math.MaxInt32 { + return math.MaxInt32 + } + return int32(x) +} + +func timeToTimestamp(t time.Time) *timestamp.Timestamp { + nanoTime := t.UnixNano() + return ×tamp.Timestamp{ + Seconds: nanoTime / 1e9, + Nanos: int32(nanoTime % 1e9), + } +} + +func ocSpanKindToProtoSpanKind(kind int) tracepb.Span_SpanKind { + switch kind { + case trace.SpanKindClient: + return tracepb.Span_CLIENT + case trace.SpanKindServer: + return tracepb.Span_SERVER + default: + return tracepb.Span_SPAN_KIND_UNSPECIFIED + } +} + +func ocTracestateToProtoTracestate(ts *tracestate.Tracestate) *tracepb.Span_Tracestate { + if ts == nil { + return nil + } + return &tracepb.Span_Tracestate{ + Entries: ocTracestateEntriesToProtoTracestateEntries(ts.Entries()), + } +} + +func ocTracestateEntriesToProtoTracestateEntries(entries []tracestate.Entry) []*tracepb.Span_Tracestate_Entry { + protoEntries := make([]*tracepb.Span_Tracestate_Entry, 0, len(entries)) + for _, entry := range entries { + protoEntries = append(protoEntries, &tracepb.Span_Tracestate_Entry{ + Key: entry.Key, + Value: entry.Value, + }) + } + return protoEntries +} diff --git a/vendor/contrib.go.opencensus.io/exporter/ocagent/transform_stats_to_metrics.go b/vendor/contrib.go.opencensus.io/exporter/ocagent/transform_stats_to_metrics.go new file mode 100644 index 000000000..43f18dec1 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/ocagent/transform_stats_to_metrics.go @@ -0,0 +1,274 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ocagent + +import ( + "errors" + "time" + + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" + + "github.com/golang/protobuf/ptypes/timestamp" + + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" +) + +var ( + errNilMeasure = errors.New("expecting a non-nil stats.Measure") + errNilView = errors.New("expecting a non-nil view.View") + errNilViewData = errors.New("expecting a non-nil view.Data") +) + +func viewDataToMetric(vd *view.Data) (*metricspb.Metric, error) { + if vd == nil { + return nil, errNilViewData + } + + descriptor, err := viewToMetricDescriptor(vd.View) + if err != nil { + return nil, err + } + + timeseries, err := viewDataToTimeseries(vd) + if err != nil { + return nil, err + } + + metric := &metricspb.Metric{ + MetricDescriptor: descriptor, + Timeseries: timeseries, + } + return metric, nil +} + +func viewToMetricDescriptor(v *view.View) (*metricspb.MetricDescriptor, error) { + if v == nil { + return nil, errNilView + } + if v.Measure == nil { + return nil, errNilMeasure + } + + desc := &metricspb.MetricDescriptor{ + Name: stringOrCall(v.Name, v.Measure.Name), + Description: stringOrCall(v.Description, v.Measure.Description), + Unit: v.Measure.Unit(), + Type: aggregationToMetricDescriptorType(v), + LabelKeys: tagKeysToLabelKeys(v.TagKeys), + } + return desc, nil +} + +func stringOrCall(first string, call func() string) string { + if first != "" { + return first + } + return call() +} + +type measureType uint + +const ( + measureUnknown measureType = iota + measureInt64 + measureFloat64 +) + +func measureTypeFromMeasure(m stats.Measure) measureType { + switch m.(type) { + default: + return measureUnknown + case *stats.Float64Measure: + return measureFloat64 + case *stats.Int64Measure: + return measureInt64 + } +} + +func aggregationToMetricDescriptorType(v *view.View) metricspb.MetricDescriptor_Type { + if v == nil || v.Aggregation == nil { + return metricspb.MetricDescriptor_UNSPECIFIED + } + if v.Measure == nil { + return metricspb.MetricDescriptor_UNSPECIFIED + } + + switch v.Aggregation.Type { + case view.AggTypeCount: + // Cumulative on int64 + return metricspb.MetricDescriptor_CUMULATIVE_INT64 + + case view.AggTypeDistribution: + // Cumulative types + return metricspb.MetricDescriptor_CUMULATIVE_DISTRIBUTION + + case view.AggTypeLastValue: + // Gauge types + switch measureTypeFromMeasure(v.Measure) { + case measureFloat64: + return metricspb.MetricDescriptor_GAUGE_DOUBLE + case measureInt64: + return metricspb.MetricDescriptor_GAUGE_INT64 + } + + case view.AggTypeSum: + // Cumulative types + switch measureTypeFromMeasure(v.Measure) { + case measureFloat64: + return metricspb.MetricDescriptor_CUMULATIVE_DOUBLE + case measureInt64: + return metricspb.MetricDescriptor_CUMULATIVE_INT64 + } + } + + // For all other cases, return unspecified. + return metricspb.MetricDescriptor_UNSPECIFIED +} + +func tagKeysToLabelKeys(tagKeys []tag.Key) []*metricspb.LabelKey { + labelKeys := make([]*metricspb.LabelKey, 0, len(tagKeys)) + for _, tagKey := range tagKeys { + labelKeys = append(labelKeys, &metricspb.LabelKey{ + Key: tagKey.Name(), + }) + } + return labelKeys +} + +func viewDataToTimeseries(vd *view.Data) ([]*metricspb.TimeSeries, error) { + if vd == nil || len(vd.Rows) == 0 { + return nil, nil + } + + // Given that view.Data only contains Start, End + // the timestamps for all the row data will be the exact same + // per aggregation. However, the values will differ. + // Each row has its own tags. + startTimestamp := timeToProtoTimestamp(vd.Start) + endTimestamp := timeToProtoTimestamp(vd.End) + + mType := measureTypeFromMeasure(vd.View.Measure) + timeseries := make([]*metricspb.TimeSeries, 0, len(vd.Rows)) + // It is imperative that the ordering of "LabelValues" matches those + // of the Label keys in the metric descriptor. + for _, row := range vd.Rows { + labelValues := labelValuesFromTags(row.Tags) + point := rowToPoint(vd.View, row, endTimestamp, mType) + timeseries = append(timeseries, &metricspb.TimeSeries{ + StartTimestamp: startTimestamp, + LabelValues: labelValues, + Points: []*metricspb.Point{point}, + }) + } + + if len(timeseries) == 0 { + return nil, nil + } + + return timeseries, nil +} + +func timeToProtoTimestamp(t time.Time) *timestamp.Timestamp { + unixNano := t.UnixNano() + return ×tamp.Timestamp{ + Seconds: int64(unixNano / 1e9), + Nanos: int32(unixNano % 1e9), + } +} + +func rowToPoint(v *view.View, row *view.Row, endTimestamp *timestamp.Timestamp, mType measureType) *metricspb.Point { + pt := &metricspb.Point{ + Timestamp: endTimestamp, + } + + switch data := row.Data.(type) { + case *view.CountData: + pt.Value = &metricspb.Point_Int64Value{Int64Value: data.Value} + + case *view.DistributionData: + pt.Value = &metricspb.Point_DistributionValue{ + DistributionValue: &metricspb.DistributionValue{ + Count: data.Count, + Sum: float64(data.Count) * data.Mean, // because Mean := Sum/Count + // TODO: Add Exemplar + Buckets: bucketsToProtoBuckets(data.CountPerBucket), + BucketOptions: &metricspb.DistributionValue_BucketOptions{ + Type: &metricspb.DistributionValue_BucketOptions_Explicit_{ + Explicit: &metricspb.DistributionValue_BucketOptions_Explicit{ + Bounds: v.Aggregation.Buckets, + }, + }, + }, + SumOfSquaredDeviation: data.SumOfSquaredDev, + }} + + case *view.LastValueData: + setPointValue(pt, data.Value, mType) + + case *view.SumData: + setPointValue(pt, data.Value, mType) + } + + return pt +} + +// Not returning anything from this function because metricspb.Point.is_Value is an unexported +// interface hence we just have to set its value by pointer. +func setPointValue(pt *metricspb.Point, value float64, mType measureType) { + if mType == measureInt64 { + pt.Value = &metricspb.Point_Int64Value{Int64Value: int64(value)} + } else { + pt.Value = &metricspb.Point_DoubleValue{DoubleValue: value} + } +} + +func bucketsToProtoBuckets(countPerBucket []int64) []*metricspb.DistributionValue_Bucket { + distBuckets := make([]*metricspb.DistributionValue_Bucket, len(countPerBucket)) + for i := 0; i < len(countPerBucket); i++ { + count := countPerBucket[i] + + distBuckets[i] = &metricspb.DistributionValue_Bucket{ + Count: count, + } + } + + return distBuckets +} + +func labelValuesFromTags(tags []tag.Tag) []*metricspb.LabelValue { + if len(tags) == 0 { + return nil + } + + labelValues := make([]*metricspb.LabelValue, 0, len(tags)) + for _, tag_ := range tags { + labelValues = append(labelValues, &metricspb.LabelValue{ + Value: tag_.Value, + + // It is imperative that we set the "HasValue" attribute, + // in order to distinguish missing a label from the empty string. + // https://godoc.org/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1#LabelValue.HasValue + // + // OpenCensus-Go uses non-pointers for tags as seen by this function's arguments, + // so the best case that we can use to distinguish missing labels/tags from the + // empty string is by checking if the Tag.Key.Name() != "" to indicate that we have + // a value. + HasValue: tag_.Key.Name() != "", + }) + } + return labelValues +} diff --git a/vendor/contrib.go.opencensus.io/exporter/ocagent/version.go b/vendor/contrib.go.opencensus.io/exporter/ocagent/version.go new file mode 100644 index 000000000..68be4c75b --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/ocagent/version.go @@ -0,0 +1,17 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ocagent + +const Version = "0.0.1" diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/LICENSE b/vendor/contrib.go.opencensus.io/exporter/prometheus/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/prometheus/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go b/vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go new file mode 100644 index 000000000..59ce1c0a3 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go @@ -0,0 +1,277 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package prometheus contains a Prometheus exporter that supports exporting +// OpenCensus views as Prometheus metrics. +package prometheus // import "contrib.go.opencensus.io/exporter/prometheus" + +import ( + "fmt" + "log" + "net/http" + "sync" + + "context" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + "go.opencensus.io/metric/metricdata" + "go.opencensus.io/metric/metricexport" + "go.opencensus.io/stats/view" +) + +// Exporter exports stats to Prometheus, users need +// to register the exporter as an http.Handler to be +// able to export. +type Exporter struct { + opts Options + g prometheus.Gatherer + c *collector + handler http.Handler +} + +// Options contains options for configuring the exporter. +type Options struct { + Namespace string + Registry *prometheus.Registry + OnError func(err error) + ConstLabels prometheus.Labels // ConstLabels will be set as labels on all views. +} + +// NewExporter returns an exporter that exports stats to Prometheus. +func NewExporter(o Options) (*Exporter, error) { + if o.Registry == nil { + o.Registry = prometheus.NewRegistry() + } + collector := newCollector(o, o.Registry) + e := &Exporter{ + opts: o, + g: o.Registry, + c: collector, + handler: promhttp.HandlerFor(o.Registry, promhttp.HandlerOpts{}), + } + collector.ensureRegisteredOnce() + + return e, nil +} + +var _ http.Handler = (*Exporter)(nil) + +// ensureRegisteredOnce invokes reg.Register on the collector itself +// exactly once to ensure that we don't get errors such as +// cannot register the collector: descriptor Desc{fqName: *} +// already exists with the same fully-qualified name and const label values +// which is documented by Prometheus at +// https://github.com/prometheus/client_golang/blob/fcc130e101e76c5d303513d0e28f4b6d732845c7/prometheus/registry.go#L89-L101 +func (c *collector) ensureRegisteredOnce() { + c.registerOnce.Do(func() { + if err := c.reg.Register(c); err != nil { + c.opts.onError(fmt.Errorf("cannot register the collector: %v", err)) + } + }) + +} + +func (o *Options) onError(err error) { + if o.OnError != nil { + o.OnError(err) + } else { + log.Printf("Failed to export to Prometheus: %v", err) + } +} + +// ExportView exports to the Prometheus if view data has one or more rows. +// Each OpenCensus AggregationData will be converted to +// corresponding Prometheus Metric: SumData will be converted +// to Untyped Metric, CountData will be a Counter Metric, +// DistributionData will be a Histogram Metric. +// Deprecated in lieu of metricexport.Reader interface. +func (e *Exporter) ExportView(vd *view.Data) { +} + +// ServeHTTP serves the Prometheus endpoint. +func (e *Exporter) ServeHTTP(w http.ResponseWriter, r *http.Request) { + e.handler.ServeHTTP(w, r) +} + +// collector implements prometheus.Collector +type collector struct { + opts Options + mu sync.Mutex // mu guards all the fields. + + registerOnce sync.Once + + // reg helps collector register views dynamically. + reg *prometheus.Registry + + // reader reads metrics from all registered producers. + reader *metricexport.Reader +} + +func (c *collector) Describe(ch chan<- *prometheus.Desc) { + de := &descExporter{c: c, descCh: ch} + c.reader.ReadAndExport(de) +} + +// Collect fetches the statistics from OpenCensus +// and delivers them as Prometheus Metrics. +// Collect is invoked every time a prometheus.Gatherer is run +// for example when the HTTP endpoint is invoked by Prometheus. +func (c *collector) Collect(ch chan<- prometheus.Metric) { + me := &metricExporter{c: c, metricCh: ch} + c.reader.ReadAndExport(me) +} + +func newCollector(opts Options, registrar *prometheus.Registry) *collector { + return &collector{ + reg: registrar, + opts: opts, + reader: metricexport.NewReader()} +} + +func (c *collector) toDesc(metric *metricdata.Metric) *prometheus.Desc { + return prometheus.NewDesc( + metricName(c.opts.Namespace, metric), + metric.Descriptor.Description, + toPromLabels(metric.Descriptor.LabelKeys), + c.opts.ConstLabels) +} + +type metricExporter struct { + c *collector + metricCh chan<- prometheus.Metric +} + +// ExportMetrics exports to the Prometheus. +// Each OpenCensus Metric will be converted to +// corresponding Prometheus Metric: +// TypeCumulativeInt64 and TypeCumulativeFloat64 will be a Counter Metric, +// TypeCumulativeDistribution will be a Histogram Metric. +// TypeGaugeFloat64 and TypeGaugeInt64 will be a Gauge Metric +func (me *metricExporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { + for _, metric := range metrics { + desc := me.c.toDesc(metric) + for _, ts := range metric.TimeSeries { + tvs := toLabelValues(ts.LabelValues) + for _, point := range ts.Points { + metric, err := toPromMetric(desc, metric, point, tvs) + if err != nil { + me.c.opts.onError(err) + } else if metric != nil { + me.metricCh <- metric + } + } + } + } + return nil +} + +type descExporter struct { + c *collector + descCh chan<- *prometheus.Desc +} + +// ExportMetrics exports descriptor to the Prometheus. +// It is invoked when request to scrape descriptors is received. +func (me *descExporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { + for _, metric := range metrics { + desc := me.c.toDesc(metric) + me.descCh <- desc + } + return nil +} + +func toPromLabels(mls []metricdata.LabelKey) (labels []string) { + for _, ml := range mls { + labels = append(labels, sanitize(ml.Key)) + } + return labels +} + +func metricName(namespace string, m *metricdata.Metric) string { + var name string + if namespace != "" { + name = namespace + "_" + } + return name + sanitize(m.Descriptor.Name) +} + +func toPromMetric( + desc *prometheus.Desc, + metric *metricdata.Metric, + point metricdata.Point, + labelValues []string) (prometheus.Metric, error) { + switch metric.Descriptor.Type { + case metricdata.TypeCumulativeFloat64, metricdata.TypeCumulativeInt64: + pv, err := toPromValue(point) + if err != nil { + return nil, err + } + return prometheus.NewConstMetric(desc, prometheus.CounterValue, pv, labelValues...) + + case metricdata.TypeGaugeFloat64, metricdata.TypeGaugeInt64: + pv, err := toPromValue(point) + if err != nil { + return nil, err + } + return prometheus.NewConstMetric(desc, prometheus.GaugeValue, pv, labelValues...) + + case metricdata.TypeCumulativeDistribution: + switch v := point.Value.(type) { + case *metricdata.Distribution: + points := make(map[float64]uint64) + // Histograms are cumulative in Prometheus. + // Get cumulative bucket counts. + cumCount := uint64(0) + for i, b := range v.BucketOptions.Bounds { + cumCount += uint64(v.Buckets[i].Count) + points[b] = cumCount + } + return prometheus.NewConstHistogram(desc, uint64(v.Count), v.Sum, points, labelValues...) + default: + return nil, typeMismatchError(point) + } + case metricdata.TypeSummary: + // TODO: [rghetia] add support for TypeSummary. + return nil, nil + default: + return nil, fmt.Errorf("aggregation %T is not yet supported", metric.Descriptor.Type) + } +} + +func toLabelValues(labelValues []metricdata.LabelValue) (values []string) { + for _, lv := range labelValues { + if lv.Present { + values = append(values, lv.Value) + } else { + values = append(values, "") + } + } + return values +} + +func typeMismatchError(point metricdata.Point) error { + return fmt.Errorf("point type %T does not match metric type", point) + +} + +func toPromValue(point metricdata.Point) (float64, error) { + switch v := point.Value.(type) { + case float64: + return v, nil + case int64: + return float64(v), nil + default: + return 0.0, typeMismatchError(point) + } +} diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go b/vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go new file mode 100644 index 000000000..ed6d8a14d --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go @@ -0,0 +1,50 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "strings" + "unicode" +) + +const labelKeySizeLimit = 100 + +// sanitize returns a string that is trunacated to 100 characters if it's too +// long, and replaces non-alphanumeric characters to underscores. +func sanitize(s string) string { + if len(s) == 0 { + return s + } + if len(s) > labelKeySizeLimit { + s = s[:labelKeySizeLimit] + } + s = strings.Map(sanitizeRune, s) + if unicode.IsDigit(rune(s[0])) { + s = "key_" + s + } + if s[0] == '_' { + s = "key" + s + } + return s +} + +// converts anything that is not a letter or digit to an underscore +func sanitizeRune(r rune) rune { + if unicode.IsLetter(r) || unicode.IsDigit(r) { + return r + } + // Everything else turns into an underscore + return '_' +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS b/vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS new file mode 100644 index 000000000..e491a9e7f --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS @@ -0,0 +1 @@ +Google Inc. diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE b/vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go new file mode 100644 index 000000000..88835cc0f --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go @@ -0,0 +1,33 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +// Labels represents a set of Stackdriver Monitoring labels. +type Labels struct { + m map[string]labelValue +} + +type labelValue struct { + val, desc string +} + +// Set stores a label with the given key, value and description, +// overwriting any previous values with the given key. +func (labels *Labels) Set(key, value, description string) { + if labels.m == nil { + labels.m = make(map[string]labelValue) + } + labels.m[key] = labelValue{value, description} +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go new file mode 100644 index 000000000..a2df93f05 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go @@ -0,0 +1,519 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +/* +The code in this file is responsible for converting OpenCensus Proto metrics +directly to Stackdriver Metrics. +*/ + +import ( + "context" + "fmt" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" + "github.com/golang/protobuf/ptypes/timestamp" + "go.opencensus.io/trace" + + distributionpb "google.golang.org/genproto/googleapis/api/distribution" + labelpb "google.golang.org/genproto/googleapis/api/label" + googlemetricpb "google.golang.org/genproto/googleapis/api/metric" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" + + "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" + "go.opencensus.io/metric/metricdata" + "go.opencensus.io/resource" +) + +const ( + exemplarAttachmentTypeString = "type.googleapis.com/google.protobuf.StringValue" + exemplarAttachmentTypeSpanCtx = "type.googleapis.com/google.monitoring.v3.SpanContext" + + // TODO(songy23): add support for this. + // exemplarAttachmentTypeDroppedLabels = "type.googleapis.com/google.monitoring.v3.DroppedLabels" +) + +// ExportMetrics exports OpenCensus Metrics to Stackdriver Monitoring. +func (se *statsExporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { + if len(metrics) == 0 { + return nil + } + + for _, metric := range metrics { + se.metricsBundler.Add(metric, 1) + // TODO: [rghetia] handle errors. + } + + return nil +} + +func (se *statsExporter) handleMetricsUpload(metrics []*metricdata.Metric) { + err := se.uploadMetrics(metrics) + if err != nil { + se.o.handleError(err) + } +} + +func (se *statsExporter) uploadMetrics(metrics []*metricdata.Metric) error { + ctx, cancel := newContextWithTimeout(se.o.Context, se.o.Timeout) + defer cancel() + + var errors []error + + ctx, span := trace.StartSpan( + ctx, + "contrib.go.opencensus.io/exporter/stackdriver.uploadMetrics", + trace.WithSampler(trace.NeverSample()), + ) + defer span.End() + + for _, metric := range metrics { + // Now create the metric descriptor remotely. + if err := se.createMetricDescriptorFromMetric(ctx, metric); err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + errors = append(errors, err) + continue + } + } + + var allTimeSeries []*monitoringpb.TimeSeries + for _, metric := range metrics { + tsl, err := se.metricToMpbTs(ctx, metric) + if err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + errors = append(errors, err) + continue + } + if tsl != nil { + allTimeSeries = append(allTimeSeries, tsl...) + } + } + + // Now batch timeseries up and then export. + for start, end := 0, 0; start < len(allTimeSeries); start = end { + end = start + maxTimeSeriesPerUpload + if end > len(allTimeSeries) { + end = len(allTimeSeries) + } + batch := allTimeSeries[start:end] + ctsreql := se.combineTimeSeriesToCreateTimeSeriesRequest(batch) + for _, ctsreq := range ctsreql { + if err := createTimeSeries(ctx, se.c, ctsreq); err != nil { + span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) + errors = append(errors, err) + } + } + } + + numErrors := len(errors) + if numErrors == 0 { + return nil + } else if numErrors == 1 { + return errors[0] + } + errMsgs := make([]string, 0, numErrors) + for _, err := range errors { + errMsgs = append(errMsgs, err.Error()) + } + return fmt.Errorf("[%s]", strings.Join(errMsgs, "; ")) +} + +// metricToMpbTs converts a metric into a list of Stackdriver Monitoring v3 API TimeSeries +// but it doesn't invoke any remote API. +func (se *statsExporter) metricToMpbTs(ctx context.Context, metric *metricdata.Metric) ([]*monitoringpb.TimeSeries, error) { + if metric == nil { + return nil, errNilMetricOrMetricDescriptor + } + + resource := se.metricRscToMpbRsc(metric.Resource) + + metricName := metric.Descriptor.Name + metricType := se.metricTypeFromProto(metricName) + metricLabelKeys := metric.Descriptor.LabelKeys + metricKind, _ := metricDescriptorTypeToMetricKind(metric) + + if metricKind == googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED { + // ignore these Timeserieses. TODO [rghetia] log errors. + return nil, nil + } + + timeSeries := make([]*monitoringpb.TimeSeries, 0, len(metric.TimeSeries)) + for _, ts := range metric.TimeSeries { + sdPoints, err := se.metricTsToMpbPoint(ts, metricKind) + if err != nil { + // TODO(@rghetia): record error metrics + continue + } + + // Each TimeSeries has labelValues which MUST be correlated + // with that from the MetricDescriptor + labels, err := metricLabelsToTsLabels(se.defaultLabels, metricLabelKeys, ts.LabelValues) + if err != nil { + // TODO: (@rghetia) perhaps log this error from labels extraction, if non-nil. + continue + } + + var rsc *monitoredrespb.MonitoredResource + var mr monitoredresource.Interface + if se.o.ResourceByDescriptor != nil { + labels, mr = se.o.ResourceByDescriptor(&metric.Descriptor, labels) + // TODO(rghetia): optimize this. It is inefficient to convert this for all metrics. + rsc = convertMonitoredResourceToPB(mr) + if rsc.Type == "" { + rsc.Type = "global" + rsc.Labels = nil + } + } else { + rsc = resource + } + timeSeries = append(timeSeries, &monitoringpb.TimeSeries{ + Metric: &googlemetricpb.Metric{ + Type: metricType, + Labels: labels, + }, + Resource: rsc, + Points: sdPoints, + }) + } + + return timeSeries, nil +} + +func metricLabelsToTsLabels(defaults map[string]labelValue, labelKeys []metricdata.LabelKey, labelValues []metricdata.LabelValue) (map[string]string, error) { + // Perform this sanity check now. + if len(labelKeys) != len(labelValues) { + return nil, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues)) + } + + if len(defaults)+len(labelKeys) == 0 { + return nil, nil + } + + labels := make(map[string]string) + // Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched. + for key, label := range defaults { + labels[sanitize(key)] = label.val + } + + for i, labelKey := range labelKeys { + labelValue := labelValues[i] + labels[sanitize(labelKey.Key)] = labelValue.Value + } + + return labels, nil +} + +// createMetricDescriptorFromMetric creates a metric descriptor from the OpenCensus metric +// and then creates it remotely using Stackdriver's API. +func (se *statsExporter) createMetricDescriptorFromMetric(ctx context.Context, metric *metricdata.Metric) error { + // Skip create metric descriptor if configured + if se.o.SkipCMD { + return nil + } + + se.metricMu.Lock() + defer se.metricMu.Unlock() + + name := metric.Descriptor.Name + if _, created := se.metricDescriptors[name]; created { + return nil + } + + if builtinMetric(se.metricTypeFromProto(name)) { + se.metricDescriptors[name] = true + return nil + } + + // Otherwise, we encountered a cache-miss and + // should create the metric descriptor remotely. + inMD, err := se.metricToMpbMetricDescriptor(metric) + if err != nil { + return err + } + + if err = se.createMetricDescriptor(ctx, inMD); err != nil { + return err + } + + // Now record the metric as having been created. + se.metricDescriptors[name] = true + return nil +} + +func (se *statsExporter) metricToMpbMetricDescriptor(metric *metricdata.Metric) (*googlemetricpb.MetricDescriptor, error) { + if metric == nil { + return nil, errNilMetricOrMetricDescriptor + } + + metricType := se.metricTypeFromProto(metric.Descriptor.Name) + displayName := se.displayName(metric.Descriptor.Name) + metricKind, valueType := metricDescriptorTypeToMetricKind(metric) + + sdm := &googlemetricpb.MetricDescriptor{ + Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", se.o.ProjectID, metricType), + DisplayName: displayName, + Description: metric.Descriptor.Description, + Unit: string(metric.Descriptor.Unit), + Type: metricType, + MetricKind: metricKind, + ValueType: valueType, + Labels: metricLableKeysToLabels(se.defaultLabels, metric.Descriptor.LabelKeys), + } + + return sdm, nil +} + +func metricLableKeysToLabels(defaults map[string]labelValue, labelKeys []metricdata.LabelKey) []*labelpb.LabelDescriptor { + labelDescriptors := make([]*labelpb.LabelDescriptor, 0, len(defaults)+len(labelKeys)) + + // Fill in the defaults first. + for key, lbl := range defaults { + labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ + Key: sanitize(key), + Description: lbl.desc, + ValueType: labelpb.LabelDescriptor_STRING, + }) + } + + // Now fill in those from the metric. + for _, key := range labelKeys { + labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ + Key: sanitize(key.Key), + Description: key.Description, + ValueType: labelpb.LabelDescriptor_STRING, // We only use string tags + }) + } + return labelDescriptors +} + +func metricDescriptorTypeToMetricKind(m *metricdata.Metric) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { + if m == nil { + return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED + } + + switch m.Descriptor.Type { + case metricdata.TypeCumulativeInt64: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64 + + case metricdata.TypeCumulativeFloat64: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE + + case metricdata.TypeCumulativeDistribution: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION + + case metricdata.TypeGaugeFloat64: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE + + case metricdata.TypeGaugeInt64: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 + + case metricdata.TypeGaugeDistribution: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DISTRIBUTION + + case metricdata.TypeSummary: + // TODO: [rghetia] after upgrading to proto version3, retrun UNRECOGNIZED instead of UNSPECIFIED + return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED + + default: + // TODO: [rghetia] after upgrading to proto version3, retrun UNRECOGNIZED instead of UNSPECIFIED + return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED + } +} + +func (se *statsExporter) metricRscToMpbRsc(rs *resource.Resource) *monitoredrespb.MonitoredResource { + if rs == nil { + resource := se.o.Resource + if resource == nil { + resource = &monitoredrespb.MonitoredResource{ + Type: "global", + } + } + return resource + } + typ := rs.Type + if typ == "" { + typ = "global" + } + mrsp := &monitoredrespb.MonitoredResource{ + Type: typ, + } + if rs.Labels != nil { + mrsp.Labels = make(map[string]string, len(rs.Labels)) + for k, v := range rs.Labels { + // TODO: [rghetia] add mapping between OC Labels and SD Labels. + mrsp.Labels[k] = v + } + } + return mrsp +} + +func (se *statsExporter) metricTsToMpbPoint(ts *metricdata.TimeSeries, metricKind googlemetricpb.MetricDescriptor_MetricKind) (sptl []*monitoringpb.Point, err error) { + for _, pt := range ts.Points { + + // If we have a last value aggregation point i.e. MetricDescriptor_GAUGE + // StartTime should be nil. + startTime := timestampProto(ts.StartTime) + if metricKind == googlemetricpb.MetricDescriptor_GAUGE { + startTime = nil + } + + spt, err := metricPointToMpbPoint(startTime, &pt, se.o.ProjectID) + if err != nil { + return nil, err + } + sptl = append(sptl, spt) + } + return sptl, nil +} + +func metricPointToMpbPoint(startTime *timestamp.Timestamp, pt *metricdata.Point, projectID string) (*monitoringpb.Point, error) { + if pt == nil { + return nil, nil + } + + mptv, err := metricPointToMpbValue(pt, projectID) + if err != nil { + return nil, err + } + + mpt := &monitoringpb.Point{ + Value: mptv, + Interval: &monitoringpb.TimeInterval{ + StartTime: startTime, + EndTime: timestampProto(pt.Time), + }, + } + return mpt, nil +} + +func metricPointToMpbValue(pt *metricdata.Point, projectID string) (*monitoringpb.TypedValue, error) { + if pt == nil { + return nil, nil + } + + var err error + var tval *monitoringpb.TypedValue + switch v := pt.Value.(type) { + default: + err = fmt.Errorf("protoToMetricPoint: unknown Data type: %T", pt.Value) + + case int64: + tval = &monitoringpb.TypedValue{ + Value: &monitoringpb.TypedValue_Int64Value{ + Int64Value: v, + }, + } + + case float64: + tval = &monitoringpb.TypedValue{ + Value: &monitoringpb.TypedValue_DoubleValue{ + DoubleValue: v, + }, + } + + case *metricdata.Distribution: + dv := v + var mv *monitoringpb.TypedValue_DistributionValue + var mean float64 + if dv.Count > 0 { + mean = float64(dv.Sum) / float64(dv.Count) + } + mv = &monitoringpb.TypedValue_DistributionValue{ + DistributionValue: &distributionpb.Distribution{ + Count: dv.Count, + Mean: mean, + SumOfSquaredDeviation: dv.SumOfSquaredDeviation, + }, + } + + insertZeroBound := false + if bopts := dv.BucketOptions; bopts != nil { + insertZeroBound = shouldInsertZeroBound(bopts.Bounds...) + mv.DistributionValue.BucketOptions = &distributionpb.Distribution_BucketOptions{ + Options: &distributionpb.Distribution_BucketOptions_ExplicitBuckets{ + ExplicitBuckets: &distributionpb.Distribution_BucketOptions_Explicit{ + // The first bucket bound should be 0.0 because the Metrics first bucket is + // [0, first_bound) but Stackdriver monitoring bucket bounds begin with -infinity + // (first bucket is (-infinity, 0)) + Bounds: addZeroBoundOnCondition(insertZeroBound, bopts.Bounds...), + }, + }, + } + } + bucketCounts, exemplars := metricBucketToBucketCountsAndExemplars(dv.Buckets, projectID) + mv.DistributionValue.BucketCounts = addZeroBucketCountOnCondition(insertZeroBound, bucketCounts...) + mv.DistributionValue.Exemplars = exemplars + + tval = &monitoringpb.TypedValue{Value: mv} + } + + return tval, err +} + +func metricBucketToBucketCountsAndExemplars(buckets []metricdata.Bucket, projectID string) ([]int64, []*distributionpb.Distribution_Exemplar) { + bucketCounts := make([]int64, len(buckets)) + var exemplars []*distributionpb.Distribution_Exemplar + for i, bucket := range buckets { + bucketCounts[i] = bucket.Count + if bucket.Exemplar != nil { + exemplars = append(exemplars, metricExemplarToPbExemplar(bucket.Exemplar, projectID)) + } + } + return bucketCounts, exemplars +} + +func metricExemplarToPbExemplar(exemplar *metricdata.Exemplar, projectID string) *distributionpb.Distribution_Exemplar { + return &distributionpb.Distribution_Exemplar{ + Value: exemplar.Value, + Timestamp: timestampProto(exemplar.Timestamp), + Attachments: attachmentsToPbAttachments(exemplar.Attachments, projectID), + } +} + +func attachmentsToPbAttachments(attachments metricdata.Attachments, projectID string) []*any.Any { + var pbAttachments []*any.Any + for _, v := range attachments { + if spanCtx, succ := v.(trace.SpanContext); succ { + pbAttachments = append(pbAttachments, toPbSpanCtxAttachment(spanCtx, projectID)) + } else { + // Treat everything else as plain string for now. + // TODO(songy23): add support for dropped label attachments. + pbAttachments = append(pbAttachments, toPbStringAttachment(v)) + } + } + return pbAttachments +} + +func toPbStringAttachment(v interface{}) *any.Any { + s := fmt.Sprintf("%v", v) + return &any.Any{ + TypeUrl: exemplarAttachmentTypeString, + Value: []byte(s), + } +} + +func toPbSpanCtxAttachment(spanCtx trace.SpanContext, projectID string) *any.Any { + pbSpanCtx := monitoringpb.SpanContext{ + SpanName: fmt.Sprintf("projects/%s/traces/%s/spans/%s", projectID, spanCtx.TraceID.String(), spanCtx.SpanID.String()), + } + bytes, _ := proto.Marshal(&pbSpanCtx) + return &any.Any{ + TypeUrl: exemplarAttachmentTypeSpanCtx, + Value: bytes, + } +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go new file mode 100644 index 000000000..ccd6ee4a6 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go @@ -0,0 +1,201 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +import ( + "context" + "fmt" + "strings" + "sync" + "time" + + monitoring "cloud.google.com/go/monitoring/apiv3" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" +) + +const ( + minNumWorkers = 1 + minReqsChanSize = 5 +) + +type metricsBatcher struct { + projectName string + allTss []*monitoringpb.TimeSeries + allErrs []error + + // Counts all dropped TimeSeries by this metricsBatcher. + droppedTimeSeries int + + workers []*worker + // reqsChan, respsChan and wg are shared between metricsBatcher and worker goroutines. + reqsChan chan *monitoringpb.CreateTimeSeriesRequest + respsChan chan *response + wg *sync.WaitGroup +} + +func newMetricsBatcher(ctx context.Context, projectID string, numWorkers int, mc *monitoring.MetricClient, timeout time.Duration) *metricsBatcher { + if numWorkers < minNumWorkers { + numWorkers = minNumWorkers + } + workers := make([]*worker, 0, numWorkers) + reqsChanSize := numWorkers + if reqsChanSize < minReqsChanSize { + reqsChanSize = minReqsChanSize + } + reqsChan := make(chan *monitoringpb.CreateTimeSeriesRequest, reqsChanSize) + respsChan := make(chan *response, numWorkers) + var wg sync.WaitGroup + wg.Add(numWorkers) + for i := 0; i < numWorkers; i++ { + w := newWorker(ctx, mc, reqsChan, respsChan, &wg, timeout) + workers = append(workers, w) + go w.start() + } + return &metricsBatcher{ + projectName: fmt.Sprintf("projects/%s", projectID), + allTss: make([]*monitoringpb.TimeSeries, 0, maxTimeSeriesPerUpload), + droppedTimeSeries: 0, + workers: workers, + wg: &wg, + reqsChan: reqsChan, + respsChan: respsChan, + } +} + +func (mb *metricsBatcher) recordDroppedTimeseries(numTimeSeries int, errs ...error) { + mb.droppedTimeSeries += numTimeSeries + for _, err := range errs { + if err != nil { + mb.allErrs = append(mb.allErrs, err) + } + } +} + +func (mb *metricsBatcher) addTimeSeries(ts *monitoringpb.TimeSeries) { + mb.allTss = append(mb.allTss, ts) + if len(mb.allTss) == maxTimeSeriesPerUpload { + mb.sendReqToChan() + mb.allTss = make([]*monitoringpb.TimeSeries, 0, maxTimeSeriesPerUpload) + } +} + +func (mb *metricsBatcher) close(ctx context.Context) error { + // Send any remaining time series, must be <200 + if len(mb.allTss) > 0 { + mb.sendReqToChan() + } + + close(mb.reqsChan) + mb.wg.Wait() + for i := 0; i < len(mb.workers); i++ { + resp := <-mb.respsChan + mb.recordDroppedTimeseries(resp.droppedTimeSeries, resp.errs...) + } + close(mb.respsChan) + + numErrors := len(mb.allErrs) + if numErrors == 0 { + return nil + } + + if numErrors == 1 { + return mb.allErrs[0] + } + + errMsgs := make([]string, 0, numErrors) + for _, err := range mb.allErrs { + errMsgs = append(errMsgs, err.Error()) + } + return fmt.Errorf("[%s]", strings.Join(errMsgs, "; ")) +} + +// sendReqToChan grabs all the timeseies in this metricsBatcher, puts them +// to a CreateTimeSeriesRequest and sends the request to reqsChan. +func (mb *metricsBatcher) sendReqToChan() { + req := &monitoringpb.CreateTimeSeriesRequest{ + Name: mb.projectName, + TimeSeries: mb.allTss, + } + mb.reqsChan <- req +} + +// sendReq sends create time series requests to Stackdriver, +// and returns the count of dropped time series and error. +func sendReq(ctx context.Context, c *monitoring.MetricClient, req *monitoringpb.CreateTimeSeriesRequest) (int, error) { + if c != nil { // c==nil only happens in unit tests where we don't make real calls to Stackdriver server + err := createTimeSeries(ctx, c, req) + if err != nil { + return len(req.TimeSeries), err + } + } + return 0, nil +} + +type worker struct { + ctx context.Context + timeout time.Duration + mc *monitoring.MetricClient + + resp *response + + respsChan chan *response + reqsChan chan *monitoringpb.CreateTimeSeriesRequest + + wg *sync.WaitGroup +} + +func newWorker( + ctx context.Context, + mc *monitoring.MetricClient, + reqsChan chan *monitoringpb.CreateTimeSeriesRequest, + respsChan chan *response, + wg *sync.WaitGroup, + timeout time.Duration) *worker { + return &worker{ + ctx: ctx, + mc: mc, + resp: &response{}, + reqsChan: reqsChan, + respsChan: respsChan, + wg: wg, + } +} + +func (w *worker) start() { + for req := range w.reqsChan { + w.sendReqWithTimeout(req) + } + w.respsChan <- w.resp + w.wg.Done() +} + +func (w *worker) sendReqWithTimeout(req *monitoringpb.CreateTimeSeriesRequest) { + ctx, cancel := newContextWithTimeout(w.ctx, w.timeout) + defer cancel() + + w.recordDroppedTimeseries(sendReq(ctx, w.mc, req)) +} + +func (w *worker) recordDroppedTimeseries(numTimeSeries int, err error) { + w.resp.droppedTimeSeries += numTimeSeries + if err != nil { + w.resp.errs = append(w.resp.errs, err) + } +} + +type response struct { + droppedTimeSeries int + errs []error +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go new file mode 100644 index 000000000..bcc1f0ee9 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go @@ -0,0 +1,569 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +/* +The code in this file is responsible for converting OpenCensus Proto metrics +directly to Stackdriver Metrics. +*/ + +import ( + "context" + "errors" + "fmt" + "path" + "strings" + + "go.opencensus.io/resource" + + commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1" + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + timestamppb "github.com/golang/protobuf/ptypes/timestamp" + distributionpb "google.golang.org/genproto/googleapis/api/distribution" + labelpb "google.golang.org/genproto/googleapis/api/label" + googlemetricpb "google.golang.org/genproto/googleapis/api/metric" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" +) + +var errNilMetricOrMetricDescriptor = errors.New("non-nil metric or metric descriptor") +var percentileLabelKey = &metricspb.LabelKey{ + Key: "percentile", + Description: "the value at a given percentile of a distribution", +} +var globalResource = &resource.Resource{Type: "global"} +var domains = []string{"googleapis.com", "kubernetes.io", "istio.io", "knative.dev"} + +// PushMetricsProto exports OpenCensus Metrics Proto to Stackdriver Monitoring synchronously, +// without de-duping or adding proto metrics to the bundler. +func (se *statsExporter) PushMetricsProto(ctx context.Context, node *commonpb.Node, rsc *resourcepb.Resource, metrics []*metricspb.Metric) (int, error) { + if len(metrics) == 0 { + return 0, errNilMetricOrMetricDescriptor + } + + // Caches the resources seen so far + seenResources := make(map[*resourcepb.Resource]*monitoredrespb.MonitoredResource) + + mb := newMetricsBatcher(ctx, se.o.ProjectID, se.o.NumberOfWorkers, se.c, se.o.Timeout) + for _, metric := range metrics { + if len(metric.GetTimeseries()) == 0 { + // No TimeSeries to export, skip this metric. + continue + } + mappedRsc := se.getResource(rsc, metric, seenResources) + if metric.GetMetricDescriptor().GetType() == metricspb.MetricDescriptor_SUMMARY { + summaryMtcs := se.convertSummaryMetrics(metric) + for _, summaryMtc := range summaryMtcs { + if err := se.createMetricDescriptorFromMetricProto(ctx, summaryMtc); err != nil { + mb.recordDroppedTimeseries(len(summaryMtc.GetTimeseries()), err) + continue + } + se.protoMetricToTimeSeries(ctx, mappedRsc, summaryMtc, mb) + } + } else { + if err := se.createMetricDescriptorFromMetricProto(ctx, metric); err != nil { + mb.recordDroppedTimeseries(len(metric.GetTimeseries()), err) + continue + } + se.protoMetricToTimeSeries(ctx, mappedRsc, metric, mb) + } + } + + return mb.droppedTimeSeries, mb.close(ctx) +} + +func (se *statsExporter) convertSummaryMetrics(summary *metricspb.Metric) []*metricspb.Metric { + var metrics []*metricspb.Metric + + for _, ts := range summary.Timeseries { + var percentileTss []*metricspb.TimeSeries + var countTss []*metricspb.TimeSeries + var sumTss []*metricspb.TimeSeries + lvs := ts.GetLabelValues() + + startTime := ts.StartTimestamp + for _, pt := range ts.GetPoints() { + ptTimestamp := pt.GetTimestamp() + summaryValue := pt.GetSummaryValue() + if summaryValue.Sum != nil { + sumTs := &metricspb.TimeSeries{ + LabelValues: lvs, + StartTimestamp: startTime, + Points: []*metricspb.Point{ + { + Value: &metricspb.Point_DoubleValue{ + DoubleValue: summaryValue.Sum.Value, + }, + Timestamp: ptTimestamp, + }, + }, + } + sumTss = append(sumTss, sumTs) + } + + if summaryValue.Count != nil { + countTs := &metricspb.TimeSeries{ + LabelValues: lvs, + StartTimestamp: startTime, + Points: []*metricspb.Point{ + { + Value: &metricspb.Point_Int64Value{ + Int64Value: summaryValue.Count.Value, + }, + Timestamp: ptTimestamp, + }, + }, + } + countTss = append(countTss, countTs) + } + + snapshot := summaryValue.GetSnapshot() + for _, percentileValue := range snapshot.GetPercentileValues() { + lvsWithPercentile := lvs[0:] + lvsWithPercentile = append(lvsWithPercentile, &metricspb.LabelValue{ + HasValue: true, + Value: fmt.Sprintf("%f", percentileValue.Percentile), + }) + percentileTs := &metricspb.TimeSeries{ + LabelValues: lvsWithPercentile, + StartTimestamp: nil, + Points: []*metricspb.Point{ + { + Value: &metricspb.Point_DoubleValue{ + DoubleValue: percentileValue.Value, + }, + Timestamp: ptTimestamp, + }, + }, + } + percentileTss = append(percentileTss, percentileTs) + } + } + + if len(sumTss) > 0 { + metric := &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: fmt.Sprintf("%s_summary_sum", summary.GetMetricDescriptor().GetName()), + Description: summary.GetMetricDescriptor().GetDescription(), + Type: metricspb.MetricDescriptor_CUMULATIVE_DOUBLE, + Unit: summary.GetMetricDescriptor().GetUnit(), + LabelKeys: summary.GetMetricDescriptor().GetLabelKeys(), + }, + Timeseries: sumTss, + Resource: summary.Resource, + } + metrics = append(metrics, metric) + } + if len(countTss) > 0 { + metric := &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: fmt.Sprintf("%s_summary_count", summary.GetMetricDescriptor().GetName()), + Description: summary.GetMetricDescriptor().GetDescription(), + Type: metricspb.MetricDescriptor_CUMULATIVE_INT64, + Unit: "1", + LabelKeys: summary.GetMetricDescriptor().GetLabelKeys(), + }, + Timeseries: countTss, + Resource: summary.Resource, + } + metrics = append(metrics, metric) + } + if len(percentileTss) > 0 { + lks := summary.GetMetricDescriptor().GetLabelKeys()[0:] + lks = append(lks, percentileLabelKey) + metric := &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: fmt.Sprintf("%s_summary_percentile", summary.GetMetricDescriptor().GetName()), + Description: summary.GetMetricDescriptor().GetDescription(), + Type: metricspb.MetricDescriptor_GAUGE_DOUBLE, + Unit: summary.GetMetricDescriptor().GetUnit(), + LabelKeys: lks, + }, + Timeseries: percentileTss, + Resource: summary.Resource, + } + metrics = append(metrics, metric) + } + } + return metrics +} + +func (se *statsExporter) getResource(rsc *resourcepb.Resource, metric *metricspb.Metric, seenRscs map[*resourcepb.Resource]*monitoredrespb.MonitoredResource) *monitoredrespb.MonitoredResource { + var resource = rsc + if metric.Resource != nil { + resource = metric.Resource + } + mappedRsc, ok := seenRscs[resource] + if !ok { + mappedRsc = se.o.MapResource(resourcepbToResource(resource)) + seenRscs[resource] = mappedRsc + } + return mappedRsc +} + +func resourcepbToResource(rsc *resourcepb.Resource) *resource.Resource { + if rsc == nil { + return globalResource + } + res := &resource.Resource{ + Type: rsc.Type, + Labels: make(map[string]string, len(rsc.Labels)), + } + + for k, v := range rsc.Labels { + res.Labels[k] = v + } + return res +} + +// protoMetricToTimeSeries converts a metric into a Stackdriver Monitoring v3 API CreateTimeSeriesRequest +// but it doesn't invoke any remote API. +func (se *statsExporter) protoMetricToTimeSeries(ctx context.Context, mappedRsc *monitoredrespb.MonitoredResource, metric *metricspb.Metric, mb *metricsBatcher) { + if metric == nil || metric.MetricDescriptor == nil { + mb.recordDroppedTimeseries(len(metric.GetTimeseries()), errNilMetricOrMetricDescriptor) + } + + metricType := se.metricTypeFromProto(metric.GetMetricDescriptor().GetName()) + metricLabelKeys := metric.GetMetricDescriptor().GetLabelKeys() + metricKind, valueType := protoMetricDescriptorTypeToMetricKind(metric) + labelKeys := make([]string, 0, len(metricLabelKeys)) + for _, key := range metricLabelKeys { + labelKeys = append(labelKeys, sanitize(key.GetKey())) + } + + for _, protoTimeSeries := range metric.Timeseries { + if len(protoTimeSeries.Points) == 0 { + // No points to send just move forward. + continue + } + + sdPoints, err := se.protoTimeSeriesToMonitoringPoints(protoTimeSeries, metricKind) + if err != nil { + mb.recordDroppedTimeseries(1, err) + continue + } + + // Each TimeSeries has labelValues which MUST be correlated + // with that from the MetricDescriptor + labels, err := labelsPerTimeSeries(se.defaultLabels, labelKeys, protoTimeSeries.GetLabelValues()) + if err != nil { + mb.recordDroppedTimeseries(1, err) + continue + } + mb.addTimeSeries(&monitoringpb.TimeSeries{ + Metric: &googlemetricpb.Metric{ + Type: metricType, + Labels: labels, + }, + MetricKind: metricKind, + ValueType: valueType, + Resource: mappedRsc, + Points: sdPoints, + }) + } +} + +func labelsPerTimeSeries(defaults map[string]labelValue, labelKeys []string, labelValues []*metricspb.LabelValue) (map[string]string, error) { + if len(labelKeys) != len(labelValues) { + return nil, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues)) + } + + if len(defaults)+len(labelKeys) == 0 { + // No labels for this metric + return nil, nil + } + + labels := make(map[string]string) + // Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched. + for key, label := range defaults { + labels[key] = label.val + } + + for i, labelKey := range labelKeys { + labelValue := labelValues[i] + if !labelValue.GetHasValue() { + continue + } + labels[labelKey] = labelValue.GetValue() + } + + return labels, nil +} + +func (se *statsExporter) createMetricDescriptorFromMetricProto(ctx context.Context, metric *metricspb.Metric) error { + // Skip create metric descriptor if configured + if se.o.SkipCMD { + return nil + } + + ctx, cancel := newContextWithTimeout(ctx, se.o.Timeout) + defer cancel() + + se.protoMu.Lock() + defer se.protoMu.Unlock() + + name := metric.GetMetricDescriptor().GetName() + if _, created := se.protoMetricDescriptors[name]; created { + return nil + } + + if builtinMetric(se.metricTypeFromProto(name)) { + se.protoMetricDescriptors[name] = true + return nil + } + + // Otherwise, we encountered a cache-miss and + // should create the metric descriptor remotely. + inMD, err := se.protoToMonitoringMetricDescriptor(metric, se.defaultLabels) + if err != nil { + return err + } + + if err = se.createMetricDescriptor(ctx, inMD); err != nil { + return err + } + + se.protoMetricDescriptors[name] = true + return nil +} + +func (se *statsExporter) protoTimeSeriesToMonitoringPoints(ts *metricspb.TimeSeries, metricKind googlemetricpb.MetricDescriptor_MetricKind) ([]*monitoringpb.Point, error) { + sptl := make([]*monitoringpb.Point, 0, len(ts.Points)) + for _, pt := range ts.Points { + // If we have a last value aggregation point i.e. MetricDescriptor_GAUGE + // StartTime should be nil. + startTime := ts.StartTimestamp + if metricKind == googlemetricpb.MetricDescriptor_GAUGE { + startTime = nil + } + spt, err := fromProtoPoint(startTime, pt) + if err != nil { + return nil, err + } + sptl = append(sptl, spt) + } + return sptl, nil +} + +func (se *statsExporter) protoToMonitoringMetricDescriptor(metric *metricspb.Metric, additionalLabels map[string]labelValue) (*googlemetricpb.MetricDescriptor, error) { + if metric == nil || metric.MetricDescriptor == nil { + return nil, errNilMetricOrMetricDescriptor + } + + md := metric.GetMetricDescriptor() + metricName := md.GetName() + unit := md.GetUnit() + description := md.GetDescription() + metricType := se.metricTypeFromProto(metricName) + displayName := se.displayName(metricName) + metricKind, valueType := protoMetricDescriptorTypeToMetricKind(metric) + + sdm := &googlemetricpb.MetricDescriptor{ + Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", se.o.ProjectID, metricType), + DisplayName: displayName, + Description: description, + Unit: unit, + Type: metricType, + MetricKind: metricKind, + ValueType: valueType, + Labels: labelDescriptorsFromProto(additionalLabels, metric.GetMetricDescriptor().GetLabelKeys()), + } + + return sdm, nil +} + +func labelDescriptorsFromProto(defaults map[string]labelValue, protoLabelKeys []*metricspb.LabelKey) []*labelpb.LabelDescriptor { + labelDescriptors := make([]*labelpb.LabelDescriptor, 0, len(defaults)+len(protoLabelKeys)) + + // Fill in the defaults first. + for key, lbl := range defaults { + labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ + Key: sanitize(key), + Description: lbl.desc, + ValueType: labelpb.LabelDescriptor_STRING, + }) + } + + // Now fill in those from the metric. + for _, protoKey := range protoLabelKeys { + labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ + Key: sanitize(protoKey.GetKey()), + Description: protoKey.GetDescription(), + ValueType: labelpb.LabelDescriptor_STRING, // We only use string tags + }) + } + return labelDescriptors +} + +func (se *statsExporter) metricTypeFromProto(name string) string { + prefix := se.o.MetricPrefix + if se.o.GetMetricPrefix != nil { + prefix = se.o.GetMetricPrefix(name) + } + if prefix != "" { + name = path.Join(prefix, name) + } + if !hasDomain(name) { + // Still needed because the name may or may not have a "/" at the beginning. + name = path.Join(defaultDomain, name) + } + return name +} + +// hasDomain checks if the metric name already has a domain in it. +func hasDomain(name string) bool { + for _, domain := range domains { + if strings.Contains(name, domain) { + return true + } + } + return false +} + +func fromProtoPoint(startTime *timestamppb.Timestamp, pt *metricspb.Point) (*monitoringpb.Point, error) { + if pt == nil { + return nil, nil + } + + mptv, err := protoToMetricPoint(pt.Value) + if err != nil { + return nil, err + } + + return &monitoringpb.Point{ + Value: mptv, + Interval: &monitoringpb.TimeInterval{ + StartTime: startTime, + EndTime: pt.Timestamp, + }, + }, nil +} + +func protoToMetricPoint(value interface{}) (*monitoringpb.TypedValue, error) { + if value == nil { + return nil, nil + } + + switch v := value.(type) { + default: + // All the other types are not yet handled. + // TODO: (@odeke-em, @songy23) talk to the Stackdriver team to determine + // the use cases for: + // + // *TypedValue_BoolValue + // *TypedValue_StringValue + // + // and then file feature requests on OpenCensus-Specs and then OpenCensus-Proto, + // lest we shall error here. + // + // TODO: Add conversion from SummaryValue when + // https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/66 + // has been figured out. + return nil, fmt.Errorf("protoToMetricPoint: unknown Data type: %T", value) + + case *metricspb.Point_Int64Value: + return &monitoringpb.TypedValue{ + Value: &monitoringpb.TypedValue_Int64Value{ + Int64Value: v.Int64Value, + }, + }, nil + + case *metricspb.Point_DoubleValue: + return &monitoringpb.TypedValue{ + Value: &monitoringpb.TypedValue_DoubleValue{ + DoubleValue: v.DoubleValue, + }, + }, nil + + case *metricspb.Point_DistributionValue: + dv := v.DistributionValue + var mv *monitoringpb.TypedValue_DistributionValue + if dv != nil { + var mean float64 + if dv.Count > 0 { + mean = float64(dv.Sum) / float64(dv.Count) + } + mv = &monitoringpb.TypedValue_DistributionValue{ + DistributionValue: &distributionpb.Distribution{ + Count: dv.Count, + Mean: mean, + SumOfSquaredDeviation: dv.SumOfSquaredDeviation, + }, + } + + insertZeroBound := false + if bopts := dv.BucketOptions; bopts != nil && bopts.Type != nil { + bexp, ok := bopts.Type.(*metricspb.DistributionValue_BucketOptions_Explicit_) + if ok && bexp != nil && bexp.Explicit != nil { + insertZeroBound = shouldInsertZeroBound(bexp.Explicit.Bounds...) + mv.DistributionValue.BucketOptions = &distributionpb.Distribution_BucketOptions{ + Options: &distributionpb.Distribution_BucketOptions_ExplicitBuckets{ + ExplicitBuckets: &distributionpb.Distribution_BucketOptions_Explicit{ + // The first bucket bound should be 0.0 because the Metrics first bucket is + // [0, first_bound) but Stackdriver monitoring bucket bounds begin with -infinity + // (first bucket is (-infinity, 0)) + Bounds: addZeroBoundOnCondition(insertZeroBound, bexp.Explicit.Bounds...), + }, + }, + } + } + } + mv.DistributionValue.BucketCounts = addZeroBucketCountOnCondition(insertZeroBound, bucketCounts(dv.Buckets)...) + + } + return &monitoringpb.TypedValue{Value: mv}, nil + } +} + +func bucketCounts(buckets []*metricspb.DistributionValue_Bucket) []int64 { + bucketCounts := make([]int64, len(buckets)) + for i, bucket := range buckets { + if bucket != nil { + bucketCounts[i] = bucket.Count + } + } + return bucketCounts +} + +func protoMetricDescriptorTypeToMetricKind(m *metricspb.Metric) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { + dt := m.GetMetricDescriptor() + if dt == nil { + return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED + } + + switch dt.Type { + case metricspb.MetricDescriptor_CUMULATIVE_INT64: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64 + + case metricspb.MetricDescriptor_CUMULATIVE_DOUBLE: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE + + case metricspb.MetricDescriptor_CUMULATIVE_DISTRIBUTION: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION + + case metricspb.MetricDescriptor_GAUGE_DOUBLE: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE + + case metricspb.MetricDescriptor_GAUGE_INT64: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 + + case metricspb.MetricDescriptor_GAUGE_DISTRIBUTION: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DISTRIBUTION + + default: + return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED + } +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go new file mode 100644 index 000000000..ee519a4bf --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go @@ -0,0 +1,57 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package monitoredresource + +import ( + "github.com/aws/aws-sdk-go/aws/ec2metadata" + "github.com/aws/aws-sdk-go/aws/session" +) + +// awsIdentityDocument is used to store parsed AWS Identity Document. +type awsIdentityDocument struct { + // accountID is the AWS account number for the VM. + accountID string + + // instanceID is the instance id of the instance. + instanceID string + + // Region is the AWS region for the VM. + region string +} + +// retrieveAWSIdentityDocument attempts to retrieve AWS Identity Document. +// If the environment is AWS EC2 Instance then a valid document is retrieved. +// Relevant attributes from the document are stored in awsIdentityDoc. +// This is only done once. +func retrieveAWSIdentityDocument() *awsIdentityDocument { + awsIdentityDoc := awsIdentityDocument{} + sesion, err := session.NewSession() + if err != nil { + return nil + } + c := ec2metadata.New(sesion) + if !c.Available() { + return nil + } + ec2InstanceIdentifyDocument, err := c.GetInstanceIdentityDocument() + if err != nil { + return nil + } + awsIdentityDoc.region = ec2InstanceIdentifyDocument.Region + awsIdentityDoc.instanceID = ec2InstanceIdentifyDocument.InstanceID + awsIdentityDoc.accountID = ec2InstanceIdentifyDocument.AccountID + + return &awsIdentityDoc +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go new file mode 100644 index 000000000..f0d88856b --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go @@ -0,0 +1,117 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package monitoredresource + +import ( + "context" + "fmt" + "log" + "os" + "strings" + + "cloud.google.com/go/compute/metadata" + container "cloud.google.com/go/container/apiv1" + containerpb "google.golang.org/genproto/googleapis/container/v1" +) + +// gcpMetadata represents metadata retrieved from GCP (GKE and GCE) environment. +type gcpMetadata struct { + + // projectID is the identifier of the GCP project associated with this resource, such as "my-project". + projectID string + + // instanceID is the numeric VM instance identifier assigned by Compute Engine. + instanceID string + + // clusterName is the name for the cluster the container is running in. + clusterName string + + // containerName is the name of the container. + containerName string + + // namespaceID is the identifier for the cluster namespace the container is running in + namespaceID string + + // podID is the identifier for the pod the container is running in. + podID string + + // zone is the Compute Engine zone in which the VM is running. + zone string + + monitoringV2 bool +} + +// retrieveGCPMetadata retrieves value of each Attribute from Metadata Server +// in GKE container and GCE instance environment. +// Some attributes are retrieved from the system environment. +// This is only executed detectOnce. +func retrieveGCPMetadata() *gcpMetadata { + gcpMetadata := gcpMetadata{} + var err error + gcpMetadata.instanceID, err = metadata.InstanceID() + if err != nil { + // Not a GCP environment + return &gcpMetadata + } + + gcpMetadata.projectID, err = metadata.ProjectID() + logError(err) + + gcpMetadata.zone, err = metadata.Zone() + logError(err) + + clusterName, err := metadata.InstanceAttributeValue("cluster-name") + logError(err) + gcpMetadata.clusterName = strings.TrimSpace(clusterName) + + clusterLocation, err := metadata.InstanceAttributeValue("cluster-location") + logError(err) + + // Following attributes are derived from environment variables. They are configured + // via yaml file. For details refer to: + // https://cloud.google.com/kubernetes-engine/docs/tutorials/custom-metrics-autoscaling#exporting_metrics_from_the_application + gcpMetadata.namespaceID = os.Getenv("NAMESPACE") + gcpMetadata.containerName = os.Getenv("CONTAINER_NAME") + gcpMetadata.podID = os.Getenv("HOSTNAME") + + // Monitoring API version can be obtained from cluster info.q + if gcpMetadata.clusterName != "" { + ctx := context.Background() + c, err := container.NewClusterManagerClient(ctx) + logError(err) + if c != nil { + req := &containerpb.GetClusterRequest{ + Name: fmt.Sprintf("projects/%s/locations/%s/clusters/%s", gcpMetadata.projectID, strings.TrimSpace(clusterLocation), gcpMetadata.clusterName), + } + resp, err := c.GetCluster(ctx, req) + logError(err) + if resp != nil && resp.GetMonitoringService() == "monitoring.googleapis.com/kubernetes" && + resp.GetLoggingService() == "logging.googleapis.com/kubernetes" { + gcpMetadata.monitoringV2 = true + } + } + } + + return &gcpMetadata +} + +// logError logs error only if the error is present and it is not 'not defined' +func logError(err error) { + if err != nil { + if !strings.Contains(err.Error(), "not defined") { + log.Printf("Error retrieving gcp metadata: %v", err) + } + } +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go new file mode 100644 index 000000000..86e76002a --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go @@ -0,0 +1,232 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package monitoredresource + +import ( + "fmt" + "os" + "sync" +) + +// Interface is a type that represent monitor resource that satisfies monitoredresource.Interface +type Interface interface { + + // MonitoredResource returns the resource type and resource labels. + MonitoredResource() (resType string, labels map[string]string) +} + +// GKEContainer represents gke_container type monitored resource. +// For definition refer to +// https://cloud.google.com/monitoring/api/resources#tag_gke_container +type GKEContainer struct { + + // ProjectID is the identifier of the GCP project associated with this resource, such as "my-project". + ProjectID string + + // InstanceID is the numeric VM instance identifier assigned by Compute Engine. + InstanceID string + + // ClusterName is the name for the cluster the container is running in. + ClusterName string + + // ContainerName is the name of the container. + ContainerName string + + // NamespaceID is the identifier for the cluster namespace the container is running in + NamespaceID string + + // PodID is the identifier for the pod the container is running in. + PodID string + + // Zone is the Compute Engine zone in which the VM is running. + Zone string + + // LoggingMonitoringV2Enabled is the identifier if user enabled V2 logging and monitoring for GKE + LoggingMonitoringV2Enabled bool +} + +// MonitoredResource returns resource type and resource labels for GKEContainer +func (gke *GKEContainer) MonitoredResource() (resType string, labels map[string]string) { + labels = map[string]string{ + "project_id": gke.ProjectID, + "cluster_name": gke.ClusterName, + "container_name": gke.ContainerName, + } + var typ string + if gke.LoggingMonitoringV2Enabled { + typ = "k8s_container" + labels["pod_name"] = gke.PodID + labels["namespace_name"] = gke.NamespaceID + labels["location"] = gke.Zone + } else { + typ = "gke_container" + labels["pod_id"] = gke.PodID + labels["namespace_id"] = gke.NamespaceID + labels["zone"] = gke.Zone + labels["instance_id"] = gke.InstanceID + } + return typ, labels +} + +// GCEInstance represents gce_instance type monitored resource. +// For definition refer to +// https://cloud.google.com/monitoring/api/resources#tag_gce_instance +type GCEInstance struct { + + // ProjectID is the identifier of the GCP project associated with this resource, such as "my-project". + ProjectID string + + // InstanceID is the numeric VM instance identifier assigned by Compute Engine. + InstanceID string + + // Zone is the Compute Engine zone in which the VM is running. + Zone string +} + +// MonitoredResource returns resource type and resource labels for GCEInstance +func (gce *GCEInstance) MonitoredResource() (resType string, labels map[string]string) { + labels = map[string]string{ + "project_id": gce.ProjectID, + "instance_id": gce.InstanceID, + "zone": gce.Zone, + } + return "gce_instance", labels +} + +// AWSEC2Instance represents aws_ec2_instance type monitored resource. +// For definition refer to +// https://cloud.google.com/monitoring/api/resources#tag_aws_ec2_instance +type AWSEC2Instance struct { + + // AWSAccount is the AWS account number for the VM. + AWSAccount string + + // InstanceID is the instance id of the instance. + InstanceID string + + // Region is the AWS region for the VM. The format of this field is "aws:{region}", + // where supported values for {region} are listed at + // http://docs.aws.amazon.com/general/latest/gr/rande.html. + Region string +} + +// MonitoredResource returns resource type and resource labels for AWSEC2Instance +func (aws *AWSEC2Instance) MonitoredResource() (resType string, labels map[string]string) { + labels = map[string]string{ + "aws_account": aws.AWSAccount, + "instance_id": aws.InstanceID, + "region": aws.Region, + } + return "aws_ec2_instance", labels +} + +// Autodetect auto detects monitored resources based on +// the environment where the application is running. +// It supports detection of following resource types +// 1. gke_container: +// 2. gce_instance: +// 3. aws_ec2_instance: +// +// Returns MonitoredResInterface which implements getLabels() and getType() +// For resource definition go to https://cloud.google.com/monitoring/api/resources +func Autodetect() Interface { + return func() Interface { + detectOnce.Do(func() { + var awsIdentityDoc *awsIdentityDocument + var gcpMetadata *gcpMetadata + + // First attempts to retrieve AWS Identity Doc and GCP metadata. + // It then determines the resource type + // In GCP and AWS environment both func finishes quickly. However, + // in an environment other than those (e.g local laptop) it + // takes 2 seconds for GCP and 5-6 for AWS. + var wg sync.WaitGroup + wg.Add(2) + + go func() { + defer wg.Done() + awsIdentityDoc = retrieveAWSIdentityDocument() + }() + go func() { + defer wg.Done() + gcpMetadata = retrieveGCPMetadata() + }() + + wg.Wait() + autoDetected = detectResourceType(awsIdentityDoc, gcpMetadata) + }) + return autoDetected + }() + +} + +// createAWSEC2InstanceMonitoredResource creates a aws_ec2_instance monitored resource +// awsIdentityDoc contains AWS EC2 specific attributes. +func createAWSEC2InstanceMonitoredResource(awsIdentityDoc *awsIdentityDocument) *AWSEC2Instance { + awsInstance := AWSEC2Instance{ + AWSAccount: awsIdentityDoc.accountID, + InstanceID: awsIdentityDoc.instanceID, + Region: fmt.Sprintf("aws:%s", awsIdentityDoc.region), + } + return &awsInstance +} + +// createGCEInstanceMonitoredResource creates a gce_instance monitored resource +// gcpMetadata contains GCP (GKE or GCE) specific attributes. +func createGCEInstanceMonitoredResource(gcpMetadata *gcpMetadata) *GCEInstance { + gceInstance := GCEInstance{ + ProjectID: gcpMetadata.projectID, + InstanceID: gcpMetadata.instanceID, + Zone: gcpMetadata.zone, + } + return &gceInstance +} + +// createGKEContainerMonitoredResource creates a gke_container monitored resource +// gcpMetadata contains GCP (GKE or GCE) specific attributes. +func createGKEContainerMonitoredResource(gcpMetadata *gcpMetadata) *GKEContainer { + gkeContainer := GKEContainer{ + ProjectID: gcpMetadata.projectID, + InstanceID: gcpMetadata.instanceID, + Zone: gcpMetadata.zone, + ContainerName: gcpMetadata.containerName, + ClusterName: gcpMetadata.clusterName, + NamespaceID: gcpMetadata.namespaceID, + PodID: gcpMetadata.podID, + LoggingMonitoringV2Enabled: gcpMetadata.monitoringV2, + } + return &gkeContainer +} + +// detectOnce is used to make sure GCP and AWS metadata detect function executes only once. +var detectOnce sync.Once + +// autoDetected is the metadata detected after the first execution of Autodetect function. +var autoDetected Interface + +// detectResourceType determines the resource type. +// awsIdentityDoc contains AWS EC2 attributes. nil if it is not AWS EC2 environment +// gcpMetadata contains GCP (GKE or GCE) specific attributes. +func detectResourceType(awsIdentityDoc *awsIdentityDocument, gcpMetadata *gcpMetadata) Interface { + if os.Getenv("KUBERNETES_SERVICE_HOST") != "" && + gcpMetadata != nil && gcpMetadata.instanceID != "" { + return createGKEContainerMonitoredResource(gcpMetadata) + } else if gcpMetadata != nil && gcpMetadata.instanceID != "" { + return createGCEInstanceMonitoredResource(gcpMetadata) + } else if awsIdentityDoc != nil { + return createAWSEC2InstanceMonitoredResource(awsIdentityDoc) + } + return nil +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go new file mode 100644 index 000000000..782011cb6 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go @@ -0,0 +1,143 @@ +// Copyright 2019, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver // import "contrib.go.opencensus.io/exporter/stackdriver" + +import ( + "fmt" + + "go.opencensus.io/resource" + "go.opencensus.io/resource/resourcekeys" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" +) + +// Resource labels that are generally internal to the exporter. +// Consider exposing these labels and a type identifier in the future to allow +// for customization. +const ( + stackdriverLocation = "contrib.opencensus.io/exporter/stackdriver/location" + stackdriverProjectID = "contrib.opencensus.io/exporter/stackdriver/project_id" + stackdriverGenericTaskNamespace = "contrib.opencensus.io/exporter/stackdriver/generic_task/namespace" + stackdriverGenericTaskJob = "contrib.opencensus.io/exporter/stackdriver/generic_task/job" + stackdriverGenericTaskID = "contrib.opencensus.io/exporter/stackdriver/generic_task/task_id" +) + +// Mappings for the well-known OpenCensus resources to applicable Stackdriver resources. +var k8sContainerMap = map[string]string{ + "project_id": stackdriverProjectID, + "location": resourcekeys.CloudKeyZone, + "cluster_name": resourcekeys.K8SKeyClusterName, + "namespace_name": resourcekeys.K8SKeyNamespaceName, + "pod_name": resourcekeys.K8SKeyPodName, + "container_name": resourcekeys.ContainerKeyName, +} + +var k8sPodMap = map[string]string{ + "project_id": stackdriverProjectID, + "location": resourcekeys.CloudKeyZone, + "cluster_name": resourcekeys.K8SKeyClusterName, + "namespace_name": resourcekeys.K8SKeyNamespaceName, + "pod_name": resourcekeys.K8SKeyPodName, +} + +var k8sNodeMap = map[string]string{ + "project_id": stackdriverProjectID, + "location": resourcekeys.CloudKeyZone, + "cluster_name": resourcekeys.K8SKeyClusterName, + "node_name": resourcekeys.HostKeyName, +} + +var gcpResourceMap = map[string]string{ + "project_id": stackdriverProjectID, + "instance_id": resourcekeys.HostKeyID, + "zone": resourcekeys.CloudKeyZone, +} + +var awsResourceMap = map[string]string{ + "project_id": stackdriverProjectID, + "instance_id": resourcekeys.HostKeyID, + "region": resourcekeys.CloudKeyRegion, + "aws_account": resourcekeys.CloudKeyAccountID, +} + +// Generic task resource. +var genericResourceMap = map[string]string{ + "project_id": stackdriverProjectID, + "location": stackdriverLocation, + "namespace": stackdriverGenericTaskNamespace, + "job": stackdriverGenericTaskJob, + "task_id": stackdriverGenericTaskID, +} + +// returns transformed label map and true if all labels in match are found +// in input except optional project_id. It returns false if at least one label +// other than project_id is missing. +func transformResource(match, input map[string]string) (map[string]string, bool) { + output := make(map[string]string, len(input)) + for dst, src := range match { + v, ok := input[src] + if ok { + output[dst] = v + } else if dst != "project_id" { + return nil, true + } + } + return output, false +} + +func defaultMapResource(res *resource.Resource) *monitoredrespb.MonitoredResource { + match := genericResourceMap + result := &monitoredrespb.MonitoredResource{ + Type: "global", + } + if res == nil || res.Labels == nil { + return result + } + + switch { + case res.Type == resourcekeys.ContainerType: + result.Type = "k8s_container" + match = k8sContainerMap + case res.Type == resourcekeys.K8SType: + result.Type = "k8s_pod" + match = k8sPodMap + case res.Type == resourcekeys.HostType && res.Labels[resourcekeys.K8SKeyClusterName] != "": + result.Type = "k8s_node" + match = k8sNodeMap + case res.Labels[resourcekeys.CloudKeyProvider] == resourcekeys.CloudProviderGCP: + result.Type = "gce_instance" + match = gcpResourceMap + case res.Labels[resourcekeys.CloudKeyProvider] == resourcekeys.CloudProviderAWS: + result.Type = "aws_ec2_instance" + match = awsResourceMap + } + + var missing bool + result.Labels, missing = transformResource(match, res.Labels) + if missing { + result.Type = "global" + // if project id specified then transform it. + if v, ok := res.Labels[stackdriverProjectID]; ok { + result.Labels = make(map[string]string, 1) + result.Labels["project_id"] = v + } + return result + } + if result.Type == "aws_ec2_instance" { + if v, ok := result.Labels["region"]; ok { + result.Labels["region"] = fmt.Sprintf("aws:%s", v) + } + } + return result +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go new file mode 100644 index 000000000..184bb1d43 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go @@ -0,0 +1,50 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +import ( + "strings" + "unicode" +) + +const labelKeySizeLimit = 100 + +// sanitize returns a string that is trunacated to 100 characters if it's too +// long, and replaces non-alphanumeric characters to underscores. +func sanitize(s string) string { + if len(s) == 0 { + return s + } + if len(s) > labelKeySizeLimit { + s = s[:labelKeySizeLimit] + } + s = strings.Map(sanitizeRune, s) + if unicode.IsDigit(rune(s[0])) { + s = "key_" + s + } + if s[0] == '_' { + s = "key" + s + } + return s +} + +// converts anything that is not a letter or digit to an underscore +func sanitizeRune(r rune) rune { + if unicode.IsLetter(r) || unicode.IsDigit(r) { + return r + } + // Everything else turns into an underscore + return '_' +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go new file mode 100644 index 000000000..fafd06c28 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go @@ -0,0 +1,480 @@ +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package stackdriver contains the OpenCensus exporters for +// Stackdriver Monitoring and Stackdriver Tracing. +// +// This exporter can be used to send metrics to Stackdriver Monitoring and traces +// to Stackdriver trace. +// +// The package uses Application Default Credentials to authenticate by default. +// See: https://developers.google.com/identity/protocols/application-default-credentials +// +// Alternatively, pass the authentication options in both the MonitoringClientOptions +// and the TraceClientOptions fields of Options. +// +// Stackdriver Monitoring +// +// This exporter support exporting OpenCensus views to Stackdriver Monitoring. +// Each registered view becomes a metric in Stackdriver Monitoring, with the +// tags becoming labels. +// +// The aggregation function determines the metric kind: LastValue aggregations +// generate Gauge metrics and all other aggregations generate Cumulative metrics. +// +// In order to be able to push your stats to Stackdriver Monitoring, you must: +// +// 1. Create a Cloud project: https://support.google.com/cloud/answer/6251787?hl=en +// 2. Enable billing: https://support.google.com/cloud/answer/6288653#new-billing +// 3. Enable the Stackdriver Monitoring API: https://console.cloud.google.com/apis/dashboard +// +// These steps enable the API but don't require that your app is hosted on Google Cloud Platform. +// +// Stackdriver Trace +// +// This exporter supports exporting Trace Spans to Stackdriver Trace. It also +// supports the Google "Cloud Trace" propagation format header. +package stackdriver // import "contrib.go.opencensus.io/exporter/stackdriver" + +import ( + "context" + "errors" + "fmt" + "log" + "os" + "path" + "strings" + "time" + + metadataapi "cloud.google.com/go/compute/metadata" + traceapi "cloud.google.com/go/trace/apiv2" + "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" + "go.opencensus.io/resource" + "go.opencensus.io/stats/view" + "go.opencensus.io/trace" + "golang.org/x/oauth2/google" + "google.golang.org/api/option" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + + commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1" + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + "go.opencensus.io/metric/metricdata" +) + +// Options contains options for configuring the exporter. +type Options struct { + // ProjectID is the identifier of the Stackdriver + // project the user is uploading the stats data to. + // If not set, this will default to your "Application Default Credentials". + // For details see: https://developers.google.com/accounts/docs/application-default-credentials. + // + // It will be used in the project_id label of a Stackdriver monitored + // resource if the resource does not inherently belong to a specific + // project, e.g. on-premise resource like k8s_container or generic_task. + ProjectID string + + // Location is the identifier of the GCP or AWS cloud region/zone in which + // the data for a resource is stored. + // If not set, it will default to the location provided by the metadata server. + // + // It will be used in the location label of a Stackdriver monitored resource + // if the resource does not inherently belong to a specific project, e.g. + // on-premise resource like k8s_container or generic_task. + Location string + + // OnError is the hook to be called when there is + // an error uploading the stats or tracing data. + // If no custom hook is set, errors are logged. + // Optional. + OnError func(err error) + + // MonitoringClientOptions are additional options to be passed + // to the underlying Stackdriver Monitoring API client. + // Optional. + MonitoringClientOptions []option.ClientOption + + // TraceClientOptions are additional options to be passed + // to the underlying Stackdriver Trace API client. + // Optional. + TraceClientOptions []option.ClientOption + + // BundleDelayThreshold determines the max amount of time + // the exporter can wait before uploading view data or trace spans to + // the backend. + // Optional. + BundleDelayThreshold time.Duration + + // BundleCountThreshold determines how many view data events or trace spans + // can be buffered before batch uploading them to the backend. + // Optional. + BundleCountThreshold int + + // TraceSpansBufferMaxBytes is the maximum size (in bytes) of spans that + // will be buffered in memory before being dropped. + // + // If unset, a default of 8MB will be used. + TraceSpansBufferMaxBytes int + + // Resource sets the MonitoredResource against which all views will be + // recorded by this exporter. + // + // All Stackdriver metrics created by this exporter are custom metrics, + // so only a limited number of MonitoredResource types are supported, see: + // https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource + // + // An important consideration when setting the Resource here is that + // Stackdriver Monitoring only allows a single writer per + // TimeSeries, see: https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series + // A TimeSeries is uniquely defined by the metric type name + // (constructed from the view name and the MetricPrefix), the Resource field, + // and the set of label key/value pairs (in OpenCensus terminology: tag). + // + // If no custom Resource is set, a default MonitoredResource + // with type global and no resource labels will be used. If you explicitly + // set this field, you may also want to set custom DefaultMonitoringLabels. + // + // Deprecated: Use MonitoredResource instead. + Resource *monitoredrespb.MonitoredResource + + // MonitoredResource sets the MonitoredResource against which all views will be + // recorded by this exporter. + // + // All Stackdriver metrics created by this exporter are custom metrics, + // so only a limited number of MonitoredResource types are supported, see: + // https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource + // + // An important consideration when setting the MonitoredResource here is that + // Stackdriver Monitoring only allows a single writer per + // TimeSeries, see: https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series + // A TimeSeries is uniquely defined by the metric type name + // (constructed from the view name and the MetricPrefix), the MonitoredResource field, + // and the set of label key/value pairs (in OpenCensus terminology: tag). + // + // If no custom MonitoredResource is set AND if Resource is also not set then + // a default MonitoredResource with type global and no resource labels will be used. + // If you explicitly set this field, you may also want to set custom DefaultMonitoringLabels. + // + // This field replaces Resource field. If this is set then it will override the + // Resource field. + // Optional, but encouraged. + MonitoredResource monitoredresource.Interface + + // ResourceDetector provides a hook to discover arbitrary resource information. + // + // The translation function provided in MapResource must be able to conver the + // the resource information to a Stackdriver monitored resource. + // + // If this field is unset, resource type and tags will automatically be discovered through + // the OC_RESOURCE_TYPE and OC_RESOURCE_LABELS environment variables. + ResourceDetector resource.Detector + + // MapResource converts a OpenCensus resource to a Stackdriver monitored resource. + // + // If this field is unset, defaultMapResource will be used which encodes a set of default + // conversions from auto-detected resources to well-known Stackdriver monitored resources. + MapResource func(*resource.Resource) *monitoredrespb.MonitoredResource + + // MetricPrefix overrides the prefix of a Stackdriver metric names. + // Optional. If unset defaults to "custom.googleapis.com/opencensus/". + // If GetMetricPrefix is non-nil, this option is ignored. + MetricPrefix string + + // GetMetricDisplayName allows customizing the display name for the metric + // associated with the given view. By default it will be: + // MetricPrefix + view.Name + GetMetricDisplayName func(view *view.View) string + + // GetMetricType allows customizing the metric type for the given view. + // By default, it will be: + // "custom.googleapis.com/opencensus/" + view.Name + // + // See: https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricDescriptor + // Depreacted. Use GetMetricPrefix instead. + GetMetricType func(view *view.View) string + + // GetMetricPrefix allows customizing the metric prefix for the given metric name. + // If it is not set, MetricPrefix is used. If MetricPrefix is not set, it defaults to: + // "custom.googleapis.com/opencensus/" + // + // See: https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricDescriptor + GetMetricPrefix func(name string) string + + // DefaultTraceAttributes will be appended to every span that is exported to + // Stackdriver Trace. + DefaultTraceAttributes map[string]interface{} + + // DefaultMonitoringLabels are labels added to every metric created by this + // exporter in Stackdriver Monitoring. + // + // If unset, this defaults to a single label with key "opencensus_task" and + // value "go-@". This default ensures that the set of labels + // together with the default Resource (global) are unique to this + // process, as required by Stackdriver Monitoring. + // + // If you set DefaultMonitoringLabels, make sure that the Resource field + // together with these labels is unique to the + // current process. This is to ensure that there is only a single writer to + // each TimeSeries in Stackdriver. + // + // Set this to &Labels{} (a pointer to an empty Labels) to avoid getting the + // default "opencensus_task" label. You should only do this if you know that + // the Resource you set uniquely identifies this Go process. + DefaultMonitoringLabels *Labels + + // Context allows you to provide a custom context for API calls. + // + // This context will be used several times: first, to create Stackdriver + // trace and metric clients, and then every time a new batch of traces or + // stats needs to be uploaded. + // + // Do not set a timeout on this context. Instead, set the Timeout option. + // + // If unset, context.Background() will be used. + Context context.Context + + // SkipCMD enforces to skip all the CreateMetricDescriptor calls. + // These calls are important in order to configure the unit of the metrics, + // but in some cases all the exported metrics are builtin (unit is configured) + // or the unit is not important. + SkipCMD bool + + // Timeout for all API calls. If not set, defaults to 5 seconds. + Timeout time.Duration + + // ReportingInterval sets the interval between reporting metrics. + // If it is set to zero then default value is used. + ReportingInterval time.Duration + + // NumberOfWorkers sets the number of go rountines that send requests + // to Stackdriver Monitoring. This is only used for Proto metrics export + // for now. The minimum number of workers is 1. + NumberOfWorkers int + + // ResourceByDescriptor may be provided to supply monitored resource dynamically + // based on the metric Descriptor. Most users will not need to set this, + // but should instead set ResourceDetector. + // + // The MonitoredResource and ResourceDetector fields are ignored if this + // field is set to a non-nil value. + // + // The ResourceByDescriptor is called to derive monitored resources from + // metric.Descriptor and the label map associated with the time-series. + // If any label is used for the derived resource then it will be removed + // from the label map. The remaining labels in the map are returned to + // be used with the time-series. + // + // If the func set to this field does not return valid resource even for one + // time-series then it will result into an error for the entire CreateTimeSeries request + // which may contain more than one time-series. + ResourceByDescriptor func(*metricdata.Descriptor, map[string]string) (map[string]string, monitoredresource.Interface) +} + +const defaultTimeout = 5 * time.Second + +var defaultDomain = path.Join("custom.googleapis.com", "opencensus") + +// Exporter is a stats and trace exporter that uploads data to Stackdriver. +// +// You can create a single Exporter and register it as both a trace exporter +// (to export to Stackdriver Trace) and a stats exporter (to integrate with +// Stackdriver Monitoring). +type Exporter struct { + traceExporter *traceExporter + statsExporter *statsExporter +} + +// NewExporter creates a new Exporter that implements both stats.Exporter and +// trace.Exporter. +func NewExporter(o Options) (*Exporter, error) { + if o.ProjectID == "" { + ctx := o.Context + if ctx == nil { + ctx = context.Background() + } + creds, err := google.FindDefaultCredentials(ctx, traceapi.DefaultAuthScopes()...) + if err != nil { + return nil, fmt.Errorf("stackdriver: %v", err) + } + if creds.ProjectID == "" { + return nil, errors.New("stackdriver: no project found with application default credentials") + } + o.ProjectID = creds.ProjectID + } + if o.Location == "" { + if metadataapi.OnGCE() { + zone, err := metadataapi.Zone() + if err != nil { + // This error should be logged with a warning level. + err = fmt.Errorf("setting Stackdriver default location failed: %s", err) + if o.OnError != nil { + o.OnError(err) + } else { + log.Print(err) + } + } else { + o.Location = zone + } + } + } + + if o.MonitoredResource != nil { + o.Resource = convertMonitoredResourceToPB(o.MonitoredResource) + } + if o.MapResource == nil { + o.MapResource = defaultMapResource + } + if o.ResourceDetector != nil { + // For backwards-compatibility we still respect the deprecated resource field. + if o.Resource != nil { + return nil, errors.New("stackdriver: ResourceDetector must not be used in combination with deprecated resource fields") + } + res, err := o.ResourceDetector(o.Context) + if err != nil { + return nil, fmt.Errorf("stackdriver: detect resource: %s", err) + } + // Populate internal resource labels for defaulting project_id, location, and + // generic resource labels of applicable monitored resources. + res.Labels[stackdriverProjectID] = o.ProjectID + res.Labels[stackdriverLocation] = o.Location + res.Labels[stackdriverGenericTaskNamespace] = "default" + res.Labels[stackdriverGenericTaskJob] = path.Base(os.Args[0]) + res.Labels[stackdriverGenericTaskID] = getTaskValue() + + o.Resource = o.MapResource(res) + } + if o.MetricPrefix != "" && !strings.HasSuffix(o.MetricPrefix, "/") { + o.MetricPrefix = o.MetricPrefix + "/" + } + + se, err := newStatsExporter(o) + if err != nil { + return nil, err + } + te, err := newTraceExporter(o) + if err != nil { + return nil, err + } + return &Exporter{ + statsExporter: se, + traceExporter: te, + }, nil +} + +// ExportView exports to the Stackdriver Monitoring if view data +// has one or more rows. +// Deprecated: use ExportMetrics and StartMetricsExporter instead. +func (e *Exporter) ExportView(vd *view.Data) { + e.statsExporter.ExportView(vd) +} + +// ExportMetricsProto exports OpenCensus Metrics Proto to Stackdriver Monitoring synchronously, +// without de-duping or adding proto metrics to the bundler. +func (e *Exporter) ExportMetricsProto(ctx context.Context, node *commonpb.Node, rsc *resourcepb.Resource, metrics []*metricspb.Metric) error { + _, err := e.statsExporter.PushMetricsProto(ctx, node, rsc, metrics) + return err +} + +// PushMetricsProto simliar with ExportMetricsProto but returns the number of dropped timeseries. +func (e *Exporter) PushMetricsProto(ctx context.Context, node *commonpb.Node, rsc *resourcepb.Resource, metrics []*metricspb.Metric) (int, error) { + return e.statsExporter.PushMetricsProto(ctx, node, rsc, metrics) +} + +// ExportMetrics exports OpenCensus Metrics to Stackdriver Monitoring +func (e *Exporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { + return e.statsExporter.ExportMetrics(ctx, metrics) +} + +// StartMetricsExporter starts exporter by creating an interval reader that reads metrics +// from all registered producers at set interval and exports them. +// Use StopMetricsExporter to stop exporting metrics. +// Previously, it required registering exporter to export stats collected by opencensus. +// exporter := stackdriver.NewExporter(stackdriver.Option{}) +// view.RegisterExporter(exporter) +// Now, it requires to call StartMetricsExporter() to export stats and metrics collected by opencensus. +// exporter := stackdriver.NewExporter(stackdriver.Option{}) +// exporter.StartMetricsExporter() +// defer exporter.StopMetricsExporter() +// +// Both approach should not be used simultaenously. Otherwise it may result into unknown behavior. +// Previous approach continues to work as before but will not report newly define metrics such +// as gauges. +func (e *Exporter) StartMetricsExporter() error { + return e.statsExporter.startMetricsReader() +} + +// StopMetricsExporter stops exporter from exporting metrics. +func (e *Exporter) StopMetricsExporter() { + e.statsExporter.stopMetricsReader() +} + +// ExportSpan exports a SpanData to Stackdriver Trace. +func (e *Exporter) ExportSpan(sd *trace.SpanData) { + if len(e.traceExporter.o.DefaultTraceAttributes) > 0 { + sd = e.sdWithDefaultTraceAttributes(sd) + } + e.traceExporter.ExportSpan(sd) +} + +func (e *Exporter) sdWithDefaultTraceAttributes(sd *trace.SpanData) *trace.SpanData { + newSD := *sd + newSD.Attributes = make(map[string]interface{}) + for k, v := range e.traceExporter.o.DefaultTraceAttributes { + newSD.Attributes[k] = v + } + for k, v := range sd.Attributes { + newSD.Attributes[k] = v + } + return &newSD +} + +// Flush waits for exported data to be uploaded. +// +// This is useful if your program is ending and you do not +// want to lose recent stats or spans. +func (e *Exporter) Flush() { + e.statsExporter.Flush() + e.traceExporter.Flush() +} + +func (o Options) handleError(err error) { + if o.OnError != nil { + o.OnError(err) + return + } + log.Printf("Failed to export to Stackdriver: %v", err) +} + +func newContextWithTimeout(ctx context.Context, timeout time.Duration) (context.Context, func()) { + if ctx == nil { + ctx = context.Background() + } + if timeout <= 0 { + timeout = defaultTimeout + } + return context.WithTimeout(ctx, timeout) +} + +// convertMonitoredResourceToPB converts MonitoredResource data in to +// protocol buffer. +func convertMonitoredResourceToPB(mr monitoredresource.Interface) *monitoredrespb.MonitoredResource { + mrpb := new(monitoredrespb.MonitoredResource) + var labels map[string]string + mrpb.Type, labels = mr.MonitoredResource() + mrpb.Labels = make(map[string]string) + for k, v := range labels { + mrpb.Labels[k] = v + } + return mrpb +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go new file mode 100644 index 000000000..e0a02ca9a --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go @@ -0,0 +1,628 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +import ( + "context" + "errors" + "fmt" + "os" + "path" + "sort" + "strconv" + "strings" + "sync" + "time" + + opencensus "go.opencensus.io" + "go.opencensus.io/stats" + "go.opencensus.io/stats/view" + "go.opencensus.io/tag" + "go.opencensus.io/trace" + + monitoring "cloud.google.com/go/monitoring/apiv3" + "github.com/golang/protobuf/ptypes/timestamp" + "go.opencensus.io/metric/metricdata" + "go.opencensus.io/metric/metricexport" + "google.golang.org/api/option" + "google.golang.org/api/support/bundler" + distributionpb "google.golang.org/genproto/googleapis/api/distribution" + labelpb "google.golang.org/genproto/googleapis/api/label" + "google.golang.org/genproto/googleapis/api/metric" + googlemetricpb "google.golang.org/genproto/googleapis/api/metric" + metricpb "google.golang.org/genproto/googleapis/api/metric" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" +) + +const ( + maxTimeSeriesPerUpload = 200 + opencensusTaskKey = "opencensus_task" + opencensusTaskDescription = "Opencensus task identifier" + defaultDisplayNamePrefix = "OpenCensus" + version = "0.10.0" +) + +var userAgent = fmt.Sprintf("opencensus-go %s; stackdriver-exporter %s", opencensus.Version(), version) + +// statsExporter exports stats to the Stackdriver Monitoring. +type statsExporter struct { + o Options + + viewDataBundler *bundler.Bundler + metricsBundler *bundler.Bundler + + protoMu sync.Mutex + protoMetricDescriptors map[string]bool // Metric descriptors that were already created remotely + + metricMu sync.Mutex + metricDescriptors map[string]bool // Metric descriptors that were already created remotely + + c *monitoring.MetricClient + defaultLabels map[string]labelValue + ir *metricexport.IntervalReader + + initReaderOnce sync.Once +} + +var ( + errBlankProjectID = errors.New("expecting a non-blank ProjectID") +) + +// newStatsExporter returns an exporter that uploads stats data to Stackdriver Monitoring. +// Only one Stackdriver exporter should be created per ProjectID per process, any subsequent +// invocations of NewExporter with the same ProjectID will return an error. +func newStatsExporter(o Options) (*statsExporter, error) { + if strings.TrimSpace(o.ProjectID) == "" { + return nil, errBlankProjectID + } + + opts := append(o.MonitoringClientOptions, option.WithUserAgent(userAgent)) + ctx := o.Context + if ctx == nil { + ctx = context.Background() + } + client, err := monitoring.NewMetricClient(ctx, opts...) + if err != nil { + return nil, err + } + e := &statsExporter{ + c: client, + o: o, + protoMetricDescriptors: make(map[string]bool), + metricDescriptors: make(map[string]bool), + } + + var defaultLablesNotSanitized map[string]labelValue + if o.DefaultMonitoringLabels != nil { + defaultLablesNotSanitized = o.DefaultMonitoringLabels.m + } else { + defaultLablesNotSanitized = map[string]labelValue{ + opencensusTaskKey: {val: getTaskValue(), desc: opencensusTaskDescription}, + } + } + + e.defaultLabels = make(map[string]labelValue) + // Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched. + for key, label := range defaultLablesNotSanitized { + e.defaultLabels[sanitize(key)] = label + } + + e.viewDataBundler = bundler.NewBundler((*view.Data)(nil), func(bundle interface{}) { + vds := bundle.([]*view.Data) + e.handleUpload(vds...) + }) + e.metricsBundler = bundler.NewBundler((*metricdata.Metric)(nil), func(bundle interface{}) { + metrics := bundle.([]*metricdata.Metric) + e.handleMetricsUpload(metrics) + }) + if delayThreshold := e.o.BundleDelayThreshold; delayThreshold > 0 { + e.viewDataBundler.DelayThreshold = delayThreshold + e.metricsBundler.DelayThreshold = delayThreshold + } + if countThreshold := e.o.BundleCountThreshold; countThreshold > 0 { + e.viewDataBundler.BundleCountThreshold = countThreshold + e.metricsBundler.BundleCountThreshold = countThreshold + } + return e, nil +} + +func (e *statsExporter) startMetricsReader() error { + e.initReaderOnce.Do(func() { + e.ir, _ = metricexport.NewIntervalReader(metricexport.NewReader(), e) + }) + e.ir.ReportingInterval = e.o.ReportingInterval + return e.ir.Start() +} + +func (e *statsExporter) stopMetricsReader() { + if e.ir != nil { + e.ir.Stop() + } +} + +func (e *statsExporter) getMonitoredResource(v *view.View, tags []tag.Tag) ([]tag.Tag, *monitoredrespb.MonitoredResource) { + resource := e.o.Resource + if resource == nil { + resource = &monitoredrespb.MonitoredResource{ + Type: "global", + } + } + return tags, resource +} + +// ExportView exports to the Stackdriver Monitoring if view data +// has one or more rows. +func (e *statsExporter) ExportView(vd *view.Data) { + if len(vd.Rows) == 0 { + return + } + err := e.viewDataBundler.Add(vd, 1) + switch err { + case nil: + return + case bundler.ErrOverflow: + e.o.handleError(errors.New("failed to upload: buffer full")) + default: + e.o.handleError(err) + } +} + +// getTaskValue returns a task label value in the format of +// "go-@". +func getTaskValue() string { + hostname, err := os.Hostname() + if err != nil { + hostname = "localhost" + } + return "go-" + strconv.Itoa(os.Getpid()) + "@" + hostname +} + +// handleUpload handles uploading a slice +// of Data, as well as error handling. +func (e *statsExporter) handleUpload(vds ...*view.Data) { + if err := e.uploadStats(vds); err != nil { + e.o.handleError(err) + } +} + +// Flush waits for exported view data and metrics to be uploaded. +// +// This is useful if your program is ending and you do not +// want to lose data that hasn't yet been exported. +func (e *statsExporter) Flush() { + e.viewDataBundler.Flush() + e.metricsBundler.Flush() +} + +func (e *statsExporter) uploadStats(vds []*view.Data) error { + ctx, cancel := newContextWithTimeout(e.o.Context, e.o.Timeout) + defer cancel() + ctx, span := trace.StartSpan( + ctx, + "contrib.go.opencensus.io/exporter/stackdriver.uploadStats", + trace.WithSampler(trace.NeverSample()), + ) + defer span.End() + + for _, vd := range vds { + if err := e.createMetricDescriptorFromView(ctx, vd.View); err != nil { + span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) + return err + } + } + for _, req := range e.makeReq(vds, maxTimeSeriesPerUpload) { + if err := createTimeSeries(ctx, e.c, req); err != nil { + span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) + // TODO(jbd): Don't fail fast here, batch errors? + return err + } + } + return nil +} + +func (e *statsExporter) makeReq(vds []*view.Data, limit int) []*monitoringpb.CreateTimeSeriesRequest { + var reqs []*monitoringpb.CreateTimeSeriesRequest + + var allTimeSeries []*monitoringpb.TimeSeries + for _, vd := range vds { + for _, row := range vd.Rows { + tags, resource := e.getMonitoredResource(vd.View, append([]tag.Tag(nil), row.Tags...)) + ts := &monitoringpb.TimeSeries{ + Metric: &metricpb.Metric{ + Type: e.metricType(vd.View), + Labels: newLabels(e.defaultLabels, tags), + }, + Resource: resource, + Points: []*monitoringpb.Point{newPoint(vd.View, row, vd.Start, vd.End)}, + } + allTimeSeries = append(allTimeSeries, ts) + } + } + + var timeSeries []*monitoringpb.TimeSeries + for _, ts := range allTimeSeries { + timeSeries = append(timeSeries, ts) + if len(timeSeries) == limit { + ctsreql := e.combineTimeSeriesToCreateTimeSeriesRequest(timeSeries) + reqs = append(reqs, ctsreql...) + timeSeries = timeSeries[:0] + } + } + + if len(timeSeries) > 0 { + ctsreql := e.combineTimeSeriesToCreateTimeSeriesRequest(timeSeries) + reqs = append(reqs, ctsreql...) + } + return reqs +} + +func (e *statsExporter) viewToMetricDescriptor(ctx context.Context, v *view.View) (*metricpb.MetricDescriptor, error) { + m := v.Measure + agg := v.Aggregation + viewName := v.Name + + metricType := e.metricType(v) + var valueType metricpb.MetricDescriptor_ValueType + unit := m.Unit() + // Default metric Kind + metricKind := metricpb.MetricDescriptor_CUMULATIVE + + switch agg.Type { + case view.AggTypeCount: + valueType = metricpb.MetricDescriptor_INT64 + // If the aggregation type is count, which counts the number of recorded measurements, the unit must be "1", + // because this view does not apply to the recorded values. + unit = stats.UnitDimensionless + case view.AggTypeSum: + switch m.(type) { + case *stats.Int64Measure: + valueType = metricpb.MetricDescriptor_INT64 + case *stats.Float64Measure: + valueType = metricpb.MetricDescriptor_DOUBLE + } + case view.AggTypeDistribution: + valueType = metricpb.MetricDescriptor_DISTRIBUTION + case view.AggTypeLastValue: + metricKind = metricpb.MetricDescriptor_GAUGE + switch m.(type) { + case *stats.Int64Measure: + valueType = metricpb.MetricDescriptor_INT64 + case *stats.Float64Measure: + valueType = metricpb.MetricDescriptor_DOUBLE + } + default: + return nil, fmt.Errorf("unsupported aggregation type: %s", agg.Type.String()) + } + + var displayName string + if e.o.GetMetricDisplayName == nil { + displayName = e.displayName(viewName) + } else { + displayName = e.o.GetMetricDisplayName(v) + } + + res := &metricpb.MetricDescriptor{ + Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", e.o.ProjectID, metricType), + DisplayName: displayName, + Description: v.Description, + Unit: unit, + Type: metricType, + MetricKind: metricKind, + ValueType: valueType, + Labels: newLabelDescriptors(e.defaultLabels, v.TagKeys), + } + return res, nil +} + +// createMetricDescriptorFromView creates a MetricDescriptor for the given view data in Stackdriver Monitoring. +// An error will be returned if there is already a metric descriptor created with the same name +// but it has a different aggregation or keys. +func (e *statsExporter) createMetricDescriptorFromView(ctx context.Context, v *view.View) error { + // Skip create metric descriptor if configured + if e.o.SkipCMD { + return nil + } + + e.metricMu.Lock() + defer e.metricMu.Unlock() + + viewName := v.Name + + if _, created := e.metricDescriptors[viewName]; created { + return nil + } + + if builtinMetric(e.metricType(v)) { + e.metricDescriptors[viewName] = true + return nil + } + + inMD, err := e.viewToMetricDescriptor(ctx, v) + if err != nil { + return err + } + + if err = e.createMetricDescriptor(ctx, inMD); err != nil { + return err + } + + // Now cache the metric descriptor + e.metricDescriptors[viewName] = true + return nil +} + +func (e *statsExporter) displayName(suffix string) string { + return path.Join(defaultDisplayNamePrefix, suffix) +} + +func (e *statsExporter) combineTimeSeriesToCreateTimeSeriesRequest(ts []*monitoringpb.TimeSeries) (ctsreql []*monitoringpb.CreateTimeSeriesRequest) { + if len(ts) == 0 { + return nil + } + + // Since there are scenarios in which Metrics with the same Type + // can be bunched in the same TimeSeries, we have to ensure that + // we create a unique CreateTimeSeriesRequest with entirely unique Metrics + // per TimeSeries, lest we'll encounter: + // + // err: rpc error: code = InvalidArgument desc = One or more TimeSeries could not be written: + // Field timeSeries[2] had an invalid value: Duplicate TimeSeries encountered. + // Only one point can be written per TimeSeries per request.: timeSeries[2] + // + // This scenario happens when we are using the OpenCensus Agent in which multiple metrics + // are streamed by various client applications. + // See https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/73 + uniqueTimeSeries := make([]*monitoringpb.TimeSeries, 0, len(ts)) + nonUniqueTimeSeries := make([]*monitoringpb.TimeSeries, 0, len(ts)) + seenMetrics := make(map[string]struct{}) + + for _, tti := range ts { + key := metricSignature(tti.Metric) + if _, alreadySeen := seenMetrics[key]; !alreadySeen { + uniqueTimeSeries = append(uniqueTimeSeries, tti) + seenMetrics[key] = struct{}{} + } else { + nonUniqueTimeSeries = append(nonUniqueTimeSeries, tti) + } + } + + // UniqueTimeSeries can be bunched up together + // While for each nonUniqueTimeSeries, we have + // to make a unique CreateTimeSeriesRequest. + ctsreql = append(ctsreql, &monitoringpb.CreateTimeSeriesRequest{ + Name: fmt.Sprintf("projects/%s", e.o.ProjectID), + TimeSeries: uniqueTimeSeries, + }) + + // Now recursively also combine the non-unique TimeSeries + // that were singly added to nonUniqueTimeSeries. + // The reason is that we need optimal combinations + // for optimal combinations because: + // * "a/b/c" + // * "a/b/c" + // * "x/y/z" + // * "a/b/c" + // * "x/y/z" + // * "p/y/z" + // * "d/y/z" + // + // should produce: + // CreateTimeSeries(uniqueTimeSeries) :: ["a/b/c", "x/y/z", "p/y/z", "d/y/z"] + // CreateTimeSeries(nonUniqueTimeSeries) :: ["a/b/c"] + // CreateTimeSeries(nonUniqueTimeSeries) :: ["a/b/c", "x/y/z"] + nonUniqueRequests := e.combineTimeSeriesToCreateTimeSeriesRequest(nonUniqueTimeSeries) + ctsreql = append(ctsreql, nonUniqueRequests...) + + return ctsreql +} + +// metricSignature creates a unique signature consisting of a +// metric's type and its lexicographically sorted label values +// See https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/120 +func metricSignature(metric *googlemetricpb.Metric) string { + labels := metric.GetLabels() + labelValues := make([]string, 0, len(labels)) + + for _, labelValue := range labels { + labelValues = append(labelValues, labelValue) + } + sort.Strings(labelValues) + return fmt.Sprintf("%s:%s", metric.GetType(), strings.Join(labelValues, ",")) +} + +func newPoint(v *view.View, row *view.Row, start, end time.Time) *monitoringpb.Point { + switch v.Aggregation.Type { + case view.AggTypeLastValue: + return newGaugePoint(v, row, end) + default: + return newCumulativePoint(v, row, start, end) + } +} + +func newCumulativePoint(v *view.View, row *view.Row, start, end time.Time) *monitoringpb.Point { + return &monitoringpb.Point{ + Interval: &monitoringpb.TimeInterval{ + StartTime: ×tamp.Timestamp{ + Seconds: start.Unix(), + Nanos: int32(start.Nanosecond()), + }, + EndTime: ×tamp.Timestamp{ + Seconds: end.Unix(), + Nanos: int32(end.Nanosecond()), + }, + }, + Value: newTypedValue(v, row), + } +} + +func newGaugePoint(v *view.View, row *view.Row, end time.Time) *monitoringpb.Point { + gaugeTime := ×tamp.Timestamp{ + Seconds: end.Unix(), + Nanos: int32(end.Nanosecond()), + } + return &monitoringpb.Point{ + Interval: &monitoringpb.TimeInterval{ + EndTime: gaugeTime, + }, + Value: newTypedValue(v, row), + } +} + +func newTypedValue(vd *view.View, r *view.Row) *monitoringpb.TypedValue { + switch v := r.Data.(type) { + case *view.CountData: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ + Int64Value: v.Value, + }} + case *view.SumData: + switch vd.Measure.(type) { + case *stats.Int64Measure: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ + Int64Value: int64(v.Value), + }} + case *stats.Float64Measure: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ + DoubleValue: v.Value, + }} + } + case *view.DistributionData: + insertZeroBound := shouldInsertZeroBound(vd.Aggregation.Buckets...) + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DistributionValue{ + DistributionValue: &distributionpb.Distribution{ + Count: v.Count, + Mean: v.Mean, + SumOfSquaredDeviation: v.SumOfSquaredDev, + // TODO(songya): uncomment this once Stackdriver supports min/max. + // Range: &distributionpb.Distribution_Range{ + // Min: v.Min, + // Max: v.Max, + // }, + BucketOptions: &distributionpb.Distribution_BucketOptions{ + Options: &distributionpb.Distribution_BucketOptions_ExplicitBuckets{ + ExplicitBuckets: &distributionpb.Distribution_BucketOptions_Explicit{ + Bounds: addZeroBoundOnCondition(insertZeroBound, vd.Aggregation.Buckets...), + }, + }, + }, + BucketCounts: addZeroBucketCountOnCondition(insertZeroBound, v.CountPerBucket...), + }, + }} + case *view.LastValueData: + switch vd.Measure.(type) { + case *stats.Int64Measure: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ + Int64Value: int64(v.Value), + }} + case *stats.Float64Measure: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ + DoubleValue: v.Value, + }} + } + } + return nil +} + +func shouldInsertZeroBound(bounds ...float64) bool { + if len(bounds) > 0 && bounds[0] != 0.0 { + return true + } + return false +} + +func addZeroBucketCountOnCondition(insert bool, counts ...int64) []int64 { + if insert { + return append([]int64{0}, counts...) + } + return counts +} + +func addZeroBoundOnCondition(insert bool, bounds ...float64) []float64 { + if insert { + return append([]float64{0.0}, bounds...) + } + return bounds +} + +func (e *statsExporter) metricType(v *view.View) string { + if formatter := e.o.GetMetricType; formatter != nil { + return formatter(v) + } + return path.Join("custom.googleapis.com", "opencensus", v.Name) +} + +func newLabels(defaults map[string]labelValue, tags []tag.Tag) map[string]string { + labels := make(map[string]string) + for k, lbl := range defaults { + labels[sanitize(k)] = lbl.val + } + for _, tag := range tags { + labels[sanitize(tag.Key.Name())] = tag.Value + } + return labels +} + +func newLabelDescriptors(defaults map[string]labelValue, keys []tag.Key) []*labelpb.LabelDescriptor { + labelDescriptors := make([]*labelpb.LabelDescriptor, 0, len(keys)+len(defaults)) + for key, lbl := range defaults { + labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ + Key: sanitize(key), + Description: lbl.desc, + ValueType: labelpb.LabelDescriptor_STRING, + }) + } + for _, key := range keys { + labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ + Key: sanitize(key.Name()), + ValueType: labelpb.LabelDescriptor_STRING, // We only use string tags + }) + } + return labelDescriptors +} + +func (e *statsExporter) createMetricDescriptor(ctx context.Context, md *metric.MetricDescriptor) error { + ctx, cancel := newContextWithTimeout(ctx, e.o.Timeout) + defer cancel() + cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{ + Name: fmt.Sprintf("projects/%s", e.o.ProjectID), + MetricDescriptor: md, + } + _, err := createMetricDescriptor(ctx, e.c, cmrdesc) + return err +} + +var createMetricDescriptor = func(ctx context.Context, c *monitoring.MetricClient, mdr *monitoringpb.CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) { + return c.CreateMetricDescriptor(ctx, mdr) +} + +var createTimeSeries = func(ctx context.Context, c *monitoring.MetricClient, ts *monitoringpb.CreateTimeSeriesRequest) error { + return c.CreateTimeSeries(ctx, ts) +} + +var knownExternalMetricPrefixes = []string{ + "custom.googleapis.com/", + "external.googleapis.com/", +} + +// builtinMetric returns true if a MetricType is a heuristically known +// built-in Stackdriver metric +func builtinMetric(metricType string) bool { + for _, knownExternalMetric := range knownExternalMetricPrefixes { + if strings.HasPrefix(metricType, knownExternalMetric) { + return false + } + } + return true +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go new file mode 100644 index 000000000..ee6535eef --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go @@ -0,0 +1,178 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +import ( + "context" + "fmt" + "log" + "sync" + "time" + + tracingclient "cloud.google.com/go/trace/apiv2" + "github.com/golang/protobuf/proto" + "go.opencensus.io/trace" + "google.golang.org/api/support/bundler" + tracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2" +) + +// traceExporter is an implementation of trace.Exporter that uploads spans to +// Stackdriver. +// +type traceExporter struct { + o Options + projectID string + bundler *bundler.Bundler + // uploadFn defaults to uploadSpans; it can be replaced for tests. + uploadFn func(spans []*tracepb.Span) + overflowLogger + client *tracingclient.Client +} + +var _ trace.Exporter = (*traceExporter)(nil) + +func newTraceExporter(o Options) (*traceExporter, error) { + ctx := o.Context + if ctx == nil { + ctx = context.Background() + } + client, err := tracingclient.NewClient(ctx, o.TraceClientOptions...) + if err != nil { + return nil, fmt.Errorf("stackdriver: couldn't initialize trace client: %v", err) + } + return newTraceExporterWithClient(o, client), nil +} + +const defaultBufferedByteLimit = 8 * 1024 * 1024 + +func newTraceExporterWithClient(o Options, c *tracingclient.Client) *traceExporter { + e := &traceExporter{ + projectID: o.ProjectID, + client: c, + o: o, + } + b := bundler.NewBundler((*tracepb.Span)(nil), func(bundle interface{}) { + e.uploadFn(bundle.([]*tracepb.Span)) + }) + if o.BundleDelayThreshold > 0 { + b.DelayThreshold = o.BundleDelayThreshold + } else { + b.DelayThreshold = 2 * time.Second + } + if o.BundleCountThreshold > 0 { + b.BundleCountThreshold = o.BundleCountThreshold + } else { + b.BundleCountThreshold = 50 + } + // The measured "bytes" are not really bytes, see exportReceiver. + b.BundleByteThreshold = b.BundleCountThreshold * 200 + b.BundleByteLimit = b.BundleCountThreshold * 1000 + if o.TraceSpansBufferMaxBytes > 0 { + b.BufferedByteLimit = o.TraceSpansBufferMaxBytes + } else { + b.BufferedByteLimit = defaultBufferedByteLimit + } + + e.bundler = b + e.uploadFn = e.uploadSpans + return e +} + +// ExportSpan exports a SpanData to Stackdriver Trace. +func (e *traceExporter) ExportSpan(s *trace.SpanData) { + protoSpan := protoFromSpanData(s, e.projectID, e.o.Resource) + protoSize := proto.Size(protoSpan) + err := e.bundler.Add(protoSpan, protoSize) + switch err { + case nil: + return + case bundler.ErrOversizedItem: + case bundler.ErrOverflow: + e.overflowLogger.log() + default: + e.o.handleError(err) + } +} + +// Flush waits for exported trace spans to be uploaded. +// +// This is useful if your program is ending and you do not want to lose recent +// spans. +func (e *traceExporter) Flush() { + e.bundler.Flush() +} + +// uploadSpans uploads a set of spans to Stackdriver. +func (e *traceExporter) uploadSpans(spans []*tracepb.Span) { + req := tracepb.BatchWriteSpansRequest{ + Name: "projects/" + e.projectID, + Spans: spans, + } + // Create a never-sampled span to prevent traces associated with exporter. + ctx, cancel := newContextWithTimeout(e.o.Context, e.o.Timeout) + defer cancel() + ctx, span := trace.StartSpan( + ctx, + "contrib.go.opencensus.io/exporter/stackdriver.uploadSpans", + trace.WithSampler(trace.NeverSample()), + ) + defer span.End() + span.AddAttributes(trace.Int64Attribute("num_spans", int64(len(spans)))) + + err := e.client.BatchWriteSpans(ctx, &req) + if err != nil { + span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) + e.o.handleError(err) + } +} + +// overflowLogger ensures that at most one overflow error log message is +// written every 5 seconds. +type overflowLogger struct { + mu sync.Mutex + pause bool + accum int +} + +func (o *overflowLogger) delay() { + o.pause = true + time.AfterFunc(5*time.Second, func() { + o.mu.Lock() + defer o.mu.Unlock() + switch { + case o.accum == 0: + o.pause = false + case o.accum == 1: + log.Println("OpenCensus Stackdriver exporter: failed to upload span: buffer full") + o.accum = 0 + o.delay() + default: + log.Printf("OpenCensus Stackdriver exporter: failed to upload %d spans: buffer full", o.accum) + o.accum = 0 + o.delay() + } + }) +} + +func (o *overflowLogger) log() { + o.mu.Lock() + defer o.mu.Unlock() + if !o.pause { + log.Println("OpenCensus Stackdriver exporter: failed to upload span: buffer full") + o.delay() + } else { + o.accum++ + } +} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go new file mode 100644 index 000000000..422a98026 --- /dev/null +++ b/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go @@ -0,0 +1,291 @@ +// Copyright 2017, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stackdriver + +import ( + "fmt" + "math" + "strconv" + "time" + "unicode/utf8" + + timestamppb "github.com/golang/protobuf/ptypes/timestamp" + wrapperspb "github.com/golang/protobuf/ptypes/wrappers" + "go.opencensus.io/plugin/ochttp" + "go.opencensus.io/trace" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" + tracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2" + statuspb "google.golang.org/genproto/googleapis/rpc/status" +) + +const ( + maxAnnotationEventsPerSpan = 32 + maxMessageEventsPerSpan = 128 + maxAttributeStringValue = 256 + agentLabel = "g.co/agent" + + labelHTTPHost = `/http/host` + labelHTTPMethod = `/http/method` + labelHTTPStatusCode = `/http/status_code` + labelHTTPPath = `/http/path` + labelHTTPUserAgent = `/http/user_agent` +) + +// proto returns a protocol buffer representation of a SpanData. +func protoFromSpanData(s *trace.SpanData, projectID string, mr *monitoredrespb.MonitoredResource) *tracepb.Span { + if s == nil { + return nil + } + + traceIDString := s.SpanContext.TraceID.String() + spanIDString := s.SpanContext.SpanID.String() + + name := s.Name + switch s.SpanKind { + case trace.SpanKindClient: + name = "Sent." + name + case trace.SpanKindServer: + name = "Recv." + name + } + + sp := &tracepb.Span{ + Name: "projects/" + projectID + "/traces/" + traceIDString + "/spans/" + spanIDString, + SpanId: spanIDString, + DisplayName: trunc(name, 128), + StartTime: timestampProto(s.StartTime), + EndTime: timestampProto(s.EndTime), + SameProcessAsParentSpan: &wrapperspb.BoolValue{Value: !s.HasRemoteParent}, + } + if p := s.ParentSpanID; p != (trace.SpanID{}) { + sp.ParentSpanId = p.String() + } + if s.Status.Code != 0 || s.Status.Message != "" { + sp.Status = &statuspb.Status{Code: s.Status.Code, Message: s.Status.Message} + } + + var annotations, droppedAnnotationsCount, messageEvents, droppedMessageEventsCount int + copyAttributes(&sp.Attributes, s.Attributes) + + // Copy MonitoredResources as span Attributes + sp.Attributes = copyMonitoredResourceAttributes(sp.Attributes, mr) + + as := s.Annotations + for i, a := range as { + if annotations >= maxAnnotationEventsPerSpan { + droppedAnnotationsCount = len(as) - i + break + } + annotation := &tracepb.Span_TimeEvent_Annotation{Description: trunc(a.Message, maxAttributeStringValue)} + copyAttributes(&annotation.Attributes, a.Attributes) + event := &tracepb.Span_TimeEvent{ + Time: timestampProto(a.Time), + Value: &tracepb.Span_TimeEvent_Annotation_{Annotation: annotation}, + } + annotations++ + if sp.TimeEvents == nil { + sp.TimeEvents = &tracepb.Span_TimeEvents{} + } + sp.TimeEvents.TimeEvent = append(sp.TimeEvents.TimeEvent, event) + } + + if sp.Attributes == nil { + sp.Attributes = &tracepb.Span_Attributes{ + AttributeMap: make(map[string]*tracepb.AttributeValue), + } + } + + // Only set the agent label if it is not already set. That enables the + // OpenCensus agent/collector to set the agent label based on the library that + // sent the span to the agent. + if _, hasAgent := sp.Attributes.AttributeMap[agentLabel]; !hasAgent { + sp.Attributes.AttributeMap[agentLabel] = &tracepb.AttributeValue{ + Value: &tracepb.AttributeValue_StringValue{ + StringValue: trunc(userAgent, maxAttributeStringValue), + }, + } + } + + es := s.MessageEvents + for i, e := range es { + if messageEvents >= maxMessageEventsPerSpan { + droppedMessageEventsCount = len(es) - i + break + } + messageEvents++ + if sp.TimeEvents == nil { + sp.TimeEvents = &tracepb.Span_TimeEvents{} + } + sp.TimeEvents.TimeEvent = append(sp.TimeEvents.TimeEvent, &tracepb.Span_TimeEvent{ + Time: timestampProto(e.Time), + Value: &tracepb.Span_TimeEvent_MessageEvent_{ + MessageEvent: &tracepb.Span_TimeEvent_MessageEvent{ + Type: tracepb.Span_TimeEvent_MessageEvent_Type(e.EventType), + Id: e.MessageID, + UncompressedSizeBytes: e.UncompressedByteSize, + CompressedSizeBytes: e.CompressedByteSize, + }, + }, + }) + } + + if droppedAnnotationsCount != 0 || droppedMessageEventsCount != 0 { + if sp.TimeEvents == nil { + sp.TimeEvents = &tracepb.Span_TimeEvents{} + } + sp.TimeEvents.DroppedAnnotationsCount = clip32(droppedAnnotationsCount) + sp.TimeEvents.DroppedMessageEventsCount = clip32(droppedMessageEventsCount) + } + + if len(s.Links) > 0 { + sp.Links = &tracepb.Span_Links{} + sp.Links.Link = make([]*tracepb.Span_Link, 0, len(s.Links)) + for _, l := range s.Links { + link := &tracepb.Span_Link{ + TraceId: l.TraceID.String(), + SpanId: l.SpanID.String(), + Type: tracepb.Span_Link_Type(l.Type), + } + copyAttributes(&link.Attributes, l.Attributes) + sp.Links.Link = append(sp.Links.Link, link) + } + } + return sp +} + +// timestampProto creates a timestamp proto for a time.Time. +func timestampProto(t time.Time) *timestamppb.Timestamp { + return ×tamppb.Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } +} + +// copyMonitoredResourceAttributes copies proto monitoredResource to proto map field (Span_Attributes) +// it creates the map if it is nil. +func copyMonitoredResourceAttributes(out *tracepb.Span_Attributes, mr *monitoredrespb.MonitoredResource) *tracepb.Span_Attributes { + if mr == nil { + return out + } + if out == nil { + out = &tracepb.Span_Attributes{} + } + if out.AttributeMap == nil { + out.AttributeMap = make(map[string]*tracepb.AttributeValue) + } + for k, v := range mr.Labels { + av := attributeValue(v) + out.AttributeMap[fmt.Sprintf("g.co/r/%s/%s", mr.Type, k)] = av + } + return out +} + +// copyAttributes copies a map of attributes to a proto map field. +// It creates the map if it is nil. +func copyAttributes(out **tracepb.Span_Attributes, in map[string]interface{}) { + if len(in) == 0 { + return + } + if *out == nil { + *out = &tracepb.Span_Attributes{} + } + if (*out).AttributeMap == nil { + (*out).AttributeMap = make(map[string]*tracepb.AttributeValue) + } + var dropped int32 + for key, value := range in { + av := attributeValue(value) + if av == nil { + continue + } + switch key { + case ochttp.PathAttribute: + (*out).AttributeMap[labelHTTPPath] = av + case ochttp.HostAttribute: + (*out).AttributeMap[labelHTTPHost] = av + case ochttp.MethodAttribute: + (*out).AttributeMap[labelHTTPMethod] = av + case ochttp.UserAgentAttribute: + (*out).AttributeMap[labelHTTPUserAgent] = av + case ochttp.StatusCodeAttribute: + (*out).AttributeMap[labelHTTPStatusCode] = av + default: + if len(key) > 128 { + dropped++ + continue + } + (*out).AttributeMap[key] = av + } + } + (*out).DroppedAttributesCount = dropped +} + +func attributeValue(v interface{}) *tracepb.AttributeValue { + switch value := v.(type) { + case bool: + return &tracepb.AttributeValue{ + Value: &tracepb.AttributeValue_BoolValue{BoolValue: value}, + } + case int64: + return &tracepb.AttributeValue{ + Value: &tracepb.AttributeValue_IntValue{IntValue: value}, + } + case float64: + // TODO: set double value if Stackdriver Trace support it in the future. + return &tracepb.AttributeValue{ + Value: &tracepb.AttributeValue_StringValue{ + StringValue: trunc(strconv.FormatFloat(value, 'f', -1, 64), + maxAttributeStringValue)}, + } + case string: + return &tracepb.AttributeValue{ + Value: &tracepb.AttributeValue_StringValue{StringValue: trunc(value, maxAttributeStringValue)}, + } + } + return nil +} + +// trunc returns a TruncatableString truncated to the given limit. +func trunc(s string, limit int) *tracepb.TruncatableString { + if len(s) > limit { + b := []byte(s[:limit]) + for { + r, size := utf8.DecodeLastRune(b) + if r == utf8.RuneError && size == 1 { + b = b[:len(b)-1] + } else { + break + } + } + return &tracepb.TruncatableString{ + Value: string(b), + TruncatedByteCount: clip32(len(s) - len(b)), + } + } + return &tracepb.TruncatableString{ + Value: s, + TruncatedByteCount: 0, + } +} + +// clip32 clips an int to the range of an int32. +func clip32(x int) int32 { + if x < math.MinInt32 { + return math.MinInt32 + } + if x > math.MaxInt32 { + return math.MaxInt32 + } + return int32(x) +} diff --git a/vendor/github.com/aws/aws-sdk-go/LICENSE.txt b/vendor/github.com/aws/aws-sdk-go/LICENSE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/aws/aws-sdk-go/NOTICE.txt b/vendor/github.com/aws/aws-sdk-go/NOTICE.txt new file mode 100644 index 000000000..899129ecc --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/NOTICE.txt @@ -0,0 +1,3 @@ +AWS SDK for Go +Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2014-2015 Stripe, Inc. diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go b/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go new file mode 100644 index 000000000..99849c0e1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go @@ -0,0 +1,164 @@ +// Package awserr represents API error interface accessors for the SDK. +package awserr + +// An Error wraps lower level errors with code, message and an original error. +// The underlying concrete error type may also satisfy other interfaces which +// can be to used to obtain more specific information about the error. +// +// Calling Error() or String() will always include the full information about +// an error based on its underlying type. +// +// Example: +// +// output, err := s3manage.Upload(svc, input, opts) +// if err != nil { +// if awsErr, ok := err.(awserr.Error); ok { +// // Get error details +// log.Println("Error:", awsErr.Code(), awsErr.Message()) +// +// // Prints out full error message, including original error if there was one. +// log.Println("Error:", awsErr.Error()) +// +// // Get original error +// if origErr := awsErr.OrigErr(); origErr != nil { +// // operate on original error. +// } +// } else { +// fmt.Println(err.Error()) +// } +// } +// +type Error interface { + // Satisfy the generic error interface. + error + + // Returns the short phrase depicting the classification of the error. + Code() string + + // Returns the error details message. + Message() string + + // Returns the original error if one was set. Nil is returned if not set. + OrigErr() error +} + +// BatchError is a batch of errors which also wraps lower level errors with +// code, message, and original errors. Calling Error() will include all errors +// that occurred in the batch. +// +// Deprecated: Replaced with BatchedErrors. Only defined for backwards +// compatibility. +type BatchError interface { + // Satisfy the generic error interface. + error + + // Returns the short phrase depicting the classification of the error. + Code() string + + // Returns the error details message. + Message() string + + // Returns the original error if one was set. Nil is returned if not set. + OrigErrs() []error +} + +// BatchedErrors is a batch of errors which also wraps lower level errors with +// code, message, and original errors. Calling Error() will include all errors +// that occurred in the batch. +// +// Replaces BatchError +type BatchedErrors interface { + // Satisfy the base Error interface. + Error + + // Returns the original error if one was set. Nil is returned if not set. + OrigErrs() []error +} + +// New returns an Error object described by the code, message, and origErr. +// +// If origErr satisfies the Error interface it will not be wrapped within a new +// Error object and will instead be returned. +func New(code, message string, origErr error) Error { + var errs []error + if origErr != nil { + errs = append(errs, origErr) + } + return newBaseError(code, message, errs) +} + +// NewBatchError returns an BatchedErrors with a collection of errors as an +// array of errors. +func NewBatchError(code, message string, errs []error) BatchedErrors { + return newBaseError(code, message, errs) +} + +// A RequestFailure is an interface to extract request failure information from +// an Error such as the request ID of the failed request returned by a service. +// RequestFailures may not always have a requestID value if the request failed +// prior to reaching the service such as a connection error. +// +// Example: +// +// output, err := s3manage.Upload(svc, input, opts) +// if err != nil { +// if reqerr, ok := err.(RequestFailure); ok { +// log.Println("Request failed", reqerr.Code(), reqerr.Message(), reqerr.RequestID()) +// } else { +// log.Println("Error:", err.Error()) +// } +// } +// +// Combined with awserr.Error: +// +// output, err := s3manage.Upload(svc, input, opts) +// if err != nil { +// if awsErr, ok := err.(awserr.Error); ok { +// // Generic AWS Error with Code, Message, and original error (if any) +// fmt.Println(awsErr.Code(), awsErr.Message(), awsErr.OrigErr()) +// +// if reqErr, ok := err.(awserr.RequestFailure); ok { +// // A service error occurred +// fmt.Println(reqErr.StatusCode(), reqErr.RequestID()) +// } +// } else { +// fmt.Println(err.Error()) +// } +// } +// +type RequestFailure interface { + Error + + // The status code of the HTTP response. + StatusCode() int + + // The request ID returned by the service for a request failure. This will + // be empty if no request ID is available such as the request failed due + // to a connection error. + RequestID() string +} + +// NewRequestFailure returns a wrapped error with additional information for +// request status code, and service requestID. +// +// Should be used to wrap all request which involve service requests. Even if +// the request failed without a service response, but had an HTTP status code +// that may be meaningful. +func NewRequestFailure(err Error, statusCode int, reqID string) RequestFailure { + return newRequestError(err, statusCode, reqID) +} + +// UnmarshalError provides the interface for the SDK failing to unmarshal data. +type UnmarshalError interface { + awsError + Bytes() []byte +} + +// NewUnmarshalError returns an initialized UnmarshalError error wrapper adding +// the bytes that fail to unmarshal to the error. +func NewUnmarshalError(err error, msg string, bytes []byte) UnmarshalError { + return &unmarshalError{ + awsError: New("UnmarshalError", msg, err), + bytes: bytes, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go b/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go new file mode 100644 index 000000000..a2c5817c4 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go @@ -0,0 +1,221 @@ +package awserr + +import ( + "encoding/hex" + "fmt" +) + +// SprintError returns a string of the formatted error code. +// +// Both extra and origErr are optional. If they are included their lines +// will be added, but if they are not included their lines will be ignored. +func SprintError(code, message, extra string, origErr error) string { + msg := fmt.Sprintf("%s: %s", code, message) + if extra != "" { + msg = fmt.Sprintf("%s\n\t%s", msg, extra) + } + if origErr != nil { + msg = fmt.Sprintf("%s\ncaused by: %s", msg, origErr.Error()) + } + return msg +} + +// A baseError wraps the code and message which defines an error. It also +// can be used to wrap an original error object. +// +// Should be used as the root for errors satisfying the awserr.Error. Also +// for any error which does not fit into a specific error wrapper type. +type baseError struct { + // Classification of error + code string + + // Detailed information about error + message string + + // Optional original error this error is based off of. Allows building + // chained errors. + errs []error +} + +// newBaseError returns an error object for the code, message, and errors. +// +// code is a short no whitespace phrase depicting the classification of +// the error that is being created. +// +// message is the free flow string containing detailed information about the +// error. +// +// origErrs is the error objects which will be nested under the new errors to +// be returned. +func newBaseError(code, message string, origErrs []error) *baseError { + b := &baseError{ + code: code, + message: message, + errs: origErrs, + } + + return b +} + +// Error returns the string representation of the error. +// +// See ErrorWithExtra for formatting. +// +// Satisfies the error interface. +func (b baseError) Error() string { + size := len(b.errs) + if size > 0 { + return SprintError(b.code, b.message, "", errorList(b.errs)) + } + + return SprintError(b.code, b.message, "", nil) +} + +// String returns the string representation of the error. +// Alias for Error to satisfy the stringer interface. +func (b baseError) String() string { + return b.Error() +} + +// Code returns the short phrase depicting the classification of the error. +func (b baseError) Code() string { + return b.code +} + +// Message returns the error details message. +func (b baseError) Message() string { + return b.message +} + +// OrigErr returns the original error if one was set. Nil is returned if no +// error was set. This only returns the first element in the list. If the full +// list is needed, use BatchedErrors. +func (b baseError) OrigErr() error { + switch len(b.errs) { + case 0: + return nil + case 1: + return b.errs[0] + default: + if err, ok := b.errs[0].(Error); ok { + return NewBatchError(err.Code(), err.Message(), b.errs[1:]) + } + return NewBatchError("BatchedErrors", + "multiple errors occurred", b.errs) + } +} + +// OrigErrs returns the original errors if one was set. An empty slice is +// returned if no error was set. +func (b baseError) OrigErrs() []error { + return b.errs +} + +// So that the Error interface type can be included as an anonymous field +// in the requestError struct and not conflict with the error.Error() method. +type awsError Error + +// A requestError wraps a request or service error. +// +// Composed of baseError for code, message, and original error. +type requestError struct { + awsError + statusCode int + requestID string + bytes []byte +} + +// newRequestError returns a wrapped error with additional information for +// request status code, and service requestID. +// +// Should be used to wrap all request which involve service requests. Even if +// the request failed without a service response, but had an HTTP status code +// that may be meaningful. +// +// Also wraps original errors via the baseError. +func newRequestError(err Error, statusCode int, requestID string) *requestError { + return &requestError{ + awsError: err, + statusCode: statusCode, + requestID: requestID, + } +} + +// Error returns the string representation of the error. +// Satisfies the error interface. +func (r requestError) Error() string { + extra := fmt.Sprintf("status code: %d, request id: %s", + r.statusCode, r.requestID) + return SprintError(r.Code(), r.Message(), extra, r.OrigErr()) +} + +// String returns the string representation of the error. +// Alias for Error to satisfy the stringer interface. +func (r requestError) String() string { + return r.Error() +} + +// StatusCode returns the wrapped status code for the error +func (r requestError) StatusCode() int { + return r.statusCode +} + +// RequestID returns the wrapped requestID +func (r requestError) RequestID() string { + return r.requestID +} + +// OrigErrs returns the original errors if one was set. An empty slice is +// returned if no error was set. +func (r requestError) OrigErrs() []error { + if b, ok := r.awsError.(BatchedErrors); ok { + return b.OrigErrs() + } + return []error{r.OrigErr()} +} + +type unmarshalError struct { + awsError + bytes []byte +} + +// Error returns the string representation of the error. +// Satisfies the error interface. +func (e unmarshalError) Error() string { + extra := hex.Dump(e.bytes) + return SprintError(e.Code(), e.Message(), extra, e.OrigErr()) +} + +// String returns the string representation of the error. +// Alias for Error to satisfy the stringer interface. +func (e unmarshalError) String() string { + return e.Error() +} + +// Bytes returns the bytes that failed to unmarshal. +func (e unmarshalError) Bytes() []byte { + return e.bytes +} + +// An error list that satisfies the golang interface +type errorList []error + +// Error returns the string representation of the error. +// +// Satisfies the error interface. +func (e errorList) Error() string { + msg := "" + // How do we want to handle the array size being zero + if size := len(e); size > 0 { + for i := 0; i < size; i++ { + msg += fmt.Sprintf("%s", e[i].Error()) + // We check the next index to see if it is within the slice. + // If it is, then we append a newline. We do this, because unit tests + // could be broken with the additional '\n' + if i+1 < size { + msg += "\n" + } + } + } + return msg +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go new file mode 100644 index 000000000..1a3d106d5 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go @@ -0,0 +1,108 @@ +package awsutil + +import ( + "io" + "reflect" + "time" +) + +// Copy deeply copies a src structure to dst. Useful for copying request and +// response structures. +// +// Can copy between structs of different type, but will only copy fields which +// are assignable, and exist in both structs. Fields which are not assignable, +// or do not exist in both structs are ignored. +func Copy(dst, src interface{}) { + dstval := reflect.ValueOf(dst) + if !dstval.IsValid() { + panic("Copy dst cannot be nil") + } + + rcopy(dstval, reflect.ValueOf(src), true) +} + +// CopyOf returns a copy of src while also allocating the memory for dst. +// src must be a pointer type or this operation will fail. +func CopyOf(src interface{}) (dst interface{}) { + dsti := reflect.New(reflect.TypeOf(src).Elem()) + dst = dsti.Interface() + rcopy(dsti, reflect.ValueOf(src), true) + return +} + +// rcopy performs a recursive copy of values from the source to destination. +// +// root is used to skip certain aspects of the copy which are not valid +// for the root node of a object. +func rcopy(dst, src reflect.Value, root bool) { + if !src.IsValid() { + return + } + + switch src.Kind() { + case reflect.Ptr: + if _, ok := src.Interface().(io.Reader); ok { + if dst.Kind() == reflect.Ptr && dst.Elem().CanSet() { + dst.Elem().Set(src) + } else if dst.CanSet() { + dst.Set(src) + } + } else { + e := src.Type().Elem() + if dst.CanSet() && !src.IsNil() { + if _, ok := src.Interface().(*time.Time); !ok { + dst.Set(reflect.New(e)) + } else { + tempValue := reflect.New(e) + tempValue.Elem().Set(src.Elem()) + // Sets time.Time's unexported values + dst.Set(tempValue) + } + } + if src.Elem().IsValid() { + // Keep the current root state since the depth hasn't changed + rcopy(dst.Elem(), src.Elem(), root) + } + } + case reflect.Struct: + t := dst.Type() + for i := 0; i < t.NumField(); i++ { + name := t.Field(i).Name + srcVal := src.FieldByName(name) + dstVal := dst.FieldByName(name) + if srcVal.IsValid() && dstVal.CanSet() { + rcopy(dstVal, srcVal, false) + } + } + case reflect.Slice: + if src.IsNil() { + break + } + + s := reflect.MakeSlice(src.Type(), src.Len(), src.Cap()) + dst.Set(s) + for i := 0; i < src.Len(); i++ { + rcopy(dst.Index(i), src.Index(i), false) + } + case reflect.Map: + if src.IsNil() { + break + } + + s := reflect.MakeMap(src.Type()) + dst.Set(s) + for _, k := range src.MapKeys() { + v := src.MapIndex(k) + v2 := reflect.New(v.Type()).Elem() + rcopy(v2, v, false) + dst.SetMapIndex(k, v2) + } + default: + // Assign the value if possible. If its not assignable, the value would + // need to be converted and the impact of that may be unexpected, or is + // not compatible with the dst type. + if src.Type().AssignableTo(dst.Type()) { + dst.Set(src) + } + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go new file mode 100644 index 000000000..142a7a01c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go @@ -0,0 +1,27 @@ +package awsutil + +import ( + "reflect" +) + +// DeepEqual returns if the two values are deeply equal like reflect.DeepEqual. +// In addition to this, this method will also dereference the input values if +// possible so the DeepEqual performed will not fail if one parameter is a +// pointer and the other is not. +// +// DeepEqual will not perform indirection of nested values of the input parameters. +func DeepEqual(a, b interface{}) bool { + ra := reflect.Indirect(reflect.ValueOf(a)) + rb := reflect.Indirect(reflect.ValueOf(b)) + + if raValid, rbValid := ra.IsValid(), rb.IsValid(); !raValid && !rbValid { + // If the elements are both nil, and of the same type they are equal + // If they are of different types they are not equal + return reflect.TypeOf(a) == reflect.TypeOf(b) + } else if raValid != rbValid { + // Both values must be valid to be equal + return false + } + + return reflect.DeepEqual(ra.Interface(), rb.Interface()) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go new file mode 100644 index 000000000..11c52c389 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go @@ -0,0 +1,222 @@ +package awsutil + +import ( + "reflect" + "regexp" + "strconv" + "strings" + + "github.com/jmespath/go-jmespath" +) + +var indexRe = regexp.MustCompile(`(.+)\[(-?\d+)?\]$`) + +// rValuesAtPath returns a slice of values found in value v. The values +// in v are explored recursively so all nested values are collected. +func rValuesAtPath(v interface{}, path string, createPath, caseSensitive, nilTerm bool) []reflect.Value { + pathparts := strings.Split(path, "||") + if len(pathparts) > 1 { + for _, pathpart := range pathparts { + vals := rValuesAtPath(v, pathpart, createPath, caseSensitive, nilTerm) + if len(vals) > 0 { + return vals + } + } + return nil + } + + values := []reflect.Value{reflect.Indirect(reflect.ValueOf(v))} + components := strings.Split(path, ".") + for len(values) > 0 && len(components) > 0 { + var index *int64 + var indexStar bool + c := strings.TrimSpace(components[0]) + if c == "" { // no actual component, illegal syntax + return nil + } else if caseSensitive && c != "*" && strings.ToLower(c[0:1]) == c[0:1] { + // TODO normalize case for user + return nil // don't support unexported fields + } + + // parse this component + if m := indexRe.FindStringSubmatch(c); m != nil { + c = m[1] + if m[2] == "" { + index = nil + indexStar = true + } else { + i, _ := strconv.ParseInt(m[2], 10, 32) + index = &i + indexStar = false + } + } + + nextvals := []reflect.Value{} + for _, value := range values { + // pull component name out of struct member + if value.Kind() != reflect.Struct { + continue + } + + if c == "*" { // pull all members + for i := 0; i < value.NumField(); i++ { + if f := reflect.Indirect(value.Field(i)); f.IsValid() { + nextvals = append(nextvals, f) + } + } + continue + } + + value = value.FieldByNameFunc(func(name string) bool { + if c == name { + return true + } else if !caseSensitive && strings.ToLower(name) == strings.ToLower(c) { + return true + } + return false + }) + + if nilTerm && value.Kind() == reflect.Ptr && len(components[1:]) == 0 { + if !value.IsNil() { + value.Set(reflect.Zero(value.Type())) + } + return []reflect.Value{value} + } + + if createPath && value.Kind() == reflect.Ptr && value.IsNil() { + // TODO if the value is the terminus it should not be created + // if the value to be set to its position is nil. + value.Set(reflect.New(value.Type().Elem())) + value = value.Elem() + } else { + value = reflect.Indirect(value) + } + + if value.Kind() == reflect.Slice || value.Kind() == reflect.Map { + if !createPath && value.IsNil() { + value = reflect.ValueOf(nil) + } + } + + if value.IsValid() { + nextvals = append(nextvals, value) + } + } + values = nextvals + + if indexStar || index != nil { + nextvals = []reflect.Value{} + for _, valItem := range values { + value := reflect.Indirect(valItem) + if value.Kind() != reflect.Slice { + continue + } + + if indexStar { // grab all indices + for i := 0; i < value.Len(); i++ { + idx := reflect.Indirect(value.Index(i)) + if idx.IsValid() { + nextvals = append(nextvals, idx) + } + } + continue + } + + // pull out index + i := int(*index) + if i >= value.Len() { // check out of bounds + if createPath { + // TODO resize slice + } else { + continue + } + } else if i < 0 { // support negative indexing + i = value.Len() + i + } + value = reflect.Indirect(value.Index(i)) + + if value.Kind() == reflect.Slice || value.Kind() == reflect.Map { + if !createPath && value.IsNil() { + value = reflect.ValueOf(nil) + } + } + + if value.IsValid() { + nextvals = append(nextvals, value) + } + } + values = nextvals + } + + components = components[1:] + } + return values +} + +// ValuesAtPath returns a list of values at the case insensitive lexical +// path inside of a structure. +func ValuesAtPath(i interface{}, path string) ([]interface{}, error) { + result, err := jmespath.Search(path, i) + if err != nil { + return nil, err + } + + v := reflect.ValueOf(result) + if !v.IsValid() || (v.Kind() == reflect.Ptr && v.IsNil()) { + return nil, nil + } + if s, ok := result.([]interface{}); ok { + return s, err + } + if v.Kind() == reflect.Map && v.Len() == 0 { + return nil, nil + } + if v.Kind() == reflect.Slice { + out := make([]interface{}, v.Len()) + for i := 0; i < v.Len(); i++ { + out[i] = v.Index(i).Interface() + } + return out, nil + } + + return []interface{}{result}, nil +} + +// SetValueAtPath sets a value at the case insensitive lexical path inside +// of a structure. +func SetValueAtPath(i interface{}, path string, v interface{}) { + if rvals := rValuesAtPath(i, path, true, false, v == nil); rvals != nil { + for _, rval := range rvals { + if rval.Kind() == reflect.Ptr && rval.IsNil() { + continue + } + setValue(rval, v) + } + } +} + +func setValue(dstVal reflect.Value, src interface{}) { + if dstVal.Kind() == reflect.Ptr { + dstVal = reflect.Indirect(dstVal) + } + srcVal := reflect.ValueOf(src) + + if !srcVal.IsValid() { // src is literal nil + if dstVal.CanAddr() { + // Convert to pointer so that pointer's value can be nil'ed + // dstVal = dstVal.Addr() + } + dstVal.Set(reflect.Zero(dstVal.Type())) + + } else if srcVal.Kind() == reflect.Ptr { + if srcVal.IsNil() { + srcVal = reflect.Zero(dstVal.Type()) + } else { + srcVal = reflect.ValueOf(src).Elem() + } + dstVal.Set(srcVal) + } else { + dstVal.Set(srcVal) + } + +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go new file mode 100644 index 000000000..710eb432f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go @@ -0,0 +1,113 @@ +package awsutil + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strings" +) + +// Prettify returns the string representation of a value. +func Prettify(i interface{}) string { + var buf bytes.Buffer + prettify(reflect.ValueOf(i), 0, &buf) + return buf.String() +} + +// prettify will recursively walk value v to build a textual +// representation of the value. +func prettify(v reflect.Value, indent int, buf *bytes.Buffer) { + for v.Kind() == reflect.Ptr { + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + strtype := v.Type().String() + if strtype == "time.Time" { + fmt.Fprintf(buf, "%s", v.Interface()) + break + } else if strings.HasPrefix(strtype, "io.") { + buf.WriteString("") + break + } + + buf.WriteString("{\n") + + names := []string{} + for i := 0; i < v.Type().NumField(); i++ { + name := v.Type().Field(i).Name + f := v.Field(i) + if name[0:1] == strings.ToLower(name[0:1]) { + continue // ignore unexported fields + } + if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice || f.Kind() == reflect.Map) && f.IsNil() { + continue // ignore unset fields + } + names = append(names, name) + } + + for i, n := range names { + val := v.FieldByName(n) + buf.WriteString(strings.Repeat(" ", indent+2)) + buf.WriteString(n + ": ") + prettify(val, indent+2, buf) + + if i < len(names)-1 { + buf.WriteString(",\n") + } + } + + buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") + case reflect.Slice: + strtype := v.Type().String() + if strtype == "[]uint8" { + fmt.Fprintf(buf, " len %d", v.Len()) + break + } + + nl, id, id2 := "", "", "" + if v.Len() > 3 { + nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) + } + buf.WriteString("[" + nl) + for i := 0; i < v.Len(); i++ { + buf.WriteString(id2) + prettify(v.Index(i), indent+2, buf) + + if i < v.Len()-1 { + buf.WriteString("," + nl) + } + } + + buf.WriteString(nl + id + "]") + case reflect.Map: + buf.WriteString("{\n") + + for i, k := range v.MapKeys() { + buf.WriteString(strings.Repeat(" ", indent+2)) + buf.WriteString(k.String() + ": ") + prettify(v.MapIndex(k), indent+2, buf) + + if i < v.Len()-1 { + buf.WriteString(",\n") + } + } + + buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") + default: + if !v.IsValid() { + fmt.Fprint(buf, "") + return + } + format := "%v" + switch v.Interface().(type) { + case string: + format = "%q" + case io.ReadSeeker, io.Reader: + format = "buffer(%p)" + } + fmt.Fprintf(buf, format, v.Interface()) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go new file mode 100644 index 000000000..645df2450 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go @@ -0,0 +1,88 @@ +package awsutil + +import ( + "bytes" + "fmt" + "reflect" + "strings" +) + +// StringValue returns the string representation of a value. +func StringValue(i interface{}) string { + var buf bytes.Buffer + stringValue(reflect.ValueOf(i), 0, &buf) + return buf.String() +} + +func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) { + for v.Kind() == reflect.Ptr { + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + buf.WriteString("{\n") + + for i := 0; i < v.Type().NumField(); i++ { + ft := v.Type().Field(i) + fv := v.Field(i) + + if ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) { + continue // ignore unexported fields + } + if (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() { + continue // ignore unset fields + } + + buf.WriteString(strings.Repeat(" ", indent+2)) + buf.WriteString(ft.Name + ": ") + + if tag := ft.Tag.Get("sensitive"); tag == "true" { + buf.WriteString("") + } else { + stringValue(fv, indent+2, buf) + } + + buf.WriteString(",\n") + } + + buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") + case reflect.Slice: + nl, id, id2 := "", "", "" + if v.Len() > 3 { + nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) + } + buf.WriteString("[" + nl) + for i := 0; i < v.Len(); i++ { + buf.WriteString(id2) + stringValue(v.Index(i), indent+2, buf) + + if i < v.Len()-1 { + buf.WriteString("," + nl) + } + } + + buf.WriteString(nl + id + "]") + case reflect.Map: + buf.WriteString("{\n") + + for i, k := range v.MapKeys() { + buf.WriteString(strings.Repeat(" ", indent+2)) + buf.WriteString(k.String() + ": ") + stringValue(v.MapIndex(k), indent+2, buf) + + if i < v.Len()-1 { + buf.WriteString(",\n") + } + } + + buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") + default: + format := "%v" + switch v.Interface().(type) { + case string: + format = "%q" + } + fmt.Fprintf(buf, format, v.Interface()) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go new file mode 100644 index 000000000..709605384 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go @@ -0,0 +1,96 @@ +package client + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/aws/request" +) + +// A Config provides configuration to a service client instance. +type Config struct { + Config *aws.Config + Handlers request.Handlers + Endpoint string + SigningRegion string + SigningName string + + // States that the signing name did not come from a modeled source but + // was derived based on other data. Used by service client constructors + // to determine if the signin name can be overridden based on metadata the + // service has. + SigningNameDerived bool +} + +// ConfigProvider provides a generic way for a service client to receive +// the ClientConfig without circular dependencies. +type ConfigProvider interface { + ClientConfig(serviceName string, cfgs ...*aws.Config) Config +} + +// ConfigNoResolveEndpointProvider same as ConfigProvider except it will not +// resolve the endpoint automatically. The service client's endpoint must be +// provided via the aws.Config.Endpoint field. +type ConfigNoResolveEndpointProvider interface { + ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) Config +} + +// A Client implements the base client request and response handling +// used by all service clients. +type Client struct { + request.Retryer + metadata.ClientInfo + + Config aws.Config + Handlers request.Handlers +} + +// New will return a pointer to a new initialized service client. +func New(cfg aws.Config, info metadata.ClientInfo, handlers request.Handlers, options ...func(*Client)) *Client { + svc := &Client{ + Config: cfg, + ClientInfo: info, + Handlers: handlers.Copy(), + } + + switch retryer, ok := cfg.Retryer.(request.Retryer); { + case ok: + svc.Retryer = retryer + case cfg.Retryer != nil && cfg.Logger != nil: + s := fmt.Sprintf("WARNING: %T does not implement request.Retryer; using DefaultRetryer instead", cfg.Retryer) + cfg.Logger.Log(s) + fallthrough + default: + maxRetries := aws.IntValue(cfg.MaxRetries) + if cfg.MaxRetries == nil || maxRetries == aws.UseServiceDefaultRetries { + maxRetries = 3 + } + svc.Retryer = DefaultRetryer{NumMaxRetries: maxRetries} + } + + svc.AddDebugHandlers() + + for _, option := range options { + option(svc) + } + + return svc +} + +// NewRequest returns a new Request pointer for the service API +// operation and parameters. +func (c *Client) NewRequest(operation *request.Operation, params interface{}, data interface{}) *request.Request { + return request.New(c.Config, c.ClientInfo, c.Handlers, c.Retryer, operation, params, data) +} + +// AddDebugHandlers injects debug logging handlers into the service to log request +// debug information. +func (c *Client) AddDebugHandlers() { + if !c.Config.LogLevel.AtLeast(aws.LogDebug) { + return + } + + c.Handlers.Send.PushFrontNamed(LogHTTPRequestHandler) + c.Handlers.Send.PushBackNamed(LogHTTPResponseHandler) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go new file mode 100644 index 000000000..a397b0d04 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go @@ -0,0 +1,116 @@ +package client + +import ( + "strconv" + "time" + + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/sdkrand" +) + +// DefaultRetryer implements basic retry logic using exponential backoff for +// most services. If you want to implement custom retry logic, implement the +// request.Retryer interface or create a structure type that composes this +// struct and override the specific methods. For example, to override only +// the MaxRetries method: +// +// type retryer struct { +// client.DefaultRetryer +// } +// +// // This implementation always has 100 max retries +// func (d retryer) MaxRetries() int { return 100 } +type DefaultRetryer struct { + NumMaxRetries int +} + +// MaxRetries returns the number of maximum returns the service will use to make +// an individual API request. +func (d DefaultRetryer) MaxRetries() int { + return d.NumMaxRetries +} + +// RetryRules returns the delay duration before retrying this request again +func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration { + // Set the upper limit of delay in retrying at ~five minutes + minTime := 30 + throttle := d.shouldThrottle(r) + if throttle { + if delay, ok := getRetryDelay(r); ok { + return delay + } + + minTime = 500 + } + + retryCount := r.RetryCount + if throttle && retryCount > 8 { + retryCount = 8 + } else if retryCount > 13 { + retryCount = 13 + } + + delay := (1 << uint(retryCount)) * (sdkrand.SeededRand.Intn(minTime) + minTime) + return time.Duration(delay) * time.Millisecond +} + +// ShouldRetry returns true if the request should be retried. +func (d DefaultRetryer) ShouldRetry(r *request.Request) bool { + // If one of the other handlers already set the retry state + // we don't want to override it based on the service's state + if r.Retryable != nil { + return *r.Retryable + } + + if r.HTTPResponse.StatusCode >= 500 && r.HTTPResponse.StatusCode != 501 { + return true + } + return r.IsErrorRetryable() || d.shouldThrottle(r) +} + +// ShouldThrottle returns true if the request should be throttled. +func (d DefaultRetryer) shouldThrottle(r *request.Request) bool { + switch r.HTTPResponse.StatusCode { + case 429: + case 502: + case 503: + case 504: + default: + return r.IsErrorThrottle() + } + + return true +} + +// This will look in the Retry-After header, RFC 7231, for how long +// it will wait before attempting another request +func getRetryDelay(r *request.Request) (time.Duration, bool) { + if !canUseRetryAfterHeader(r) { + return 0, false + } + + delayStr := r.HTTPResponse.Header.Get("Retry-After") + if len(delayStr) == 0 { + return 0, false + } + + delay, err := strconv.Atoi(delayStr) + if err != nil { + return 0, false + } + + return time.Duration(delay) * time.Second, true +} + +// Will look at the status code to see if the retry header pertains to +// the status code. +func canUseRetryAfterHeader(r *request.Request) bool { + switch r.HTTPResponse.StatusCode { + case 429: + case 503: + default: + return false + } + + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go b/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go new file mode 100644 index 000000000..7b5e1276a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go @@ -0,0 +1,190 @@ +package client + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "net/http/httputil" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" +) + +const logReqMsg = `DEBUG: Request %s/%s Details: +---[ REQUEST POST-SIGN ]----------------------------- +%s +-----------------------------------------------------` + +const logReqErrMsg = `DEBUG ERROR: Request %s/%s: +---[ REQUEST DUMP ERROR ]----------------------------- +%s +------------------------------------------------------` + +type logWriter struct { + // Logger is what we will use to log the payload of a response. + Logger aws.Logger + // buf stores the contents of what has been read + buf *bytes.Buffer +} + +func (logger *logWriter) Write(b []byte) (int, error) { + return logger.buf.Write(b) +} + +type teeReaderCloser struct { + // io.Reader will be a tee reader that is used during logging. + // This structure will read from a body and write the contents to a logger. + io.Reader + // Source is used just to close when we are done reading. + Source io.ReadCloser +} + +func (reader *teeReaderCloser) Close() error { + return reader.Source.Close() +} + +// LogHTTPRequestHandler is a SDK request handler to log the HTTP request sent +// to a service. Will include the HTTP request body if the LogLevel of the +// request matches LogDebugWithHTTPBody. +var LogHTTPRequestHandler = request.NamedHandler{ + Name: "awssdk.client.LogRequest", + Fn: logRequest, +} + +func logRequest(r *request.Request) { + logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) + bodySeekable := aws.IsReaderSeekable(r.Body) + + b, err := httputil.DumpRequestOut(r.HTTPRequest, logBody) + if err != nil { + r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) + return + } + + if logBody { + if !bodySeekable { + r.SetReaderBody(aws.ReadSeekCloser(r.HTTPRequest.Body)) + } + // Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's + // Body as a NoOpCloser and will not be reset after read by the HTTP + // client reader. + r.ResetBody() + } + + r.Config.Logger.Log(fmt.Sprintf(logReqMsg, + r.ClientInfo.ServiceName, r.Operation.Name, string(b))) +} + +// LogHTTPRequestHeaderHandler is a SDK request handler to log the HTTP request sent +// to a service. Will only log the HTTP request's headers. The request payload +// will not be read. +var LogHTTPRequestHeaderHandler = request.NamedHandler{ + Name: "awssdk.client.LogRequestHeader", + Fn: logRequestHeader, +} + +func logRequestHeader(r *request.Request) { + b, err := httputil.DumpRequestOut(r.HTTPRequest, false) + if err != nil { + r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) + return + } + + r.Config.Logger.Log(fmt.Sprintf(logReqMsg, + r.ClientInfo.ServiceName, r.Operation.Name, string(b))) +} + +const logRespMsg = `DEBUG: Response %s/%s Details: +---[ RESPONSE ]-------------------------------------- +%s +-----------------------------------------------------` + +const logRespErrMsg = `DEBUG ERROR: Response %s/%s: +---[ RESPONSE DUMP ERROR ]----------------------------- +%s +-----------------------------------------------------` + +// LogHTTPResponseHandler is a SDK request handler to log the HTTP response +// received from a service. Will include the HTTP response body if the LogLevel +// of the request matches LogDebugWithHTTPBody. +var LogHTTPResponseHandler = request.NamedHandler{ + Name: "awssdk.client.LogResponse", + Fn: logResponse, +} + +func logResponse(r *request.Request) { + lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)} + + if r.HTTPResponse == nil { + lw.Logger.Log(fmt.Sprintf(logRespErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, "request's HTTPResponse is nil")) + return + } + + logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) + if logBody { + r.HTTPResponse.Body = &teeReaderCloser{ + Reader: io.TeeReader(r.HTTPResponse.Body, lw), + Source: r.HTTPResponse.Body, + } + } + + handlerFn := func(req *request.Request) { + b, err := httputil.DumpResponse(req.HTTPResponse, false) + if err != nil { + lw.Logger.Log(fmt.Sprintf(logRespErrMsg, + req.ClientInfo.ServiceName, req.Operation.Name, err)) + return + } + + lw.Logger.Log(fmt.Sprintf(logRespMsg, + req.ClientInfo.ServiceName, req.Operation.Name, string(b))) + + if logBody { + b, err := ioutil.ReadAll(lw.buf) + if err != nil { + lw.Logger.Log(fmt.Sprintf(logRespErrMsg, + req.ClientInfo.ServiceName, req.Operation.Name, err)) + return + } + + lw.Logger.Log(string(b)) + } + } + + const handlerName = "awsdk.client.LogResponse.ResponseBody" + + r.Handlers.Unmarshal.SetBackNamed(request.NamedHandler{ + Name: handlerName, Fn: handlerFn, + }) + r.Handlers.UnmarshalError.SetBackNamed(request.NamedHandler{ + Name: handlerName, Fn: handlerFn, + }) +} + +// LogHTTPResponseHeaderHandler is a SDK request handler to log the HTTP +// response received from a service. Will only log the HTTP response's headers. +// The response payload will not be read. +var LogHTTPResponseHeaderHandler = request.NamedHandler{ + Name: "awssdk.client.LogResponseHeader", + Fn: logResponseHeader, +} + +func logResponseHeader(r *request.Request) { + if r.Config.Logger == nil { + return + } + + b, err := httputil.DumpResponse(r.HTTPResponse, false) + if err != nil { + r.Config.Logger.Log(fmt.Sprintf(logRespErrMsg, + r.ClientInfo.ServiceName, r.Operation.Name, err)) + return + } + + r.Config.Logger.Log(fmt.Sprintf(logRespMsg, + r.ClientInfo.ServiceName, r.Operation.Name, string(b))) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go new file mode 100644 index 000000000..920e9fddf --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go @@ -0,0 +1,13 @@ +package metadata + +// ClientInfo wraps immutable data from the client.Client structure. +type ClientInfo struct { + ServiceName string + ServiceID string + APIVersion string + Endpoint string + SigningName string + SigningRegion string + JSONVersion string + TargetPrefix string +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/config.go b/vendor/github.com/aws/aws-sdk-go/aws/config.go new file mode 100644 index 000000000..10634d173 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/config.go @@ -0,0 +1,536 @@ +package aws + +import ( + "net/http" + "time" + + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/endpoints" +) + +// UseServiceDefaultRetries instructs the config to use the service's own +// default number of retries. This will be the default action if +// Config.MaxRetries is nil also. +const UseServiceDefaultRetries = -1 + +// RequestRetryer is an alias for a type that implements the request.Retryer +// interface. +type RequestRetryer interface{} + +// A Config provides service configuration for service clients. By default, +// all clients will use the defaults.DefaultConfig structure. +// +// // Create Session with MaxRetry configuration to be shared by multiple +// // service clients. +// sess := session.Must(session.NewSession(&aws.Config{ +// MaxRetries: aws.Int(3), +// })) +// +// // Create S3 service client with a specific Region. +// svc := s3.New(sess, &aws.Config{ +// Region: aws.String("us-west-2"), +// }) +type Config struct { + // Enables verbose error printing of all credential chain errors. + // Should be used when wanting to see all errors while attempting to + // retrieve credentials. + CredentialsChainVerboseErrors *bool + + // The credentials object to use when signing requests. Defaults to a + // chain of credential providers to search for credentials in environment + // variables, shared credential file, and EC2 Instance Roles. + Credentials *credentials.Credentials + + // An optional endpoint URL (hostname only or fully qualified URI) + // that overrides the default generated endpoint for a client. Set this + // to `""` to use the default generated endpoint. + // + // Note: You must still provide a `Region` value when specifying an + // endpoint for a client. + Endpoint *string + + // The resolver to use for looking up endpoints for AWS service clients + // to use based on region. + EndpointResolver endpoints.Resolver + + // EnforceShouldRetryCheck is used in the AfterRetryHandler to always call + // ShouldRetry regardless of whether or not if request.Retryable is set. + // This will utilize ShouldRetry method of custom retryers. If EnforceShouldRetryCheck + // is not set, then ShouldRetry will only be called if request.Retryable is nil. + // Proper handling of the request.Retryable field is important when setting this field. + EnforceShouldRetryCheck *bool + + // The region to send requests to. This parameter is required and must + // be configured globally or on a per-client basis unless otherwise + // noted. A full list of regions is found in the "Regions and Endpoints" + // document. + // + // See http://docs.aws.amazon.com/general/latest/gr/rande.html for AWS + // Regions and Endpoints. + Region *string + + // Set this to `true` to disable SSL when sending requests. Defaults + // to `false`. + DisableSSL *bool + + // The HTTP client to use when sending requests. Defaults to + // `http.DefaultClient`. + HTTPClient *http.Client + + // An integer value representing the logging level. The default log level + // is zero (LogOff), which represents no logging. To enable logging set + // to a LogLevel Value. + LogLevel *LogLevelType + + // The logger writer interface to write logging messages to. Defaults to + // standard out. + Logger Logger + + // The maximum number of times that a request will be retried for failures. + // Defaults to -1, which defers the max retry setting to the service + // specific configuration. + MaxRetries *int + + // Retryer guides how HTTP requests should be retried in case of + // recoverable failures. + // + // When nil or the value does not implement the request.Retryer interface, + // the client.DefaultRetryer will be used. + // + // When both Retryer and MaxRetries are non-nil, the former is used and + // the latter ignored. + // + // To set the Retryer field in a type-safe manner and with chaining, use + // the request.WithRetryer helper function: + // + // cfg := request.WithRetryer(aws.NewConfig(), myRetryer) + // + Retryer RequestRetryer + + // Disables semantic parameter validation, which validates input for + // missing required fields and/or other semantic request input errors. + DisableParamValidation *bool + + // Disables the computation of request and response checksums, e.g., + // CRC32 checksums in Amazon DynamoDB. + DisableComputeChecksums *bool + + // Set this to `true` to force the request to use path-style addressing, + // i.e., `http://s3.amazonaws.com/BUCKET/KEY`. By default, the S3 client + // will use virtual hosted bucket addressing when possible + // (`http://BUCKET.s3.amazonaws.com/KEY`). + // + // Note: This configuration option is specific to the Amazon S3 service. + // + // See http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html + // for Amazon S3: Virtual Hosting of Buckets + S3ForcePathStyle *bool + + // Set this to `true` to disable the SDK adding the `Expect: 100-Continue` + // header to PUT requests over 2MB of content. 100-Continue instructs the + // HTTP client not to send the body until the service responds with a + // `continue` status. This is useful to prevent sending the request body + // until after the request is authenticated, and validated. + // + // http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html + // + // 100-Continue is only enabled for Go 1.6 and above. See `http.Transport`'s + // `ExpectContinueTimeout` for information on adjusting the continue wait + // timeout. https://golang.org/pkg/net/http/#Transport + // + // You should use this flag to disble 100-Continue if you experience issues + // with proxies or third party S3 compatible services. + S3Disable100Continue *bool + + // Set this to `true` to enable S3 Accelerate feature. For all operations + // compatible with S3 Accelerate will use the accelerate endpoint for + // requests. Requests not compatible will fall back to normal S3 requests. + // + // The bucket must be enable for accelerate to be used with S3 client with + // accelerate enabled. If the bucket is not enabled for accelerate an error + // will be returned. The bucket name must be DNS compatible to also work + // with accelerate. + S3UseAccelerate *bool + + // S3DisableContentMD5Validation config option is temporarily disabled, + // For S3 GetObject API calls, #1837. + // + // Set this to `true` to disable the S3 service client from automatically + // adding the ContentMD5 to S3 Object Put and Upload API calls. This option + // will also disable the SDK from performing object ContentMD5 validation + // on GetObject API calls. + S3DisableContentMD5Validation *bool + + // Set this to `true` to disable the EC2Metadata client from overriding the + // default http.Client's Timeout. This is helpful if you do not want the + // EC2Metadata client to create a new http.Client. This options is only + // meaningful if you're not already using a custom HTTP client with the + // SDK. Enabled by default. + // + // Must be set and provided to the session.NewSession() in order to disable + // the EC2Metadata overriding the timeout for default credentials chain. + // + // Example: + // sess := session.Must(session.NewSession(aws.NewConfig() + // .WithEC2MetadataDiableTimeoutOverride(true))) + // + // svc := s3.New(sess) + // + EC2MetadataDisableTimeoutOverride *bool + + // Instructs the endpoint to be generated for a service client to + // be the dual stack endpoint. The dual stack endpoint will support + // both IPv4 and IPv6 addressing. + // + // Setting this for a service which does not support dual stack will fail + // to make requets. It is not recommended to set this value on the session + // as it will apply to all service clients created with the session. Even + // services which don't support dual stack endpoints. + // + // If the Endpoint config value is also provided the UseDualStack flag + // will be ignored. + // + // Only supported with. + // + // sess := session.Must(session.NewSession()) + // + // svc := s3.New(sess, &aws.Config{ + // UseDualStack: aws.Bool(true), + // }) + UseDualStack *bool + + // SleepDelay is an override for the func the SDK will call when sleeping + // during the lifecycle of a request. Specifically this will be used for + // request delays. This value should only be used for testing. To adjust + // the delay of a request see the aws/client.DefaultRetryer and + // aws/request.Retryer. + // + // SleepDelay will prevent any Context from being used for canceling retry + // delay of an API operation. It is recommended to not use SleepDelay at all + // and specify a Retryer instead. + SleepDelay func(time.Duration) + + // DisableRestProtocolURICleaning will not clean the URL path when making rest protocol requests. + // Will default to false. This would only be used for empty directory names in s3 requests. + // + // Example: + // sess := session.Must(session.NewSession(&aws.Config{ + // DisableRestProtocolURICleaning: aws.Bool(true), + // })) + // + // svc := s3.New(sess) + // out, err := svc.GetObject(&s3.GetObjectInput { + // Bucket: aws.String("bucketname"), + // Key: aws.String("//foo//bar//moo"), + // }) + DisableRestProtocolURICleaning *bool + + // EnableEndpointDiscovery will allow for endpoint discovery on operations that + // have the definition in its model. By default, endpoint discovery is off. + // + // Example: + // sess := session.Must(session.NewSession(&aws.Config{ + // EnableEndpointDiscovery: aws.Bool(true), + // })) + // + // svc := s3.New(sess) + // out, err := svc.GetObject(&s3.GetObjectInput { + // Bucket: aws.String("bucketname"), + // Key: aws.String("/foo/bar/moo"), + // }) + EnableEndpointDiscovery *bool + + // DisableEndpointHostPrefix will disable the SDK's behavior of prefixing + // request endpoint hosts with modeled information. + // + // Disabling this feature is useful when you want to use local endpoints + // for testing that do not support the modeled host prefix pattern. + DisableEndpointHostPrefix *bool +} + +// NewConfig returns a new Config pointer that can be chained with builder +// methods to set multiple configuration values inline without using pointers. +// +// // Create Session with MaxRetry configuration to be shared by multiple +// // service clients. +// sess := session.Must(session.NewSession(aws.NewConfig(). +// WithMaxRetries(3), +// )) +// +// // Create S3 service client with a specific Region. +// svc := s3.New(sess, aws.NewConfig(). +// WithRegion("us-west-2"), +// ) +func NewConfig() *Config { + return &Config{} +} + +// WithCredentialsChainVerboseErrors sets a config verbose errors boolean and returning +// a Config pointer. +func (c *Config) WithCredentialsChainVerboseErrors(verboseErrs bool) *Config { + c.CredentialsChainVerboseErrors = &verboseErrs + return c +} + +// WithCredentials sets a config Credentials value returning a Config pointer +// for chaining. +func (c *Config) WithCredentials(creds *credentials.Credentials) *Config { + c.Credentials = creds + return c +} + +// WithEndpoint sets a config Endpoint value returning a Config pointer for +// chaining. +func (c *Config) WithEndpoint(endpoint string) *Config { + c.Endpoint = &endpoint + return c +} + +// WithEndpointResolver sets a config EndpointResolver value returning a +// Config pointer for chaining. +func (c *Config) WithEndpointResolver(resolver endpoints.Resolver) *Config { + c.EndpointResolver = resolver + return c +} + +// WithRegion sets a config Region value returning a Config pointer for +// chaining. +func (c *Config) WithRegion(region string) *Config { + c.Region = ®ion + return c +} + +// WithDisableSSL sets a config DisableSSL value returning a Config pointer +// for chaining. +func (c *Config) WithDisableSSL(disable bool) *Config { + c.DisableSSL = &disable + return c +} + +// WithHTTPClient sets a config HTTPClient value returning a Config pointer +// for chaining. +func (c *Config) WithHTTPClient(client *http.Client) *Config { + c.HTTPClient = client + return c +} + +// WithMaxRetries sets a config MaxRetries value returning a Config pointer +// for chaining. +func (c *Config) WithMaxRetries(max int) *Config { + c.MaxRetries = &max + return c +} + +// WithDisableParamValidation sets a config DisableParamValidation value +// returning a Config pointer for chaining. +func (c *Config) WithDisableParamValidation(disable bool) *Config { + c.DisableParamValidation = &disable + return c +} + +// WithDisableComputeChecksums sets a config DisableComputeChecksums value +// returning a Config pointer for chaining. +func (c *Config) WithDisableComputeChecksums(disable bool) *Config { + c.DisableComputeChecksums = &disable + return c +} + +// WithLogLevel sets a config LogLevel value returning a Config pointer for +// chaining. +func (c *Config) WithLogLevel(level LogLevelType) *Config { + c.LogLevel = &level + return c +} + +// WithLogger sets a config Logger value returning a Config pointer for +// chaining. +func (c *Config) WithLogger(logger Logger) *Config { + c.Logger = logger + return c +} + +// WithS3ForcePathStyle sets a config S3ForcePathStyle value returning a Config +// pointer for chaining. +func (c *Config) WithS3ForcePathStyle(force bool) *Config { + c.S3ForcePathStyle = &force + return c +} + +// WithS3Disable100Continue sets a config S3Disable100Continue value returning +// a Config pointer for chaining. +func (c *Config) WithS3Disable100Continue(disable bool) *Config { + c.S3Disable100Continue = &disable + return c +} + +// WithS3UseAccelerate sets a config S3UseAccelerate value returning a Config +// pointer for chaining. +func (c *Config) WithS3UseAccelerate(enable bool) *Config { + c.S3UseAccelerate = &enable + return c + +} + +// WithS3DisableContentMD5Validation sets a config +// S3DisableContentMD5Validation value returning a Config pointer for chaining. +func (c *Config) WithS3DisableContentMD5Validation(enable bool) *Config { + c.S3DisableContentMD5Validation = &enable + return c + +} + +// WithUseDualStack sets a config UseDualStack value returning a Config +// pointer for chaining. +func (c *Config) WithUseDualStack(enable bool) *Config { + c.UseDualStack = &enable + return c +} + +// WithEC2MetadataDisableTimeoutOverride sets a config EC2MetadataDisableTimeoutOverride value +// returning a Config pointer for chaining. +func (c *Config) WithEC2MetadataDisableTimeoutOverride(enable bool) *Config { + c.EC2MetadataDisableTimeoutOverride = &enable + return c +} + +// WithSleepDelay overrides the function used to sleep while waiting for the +// next retry. Defaults to time.Sleep. +func (c *Config) WithSleepDelay(fn func(time.Duration)) *Config { + c.SleepDelay = fn + return c +} + +// WithEndpointDiscovery will set whether or not to use endpoint discovery. +func (c *Config) WithEndpointDiscovery(t bool) *Config { + c.EnableEndpointDiscovery = &t + return c +} + +// WithDisableEndpointHostPrefix will set whether or not to use modeled host prefix +// when making requests. +func (c *Config) WithDisableEndpointHostPrefix(t bool) *Config { + c.DisableEndpointHostPrefix = &t + return c +} + +// MergeIn merges the passed in configs into the existing config object. +func (c *Config) MergeIn(cfgs ...*Config) { + for _, other := range cfgs { + mergeInConfig(c, other) + } +} + +func mergeInConfig(dst *Config, other *Config) { + if other == nil { + return + } + + if other.CredentialsChainVerboseErrors != nil { + dst.CredentialsChainVerboseErrors = other.CredentialsChainVerboseErrors + } + + if other.Credentials != nil { + dst.Credentials = other.Credentials + } + + if other.Endpoint != nil { + dst.Endpoint = other.Endpoint + } + + if other.EndpointResolver != nil { + dst.EndpointResolver = other.EndpointResolver + } + + if other.Region != nil { + dst.Region = other.Region + } + + if other.DisableSSL != nil { + dst.DisableSSL = other.DisableSSL + } + + if other.HTTPClient != nil { + dst.HTTPClient = other.HTTPClient + } + + if other.LogLevel != nil { + dst.LogLevel = other.LogLevel + } + + if other.Logger != nil { + dst.Logger = other.Logger + } + + if other.MaxRetries != nil { + dst.MaxRetries = other.MaxRetries + } + + if other.Retryer != nil { + dst.Retryer = other.Retryer + } + + if other.DisableParamValidation != nil { + dst.DisableParamValidation = other.DisableParamValidation + } + + if other.DisableComputeChecksums != nil { + dst.DisableComputeChecksums = other.DisableComputeChecksums + } + + if other.S3ForcePathStyle != nil { + dst.S3ForcePathStyle = other.S3ForcePathStyle + } + + if other.S3Disable100Continue != nil { + dst.S3Disable100Continue = other.S3Disable100Continue + } + + if other.S3UseAccelerate != nil { + dst.S3UseAccelerate = other.S3UseAccelerate + } + + if other.S3DisableContentMD5Validation != nil { + dst.S3DisableContentMD5Validation = other.S3DisableContentMD5Validation + } + + if other.UseDualStack != nil { + dst.UseDualStack = other.UseDualStack + } + + if other.EC2MetadataDisableTimeoutOverride != nil { + dst.EC2MetadataDisableTimeoutOverride = other.EC2MetadataDisableTimeoutOverride + } + + if other.SleepDelay != nil { + dst.SleepDelay = other.SleepDelay + } + + if other.DisableRestProtocolURICleaning != nil { + dst.DisableRestProtocolURICleaning = other.DisableRestProtocolURICleaning + } + + if other.EnforceShouldRetryCheck != nil { + dst.EnforceShouldRetryCheck = other.EnforceShouldRetryCheck + } + + if other.EnableEndpointDiscovery != nil { + dst.EnableEndpointDiscovery = other.EnableEndpointDiscovery + } + + if other.DisableEndpointHostPrefix != nil { + dst.DisableEndpointHostPrefix = other.DisableEndpointHostPrefix + } +} + +// Copy will return a shallow copy of the Config object. If any additional +// configurations are provided they will be merged into the new config returned. +func (c *Config) Copy(cfgs ...*Config) *Config { + dst := &Config{} + dst.MergeIn(c) + + for _, cfg := range cfgs { + dst.MergeIn(cfg) + } + + return dst +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go new file mode 100644 index 000000000..2866f9a7f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go @@ -0,0 +1,37 @@ +// +build !go1.9 + +package aws + +import "time" + +// Context is an copy of the Go v1.7 stdlib's context.Context interface. +// It is represented as a SDK interface to enable you to use the "WithContext" +// API methods with Go v1.6 and a Context type such as golang.org/x/net/context. +// +// See https://golang.org/pkg/context on how to use contexts. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + Value(key interface{}) interface{} +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go new file mode 100644 index 000000000..3718b26e1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go @@ -0,0 +1,11 @@ +// +build go1.9 + +package aws + +import "context" + +// Context is an alias of the Go stdlib's context.Context interface. +// It can be used within the SDK's API operation "WithContext" methods. +// +// See https://golang.org/pkg/context on how to use contexts. +type Context = context.Context diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go new file mode 100644 index 000000000..66c5945db --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go @@ -0,0 +1,56 @@ +// +build !go1.7 + +package aws + +import "time" + +// An emptyCtx is a copy of the Go 1.7 context.emptyCtx type. This is copied to +// provide a 1.6 and 1.5 safe version of context that is compatible with Go +// 1.7's Context. +// +// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { + return +} + +func (*emptyCtx) Done() <-chan struct{} { + return nil +} + +func (*emptyCtx) Err() error { + return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (e *emptyCtx) String() string { + switch e { + case backgroundCtx: + return "aws.BackgroundContext" + } + return "unknown empty Context" +} + +var ( + backgroundCtx = new(emptyCtx) +) + +// BackgroundContext returns a context that will never be canceled, has no +// values, and no deadline. This context is used by the SDK to provide +// backwards compatibility with non-context API operations and functionality. +// +// Go 1.6 and before: +// This context function is equivalent to context.Background in the Go stdlib. +// +// Go 1.7 and later: +// The context returned will be the value returned by context.Background() +// +// See https://golang.org/pkg/context for more information on Contexts. +func BackgroundContext() Context { + return backgroundCtx +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go new file mode 100644 index 000000000..9c29f29af --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go @@ -0,0 +1,20 @@ +// +build go1.7 + +package aws + +import "context" + +// BackgroundContext returns a context that will never be canceled, has no +// values, and no deadline. This context is used by the SDK to provide +// backwards compatibility with non-context API operations and functionality. +// +// Go 1.6 and before: +// This context function is equivalent to context.Background in the Go stdlib. +// +// Go 1.7 and later: +// The context returned will be the value returned by context.Background() +// +// See https://golang.org/pkg/context for more information on Contexts. +func BackgroundContext() Context { + return context.Background() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go b/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go new file mode 100644 index 000000000..304fd1561 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go @@ -0,0 +1,24 @@ +package aws + +import ( + "time" +) + +// SleepWithContext will wait for the timer duration to expire, or the context +// is canceled. Which ever happens first. If the context is canceled the Context's +// error will be returned. +// +// Expects Context to always return a non-nil error if the Done channel is closed. +func SleepWithContext(ctx Context, dur time.Duration) error { + t := time.NewTimer(dur) + defer t.Stop() + + select { + case <-t.C: + break + case <-ctx.Done(): + return ctx.Err() + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go b/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go new file mode 100644 index 000000000..ff5d58e06 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go @@ -0,0 +1,387 @@ +package aws + +import "time" + +// String returns a pointer to the string value passed in. +func String(v string) *string { + return &v +} + +// StringValue returns the value of the string pointer passed in or +// "" if the pointer is nil. +func StringValue(v *string) string { + if v != nil { + return *v + } + return "" +} + +// StringSlice converts a slice of string values into a slice of +// string pointers +func StringSlice(src []string) []*string { + dst := make([]*string, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// StringValueSlice converts a slice of string pointers into a slice of +// string values +func StringValueSlice(src []*string) []string { + dst := make([]string, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// StringMap converts a string map of string values into a string +// map of string pointers +func StringMap(src map[string]string) map[string]*string { + dst := make(map[string]*string) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// StringValueMap converts a string map of string pointers into a string +// map of string values +func StringValueMap(src map[string]*string) map[string]string { + dst := make(map[string]string) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Bool returns a pointer to the bool value passed in. +func Bool(v bool) *bool { + return &v +} + +// BoolValue returns the value of the bool pointer passed in or +// false if the pointer is nil. +func BoolValue(v *bool) bool { + if v != nil { + return *v + } + return false +} + +// BoolSlice converts a slice of bool values into a slice of +// bool pointers +func BoolSlice(src []bool) []*bool { + dst := make([]*bool, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// BoolValueSlice converts a slice of bool pointers into a slice of +// bool values +func BoolValueSlice(src []*bool) []bool { + dst := make([]bool, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// BoolMap converts a string map of bool values into a string +// map of bool pointers +func BoolMap(src map[string]bool) map[string]*bool { + dst := make(map[string]*bool) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// BoolValueMap converts a string map of bool pointers into a string +// map of bool values +func BoolValueMap(src map[string]*bool) map[string]bool { + dst := make(map[string]bool) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int returns a pointer to the int value passed in. +func Int(v int) *int { + return &v +} + +// IntValue returns the value of the int pointer passed in or +// 0 if the pointer is nil. +func IntValue(v *int) int { + if v != nil { + return *v + } + return 0 +} + +// IntSlice converts a slice of int values into a slice of +// int pointers +func IntSlice(src []int) []*int { + dst := make([]*int, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// IntValueSlice converts a slice of int pointers into a slice of +// int values +func IntValueSlice(src []*int) []int { + dst := make([]int, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// IntMap converts a string map of int values into a string +// map of int pointers +func IntMap(src map[string]int) map[string]*int { + dst := make(map[string]*int) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// IntValueMap converts a string map of int pointers into a string +// map of int values +func IntValueMap(src map[string]*int) map[string]int { + dst := make(map[string]int) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int64 returns a pointer to the int64 value passed in. +func Int64(v int64) *int64 { + return &v +} + +// Int64Value returns the value of the int64 pointer passed in or +// 0 if the pointer is nil. +func Int64Value(v *int64) int64 { + if v != nil { + return *v + } + return 0 +} + +// Int64Slice converts a slice of int64 values into a slice of +// int64 pointers +func Int64Slice(src []int64) []*int64 { + dst := make([]*int64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int64ValueSlice converts a slice of int64 pointers into a slice of +// int64 values +func Int64ValueSlice(src []*int64) []int64 { + dst := make([]int64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int64Map converts a string map of int64 values into a string +// map of int64 pointers +func Int64Map(src map[string]int64) map[string]*int64 { + dst := make(map[string]*int64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int64ValueMap converts a string map of int64 pointers into a string +// map of int64 values +func Int64ValueMap(src map[string]*int64) map[string]int64 { + dst := make(map[string]int64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Float64 returns a pointer to the float64 value passed in. +func Float64(v float64) *float64 { + return &v +} + +// Float64Value returns the value of the float64 pointer passed in or +// 0 if the pointer is nil. +func Float64Value(v *float64) float64 { + if v != nil { + return *v + } + return 0 +} + +// Float64Slice converts a slice of float64 values into a slice of +// float64 pointers +func Float64Slice(src []float64) []*float64 { + dst := make([]*float64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Float64ValueSlice converts a slice of float64 pointers into a slice of +// float64 values +func Float64ValueSlice(src []*float64) []float64 { + dst := make([]float64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Float64Map converts a string map of float64 values into a string +// map of float64 pointers +func Float64Map(src map[string]float64) map[string]*float64 { + dst := make(map[string]*float64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Float64ValueMap converts a string map of float64 pointers into a string +// map of float64 values +func Float64ValueMap(src map[string]*float64) map[string]float64 { + dst := make(map[string]float64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Time returns a pointer to the time.Time value passed in. +func Time(v time.Time) *time.Time { + return &v +} + +// TimeValue returns the value of the time.Time pointer passed in or +// time.Time{} if the pointer is nil. +func TimeValue(v *time.Time) time.Time { + if v != nil { + return *v + } + return time.Time{} +} + +// SecondsTimeValue converts an int64 pointer to a time.Time value +// representing seconds since Epoch or time.Time{} if the pointer is nil. +func SecondsTimeValue(v *int64) time.Time { + if v != nil { + return time.Unix((*v / 1000), 0) + } + return time.Time{} +} + +// MillisecondsTimeValue converts an int64 pointer to a time.Time value +// representing milliseconds sinch Epoch or time.Time{} if the pointer is nil. +func MillisecondsTimeValue(v *int64) time.Time { + if v != nil { + return time.Unix(0, (*v * 1000000)) + } + return time.Time{} +} + +// TimeUnixMilli returns a Unix timestamp in milliseconds from "January 1, 1970 UTC". +// The result is undefined if the Unix time cannot be represented by an int64. +// Which includes calling TimeUnixMilli on a zero Time is undefined. +// +// This utility is useful for service API's such as CloudWatch Logs which require +// their unix time values to be in milliseconds. +// +// See Go stdlib https://golang.org/pkg/time/#Time.UnixNano for more information. +func TimeUnixMilli(t time.Time) int64 { + return t.UnixNano() / int64(time.Millisecond/time.Nanosecond) +} + +// TimeSlice converts a slice of time.Time values into a slice of +// time.Time pointers +func TimeSlice(src []time.Time) []*time.Time { + dst := make([]*time.Time, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// TimeValueSlice converts a slice of time.Time pointers into a slice of +// time.Time values +func TimeValueSlice(src []*time.Time) []time.Time { + dst := make([]time.Time, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// TimeMap converts a string map of time.Time values into a string +// map of time.Time pointers +func TimeMap(src map[string]time.Time) map[string]*time.Time { + dst := make(map[string]*time.Time) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// TimeValueMap converts a string map of time.Time pointers into a string +// map of time.Time values +func TimeValueMap(src map[string]*time.Time) map[string]time.Time { + dst := make(map[string]time.Time) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go new file mode 100644 index 000000000..f8853d78a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go @@ -0,0 +1,228 @@ +package corehandlers + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "regexp" + "strconv" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/request" +) + +// Interface for matching types which also have a Len method. +type lener interface { + Len() int +} + +// BuildContentLengthHandler builds the content length of a request based on the body, +// or will use the HTTPRequest.Header's "Content-Length" if defined. If unable +// to determine request body length and no "Content-Length" was specified it will panic. +// +// The Content-Length will only be added to the request if the length of the body +// is greater than 0. If the body is empty or the current `Content-Length` +// header is <= 0, the header will also be stripped. +var BuildContentLengthHandler = request.NamedHandler{Name: "core.BuildContentLengthHandler", Fn: func(r *request.Request) { + var length int64 + + if slength := r.HTTPRequest.Header.Get("Content-Length"); slength != "" { + length, _ = strconv.ParseInt(slength, 10, 64) + } else { + if r.Body != nil { + var err error + length, err = aws.SeekerLen(r.Body) + if err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "failed to get request body's length", err) + return + } + } + } + + if length > 0 { + r.HTTPRequest.ContentLength = length + r.HTTPRequest.Header.Set("Content-Length", fmt.Sprintf("%d", length)) + } else { + r.HTTPRequest.ContentLength = 0 + r.HTTPRequest.Header.Del("Content-Length") + } +}} + +var reStatusCode = regexp.MustCompile(`^(\d{3})`) + +// ValidateReqSigHandler is a request handler to ensure that the request's +// signature doesn't expire before it is sent. This can happen when a request +// is built and signed significantly before it is sent. Or significant delays +// occur when retrying requests that would cause the signature to expire. +var ValidateReqSigHandler = request.NamedHandler{ + Name: "core.ValidateReqSigHandler", + Fn: func(r *request.Request) { + // Unsigned requests are not signed + if r.Config.Credentials == credentials.AnonymousCredentials { + return + } + + signedTime := r.Time + if !r.LastSignedAt.IsZero() { + signedTime = r.LastSignedAt + } + + // 5 minutes to allow for some clock skew/delays in transmission. + // Would be improved with aws/aws-sdk-go#423 + if signedTime.Add(5 * time.Minute).After(time.Now()) { + return + } + + fmt.Println("request expired, resigning") + r.Sign() + }, +} + +// SendHandler is a request handler to send service request using HTTP client. +var SendHandler = request.NamedHandler{ + Name: "core.SendHandler", + Fn: func(r *request.Request) { + sender := sendFollowRedirects + if r.DisableFollowRedirects { + sender = sendWithoutFollowRedirects + } + + if request.NoBody == r.HTTPRequest.Body { + // Strip off the request body if the NoBody reader was used as a + // place holder for a request body. This prevents the SDK from + // making requests with a request body when it would be invalid + // to do so. + // + // Use a shallow copy of the http.Request to ensure the race condition + // of transport on Body will not trigger + reqOrig, reqCopy := r.HTTPRequest, *r.HTTPRequest + reqCopy.Body = nil + r.HTTPRequest = &reqCopy + defer func() { + r.HTTPRequest = reqOrig + }() + } + + var err error + r.HTTPResponse, err = sender(r) + if err != nil { + handleSendError(r, err) + } + }, +} + +func sendFollowRedirects(r *request.Request) (*http.Response, error) { + return r.Config.HTTPClient.Do(r.HTTPRequest) +} + +func sendWithoutFollowRedirects(r *request.Request) (*http.Response, error) { + transport := r.Config.HTTPClient.Transport + if transport == nil { + transport = http.DefaultTransport + } + + return transport.RoundTrip(r.HTTPRequest) +} + +func handleSendError(r *request.Request, err error) { + // Prevent leaking if an HTTPResponse was returned. Clean up + // the body. + if r.HTTPResponse != nil { + r.HTTPResponse.Body.Close() + } + // Capture the case where url.Error is returned for error processing + // response. e.g. 301 without location header comes back as string + // error and r.HTTPResponse is nil. Other URL redirect errors will + // comeback in a similar method. + if e, ok := err.(*url.Error); ok && e.Err != nil { + if s := reStatusCode.FindStringSubmatch(e.Err.Error()); s != nil { + code, _ := strconv.ParseInt(s[1], 10, 64) + r.HTTPResponse = &http.Response{ + StatusCode: int(code), + Status: http.StatusText(int(code)), + Body: ioutil.NopCloser(bytes.NewReader([]byte{})), + } + return + } + } + if r.HTTPResponse == nil { + // Add a dummy request response object to ensure the HTTPResponse + // value is consistent. + r.HTTPResponse = &http.Response{ + StatusCode: int(0), + Status: http.StatusText(int(0)), + Body: ioutil.NopCloser(bytes.NewReader([]byte{})), + } + } + // Catch all other request errors. + r.Error = awserr.New("RequestError", "send request failed", err) + r.Retryable = aws.Bool(true) // network errors are retryable + + // Override the error with a context canceled error, if that was canceled. + ctx := r.Context() + select { + case <-ctx.Done(): + r.Error = awserr.New(request.CanceledErrorCode, + "request context canceled", ctx.Err()) + r.Retryable = aws.Bool(false) + default: + } +} + +// ValidateResponseHandler is a request handler to validate service response. +var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseHandler", Fn: func(r *request.Request) { + if r.HTTPResponse.StatusCode == 0 || r.HTTPResponse.StatusCode >= 300 { + // this may be replaced by an UnmarshalError handler + r.Error = awserr.New("UnknownError", "unknown error", nil) + } +}} + +// AfterRetryHandler performs final checks to determine if the request should +// be retried and how long to delay. +var AfterRetryHandler = request.NamedHandler{Name: "core.AfterRetryHandler", Fn: func(r *request.Request) { + // If one of the other handlers already set the retry state + // we don't want to override it based on the service's state + if r.Retryable == nil || aws.BoolValue(r.Config.EnforceShouldRetryCheck) { + r.Retryable = aws.Bool(r.ShouldRetry(r)) + } + + if r.WillRetry() { + r.RetryDelay = r.RetryRules(r) + + if sleepFn := r.Config.SleepDelay; sleepFn != nil { + // Support SleepDelay for backwards compatibility and testing + sleepFn(r.RetryDelay) + } else if err := aws.SleepWithContext(r.Context(), r.RetryDelay); err != nil { + r.Error = awserr.New(request.CanceledErrorCode, + "request context canceled", err) + r.Retryable = aws.Bool(false) + return + } + + // when the expired token exception occurs the credentials + // need to be expired locally so that the next request to + // get credentials will trigger a credentials refresh. + if r.IsErrorExpired() { + r.Config.Credentials.Expire() + } + + r.RetryCount++ + r.Error = nil + } +}} + +// ValidateEndpointHandler is a request handler to validate a request had the +// appropriate Region and Endpoint set. Will set r.Error if the endpoint or +// region is not valid. +var ValidateEndpointHandler = request.NamedHandler{Name: "core.ValidateEndpointHandler", Fn: func(r *request.Request) { + if r.ClientInfo.SigningRegion == "" && aws.StringValue(r.Config.Region) == "" { + r.Error = aws.ErrMissingRegion + } else if r.ClientInfo.Endpoint == "" { + r.Error = aws.ErrMissingEndpoint + } +}} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go new file mode 100644 index 000000000..7d50b1557 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go @@ -0,0 +1,17 @@ +package corehandlers + +import "github.com/aws/aws-sdk-go/aws/request" + +// ValidateParametersHandler is a request handler to validate the input parameters. +// Validating parameters only has meaning if done prior to the request being sent. +var ValidateParametersHandler = request.NamedHandler{Name: "core.ValidateParametersHandler", Fn: func(r *request.Request) { + if !r.ParamsFilled() { + return + } + + if v, ok := r.Params.(request.Validator); ok { + if err := v.Validate(); err != nil { + r.Error = err + } + } +}} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go new file mode 100644 index 000000000..ab69c7a6f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go @@ -0,0 +1,37 @@ +package corehandlers + +import ( + "os" + "runtime" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" +) + +// SDKVersionUserAgentHandler is a request handler for adding the SDK Version +// to the user agent. +var SDKVersionUserAgentHandler = request.NamedHandler{ + Name: "core.SDKVersionUserAgentHandler", + Fn: request.MakeAddToUserAgentHandler(aws.SDKName, aws.SDKVersion, + runtime.Version(), runtime.GOOS, runtime.GOARCH), +} + +const execEnvVar = `AWS_EXECUTION_ENV` +const execEnvUAKey = `exec-env` + +// AddHostExecEnvUserAgentHander is a request handler appending the SDK's +// execution environment to the user agent. +// +// If the environment variable AWS_EXECUTION_ENV is set, its value will be +// appended to the user agent string. +var AddHostExecEnvUserAgentHander = request.NamedHandler{ + Name: "core.AddHostExecEnvUserAgentHander", + Fn: func(r *request.Request) { + v := os.Getenv(execEnvVar) + if len(v) == 0 { + return + } + + request.AddToUserAgent(r, execEnvUAKey+"/"+v) + }, +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go new file mode 100644 index 000000000..3ad1e798d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go @@ -0,0 +1,100 @@ +package credentials + +import ( + "github.com/aws/aws-sdk-go/aws/awserr" +) + +var ( + // ErrNoValidProvidersFoundInChain Is returned when there are no valid + // providers in the ChainProvider. + // + // This has been deprecated. For verbose error messaging set + // aws.Config.CredentialsChainVerboseErrors to true. + ErrNoValidProvidersFoundInChain = awserr.New("NoCredentialProviders", + `no valid providers in chain. Deprecated. + For verbose messaging see aws.Config.CredentialsChainVerboseErrors`, + nil) +) + +// A ChainProvider will search for a provider which returns credentials +// and cache that provider until Retrieve is called again. +// +// The ChainProvider provides a way of chaining multiple providers together +// which will pick the first available using priority order of the Providers +// in the list. +// +// If none of the Providers retrieve valid credentials Value, ChainProvider's +// Retrieve() will return the error ErrNoValidProvidersFoundInChain. +// +// If a Provider is found which returns valid credentials Value ChainProvider +// will cache that Provider for all calls to IsExpired(), until Retrieve is +// called again. +// +// Example of ChainProvider to be used with an EnvProvider and EC2RoleProvider. +// In this example EnvProvider will first check if any credentials are available +// via the environment variables. If there are none ChainProvider will check +// the next Provider in the list, EC2RoleProvider in this case. If EC2RoleProvider +// does not return any credentials ChainProvider will return the error +// ErrNoValidProvidersFoundInChain +// +// creds := credentials.NewChainCredentials( +// []credentials.Provider{ +// &credentials.EnvProvider{}, +// &ec2rolecreds.EC2RoleProvider{ +// Client: ec2metadata.New(sess), +// }, +// }) +// +// // Usage of ChainCredentials with aws.Config +// svc := ec2.New(session.Must(session.NewSession(&aws.Config{ +// Credentials: creds, +// }))) +// +type ChainProvider struct { + Providers []Provider + curr Provider + VerboseErrors bool +} + +// NewChainCredentials returns a pointer to a new Credentials object +// wrapping a chain of providers. +func NewChainCredentials(providers []Provider) *Credentials { + return NewCredentials(&ChainProvider{ + Providers: append([]Provider{}, providers...), + }) +} + +// Retrieve returns the credentials value or error if no provider returned +// without error. +// +// If a provider is found it will be cached and any calls to IsExpired() +// will return the expired state of the cached provider. +func (c *ChainProvider) Retrieve() (Value, error) { + var errs []error + for _, p := range c.Providers { + creds, err := p.Retrieve() + if err == nil { + c.curr = p + return creds, nil + } + errs = append(errs, err) + } + c.curr = nil + + var err error + err = ErrNoValidProvidersFoundInChain + if c.VerboseErrors { + err = awserr.NewBatchError("NoCredentialProviders", "no valid providers in chain", errs) + } + return Value{}, err +} + +// IsExpired will returned the expired state of the currently cached provider +// if there is one. If there is no current provider, true will be returned. +func (c *ChainProvider) IsExpired() bool { + if c.curr != nil { + return c.curr.IsExpired() + } + + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go new file mode 100644 index 000000000..894bbc7f8 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go @@ -0,0 +1,292 @@ +// Package credentials provides credential retrieval and management +// +// The Credentials is the primary method of getting access to and managing +// credentials Values. Using dependency injection retrieval of the credential +// values is handled by a object which satisfies the Provider interface. +// +// By default the Credentials.Get() will cache the successful result of a +// Provider's Retrieve() until Provider.IsExpired() returns true. At which +// point Credentials will call Provider's Retrieve() to get new credential Value. +// +// The Provider is responsible for determining when credentials Value have expired. +// It is also important to note that Credentials will always call Retrieve the +// first time Credentials.Get() is called. +// +// Example of using the environment variable credentials. +// +// creds := credentials.NewEnvCredentials() +// +// // Retrieve the credentials value +// credValue, err := creds.Get() +// if err != nil { +// // handle error +// } +// +// Example of forcing credentials to expire and be refreshed on the next Get(). +// This may be helpful to proactively expire credentials and refresh them sooner +// than they would naturally expire on their own. +// +// creds := credentials.NewCredentials(&ec2rolecreds.EC2RoleProvider{}) +// creds.Expire() +// credsValue, err := creds.Get() +// // New credentials will be retrieved instead of from cache. +// +// +// Custom Provider +// +// Each Provider built into this package also provides a helper method to generate +// a Credentials pointer setup with the provider. To use a custom Provider just +// create a type which satisfies the Provider interface and pass it to the +// NewCredentials method. +// +// type MyProvider struct{} +// func (m *MyProvider) Retrieve() (Value, error) {...} +// func (m *MyProvider) IsExpired() bool {...} +// +// creds := credentials.NewCredentials(&MyProvider{}) +// credValue, err := creds.Get() +// +package credentials + +import ( + "fmt" + "github.com/aws/aws-sdk-go/aws/awserr" + "sync" + "time" +) + +// AnonymousCredentials is an empty Credential object that can be used as +// dummy placeholder credentials for requests that do not need signed. +// +// This Credentials can be used to configure a service to not sign requests +// when making service API calls. For example, when accessing public +// s3 buckets. +// +// svc := s3.New(session.Must(session.NewSession(&aws.Config{ +// Credentials: credentials.AnonymousCredentials, +// }))) +// // Access public S3 buckets. +var AnonymousCredentials = NewStaticCredentials("", "", "") + +// A Value is the AWS credentials value for individual credential fields. +type Value struct { + // AWS Access key ID + AccessKeyID string + + // AWS Secret Access Key + SecretAccessKey string + + // AWS Session Token + SessionToken string + + // Provider used to get credentials + ProviderName string +} + +// A Provider is the interface for any component which will provide credentials +// Value. A provider is required to manage its own Expired state, and what to +// be expired means. +// +// The Provider should not need to implement its own mutexes, because +// that will be managed by Credentials. +type Provider interface { + // Retrieve returns nil if it successfully retrieved the value. + // Error is returned if the value were not obtainable, or empty. + Retrieve() (Value, error) + + // IsExpired returns if the credentials are no longer valid, and need + // to be retrieved. + IsExpired() bool +} + +// An Expirer is an interface that Providers can implement to expose the expiration +// time, if known. If the Provider cannot accurately provide this info, +// it should not implement this interface. +type Expirer interface { + // The time at which the credentials are no longer valid + ExpiresAt() time.Time +} + +// An ErrorProvider is a stub credentials provider that always returns an error +// this is used by the SDK when construction a known provider is not possible +// due to an error. +type ErrorProvider struct { + // The error to be returned from Retrieve + Err error + + // The provider name to set on the Retrieved returned Value + ProviderName string +} + +// Retrieve will always return the error that the ErrorProvider was created with. +func (p ErrorProvider) Retrieve() (Value, error) { + return Value{ProviderName: p.ProviderName}, p.Err +} + +// IsExpired will always return not expired. +func (p ErrorProvider) IsExpired() bool { + return false +} + +// A Expiry provides shared expiration logic to be used by credentials +// providers to implement expiry functionality. +// +// The best method to use this struct is as an anonymous field within the +// provider's struct. +// +// Example: +// type EC2RoleProvider struct { +// Expiry +// ... +// } +type Expiry struct { + // The date/time when to expire on + expiration time.Time + + // If set will be used by IsExpired to determine the current time. + // Defaults to time.Now if CurrentTime is not set. Available for testing + // to be able to mock out the current time. + CurrentTime func() time.Time +} + +// SetExpiration sets the expiration IsExpired will check when called. +// +// If window is greater than 0 the expiration time will be reduced by the +// window value. +// +// Using a window is helpful to trigger credentials to expire sooner than +// the expiration time given to ensure no requests are made with expired +// tokens. +func (e *Expiry) SetExpiration(expiration time.Time, window time.Duration) { + e.expiration = expiration + if window > 0 { + e.expiration = e.expiration.Add(-window) + } +} + +// IsExpired returns if the credentials are expired. +func (e *Expiry) IsExpired() bool { + curTime := e.CurrentTime + if curTime == nil { + curTime = time.Now + } + return e.expiration.Before(curTime()) +} + +// ExpiresAt returns the expiration time of the credential +func (e *Expiry) ExpiresAt() time.Time { + return e.expiration +} + +// A Credentials provides concurrency safe retrieval of AWS credentials Value. +// Credentials will cache the credentials value until they expire. Once the value +// expires the next Get will attempt to retrieve valid credentials. +// +// Credentials is safe to use across multiple goroutines and will manage the +// synchronous state so the Providers do not need to implement their own +// synchronization. +// +// The first Credentials.Get() will always call Provider.Retrieve() to get the +// first instance of the credentials Value. All calls to Get() after that +// will return the cached credentials Value until IsExpired() returns true. +type Credentials struct { + creds Value + forceRefresh bool + + m sync.RWMutex + + provider Provider +} + +// NewCredentials returns a pointer to a new Credentials with the provider set. +func NewCredentials(provider Provider) *Credentials { + return &Credentials{ + provider: provider, + forceRefresh: true, + } +} + +// Get returns the credentials value, or error if the credentials Value failed +// to be retrieved. +// +// Will return the cached credentials Value if it has not expired. If the +// credentials Value has expired the Provider's Retrieve() will be called +// to refresh the credentials. +// +// If Credentials.Expire() was called the credentials Value will be force +// expired, and the next call to Get() will cause them to be refreshed. +func (c *Credentials) Get() (Value, error) { + // Check the cached credentials first with just the read lock. + c.m.RLock() + if !c.isExpired() { + creds := c.creds + c.m.RUnlock() + return creds, nil + } + c.m.RUnlock() + + // Credentials are expired need to retrieve the credentials taking the full + // lock. + c.m.Lock() + defer c.m.Unlock() + + if c.isExpired() { + creds, err := c.provider.Retrieve() + if err != nil { + return Value{}, err + } + c.creds = creds + c.forceRefresh = false + } + + return c.creds, nil +} + +// Expire expires the credentials and forces them to be retrieved on the +// next call to Get(). +// +// This will override the Provider's expired state, and force Credentials +// to call the Provider's Retrieve(). +func (c *Credentials) Expire() { + c.m.Lock() + defer c.m.Unlock() + + c.forceRefresh = true +} + +// IsExpired returns if the credentials are no longer valid, and need +// to be retrieved. +// +// If the Credentials were forced to be expired with Expire() this will +// reflect that override. +func (c *Credentials) IsExpired() bool { + c.m.RLock() + defer c.m.RUnlock() + + return c.isExpired() +} + +// isExpired helper method wrapping the definition of expired credentials. +func (c *Credentials) isExpired() bool { + return c.forceRefresh || c.provider.IsExpired() +} + +// ExpiresAt provides access to the functionality of the Expirer interface of +// the underlying Provider, if it supports that interface. Otherwise, it returns +// an error. +func (c *Credentials) ExpiresAt() (time.Time, error) { + c.m.RLock() + defer c.m.RUnlock() + + expirer, ok := c.provider.(Expirer) + if !ok { + return time.Time{}, awserr.New("ProviderNotExpirer", + fmt.Sprintf("provider %s does not support ExpiresAt()", c.creds.ProviderName), + nil) + } + if c.forceRefresh { + // set expiration time to the distant past + return time.Time{}, nil + } + return expirer.ExpiresAt(), nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go new file mode 100644 index 000000000..43d4ed386 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go @@ -0,0 +1,180 @@ +package ec2rolecreds + +import ( + "bufio" + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/ec2metadata" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/sdkuri" +) + +// ProviderName provides a name of EC2Role provider +const ProviderName = "EC2RoleProvider" + +// A EC2RoleProvider retrieves credentials from the EC2 service, and keeps track if +// those credentials are expired. +// +// Example how to configure the EC2RoleProvider with custom http Client, Endpoint +// or ExpiryWindow +// +// p := &ec2rolecreds.EC2RoleProvider{ +// // Pass in a custom timeout to be used when requesting +// // IAM EC2 Role credentials. +// Client: ec2metadata.New(sess, aws.Config{ +// HTTPClient: &http.Client{Timeout: 10 * time.Second}, +// }), +// +// // Do not use early expiry of credentials. If a non zero value is +// // specified the credentials will be expired early +// ExpiryWindow: 0, +// } +type EC2RoleProvider struct { + credentials.Expiry + + // Required EC2Metadata client to use when connecting to EC2 metadata service. + Client *ec2metadata.EC2Metadata + + // ExpiryWindow will allow the credentials to trigger refreshing prior to + // the credentials actually expiring. This is beneficial so race conditions + // with expiring credentials do not cause request to fail unexpectedly + // due to ExpiredTokenException exceptions. + // + // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true + // 10 seconds before the credentials are actually expired. + // + // If ExpiryWindow is 0 or less it will be ignored. + ExpiryWindow time.Duration +} + +// NewCredentials returns a pointer to a new Credentials object wrapping +// the EC2RoleProvider. Takes a ConfigProvider to create a EC2Metadata client. +// The ConfigProvider is satisfied by the session.Session type. +func NewCredentials(c client.ConfigProvider, options ...func(*EC2RoleProvider)) *credentials.Credentials { + p := &EC2RoleProvider{ + Client: ec2metadata.New(c), + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +// NewCredentialsWithClient returns a pointer to a new Credentials object wrapping +// the EC2RoleProvider. Takes a EC2Metadata client to use when connecting to EC2 +// metadata service. +func NewCredentialsWithClient(client *ec2metadata.EC2Metadata, options ...func(*EC2RoleProvider)) *credentials.Credentials { + p := &EC2RoleProvider{ + Client: client, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +// Retrieve retrieves credentials from the EC2 service. +// Error will be returned if the request fails, or unable to extract +// the desired credentials. +func (m *EC2RoleProvider) Retrieve() (credentials.Value, error) { + credsList, err := requestCredList(m.Client) + if err != nil { + return credentials.Value{ProviderName: ProviderName}, err + } + + if len(credsList) == 0 { + return credentials.Value{ProviderName: ProviderName}, awserr.New("EmptyEC2RoleList", "empty EC2 Role list", nil) + } + credsName := credsList[0] + + roleCreds, err := requestCred(m.Client, credsName) + if err != nil { + return credentials.Value{ProviderName: ProviderName}, err + } + + m.SetExpiration(roleCreds.Expiration, m.ExpiryWindow) + + return credentials.Value{ + AccessKeyID: roleCreds.AccessKeyID, + SecretAccessKey: roleCreds.SecretAccessKey, + SessionToken: roleCreds.Token, + ProviderName: ProviderName, + }, nil +} + +// A ec2RoleCredRespBody provides the shape for unmarshaling credential +// request responses. +type ec2RoleCredRespBody struct { + // Success State + Expiration time.Time + AccessKeyID string + SecretAccessKey string + Token string + + // Error state + Code string + Message string +} + +const iamSecurityCredsPath = "iam/security-credentials/" + +// requestCredList requests a list of credentials from the EC2 service. +// If there are no credentials, or there is an error making or receiving the request +func requestCredList(client *ec2metadata.EC2Metadata) ([]string, error) { + resp, err := client.GetMetadata(iamSecurityCredsPath) + if err != nil { + return nil, awserr.New("EC2RoleRequestError", "no EC2 instance role found", err) + } + + credsList := []string{} + s := bufio.NewScanner(strings.NewReader(resp)) + for s.Scan() { + credsList = append(credsList, s.Text()) + } + + if err := s.Err(); err != nil { + return nil, awserr.New(request.ErrCodeSerialization, + "failed to read EC2 instance role from metadata service", err) + } + + return credsList, nil +} + +// requestCred requests the credentials for a specific credentials from the EC2 service. +// +// If the credentials cannot be found, or there is an error reading the response +// and error will be returned. +func requestCred(client *ec2metadata.EC2Metadata, credsName string) (ec2RoleCredRespBody, error) { + resp, err := client.GetMetadata(sdkuri.PathJoin(iamSecurityCredsPath, credsName)) + if err != nil { + return ec2RoleCredRespBody{}, + awserr.New("EC2RoleRequestError", + fmt.Sprintf("failed to get %s EC2 instance role credentials", credsName), + err) + } + + respCreds := ec2RoleCredRespBody{} + if err := json.NewDecoder(strings.NewReader(resp)).Decode(&respCreds); err != nil { + return ec2RoleCredRespBody{}, + awserr.New(request.ErrCodeSerialization, + fmt.Sprintf("failed to decode %s EC2 instance role credentials", credsName), + err) + } + + if respCreds.Code != "Success" { + // If an error code was returned something failed requesting the role. + return ec2RoleCredRespBody{}, awserr.New(respCreds.Code, respCreds.Message, nil) + } + + return respCreds, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go new file mode 100644 index 000000000..c2b2c5d65 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go @@ -0,0 +1,203 @@ +// Package endpointcreds provides support for retrieving credentials from an +// arbitrary HTTP endpoint. +// +// The credentials endpoint Provider can receive both static and refreshable +// credentials that will expire. Credentials are static when an "Expiration" +// value is not provided in the endpoint's response. +// +// Static credentials will never expire once they have been retrieved. The format +// of the static credentials response: +// { +// "AccessKeyId" : "MUA...", +// "SecretAccessKey" : "/7PC5om....", +// } +// +// Refreshable credentials will expire within the "ExpiryWindow" of the Expiration +// value in the response. The format of the refreshable credentials response: +// { +// "AccessKeyId" : "MUA...", +// "SecretAccessKey" : "/7PC5om....", +// "Token" : "AQoDY....=", +// "Expiration" : "2016-02-25T06:03:31Z" +// } +// +// Errors should be returned in the following format and only returned with 400 +// or 500 HTTP status codes. +// { +// "code": "ErrorCode", +// "message": "Helpful error message." +// } +package endpointcreds + +import ( + "encoding/json" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil" +) + +// ProviderName is the name of the credentials provider. +const ProviderName = `CredentialsEndpointProvider` + +// Provider satisfies the credentials.Provider interface, and is a client to +// retrieve credentials from an arbitrary endpoint. +type Provider struct { + staticCreds bool + credentials.Expiry + + // Requires a AWS Client to make HTTP requests to the endpoint with. + // the Endpoint the request will be made to is provided by the aws.Config's + // Endpoint value. + Client *client.Client + + // ExpiryWindow will allow the credentials to trigger refreshing prior to + // the credentials actually expiring. This is beneficial so race conditions + // with expiring credentials do not cause request to fail unexpectedly + // due to ExpiredTokenException exceptions. + // + // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true + // 10 seconds before the credentials are actually expired. + // + // If ExpiryWindow is 0 or less it will be ignored. + ExpiryWindow time.Duration + + // Optional authorization token value if set will be used as the value of + // the Authorization header of the endpoint credential request. + AuthorizationToken string +} + +// NewProviderClient returns a credentials Provider for retrieving AWS credentials +// from arbitrary endpoint. +func NewProviderClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) credentials.Provider { + p := &Provider{ + Client: client.New( + cfg, + metadata.ClientInfo{ + ServiceName: "CredentialsEndpoint", + Endpoint: endpoint, + }, + handlers, + ), + } + + p.Client.Handlers.Unmarshal.PushBack(unmarshalHandler) + p.Client.Handlers.UnmarshalError.PushBack(unmarshalError) + p.Client.Handlers.Validate.Clear() + p.Client.Handlers.Validate.PushBack(validateEndpointHandler) + + for _, option := range options { + option(p) + } + + return p +} + +// NewCredentialsClient returns a Credentials wrapper for retrieving credentials +// from an arbitrary endpoint concurrently. The client will request the +func NewCredentialsClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) *credentials.Credentials { + return credentials.NewCredentials(NewProviderClient(cfg, handlers, endpoint, options...)) +} + +// IsExpired returns true if the credentials retrieved are expired, or not yet +// retrieved. +func (p *Provider) IsExpired() bool { + if p.staticCreds { + return false + } + return p.Expiry.IsExpired() +} + +// Retrieve will attempt to request the credentials from the endpoint the Provider +// was configured for. And error will be returned if the retrieval fails. +func (p *Provider) Retrieve() (credentials.Value, error) { + resp, err := p.getCredentials() + if err != nil { + return credentials.Value{ProviderName: ProviderName}, + awserr.New("CredentialsEndpointError", "failed to load credentials", err) + } + + if resp.Expiration != nil { + p.SetExpiration(*resp.Expiration, p.ExpiryWindow) + } else { + p.staticCreds = true + } + + return credentials.Value{ + AccessKeyID: resp.AccessKeyID, + SecretAccessKey: resp.SecretAccessKey, + SessionToken: resp.Token, + ProviderName: ProviderName, + }, nil +} + +type getCredentialsOutput struct { + Expiration *time.Time + AccessKeyID string + SecretAccessKey string + Token string +} + +type errorOutput struct { + Code string `json:"code"` + Message string `json:"message"` +} + +func (p *Provider) getCredentials() (*getCredentialsOutput, error) { + op := &request.Operation{ + Name: "GetCredentials", + HTTPMethod: "GET", + } + + out := &getCredentialsOutput{} + req := p.Client.NewRequest(op, nil, out) + req.HTTPRequest.Header.Set("Accept", "application/json") + if authToken := p.AuthorizationToken; len(authToken) != 0 { + req.HTTPRequest.Header.Set("Authorization", authToken) + } + + return out, req.Send() +} + +func validateEndpointHandler(r *request.Request) { + if len(r.ClientInfo.Endpoint) == 0 { + r.Error = aws.ErrMissingEndpoint + } +} + +func unmarshalHandler(r *request.Request) { + defer r.HTTPResponse.Body.Close() + + out := r.Data.(*getCredentialsOutput) + if err := json.NewDecoder(r.HTTPResponse.Body).Decode(&out); err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, + "failed to decode endpoint credentials", + err, + ) + } +} + +func unmarshalError(r *request.Request) { + defer r.HTTPResponse.Body.Close() + + var errOut errorOutput + err := jsonutil.UnmarshalJSONError(&errOut, r.HTTPResponse.Body) + if err != nil { + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, + "failed to decode error message", err), + r.HTTPResponse.StatusCode, + r.RequestID, + ) + return + } + + // Response body format is not consistent between metadata endpoints. + // Grab the error message as a string and include that as the source error + r.Error = awserr.New(errOut.Code, errOut.Message, nil) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go new file mode 100644 index 000000000..54c5cf733 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go @@ -0,0 +1,74 @@ +package credentials + +import ( + "os" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +// EnvProviderName provides a name of Env provider +const EnvProviderName = "EnvProvider" + +var ( + // ErrAccessKeyIDNotFound is returned when the AWS Access Key ID can't be + // found in the process's environment. + ErrAccessKeyIDNotFound = awserr.New("EnvAccessKeyNotFound", "AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY not found in environment", nil) + + // ErrSecretAccessKeyNotFound is returned when the AWS Secret Access Key + // can't be found in the process's environment. + ErrSecretAccessKeyNotFound = awserr.New("EnvSecretNotFound", "AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY not found in environment", nil) +) + +// A EnvProvider retrieves credentials from the environment variables of the +// running process. Environment credentials never expire. +// +// Environment variables used: +// +// * Access Key ID: AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY +// +// * Secret Access Key: AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY +type EnvProvider struct { + retrieved bool +} + +// NewEnvCredentials returns a pointer to a new Credentials object +// wrapping the environment variable provider. +func NewEnvCredentials() *Credentials { + return NewCredentials(&EnvProvider{}) +} + +// Retrieve retrieves the keys from the environment. +func (e *EnvProvider) Retrieve() (Value, error) { + e.retrieved = false + + id := os.Getenv("AWS_ACCESS_KEY_ID") + if id == "" { + id = os.Getenv("AWS_ACCESS_KEY") + } + + secret := os.Getenv("AWS_SECRET_ACCESS_KEY") + if secret == "" { + secret = os.Getenv("AWS_SECRET_KEY") + } + + if id == "" { + return Value{ProviderName: EnvProviderName}, ErrAccessKeyIDNotFound + } + + if secret == "" { + return Value{ProviderName: EnvProviderName}, ErrSecretAccessKeyNotFound + } + + e.retrieved = true + return Value{ + AccessKeyID: id, + SecretAccessKey: secret, + SessionToken: os.Getenv("AWS_SESSION_TOKEN"), + ProviderName: EnvProviderName, + }, nil +} + +// IsExpired returns if the credentials have been retrieved. +func (e *EnvProvider) IsExpired() bool { + return !e.retrieved +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go new file mode 100644 index 000000000..1980c8c14 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go @@ -0,0 +1,425 @@ +/* +Package processcreds is a credential Provider to retrieve `credential_process` +credentials. + +WARNING: The following describes a method of sourcing credentials from an external +process. This can potentially be dangerous, so proceed with caution. Other +credential providers should be preferred if at all possible. If using this +option, you should make sure that the config file is as locked down as possible +using security best practices for your operating system. + +You can use credentials from a `credential_process` in a variety of ways. + +One way is to setup your shared config file, located in the default +location, with the `credential_process` key and the command you want to be +called. You also need to set the AWS_SDK_LOAD_CONFIG environment variable +(e.g., `export AWS_SDK_LOAD_CONFIG=1`) to use the shared config file. + + [default] + credential_process = /command/to/call + +Creating a new session will use the credential process to retrieve credentials. +NOTE: If there are credentials in the profile you are using, the credential +process will not be used. + + // Initialize a session to load credentials. + sess, _ := session.NewSession(&aws.Config{ + Region: aws.String("us-east-1")}, + ) + + // Create S3 service client to use the credentials. + svc := s3.New(sess) + +Another way to use the `credential_process` method is by using +`credentials.NewCredentials()` and providing a command to be executed to +retrieve credentials: + + // Create credentials using the ProcessProvider. + creds := processcreds.NewCredentials("/path/to/command") + + // Create service client value configured for credentials. + svc := s3.New(sess, &aws.Config{Credentials: creds}) + +You can set a non-default timeout for the `credential_process` with another +constructor, `credentials.NewCredentialsTimeout()`, providing the timeout. To +set a one minute timeout: + + // Create credentials using the ProcessProvider. + creds := processcreds.NewCredentialsTimeout( + "/path/to/command", + time.Duration(500) * time.Millisecond) + +If you need more control, you can set any configurable options in the +credentials using one or more option functions. For example, you can set a two +minute timeout, a credential duration of 60 minutes, and a maximum stdout +buffer size of 2k. + + creds := processcreds.NewCredentials( + "/path/to/command", + func(opt *ProcessProvider) { + opt.Timeout = time.Duration(2) * time.Minute + opt.Duration = time.Duration(60) * time.Minute + opt.MaxBufSize = 2048 + }) + +You can also use your own `exec.Cmd`: + + // Create an exec.Cmd + myCommand := exec.Command("/path/to/command") + + // Create credentials using your exec.Cmd and custom timeout + creds := processcreds.NewCredentialsCommand( + myCommand, + func(opt *processcreds.ProcessProvider) { + opt.Timeout = time.Duration(1) * time.Second + }) +*/ +package processcreds + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "runtime" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" +) + +const ( + // ProviderName is the name this credentials provider will label any + // returned credentials Value with. + ProviderName = `ProcessProvider` + + // ErrCodeProcessProviderParse error parsing process output + ErrCodeProcessProviderParse = "ProcessProviderParseError" + + // ErrCodeProcessProviderVersion version error in output + ErrCodeProcessProviderVersion = "ProcessProviderVersionError" + + // ErrCodeProcessProviderRequired required attribute missing in output + ErrCodeProcessProviderRequired = "ProcessProviderRequiredError" + + // ErrCodeProcessProviderExecution execution of command failed + ErrCodeProcessProviderExecution = "ProcessProviderExecutionError" + + // errMsgProcessProviderTimeout process took longer than allowed + errMsgProcessProviderTimeout = "credential process timed out" + + // errMsgProcessProviderProcess process error + errMsgProcessProviderProcess = "error in credential_process" + + // errMsgProcessProviderParse problem parsing output + errMsgProcessProviderParse = "parse failed of credential_process output" + + // errMsgProcessProviderVersion version error in output + errMsgProcessProviderVersion = "wrong version in process output (not 1)" + + // errMsgProcessProviderMissKey missing access key id in output + errMsgProcessProviderMissKey = "missing AccessKeyId in process output" + + // errMsgProcessProviderMissSecret missing secret acess key in output + errMsgProcessProviderMissSecret = "missing SecretAccessKey in process output" + + // errMsgProcessProviderPrepareCmd prepare of command failed + errMsgProcessProviderPrepareCmd = "failed to prepare command" + + // errMsgProcessProviderEmptyCmd command must not be empty + errMsgProcessProviderEmptyCmd = "command must not be empty" + + // errMsgProcessProviderPipe failed to initialize pipe + errMsgProcessProviderPipe = "failed to initialize pipe" + + // DefaultDuration is the default amount of time in minutes that the + // credentials will be valid for. + DefaultDuration = time.Duration(15) * time.Minute + + // DefaultBufSize limits buffer size from growing to an enormous + // amount due to a faulty process. + DefaultBufSize = 1024 + + // DefaultTimeout default limit on time a process can run. + DefaultTimeout = time.Duration(1) * time.Minute +) + +// ProcessProvider satisfies the credentials.Provider interface, and is a +// client to retrieve credentials from a process. +type ProcessProvider struct { + staticCreds bool + credentials.Expiry + originalCommand []string + + // Expiry duration of the credentials. Defaults to 15 minutes if not set. + Duration time.Duration + + // ExpiryWindow will allow the credentials to trigger refreshing prior to + // the credentials actually expiring. This is beneficial so race conditions + // with expiring credentials do not cause request to fail unexpectedly + // due to ExpiredTokenException exceptions. + // + // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true + // 10 seconds before the credentials are actually expired. + // + // If ExpiryWindow is 0 or less it will be ignored. + ExpiryWindow time.Duration + + // A string representing an os command that should return a JSON with + // credential information. + command *exec.Cmd + + // MaxBufSize limits memory usage from growing to an enormous + // amount due to a faulty process. + MaxBufSize int + + // Timeout limits the time a process can run. + Timeout time.Duration +} + +// NewCredentials returns a pointer to a new Credentials object wrapping the +// ProcessProvider. The credentials will expire every 15 minutes by default. +func NewCredentials(command string, options ...func(*ProcessProvider)) *credentials.Credentials { + p := &ProcessProvider{ + command: exec.Command(command), + Duration: DefaultDuration, + Timeout: DefaultTimeout, + MaxBufSize: DefaultBufSize, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +// NewCredentialsTimeout returns a pointer to a new Credentials object with +// the specified command and timeout, and default duration and max buffer size. +func NewCredentialsTimeout(command string, timeout time.Duration) *credentials.Credentials { + p := NewCredentials(command, func(opt *ProcessProvider) { + opt.Timeout = timeout + }) + + return p +} + +// NewCredentialsCommand returns a pointer to a new Credentials object with +// the specified command, and default timeout, duration and max buffer size. +func NewCredentialsCommand(command *exec.Cmd, options ...func(*ProcessProvider)) *credentials.Credentials { + p := &ProcessProvider{ + command: command, + Duration: DefaultDuration, + Timeout: DefaultTimeout, + MaxBufSize: DefaultBufSize, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +type credentialProcessResponse struct { + Version int + AccessKeyID string `json:"AccessKeyId"` + SecretAccessKey string + SessionToken string + Expiration *time.Time +} + +// Retrieve executes the 'credential_process' and returns the credentials. +func (p *ProcessProvider) Retrieve() (credentials.Value, error) { + out, err := p.executeCredentialProcess() + if err != nil { + return credentials.Value{ProviderName: ProviderName}, err + } + + // Serialize and validate response + resp := &credentialProcessResponse{} + if err = json.Unmarshal(out, resp); err != nil { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderParse, + fmt.Sprintf("%s: %s", errMsgProcessProviderParse, string(out)), + err) + } + + if resp.Version != 1 { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderVersion, + errMsgProcessProviderVersion, + nil) + } + + if len(resp.AccessKeyID) == 0 { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderRequired, + errMsgProcessProviderMissKey, + nil) + } + + if len(resp.SecretAccessKey) == 0 { + return credentials.Value{ProviderName: ProviderName}, awserr.New( + ErrCodeProcessProviderRequired, + errMsgProcessProviderMissSecret, + nil) + } + + // Handle expiration + p.staticCreds = resp.Expiration == nil + if resp.Expiration != nil { + p.SetExpiration(*resp.Expiration, p.ExpiryWindow) + } + + return credentials.Value{ + ProviderName: ProviderName, + AccessKeyID: resp.AccessKeyID, + SecretAccessKey: resp.SecretAccessKey, + SessionToken: resp.SessionToken, + }, nil +} + +// IsExpired returns true if the credentials retrieved are expired, or not yet +// retrieved. +func (p *ProcessProvider) IsExpired() bool { + if p.staticCreds { + return false + } + return p.Expiry.IsExpired() +} + +// prepareCommand prepares the command to be executed. +func (p *ProcessProvider) prepareCommand() error { + + var cmdArgs []string + if runtime.GOOS == "windows" { + cmdArgs = []string{"cmd.exe", "/C"} + } else { + cmdArgs = []string{"sh", "-c"} + } + + if len(p.originalCommand) == 0 { + p.originalCommand = make([]string, len(p.command.Args)) + copy(p.originalCommand, p.command.Args) + + // check for empty command because it succeeds + if len(strings.TrimSpace(p.originalCommand[0])) < 1 { + return awserr.New( + ErrCodeProcessProviderExecution, + fmt.Sprintf( + "%s: %s", + errMsgProcessProviderPrepareCmd, + errMsgProcessProviderEmptyCmd), + nil) + } + } + + cmdArgs = append(cmdArgs, p.originalCommand...) + p.command = exec.Command(cmdArgs[0], cmdArgs[1:]...) + p.command.Env = os.Environ() + + return nil +} + +// executeCredentialProcess starts the credential process on the OS and +// returns the results or an error. +func (p *ProcessProvider) executeCredentialProcess() ([]byte, error) { + + if err := p.prepareCommand(); err != nil { + return nil, err + } + + // Setup the pipes + outReadPipe, outWritePipe, err := os.Pipe() + if err != nil { + return nil, awserr.New( + ErrCodeProcessProviderExecution, + errMsgProcessProviderPipe, + err) + } + + p.command.Stderr = os.Stderr // display stderr on console for MFA + p.command.Stdout = outWritePipe // get creds json on process's stdout + p.command.Stdin = os.Stdin // enable stdin for MFA + + output := bytes.NewBuffer(make([]byte, 0, p.MaxBufSize)) + + stdoutCh := make(chan error, 1) + go readInput( + io.LimitReader(outReadPipe, int64(p.MaxBufSize)), + output, + stdoutCh) + + execCh := make(chan error, 1) + go executeCommand(*p.command, execCh) + + finished := false + var errors []error + for !finished { + select { + case readError := <-stdoutCh: + errors = appendError(errors, readError) + finished = true + case execError := <-execCh: + err := outWritePipe.Close() + errors = appendError(errors, err) + errors = appendError(errors, execError) + if errors != nil { + return output.Bytes(), awserr.NewBatchError( + ErrCodeProcessProviderExecution, + errMsgProcessProviderProcess, + errors) + } + case <-time.After(p.Timeout): + finished = true + return output.Bytes(), awserr.NewBatchError( + ErrCodeProcessProviderExecution, + errMsgProcessProviderTimeout, + errors) // errors can be nil + } + } + + out := output.Bytes() + + if runtime.GOOS == "windows" { + // windows adds slashes to quotes + out = []byte(strings.Replace(string(out), `\"`, `"`, -1)) + } + + return out, nil +} + +// appendError conveniently checks for nil before appending slice +func appendError(errors []error, err error) []error { + if err != nil { + return append(errors, err) + } + return errors +} + +func executeCommand(cmd exec.Cmd, exec chan error) { + // Start the command + err := cmd.Start() + if err == nil { + err = cmd.Wait() + } + + exec <- err +} + +func readInput(r io.Reader, w io.Writer, read chan error) { + tee := io.TeeReader(r, w) + + _, err := ioutil.ReadAll(tee) + + if err == io.EOF { + err = nil + } + + read <- err // will only arrive here when write end of pipe is closed +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go new file mode 100644 index 000000000..e15514958 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go @@ -0,0 +1,150 @@ +package credentials + +import ( + "fmt" + "os" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/internal/ini" + "github.com/aws/aws-sdk-go/internal/shareddefaults" +) + +// SharedCredsProviderName provides a name of SharedCreds provider +const SharedCredsProviderName = "SharedCredentialsProvider" + +var ( + // ErrSharedCredentialsHomeNotFound is emitted when the user directory cannot be found. + ErrSharedCredentialsHomeNotFound = awserr.New("UserHomeNotFound", "user home directory not found.", nil) +) + +// A SharedCredentialsProvider retrieves credentials from the current user's home +// directory, and keeps track if those credentials are expired. +// +// Profile ini file example: $HOME/.aws/credentials +type SharedCredentialsProvider struct { + // Path to the shared credentials file. + // + // If empty will look for "AWS_SHARED_CREDENTIALS_FILE" env variable. If the + // env value is empty will default to current user's home directory. + // Linux/OSX: "$HOME/.aws/credentials" + // Windows: "%USERPROFILE%\.aws\credentials" + Filename string + + // AWS Profile to extract credentials from the shared credentials file. If empty + // will default to environment variable "AWS_PROFILE" or "default" if + // environment variable is also not set. + Profile string + + // retrieved states if the credentials have been successfully retrieved. + retrieved bool +} + +// NewSharedCredentials returns a pointer to a new Credentials object +// wrapping the Profile file provider. +func NewSharedCredentials(filename, profile string) *Credentials { + return NewCredentials(&SharedCredentialsProvider{ + Filename: filename, + Profile: profile, + }) +} + +// Retrieve reads and extracts the shared credentials from the current +// users home directory. +func (p *SharedCredentialsProvider) Retrieve() (Value, error) { + p.retrieved = false + + filename, err := p.filename() + if err != nil { + return Value{ProviderName: SharedCredsProviderName}, err + } + + creds, err := loadProfile(filename, p.profile()) + if err != nil { + return Value{ProviderName: SharedCredsProviderName}, err + } + + p.retrieved = true + return creds, nil +} + +// IsExpired returns if the shared credentials have expired. +func (p *SharedCredentialsProvider) IsExpired() bool { + return !p.retrieved +} + +// loadProfiles loads from the file pointed to by shared credentials filename for profile. +// The credentials retrieved from the profile will be returned or error. Error will be +// returned if it fails to read from the file, or the data is invalid. +func loadProfile(filename, profile string) (Value, error) { + config, err := ini.OpenFile(filename) + if err != nil { + return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to load shared credentials file", err) + } + + iniProfile, ok := config.GetSection(profile) + if !ok { + return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to get profile", nil) + } + + id := iniProfile.String("aws_access_key_id") + if len(id) == 0 { + return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsAccessKey", + fmt.Sprintf("shared credentials %s in %s did not contain aws_access_key_id", profile, filename), + nil) + } + + secret := iniProfile.String("aws_secret_access_key") + if len(secret) == 0 { + return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsSecret", + fmt.Sprintf("shared credentials %s in %s did not contain aws_secret_access_key", profile, filename), + nil) + } + + // Default to empty string if not found + token := iniProfile.String("aws_session_token") + + return Value{ + AccessKeyID: id, + SecretAccessKey: secret, + SessionToken: token, + ProviderName: SharedCredsProviderName, + }, nil +} + +// filename returns the filename to use to read AWS shared credentials. +// +// Will return an error if the user's home directory path cannot be found. +func (p *SharedCredentialsProvider) filename() (string, error) { + if len(p.Filename) != 0 { + return p.Filename, nil + } + + if p.Filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); len(p.Filename) != 0 { + return p.Filename, nil + } + + if home := shareddefaults.UserHomeDir(); len(home) == 0 { + // Backwards compatibility of home directly not found error being returned. + // This error is too verbose, failure when opening the file would of been + // a better error to return. + return "", ErrSharedCredentialsHomeNotFound + } + + p.Filename = shareddefaults.SharedCredentialsFilename() + + return p.Filename, nil +} + +// profile returns the AWS shared credentials profile. If empty will read +// environment variable "AWS_PROFILE". If that is not set profile will +// return "default". +func (p *SharedCredentialsProvider) profile() string { + if p.Profile == "" { + p.Profile = os.Getenv("AWS_PROFILE") + } + if p.Profile == "" { + p.Profile = "default" + } + + return p.Profile +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go new file mode 100644 index 000000000..531139e39 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go @@ -0,0 +1,55 @@ +package credentials + +import ( + "github.com/aws/aws-sdk-go/aws/awserr" +) + +// StaticProviderName provides a name of Static provider +const StaticProviderName = "StaticProvider" + +var ( + // ErrStaticCredentialsEmpty is emitted when static credentials are empty. + ErrStaticCredentialsEmpty = awserr.New("EmptyStaticCreds", "static credentials are empty", nil) +) + +// A StaticProvider is a set of credentials which are set programmatically, +// and will never expire. +type StaticProvider struct { + Value +} + +// NewStaticCredentials returns a pointer to a new Credentials object +// wrapping a static credentials value provider. +func NewStaticCredentials(id, secret, token string) *Credentials { + return NewCredentials(&StaticProvider{Value: Value{ + AccessKeyID: id, + SecretAccessKey: secret, + SessionToken: token, + }}) +} + +// NewStaticCredentialsFromCreds returns a pointer to a new Credentials object +// wrapping the static credentials value provide. Same as NewStaticCredentials +// but takes the creds Value instead of individual fields +func NewStaticCredentialsFromCreds(creds Value) *Credentials { + return NewCredentials(&StaticProvider{Value: creds}) +} + +// Retrieve returns the credentials or error if the credentials are invalid. +func (s *StaticProvider) Retrieve() (Value, error) { + if s.AccessKeyID == "" || s.SecretAccessKey == "" { + return Value{ProviderName: StaticProviderName}, ErrStaticCredentialsEmpty + } + + if len(s.Value.ProviderName) == 0 { + s.Value.ProviderName = StaticProviderName + } + return s.Value, nil +} + +// IsExpired returns if the credentials are expired. +// +// For StaticProvider, the credentials never expired. +func (s *StaticProvider) IsExpired() bool { + return false +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go new file mode 100644 index 000000000..b6dbfd246 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go @@ -0,0 +1,313 @@ +/* +Package stscreds are credential Providers to retrieve STS AWS credentials. + +STS provides multiple ways to retrieve credentials which can be used when making +future AWS service API operation calls. + +The SDK will ensure that per instance of credentials.Credentials all requests +to refresh the credentials will be synchronized. But, the SDK is unable to +ensure synchronous usage of the AssumeRoleProvider if the value is shared +between multiple Credentials, Sessions or service clients. + +Assume Role + +To assume an IAM role using STS with the SDK you can create a new Credentials +with the SDKs's stscreds package. + + // Initial credentials loaded from SDK's default credential chain. Such as + // the environment, shared credentials (~/.aws/credentials), or EC2 Instance + // Role. These credentials will be used to to make the STS Assume Role API. + sess := session.Must(session.NewSession()) + + // Create the credentials from AssumeRoleProvider to assume the role + // referenced by the "myRoleARN" ARN. + creds := stscreds.NewCredentials(sess, "myRoleArn") + + // Create service client value configured for credentials + // from assumed role. + svc := s3.New(sess, &aws.Config{Credentials: creds}) + +Assume Role with static MFA Token + +To assume an IAM role with a MFA token you can either specify a MFA token code +directly or provide a function to prompt the user each time the credentials +need to refresh the role's credentials. Specifying the TokenCode should be used +for short lived operations that will not need to be refreshed, and when you do +not want to have direct control over the user provides their MFA token. + +With TokenCode the AssumeRoleProvider will be not be able to refresh the role's +credentials. + + // Create the credentials from AssumeRoleProvider to assume the role + // referenced by the "myRoleARN" ARN using the MFA token code provided. + creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) { + p.SerialNumber = aws.String("myTokenSerialNumber") + p.TokenCode = aws.String("00000000") + }) + + // Create service client value configured for credentials + // from assumed role. + svc := s3.New(sess, &aws.Config{Credentials: creds}) + +Assume Role with MFA Token Provider + +To assume an IAM role with MFA for longer running tasks where the credentials +may need to be refreshed setting the TokenProvider field of AssumeRoleProvider +will allow the credential provider to prompt for new MFA token code when the +role's credentials need to be refreshed. + +The StdinTokenProvider function is available to prompt on stdin to retrieve +the MFA token code from the user. You can also implement custom prompts by +satisfing the TokenProvider function signature. + +Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will +have undesirable results as the StdinTokenProvider will not be synchronized. A +single Credentials with an AssumeRoleProvider can be shared safely. + + // Create the credentials from AssumeRoleProvider to assume the role + // referenced by the "myRoleARN" ARN. Prompting for MFA token from stdin. + creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) { + p.SerialNumber = aws.String("myTokenSerialNumber") + p.TokenProvider = stscreds.StdinTokenProvider + }) + + // Create service client value configured for credentials + // from assumed role. + svc := s3.New(sess, &aws.Config{Credentials: creds}) + +*/ +package stscreds + +import ( + "fmt" + "os" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/internal/sdkrand" + "github.com/aws/aws-sdk-go/service/sts" +) + +// StdinTokenProvider will prompt on stderr and read from stdin for a string value. +// An error is returned if reading from stdin fails. +// +// Use this function go read MFA tokens from stdin. The function makes no attempt +// to make atomic prompts from stdin across multiple gorouties. +// +// Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will +// have undesirable results as the StdinTokenProvider will not be synchronized. A +// single Credentials with an AssumeRoleProvider can be shared safely +// +// Will wait forever until something is provided on the stdin. +func StdinTokenProvider() (string, error) { + var v string + fmt.Fprintf(os.Stderr, "Assume Role MFA token code: ") + _, err := fmt.Scanln(&v) + + return v, err +} + +// ProviderName provides a name of AssumeRole provider +const ProviderName = "AssumeRoleProvider" + +// AssumeRoler represents the minimal subset of the STS client API used by this provider. +type AssumeRoler interface { + AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) +} + +// DefaultDuration is the default amount of time in minutes that the credentials +// will be valid for. +var DefaultDuration = time.Duration(15) * time.Minute + +// AssumeRoleProvider retrieves temporary credentials from the STS service, and +// keeps track of their expiration time. +// +// This credential provider will be used by the SDKs default credential change +// when shared configuration is enabled, and the shared config or shared credentials +// file configure assume role. See Session docs for how to do this. +// +// AssumeRoleProvider does not provide any synchronization and it is not safe +// to share this value across multiple Credentials, Sessions, or service clients +// without also sharing the same Credentials instance. +type AssumeRoleProvider struct { + credentials.Expiry + + // STS client to make assume role request with. + Client AssumeRoler + + // Role to be assumed. + RoleARN string + + // Session name, if you wish to reuse the credentials elsewhere. + RoleSessionName string + + // Expiry duration of the STS credentials. Defaults to 15 minutes if not set. + Duration time.Duration + + // Optional ExternalID to pass along, defaults to nil if not set. + ExternalID *string + + // The policy plain text must be 2048 bytes or shorter. However, an internal + // conversion compresses it into a packed binary format with a separate limit. + // The PackedPolicySize response element indicates by percentage how close to + // the upper size limit the policy is, with 100% equaling the maximum allowed + // size. + Policy *string + + // The identification number of the MFA device that is associated with the user + // who is making the AssumeRole call. Specify this value if the trust policy + // of the role being assumed includes a condition that requires MFA authentication. + // The value is either the serial number for a hardware device (such as GAHT12345678) + // or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). + SerialNumber *string + + // The value provided by the MFA device, if the trust policy of the role being + // assumed requires MFA (that is, if the policy includes a condition that tests + // for MFA). If the role being assumed requires MFA and if the TokenCode value + // is missing or expired, the AssumeRole call returns an "access denied" error. + // + // If SerialNumber is set and neither TokenCode nor TokenProvider are also + // set an error will be returned. + TokenCode *string + + // Async method of providing MFA token code for assuming an IAM role with MFA. + // The value returned by the function will be used as the TokenCode in the Retrieve + // call. See StdinTokenProvider for a provider that prompts and reads from stdin. + // + // This token provider will be called when ever the assumed role's + // credentials need to be refreshed when SerialNumber is also set and + // TokenCode is not set. + // + // If both TokenCode and TokenProvider is set, TokenProvider will be used and + // TokenCode is ignored. + TokenProvider func() (string, error) + + // ExpiryWindow will allow the credentials to trigger refreshing prior to + // the credentials actually expiring. This is beneficial so race conditions + // with expiring credentials do not cause request to fail unexpectedly + // due to ExpiredTokenException exceptions. + // + // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true + // 10 seconds before the credentials are actually expired. + // + // If ExpiryWindow is 0 or less it will be ignored. + ExpiryWindow time.Duration + + // MaxJitterFrac reduces the effective Duration of each credential requested + // by a random percentage between 0 and MaxJitterFraction. MaxJitterFrac must + // have a value between 0 and 1. Any other value may lead to expected behavior. + // With a MaxJitterFrac value of 0, default) will no jitter will be used. + // + // For example, with a Duration of 30m and a MaxJitterFrac of 0.1, the + // AssumeRole call will be made with an arbitrary Duration between 27m and + // 30m. + // + // MaxJitterFrac should not be negative. + MaxJitterFrac float64 +} + +// NewCredentials returns a pointer to a new Credentials object wrapping the +// AssumeRoleProvider. The credentials will expire every 15 minutes and the +// role will be named after a nanosecond timestamp of this operation. +// +// Takes a Config provider to create the STS client. The ConfigProvider is +// satisfied by the session.Session type. +// +// It is safe to share the returned Credentials with multiple Sessions and +// service clients. All access to the credentials and refreshing them +// will be synchronized. +func NewCredentials(c client.ConfigProvider, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials { + p := &AssumeRoleProvider{ + Client: sts.New(c), + RoleARN: roleARN, + Duration: DefaultDuration, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +// NewCredentialsWithClient returns a pointer to a new Credentials object wrapping the +// AssumeRoleProvider. The credentials will expire every 15 minutes and the +// role will be named after a nanosecond timestamp of this operation. +// +// Takes an AssumeRoler which can be satisfied by the STS client. +// +// It is safe to share the returned Credentials with multiple Sessions and +// service clients. All access to the credentials and refreshing them +// will be synchronized. +func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials { + p := &AssumeRoleProvider{ + Client: svc, + RoleARN: roleARN, + Duration: DefaultDuration, + } + + for _, option := range options { + option(p) + } + + return credentials.NewCredentials(p) +} + +// Retrieve generates a new set of temporary credentials using STS. +func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) { + + // Apply defaults where parameters are not set. + if p.RoleSessionName == "" { + // Try to work out a role name that will hopefully end up unique. + p.RoleSessionName = fmt.Sprintf("%d", time.Now().UTC().UnixNano()) + } + if p.Duration == 0 { + // Expire as often as AWS permits. + p.Duration = DefaultDuration + } + jitter := time.Duration(sdkrand.SeededRand.Float64() * p.MaxJitterFrac * float64(p.Duration)) + input := &sts.AssumeRoleInput{ + DurationSeconds: aws.Int64(int64((p.Duration - jitter) / time.Second)), + RoleArn: aws.String(p.RoleARN), + RoleSessionName: aws.String(p.RoleSessionName), + ExternalId: p.ExternalID, + } + if p.Policy != nil { + input.Policy = p.Policy + } + if p.SerialNumber != nil { + if p.TokenCode != nil { + input.SerialNumber = p.SerialNumber + input.TokenCode = p.TokenCode + } else if p.TokenProvider != nil { + input.SerialNumber = p.SerialNumber + code, err := p.TokenProvider() + if err != nil { + return credentials.Value{ProviderName: ProviderName}, err + } + input.TokenCode = aws.String(code) + } else { + return credentials.Value{ProviderName: ProviderName}, + awserr.New("AssumeRoleTokenNotAvailable", + "assume role with MFA enabled, but neither TokenCode nor TokenProvider are set", nil) + } + } + + roleOutput, err := p.Client.AssumeRole(input) + if err != nil { + return credentials.Value{ProviderName: ProviderName}, err + } + + // We will proactively generate new credentials before they expire. + p.SetExpiration(*roleOutput.Credentials.Expiration, p.ExpiryWindow) + + return credentials.Value{ + AccessKeyID: *roleOutput.Credentials.AccessKeyId, + SecretAccessKey: *roleOutput.Credentials.SecretAccessKey, + SessionToken: *roleOutput.Credentials.SessionToken, + ProviderName: ProviderName, + }, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go new file mode 100644 index 000000000..152d785b3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go @@ -0,0 +1,46 @@ +// Package csm provides Client Side Monitoring (CSM) which enables sending metrics +// via UDP connection. Using the Start function will enable the reporting of +// metrics on a given port. If Start is called, with different parameters, again, +// a panic will occur. +// +// Pause can be called to pause any metrics publishing on a given port. Sessions +// that have had their handlers modified via InjectHandlers may still be used. +// However, the handlers will act as a no-op meaning no metrics will be published. +// +// Example: +// r, err := csm.Start("clientID", ":31000") +// if err != nil { +// panic(fmt.Errorf("failed starting CSM: %v", err)) +// } +// +// sess, err := session.NewSession(&aws.Config{}) +// if err != nil { +// panic(fmt.Errorf("failed loading session: %v", err)) +// } +// +// r.InjectHandlers(&sess.Handlers) +// +// client := s3.New(sess) +// resp, err := client.GetObject(&s3.GetObjectInput{ +// Bucket: aws.String("bucket"), +// Key: aws.String("key"), +// }) +// +// // Will pause monitoring +// r.Pause() +// resp, err = client.GetObject(&s3.GetObjectInput{ +// Bucket: aws.String("bucket"), +// Key: aws.String("key"), +// }) +// +// // Resume monitoring +// r.Continue() +// +// Start returns a Reporter that is used to enable or disable monitoring. If +// access to the Reporter is required later, calling Get will return the Reporter +// singleton. +// +// Example: +// r := csm.Get() +// r.Continue() +package csm diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go new file mode 100644 index 000000000..2f0c6eac9 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go @@ -0,0 +1,67 @@ +package csm + +import ( + "fmt" + "sync" +) + +var ( + lock sync.Mutex +) + +// Client side metric handler names +const ( + APICallMetricHandlerName = "awscsm.SendAPICallMetric" + APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric" +) + +// Start will start the a long running go routine to capture +// client side metrics. Calling start multiple time will only +// start the metric listener once and will panic if a different +// client ID or port is passed in. +// +// Example: +// r, err := csm.Start("clientID", "127.0.0.1:8094") +// if err != nil { +// panic(fmt.Errorf("expected no error, but received %v", err)) +// } +// sess := session.NewSession() +// r.InjectHandlers(sess.Handlers) +// +// svc := s3.New(sess) +// out, err := svc.GetObject(&s3.GetObjectInput{ +// Bucket: aws.String("bucket"), +// Key: aws.String("key"), +// }) +func Start(clientID string, url string) (*Reporter, error) { + lock.Lock() + defer lock.Unlock() + + if sender == nil { + sender = newReporter(clientID, url) + } else { + if sender.clientID != clientID { + panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID)) + } + + if sender.url != url { + panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url)) + } + } + + if err := connect(url); err != nil { + sender = nil + return nil, err + } + + return sender, nil +} + +// Get will return a reporter if one exists, if one does not exist, nil will +// be returned. +func Get() *Reporter { + lock.Lock() + defer lock.Unlock() + + return sender +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go new file mode 100644 index 000000000..5bacc791a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go @@ -0,0 +1,109 @@ +package csm + +import ( + "strconv" + "time" + + "github.com/aws/aws-sdk-go/aws" +) + +type metricTime time.Time + +func (t metricTime) MarshalJSON() ([]byte, error) { + ns := time.Duration(time.Time(t).UnixNano()) + return []byte(strconv.FormatInt(int64(ns/time.Millisecond), 10)), nil +} + +type metric struct { + ClientID *string `json:"ClientId,omitempty"` + API *string `json:"Api,omitempty"` + Service *string `json:"Service,omitempty"` + Timestamp *metricTime `json:"Timestamp,omitempty"` + Type *string `json:"Type,omitempty"` + Version *int `json:"Version,omitempty"` + + AttemptCount *int `json:"AttemptCount,omitempty"` + Latency *int `json:"Latency,omitempty"` + + Fqdn *string `json:"Fqdn,omitempty"` + UserAgent *string `json:"UserAgent,omitempty"` + AttemptLatency *int `json:"AttemptLatency,omitempty"` + + SessionToken *string `json:"SessionToken,omitempty"` + Region *string `json:"Region,omitempty"` + AccessKey *string `json:"AccessKey,omitempty"` + HTTPStatusCode *int `json:"HttpStatusCode,omitempty"` + XAmzID2 *string `json:"XAmzId2,omitempty"` + XAmzRequestID *string `json:"XAmznRequestId,omitempty"` + + AWSException *string `json:"AwsException,omitempty"` + AWSExceptionMessage *string `json:"AwsExceptionMessage,omitempty"` + SDKException *string `json:"SdkException,omitempty"` + SDKExceptionMessage *string `json:"SdkExceptionMessage,omitempty"` + + FinalHTTPStatusCode *int `json:"FinalHttpStatusCode,omitempty"` + FinalAWSException *string `json:"FinalAwsException,omitempty"` + FinalAWSExceptionMessage *string `json:"FinalAwsExceptionMessage,omitempty"` + FinalSDKException *string `json:"FinalSdkException,omitempty"` + FinalSDKExceptionMessage *string `json:"FinalSdkExceptionMessage,omitempty"` + + DestinationIP *string `json:"DestinationIp,omitempty"` + ConnectionReused *int `json:"ConnectionReused,omitempty"` + + AcquireConnectionLatency *int `json:"AcquireConnectionLatency,omitempty"` + ConnectLatency *int `json:"ConnectLatency,omitempty"` + RequestLatency *int `json:"RequestLatency,omitempty"` + DNSLatency *int `json:"DnsLatency,omitempty"` + TCPLatency *int `json:"TcpLatency,omitempty"` + SSLLatency *int `json:"SslLatency,omitempty"` + + MaxRetriesExceeded *int `json:"MaxRetriesExceeded,omitempty"` +} + +func (m *metric) TruncateFields() { + m.ClientID = truncateString(m.ClientID, 255) + m.UserAgent = truncateString(m.UserAgent, 256) + + m.AWSException = truncateString(m.AWSException, 128) + m.AWSExceptionMessage = truncateString(m.AWSExceptionMessage, 512) + + m.SDKException = truncateString(m.SDKException, 128) + m.SDKExceptionMessage = truncateString(m.SDKExceptionMessage, 512) + + m.FinalAWSException = truncateString(m.FinalAWSException, 128) + m.FinalAWSExceptionMessage = truncateString(m.FinalAWSExceptionMessage, 512) + + m.FinalSDKException = truncateString(m.FinalSDKException, 128) + m.FinalSDKExceptionMessage = truncateString(m.FinalSDKExceptionMessage, 512) +} + +func truncateString(v *string, l int) *string { + if v != nil && len(*v) > l { + nv := (*v)[:l] + return &nv + } + + return v +} + +func (m *metric) SetException(e metricException) { + switch te := e.(type) { + case awsException: + m.AWSException = aws.String(te.exception) + m.AWSExceptionMessage = aws.String(te.message) + case sdkException: + m.SDKException = aws.String(te.exception) + m.SDKExceptionMessage = aws.String(te.message) + } +} + +func (m *metric) SetFinalException(e metricException) { + switch te := e.(type) { + case awsException: + m.FinalAWSException = aws.String(te.exception) + m.FinalAWSExceptionMessage = aws.String(te.message) + case sdkException: + m.FinalSDKException = aws.String(te.exception) + m.FinalSDKExceptionMessage = aws.String(te.message) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go new file mode 100644 index 000000000..514fc3739 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go @@ -0,0 +1,54 @@ +package csm + +import ( + "sync/atomic" +) + +const ( + runningEnum = iota + pausedEnum +) + +var ( + // MetricsChannelSize of metrics to hold in the channel + MetricsChannelSize = 100 +) + +type metricChan struct { + ch chan metric + paused int64 +} + +func newMetricChan(size int) metricChan { + return metricChan{ + ch: make(chan metric, size), + } +} + +func (ch *metricChan) Pause() { + atomic.StoreInt64(&ch.paused, pausedEnum) +} + +func (ch *metricChan) Continue() { + atomic.StoreInt64(&ch.paused, runningEnum) +} + +func (ch *metricChan) IsPaused() bool { + v := atomic.LoadInt64(&ch.paused) + return v == pausedEnum +} + +// Push will push metrics to the metric channel if the channel +// is not paused +func (ch *metricChan) Push(m metric) bool { + if ch.IsPaused() { + return false + } + + select { + case ch.ch <- m: + return true + default: + return false + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go new file mode 100644 index 000000000..54a99280c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go @@ -0,0 +1,26 @@ +package csm + +type metricException interface { + Exception() string + Message() string +} + +type requestException struct { + exception string + message string +} + +func (e requestException) Exception() string { + return e.exception +} +func (e requestException) Message() string { + return e.message +} + +type awsException struct { + requestException +} + +type sdkException struct { + requestException +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go new file mode 100644 index 000000000..d9aa5b062 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go @@ -0,0 +1,260 @@ +package csm + +import ( + "encoding/json" + "net" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" +) + +const ( + // DefaultPort is used when no port is specified + DefaultPort = "31000" +) + +// Reporter will gather metrics of API requests made and +// send those metrics to the CSM endpoint. +type Reporter struct { + clientID string + url string + conn net.Conn + metricsCh metricChan + done chan struct{} +} + +var ( + sender *Reporter +) + +func connect(url string) error { + const network = "udp" + if err := sender.connect(network, url); err != nil { + return err + } + + if sender.done == nil { + sender.done = make(chan struct{}) + go sender.start() + } + + return nil +} + +func newReporter(clientID, url string) *Reporter { + return &Reporter{ + clientID: clientID, + url: url, + metricsCh: newMetricChan(MetricsChannelSize), + } +} + +func (rep *Reporter) sendAPICallAttemptMetric(r *request.Request) { + if rep == nil { + return + } + + now := time.Now() + creds, _ := r.Config.Credentials.Get() + + m := metric{ + ClientID: aws.String(rep.clientID), + API: aws.String(r.Operation.Name), + Service: aws.String(r.ClientInfo.ServiceID), + Timestamp: (*metricTime)(&now), + UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")), + Region: r.Config.Region, + Type: aws.String("ApiCallAttempt"), + Version: aws.Int(1), + + XAmzRequestID: aws.String(r.RequestID), + + AttemptCount: aws.Int(r.RetryCount + 1), + AttemptLatency: aws.Int(int(now.Sub(r.AttemptTime).Nanoseconds() / int64(time.Millisecond))), + AccessKey: aws.String(creds.AccessKeyID), + } + + if r.HTTPResponse != nil { + m.HTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode) + } + + if r.Error != nil { + if awserr, ok := r.Error.(awserr.Error); ok { + m.SetException(getMetricException(awserr)) + } + } + + m.TruncateFields() + rep.metricsCh.Push(m) +} + +func getMetricException(err awserr.Error) metricException { + msg := err.Error() + code := err.Code() + + switch code { + case "RequestError", + request.ErrCodeSerialization, + request.CanceledErrorCode: + return sdkException{ + requestException{exception: code, message: msg}, + } + default: + return awsException{ + requestException{exception: code, message: msg}, + } + } +} + +func (rep *Reporter) sendAPICallMetric(r *request.Request) { + if rep == nil { + return + } + + now := time.Now() + m := metric{ + ClientID: aws.String(rep.clientID), + API: aws.String(r.Operation.Name), + Service: aws.String(r.ClientInfo.ServiceID), + Timestamp: (*metricTime)(&now), + UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")), + Type: aws.String("ApiCall"), + AttemptCount: aws.Int(r.RetryCount + 1), + Region: r.Config.Region, + Latency: aws.Int(int(time.Now().Sub(r.Time) / time.Millisecond)), + XAmzRequestID: aws.String(r.RequestID), + MaxRetriesExceeded: aws.Int(boolIntValue(r.RetryCount >= r.MaxRetries())), + } + + if r.HTTPResponse != nil { + m.FinalHTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode) + } + + if r.Error != nil { + if awserr, ok := r.Error.(awserr.Error); ok { + m.SetFinalException(getMetricException(awserr)) + } + } + + m.TruncateFields() + + // TODO: Probably want to figure something out for logging dropped + // metrics + rep.metricsCh.Push(m) +} + +func (rep *Reporter) connect(network, url string) error { + if rep.conn != nil { + rep.conn.Close() + } + + conn, err := net.Dial(network, url) + if err != nil { + return awserr.New("UDPError", "Could not connect", err) + } + + rep.conn = conn + + return nil +} + +func (rep *Reporter) close() { + if rep.done != nil { + close(rep.done) + } + + rep.metricsCh.Pause() +} + +func (rep *Reporter) start() { + defer func() { + rep.metricsCh.Pause() + }() + + for { + select { + case <-rep.done: + rep.done = nil + return + case m := <-rep.metricsCh.ch: + // TODO: What to do with this error? Probably should just log + b, err := json.Marshal(m) + if err != nil { + continue + } + + rep.conn.Write(b) + } + } +} + +// Pause will pause the metric channel preventing any new metrics from +// being added. +func (rep *Reporter) Pause() { + lock.Lock() + defer lock.Unlock() + + if rep == nil { + return + } + + rep.close() +} + +// Continue will reopen the metric channel and allow for monitoring +// to be resumed. +func (rep *Reporter) Continue() { + lock.Lock() + defer lock.Unlock() + if rep == nil { + return + } + + if !rep.metricsCh.IsPaused() { + return + } + + rep.metricsCh.Continue() +} + +// InjectHandlers will will enable client side metrics and inject the proper +// handlers to handle how metrics are sent. +// +// Example: +// // Start must be called in order to inject the correct handlers +// r, err := csm.Start("clientID", "127.0.0.1:8094") +// if err != nil { +// panic(fmt.Errorf("expected no error, but received %v", err)) +// } +// +// sess := session.NewSession() +// r.InjectHandlers(&sess.Handlers) +// +// // create a new service client with our client side metric session +// svc := s3.New(sess) +func (rep *Reporter) InjectHandlers(handlers *request.Handlers) { + if rep == nil { + return + } + + handlers.Complete.PushFrontNamed(request.NamedHandler{ + Name: APICallMetricHandlerName, + Fn: rep.sendAPICallMetric, + }) + + handlers.CompleteAttempt.PushFrontNamed(request.NamedHandler{ + Name: APICallAttemptMetricHandlerName, + Fn: rep.sendAPICallAttemptMetric, + }) +} + +// boolIntValue return 1 for true and 0 for false. +func boolIntValue(b bool) int { + if b { + return 1 + } + + return 0 +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go new file mode 100644 index 000000000..23bb639e0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go @@ -0,0 +1,207 @@ +// Package defaults is a collection of helpers to retrieve the SDK's default +// configuration and handlers. +// +// Generally this package shouldn't be used directly, but session.Session +// instead. This package is useful when you need to reset the defaults +// of a session or service client to the SDK defaults before setting +// additional parameters. +package defaults + +import ( + "fmt" + "net" + "net/http" + "net/url" + "os" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/corehandlers" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds" + "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds" + "github.com/aws/aws-sdk-go/aws/ec2metadata" + "github.com/aws/aws-sdk-go/aws/endpoints" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/shareddefaults" +) + +// A Defaults provides a collection of default values for SDK clients. +type Defaults struct { + Config *aws.Config + Handlers request.Handlers +} + +// Get returns the SDK's default values with Config and handlers pre-configured. +func Get() Defaults { + cfg := Config() + handlers := Handlers() + cfg.Credentials = CredChain(cfg, handlers) + + return Defaults{ + Config: cfg, + Handlers: handlers, + } +} + +// Config returns the default configuration without credentials. +// To retrieve a config with credentials also included use +// `defaults.Get().Config` instead. +// +// Generally you shouldn't need to use this method directly, but +// is available if you need to reset the configuration of an +// existing service client or session. +func Config() *aws.Config { + return aws.NewConfig(). + WithCredentials(credentials.AnonymousCredentials). + WithRegion(os.Getenv("AWS_REGION")). + WithHTTPClient(http.DefaultClient). + WithMaxRetries(aws.UseServiceDefaultRetries). + WithLogger(aws.NewDefaultLogger()). + WithLogLevel(aws.LogOff). + WithEndpointResolver(endpoints.DefaultResolver()) +} + +// Handlers returns the default request handlers. +// +// Generally you shouldn't need to use this method directly, but +// is available if you need to reset the request handlers of an +// existing service client or session. +func Handlers() request.Handlers { + var handlers request.Handlers + + handlers.Validate.PushBackNamed(corehandlers.ValidateEndpointHandler) + handlers.Validate.AfterEachFn = request.HandlerListStopOnError + handlers.Build.PushBackNamed(corehandlers.SDKVersionUserAgentHandler) + handlers.Build.PushBackNamed(corehandlers.AddHostExecEnvUserAgentHander) + handlers.Build.AfterEachFn = request.HandlerListStopOnError + handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler) + handlers.Send.PushBackNamed(corehandlers.ValidateReqSigHandler) + handlers.Send.PushBackNamed(corehandlers.SendHandler) + handlers.AfterRetry.PushBackNamed(corehandlers.AfterRetryHandler) + handlers.ValidateResponse.PushBackNamed(corehandlers.ValidateResponseHandler) + + return handlers +} + +// CredChain returns the default credential chain. +// +// Generally you shouldn't need to use this method directly, but +// is available if you need to reset the credentials of an +// existing service client or session's Config. +func CredChain(cfg *aws.Config, handlers request.Handlers) *credentials.Credentials { + return credentials.NewCredentials(&credentials.ChainProvider{ + VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), + Providers: CredProviders(cfg, handlers), + }) +} + +// CredProviders returns the slice of providers used in +// the default credential chain. +// +// For applications that need to use some other provider (for example use +// different environment variables for legacy reasons) but still fall back +// on the default chain of providers. This allows that default chaint to be +// automatically updated +func CredProviders(cfg *aws.Config, handlers request.Handlers) []credentials.Provider { + return []credentials.Provider{ + &credentials.EnvProvider{}, + &credentials.SharedCredentialsProvider{Filename: "", Profile: ""}, + RemoteCredProvider(*cfg, handlers), + } +} + +const ( + httpProviderAuthorizationEnvVar = "AWS_CONTAINER_AUTHORIZATION_TOKEN" + httpProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_FULL_URI" +) + +// RemoteCredProvider returns a credentials provider for the default remote +// endpoints such as EC2 or ECS Roles. +func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider { + if u := os.Getenv(httpProviderEnvVar); len(u) > 0 { + return localHTTPCredProvider(cfg, handlers, u) + } + + if uri := os.Getenv(shareddefaults.ECSCredsProviderEnvVar); len(uri) > 0 { + u := fmt.Sprintf("%s%s", shareddefaults.ECSContainerCredentialsURI, uri) + return httpCredProvider(cfg, handlers, u) + } + + return ec2RoleProvider(cfg, handlers) +} + +var lookupHostFn = net.LookupHost + +func isLoopbackHost(host string) (bool, error) { + ip := net.ParseIP(host) + if ip != nil { + return ip.IsLoopback(), nil + } + + // Host is not an ip, perform lookup + addrs, err := lookupHostFn(host) + if err != nil { + return false, err + } + for _, addr := range addrs { + if !net.ParseIP(addr).IsLoopback() { + return false, nil + } + } + + return true, nil +} + +func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider { + var errMsg string + + parsed, err := url.Parse(u) + if err != nil { + errMsg = fmt.Sprintf("invalid URL, %v", err) + } else { + host := aws.URLHostname(parsed) + if len(host) == 0 { + errMsg = "unable to parse host from local HTTP cred provider URL" + } else if isLoopback, loopbackErr := isLoopbackHost(host); loopbackErr != nil { + errMsg = fmt.Sprintf("failed to resolve host %q, %v", host, loopbackErr) + } else if !isLoopback { + errMsg = fmt.Sprintf("invalid endpoint host, %q, only loopback hosts are allowed.", host) + } + } + + if len(errMsg) > 0 { + if cfg.Logger != nil { + cfg.Logger.Log("Ignoring, HTTP credential provider", errMsg, err) + } + return credentials.ErrorProvider{ + Err: awserr.New("CredentialsEndpointError", errMsg, err), + ProviderName: endpointcreds.ProviderName, + } + } + + return httpCredProvider(cfg, handlers, u) +} + +func httpCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider { + return endpointcreds.NewProviderClient(cfg, handlers, u, + func(p *endpointcreds.Provider) { + p.ExpiryWindow = 5 * time.Minute + p.AuthorizationToken = os.Getenv(httpProviderAuthorizationEnvVar) + }, + ) +} + +func ec2RoleProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider { + resolver := cfg.EndpointResolver + if resolver == nil { + resolver = endpoints.DefaultResolver() + } + + e, _ := resolver.EndpointFor(endpoints.Ec2metadataServiceID, "") + return &ec2rolecreds.EC2RoleProvider{ + Client: ec2metadata.NewClient(cfg, handlers, e.URL, e.SigningRegion), + ExpiryWindow: 5 * time.Minute, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go b/vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go new file mode 100644 index 000000000..ca0ee1dcc --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go @@ -0,0 +1,27 @@ +package defaults + +import ( + "github.com/aws/aws-sdk-go/internal/shareddefaults" +) + +// SharedCredentialsFilename returns the SDK's default file path +// for the shared credentials file. +// +// Builds the shared config file path based on the OS's platform. +// +// - Linux/Unix: $HOME/.aws/credentials +// - Windows: %USERPROFILE%\.aws\credentials +func SharedCredentialsFilename() string { + return shareddefaults.SharedCredentialsFilename() +} + +// SharedConfigFilename returns the SDK's default file path for +// the shared config file. +// +// Builds the shared config file path based on the OS's platform. +// +// - Linux/Unix: $HOME/.aws/config +// - Windows: %USERPROFILE%\.aws\config +func SharedConfigFilename() string { + return shareddefaults.SharedConfigFilename() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/doc.go new file mode 100644 index 000000000..4fcb61618 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/doc.go @@ -0,0 +1,56 @@ +// Package aws provides the core SDK's utilities and shared types. Use this package's +// utilities to simplify setting and reading API operations parameters. +// +// Value and Pointer Conversion Utilities +// +// This package includes a helper conversion utility for each scalar type the SDK's +// API use. These utilities make getting a pointer of the scalar, and dereferencing +// a pointer easier. +// +// Each conversion utility comes in two forms. Value to Pointer and Pointer to Value. +// The Pointer to value will safely dereference the pointer and return its value. +// If the pointer was nil, the scalar's zero value will be returned. +// +// The value to pointer functions will be named after the scalar type. So get a +// *string from a string value use the "String" function. This makes it easy to +// to get pointer of a literal string value, because getting the address of a +// literal requires assigning the value to a variable first. +// +// var strPtr *string +// +// // Without the SDK's conversion functions +// str := "my string" +// strPtr = &str +// +// // With the SDK's conversion functions +// strPtr = aws.String("my string") +// +// // Convert *string to string value +// str = aws.StringValue(strPtr) +// +// In addition to scalars the aws package also includes conversion utilities for +// map and slice for commonly types used in API parameters. The map and slice +// conversion functions use similar naming pattern as the scalar conversion +// functions. +// +// var strPtrs []*string +// var strs []string = []string{"Go", "Gophers", "Go"} +// +// // Convert []string to []*string +// strPtrs = aws.StringSlice(strs) +// +// // Convert []*string to []string +// strs = aws.StringValueSlice(strPtrs) +// +// SDK Default HTTP Client +// +// The SDK will use the http.DefaultClient if a HTTP client is not provided to +// the SDK's Session, or service client constructor. This means that if the +// http.DefaultClient is modified by other components of your application the +// modifications will be picked up by the SDK as well. +// +// In some cases this might be intended, but it is a better practice to create +// a custom HTTP Client to share explicitly through your application. You can +// configure the SDK to use the custom HTTP Client by setting the HTTPClient +// value of the SDK's Config type when creating a Session or service client. +package aws diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go new file mode 100644 index 000000000..2c8d5f56d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go @@ -0,0 +1,169 @@ +package ec2metadata + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/sdkuri" +) + +// GetMetadata uses the path provided to request information from the EC2 +// instance metdata service. The content will be returned as a string, or +// error if the request failed. +func (c *EC2Metadata) GetMetadata(p string) (string, error) { + op := &request.Operation{ + Name: "GetMetadata", + HTTPMethod: "GET", + HTTPPath: sdkuri.PathJoin("/meta-data", p), + } + + output := &metadataOutput{} + req := c.NewRequest(op, nil, output) + err := req.Send() + + return output.Content, err +} + +// GetUserData returns the userdata that was configured for the service. If +// there is no user-data setup for the EC2 instance a "NotFoundError" error +// code will be returned. +func (c *EC2Metadata) GetUserData() (string, error) { + op := &request.Operation{ + Name: "GetUserData", + HTTPMethod: "GET", + HTTPPath: "/user-data", + } + + output := &metadataOutput{} + req := c.NewRequest(op, nil, output) + req.Handlers.UnmarshalError.PushBack(func(r *request.Request) { + if r.HTTPResponse.StatusCode == http.StatusNotFound { + r.Error = awserr.New("NotFoundError", "user-data not found", r.Error) + } + }) + err := req.Send() + + return output.Content, err +} + +// GetDynamicData uses the path provided to request information from the EC2 +// instance metadata service for dynamic data. The content will be returned +// as a string, or error if the request failed. +func (c *EC2Metadata) GetDynamicData(p string) (string, error) { + op := &request.Operation{ + Name: "GetDynamicData", + HTTPMethod: "GET", + HTTPPath: sdkuri.PathJoin("/dynamic", p), + } + + output := &metadataOutput{} + req := c.NewRequest(op, nil, output) + err := req.Send() + + return output.Content, err +} + +// GetInstanceIdentityDocument retrieves an identity document describing an +// instance. Error is returned if the request fails or is unable to parse +// the response. +func (c *EC2Metadata) GetInstanceIdentityDocument() (EC2InstanceIdentityDocument, error) { + resp, err := c.GetDynamicData("instance-identity/document") + if err != nil { + return EC2InstanceIdentityDocument{}, + awserr.New("EC2MetadataRequestError", + "failed to get EC2 instance identity document", err) + } + + doc := EC2InstanceIdentityDocument{} + if err := json.NewDecoder(strings.NewReader(resp)).Decode(&doc); err != nil { + return EC2InstanceIdentityDocument{}, + awserr.New(request.ErrCodeSerialization, + "failed to decode EC2 instance identity document", err) + } + + return doc, nil +} + +// IAMInfo retrieves IAM info from the metadata API +func (c *EC2Metadata) IAMInfo() (EC2IAMInfo, error) { + resp, err := c.GetMetadata("iam/info") + if err != nil { + return EC2IAMInfo{}, + awserr.New("EC2MetadataRequestError", + "failed to get EC2 IAM info", err) + } + + info := EC2IAMInfo{} + if err := json.NewDecoder(strings.NewReader(resp)).Decode(&info); err != nil { + return EC2IAMInfo{}, + awserr.New(request.ErrCodeSerialization, + "failed to decode EC2 IAM info", err) + } + + if info.Code != "Success" { + errMsg := fmt.Sprintf("failed to get EC2 IAM Info (%s)", info.Code) + return EC2IAMInfo{}, + awserr.New("EC2MetadataError", errMsg, nil) + } + + return info, nil +} + +// Region returns the region the instance is running in. +func (c *EC2Metadata) Region() (string, error) { + resp, err := c.GetMetadata("placement/availability-zone") + if err != nil { + return "", err + } + + if len(resp) == 0 { + return "", awserr.New("EC2MetadataError", "invalid Region response", nil) + } + + // returns region without the suffix. Eg: us-west-2a becomes us-west-2 + return resp[:len(resp)-1], nil +} + +// Available returns if the application has access to the EC2 Metadata service. +// Can be used to determine if application is running within an EC2 Instance and +// the metadata service is available. +func (c *EC2Metadata) Available() bool { + if _, err := c.GetMetadata("instance-id"); err != nil { + return false + } + + return true +} + +// An EC2IAMInfo provides the shape for unmarshaling +// an IAM info from the metadata API +type EC2IAMInfo struct { + Code string + LastUpdated time.Time + InstanceProfileArn string + InstanceProfileID string +} + +// An EC2InstanceIdentityDocument provides the shape for unmarshaling +// an instance identity document +type EC2InstanceIdentityDocument struct { + DevpayProductCodes []string `json:"devpayProductCodes"` + AvailabilityZone string `json:"availabilityZone"` + PrivateIP string `json:"privateIp"` + Version string `json:"version"` + Region string `json:"region"` + InstanceID string `json:"instanceId"` + BillingProducts []string `json:"billingProducts"` + InstanceType string `json:"instanceType"` + AccountID string `json:"accountId"` + PendingTime time.Time `json:"pendingTime"` + ImageID string `json:"imageId"` + KernelID string `json:"kernelId"` + RamdiskID string `json:"ramdiskId"` + Architecture string `json:"architecture"` +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go new file mode 100644 index 000000000..f0c1d31e7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go @@ -0,0 +1,152 @@ +// Package ec2metadata provides the client for making API calls to the +// EC2 Metadata service. +// +// This package's client can be disabled completely by setting the environment +// variable "AWS_EC2_METADATA_DISABLED=true". This environment variable set to +// true instructs the SDK to disable the EC2 Metadata client. The client cannot +// be used while the environment variable is set to true, (case insensitive). +package ec2metadata + +import ( + "bytes" + "errors" + "io" + "net/http" + "os" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/aws/corehandlers" + "github.com/aws/aws-sdk-go/aws/request" +) + +// ServiceName is the name of the service. +const ServiceName = "ec2metadata" +const disableServiceEnvVar = "AWS_EC2_METADATA_DISABLED" + +// A EC2Metadata is an EC2 Metadata service Client. +type EC2Metadata struct { + *client.Client +} + +// New creates a new instance of the EC2Metadata client with a session. +// This client is safe to use across multiple goroutines. +// +// +// Example: +// // Create a EC2Metadata client from just a session. +// svc := ec2metadata.New(mySession) +// +// // Create a EC2Metadata client with additional configuration +// svc := ec2metadata.New(mySession, aws.NewConfig().WithLogLevel(aws.LogDebugHTTPBody)) +func New(p client.ConfigProvider, cfgs ...*aws.Config) *EC2Metadata { + c := p.ClientConfig(ServiceName, cfgs...) + return NewClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion) +} + +// NewClient returns a new EC2Metadata client. Should be used to create +// a client when not using a session. Generally using just New with a session +// is preferred. +// +// If an unmodified HTTP client is provided from the stdlib default, or no client +// the EC2RoleProvider's EC2Metadata HTTP client's timeout will be shortened. +// To disable this set Config.EC2MetadataDisableTimeoutOverride to false. Enabled by default. +func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion string, opts ...func(*client.Client)) *EC2Metadata { + if !aws.BoolValue(cfg.EC2MetadataDisableTimeoutOverride) && httpClientZero(cfg.HTTPClient) { + // If the http client is unmodified and this feature is not disabled + // set custom timeouts for EC2Metadata requests. + cfg.HTTPClient = &http.Client{ + // use a shorter timeout than default because the metadata + // service is local if it is running, and to fail faster + // if not running on an ec2 instance. + Timeout: 5 * time.Second, + } + } + + svc := &EC2Metadata{ + Client: client.New( + cfg, + metadata.ClientInfo{ + ServiceName: ServiceName, + ServiceID: ServiceName, + Endpoint: endpoint, + APIVersion: "latest", + }, + handlers, + ), + } + + svc.Handlers.Unmarshal.PushBack(unmarshalHandler) + svc.Handlers.UnmarshalError.PushBack(unmarshalError) + svc.Handlers.Validate.Clear() + svc.Handlers.Validate.PushBack(validateEndpointHandler) + + // Disable the EC2 Metadata service if the environment variable is set. + // This shortcirctes the service's functionality to always fail to send + // requests. + if strings.ToLower(os.Getenv(disableServiceEnvVar)) == "true" { + svc.Handlers.Send.SwapNamed(request.NamedHandler{ + Name: corehandlers.SendHandler.Name, + Fn: func(r *request.Request) { + r.HTTPResponse = &http.Response{ + Header: http.Header{}, + } + r.Error = awserr.New( + request.CanceledErrorCode, + "EC2 IMDS access disabled via "+disableServiceEnvVar+" env var", + nil) + }, + }) + } + + // Add additional options to the service config + for _, option := range opts { + option(svc.Client) + } + + return svc +} + +func httpClientZero(c *http.Client) bool { + return c == nil || (c.Transport == nil && c.CheckRedirect == nil && c.Jar == nil && c.Timeout == 0) +} + +type metadataOutput struct { + Content string +} + +func unmarshalHandler(r *request.Request) { + defer r.HTTPResponse.Body.Close() + b := &bytes.Buffer{} + if _, err := io.Copy(b, r.HTTPResponse.Body); err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "unable to unmarshal EC2 metadata respose", err) + return + } + + if data, ok := r.Data.(*metadataOutput); ok { + data.Content = b.String() + } +} + +func unmarshalError(r *request.Request) { + defer r.HTTPResponse.Body.Close() + b := &bytes.Buffer{} + if _, err := io.Copy(b, r.HTTPResponse.Body); err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "unable to unmarshal EC2 metadata error respose", err) + return + } + + // Response body format is not consistent between metadata endpoints. + // Grab the error message as a string and include that as the source error + r.Error = awserr.New("EC2MetadataError", "failed to make EC2Metadata request", errors.New(b.String())) +} + +func validateEndpointHandler(r *request.Request) { + if r.ClientInfo.Endpoint == "" { + r.Error = aws.ErrMissingEndpoint + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go new file mode 100644 index 000000000..87b9ff3ff --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go @@ -0,0 +1,188 @@ +package endpoints + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +type modelDefinition map[string]json.RawMessage + +// A DecodeModelOptions are the options for how the endpoints model definition +// are decoded. +type DecodeModelOptions struct { + SkipCustomizations bool +} + +// Set combines all of the option functions together. +func (d *DecodeModelOptions) Set(optFns ...func(*DecodeModelOptions)) { + for _, fn := range optFns { + fn(d) + } +} + +// DecodeModel unmarshals a Regions and Endpoint model definition file into +// a endpoint Resolver. If the file format is not supported, or an error occurs +// when unmarshaling the model an error will be returned. +// +// Casting the return value of this func to a EnumPartitions will +// allow you to get a list of the partitions in the order the endpoints +// will be resolved in. +// +// resolver, err := endpoints.DecodeModel(reader) +// +// partitions := resolver.(endpoints.EnumPartitions).Partitions() +// for _, p := range partitions { +// // ... inspect partitions +// } +func DecodeModel(r io.Reader, optFns ...func(*DecodeModelOptions)) (Resolver, error) { + var opts DecodeModelOptions + opts.Set(optFns...) + + // Get the version of the partition file to determine what + // unmarshaling model to use. + modelDef := modelDefinition{} + if err := json.NewDecoder(r).Decode(&modelDef); err != nil { + return nil, newDecodeModelError("failed to decode endpoints model", err) + } + + var version string + if b, ok := modelDef["version"]; ok { + version = string(b) + } else { + return nil, newDecodeModelError("endpoints version not found in model", nil) + } + + if version == "3" { + return decodeV3Endpoints(modelDef, opts) + } + + return nil, newDecodeModelError( + fmt.Sprintf("endpoints version %s, not supported", version), nil) +} + +func decodeV3Endpoints(modelDef modelDefinition, opts DecodeModelOptions) (Resolver, error) { + b, ok := modelDef["partitions"] + if !ok { + return nil, newDecodeModelError("endpoints model missing partitions", nil) + } + + ps := partitions{} + if err := json.Unmarshal(b, &ps); err != nil { + return nil, newDecodeModelError("failed to decode endpoints model", err) + } + + if opts.SkipCustomizations { + return ps, nil + } + + // Customization + for i := 0; i < len(ps); i++ { + p := &ps[i] + custAddEC2Metadata(p) + custAddS3DualStack(p) + custRmIotDataService(p) + custFixAppAutoscalingChina(p) + custFixAppAutoscalingUsGov(p) + } + + return ps, nil +} + +func custAddS3DualStack(p *partition) { + if p.ID != "aws" { + return + } + + custAddDualstack(p, "s3") + custAddDualstack(p, "s3-control") +} + +func custAddDualstack(p *partition, svcName string) { + s, ok := p.Services[svcName] + if !ok { + return + } + + s.Defaults.HasDualStack = boxedTrue + s.Defaults.DualStackHostname = "{service}.dualstack.{region}.{dnsSuffix}" + + p.Services[svcName] = s +} + +func custAddEC2Metadata(p *partition) { + p.Services["ec2metadata"] = service{ + IsRegionalized: boxedFalse, + PartitionEndpoint: "aws-global", + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, + }, + }, + } +} + +func custRmIotDataService(p *partition) { + delete(p.Services, "data.iot") +} + +func custFixAppAutoscalingChina(p *partition) { + if p.ID != "aws-cn" { + return + } + + const serviceName = "application-autoscaling" + s, ok := p.Services[serviceName] + if !ok { + return + } + + const expectHostname = `autoscaling.{region}.amazonaws.com` + if e, a := s.Defaults.Hostname, expectHostname; e != a { + fmt.Printf("custFixAppAutoscalingChina: ignoring customization, expected %s, got %s\n", e, a) + return + } + + s.Defaults.Hostname = expectHostname + ".cn" + p.Services[serviceName] = s +} + +func custFixAppAutoscalingUsGov(p *partition) { + if p.ID != "aws-us-gov" { + return + } + + const serviceName = "application-autoscaling" + s, ok := p.Services[serviceName] + if !ok { + return + } + + if a := s.Defaults.CredentialScope.Service; a != "" { + fmt.Printf("custFixAppAutoscalingUsGov: ignoring customization, expected empty credential scope service, got %s\n", a) + return + } + + if a := s.Defaults.Hostname; a != "" { + fmt.Printf("custFixAppAutoscalingUsGov: ignoring customization, expected empty hostname, got %s\n", a) + return + } + + s.Defaults.CredentialScope.Service = "application-autoscaling" + s.Defaults.Hostname = "autoscaling.{region}.amazonaws.com" + + p.Services[serviceName] = s +} + +type decodeModelError struct { + awsError +} + +func newDecodeModelError(msg string, err error) decodeModelError { + return decodeModelError{ + awsError: awserr.New("DecodeEndpointsModelError", msg, err), + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go new file mode 100644 index 000000000..41c9b8cd3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go @@ -0,0 +1,4407 @@ +// Code generated by aws/endpoints/v3model_codegen.go. DO NOT EDIT. + +package endpoints + +import ( + "regexp" +) + +// Partition identifiers +const ( + AwsPartitionID = "aws" // AWS Standard partition. + AwsCnPartitionID = "aws-cn" // AWS China partition. + AwsUsGovPartitionID = "aws-us-gov" // AWS GovCloud (US) partition. +) + +// AWS Standard partition's regions. +const ( + ApEast1RegionID = "ap-east-1" // Asia Pacific (Hong Kong). + ApNortheast1RegionID = "ap-northeast-1" // Asia Pacific (Tokyo). + ApNortheast2RegionID = "ap-northeast-2" // Asia Pacific (Seoul). + ApSouth1RegionID = "ap-south-1" // Asia Pacific (Mumbai). + ApSoutheast1RegionID = "ap-southeast-1" // Asia Pacific (Singapore). + ApSoutheast2RegionID = "ap-southeast-2" // Asia Pacific (Sydney). + CaCentral1RegionID = "ca-central-1" // Canada (Central). + EuCentral1RegionID = "eu-central-1" // EU (Frankfurt). + EuNorth1RegionID = "eu-north-1" // EU (Stockholm). + EuWest1RegionID = "eu-west-1" // EU (Ireland). + EuWest2RegionID = "eu-west-2" // EU (London). + EuWest3RegionID = "eu-west-3" // EU (Paris). + SaEast1RegionID = "sa-east-1" // South America (Sao Paulo). + UsEast1RegionID = "us-east-1" // US East (N. Virginia). + UsEast2RegionID = "us-east-2" // US East (Ohio). + UsWest1RegionID = "us-west-1" // US West (N. California). + UsWest2RegionID = "us-west-2" // US West (Oregon). +) + +// AWS China partition's regions. +const ( + CnNorth1RegionID = "cn-north-1" // China (Beijing). + CnNorthwest1RegionID = "cn-northwest-1" // China (Ningxia). +) + +// AWS GovCloud (US) partition's regions. +const ( + UsGovEast1RegionID = "us-gov-east-1" // AWS GovCloud (US-East). + UsGovWest1RegionID = "us-gov-west-1" // AWS GovCloud (US). +) + +// DefaultResolver returns an Endpoint resolver that will be able +// to resolve endpoints for: AWS Standard, AWS China, and AWS GovCloud (US). +// +// Use DefaultPartitions() to get the list of the default partitions. +func DefaultResolver() Resolver { + return defaultPartitions +} + +// DefaultPartitions returns a list of the partitions the SDK is bundled +// with. The available partitions are: AWS Standard, AWS China, and AWS GovCloud (US). +// +// partitions := endpoints.DefaultPartitions +// for _, p := range partitions { +// // ... inspect partitions +// } +func DefaultPartitions() []Partition { + return defaultPartitions.Partitions() +} + +var defaultPartitions = partitions{ + awsPartition, + awscnPartition, + awsusgovPartition, +} + +// AwsPartition returns the Resolver for AWS Standard. +func AwsPartition() Partition { + return awsPartition.Partition() +} + +var awsPartition = partition{ + ID: "aws", + Name: "AWS Standard", + DNSSuffix: "amazonaws.com", + RegionRegex: regionRegex{ + Regexp: func() *regexp.Regexp { + reg, _ := regexp.Compile("^(us|eu|ap|sa|ca)\\-\\w+\\-\\d+$") + return reg + }(), + }, + Defaults: endpoint{ + Hostname: "{service}.{region}.{dnsSuffix}", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + Regions: regions{ + "ap-east-1": region{ + Description: "Asia Pacific (Hong Kong)", + }, + "ap-northeast-1": region{ + Description: "Asia Pacific (Tokyo)", + }, + "ap-northeast-2": region{ + Description: "Asia Pacific (Seoul)", + }, + "ap-south-1": region{ + Description: "Asia Pacific (Mumbai)", + }, + "ap-southeast-1": region{ + Description: "Asia Pacific (Singapore)", + }, + "ap-southeast-2": region{ + Description: "Asia Pacific (Sydney)", + }, + "ca-central-1": region{ + Description: "Canada (Central)", + }, + "eu-central-1": region{ + Description: "EU (Frankfurt)", + }, + "eu-north-1": region{ + Description: "EU (Stockholm)", + }, + "eu-west-1": region{ + Description: "EU (Ireland)", + }, + "eu-west-2": region{ + Description: "EU (London)", + }, + "eu-west-3": region{ + Description: "EU (Paris)", + }, + "sa-east-1": region{ + Description: "South America (Sao Paulo)", + }, + "us-east-1": region{ + Description: "US East (N. Virginia)", + }, + "us-east-2": region{ + Description: "US East (Ohio)", + }, + "us-west-1": region{ + Description: "US West (N. California)", + }, + "us-west-2": region{ + Description: "US West (Oregon)", + }, + }, + Services: services{ + "a4b": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "acm": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "acm-pca": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "api.ecr": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{ + Hostname: "api.ecr.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, + "ap-northeast-1": endpoint{ + Hostname: "api.ecr.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "api.ecr.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "api.ecr.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "api.ecr.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "api.ecr.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "api.ecr.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "api.ecr.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-north-1": endpoint{ + Hostname: "api.ecr.eu-north-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "api.ecr.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "api.ecr.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "eu-west-3": endpoint{ + Hostname: "api.ecr.eu-west-3.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + "sa-east-1": endpoint{ + Hostname: "api.ecr.sa-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + }, + "us-east-1": endpoint{ + Hostname: "api.ecr.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "api.ecr.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{ + Hostname: "api.ecr.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{ + Hostname: "api.ecr.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "api.mediatailor": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "api.pricing": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "pricing", + }, + }, + Endpoints: endpoints{ + "ap-south-1": endpoint{}, + "us-east-1": endpoint{}, + }, + }, + "api.sagemaker": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "api-fips.sagemaker.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "apigateway": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "application-autoscaling": service{ + Defaults: endpoint{ + Hostname: "autoscaling.{region}.amazonaws.com", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "application-autoscaling", + }, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "appmesh": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "appstream2": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + CredentialScope: credentialScope{ + Service: "appstream", + }, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "appsync": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "athena": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "autoscaling": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "autoscaling-plans": service{ + Defaults: endpoint{ + Hostname: "autoscaling.{region}.amazonaws.com", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "autoscaling-plans", + }, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "batch": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "budgets": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "budgets.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "ce": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "ce.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "chime": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + Defaults: endpoint{ + SSLCommonName: "service.chime.aws.amazon.com", + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "service.chime.aws.amazon.com", + Protocols: []string{"https"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "cloud9": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "clouddirectory": service{ + + Endpoints: endpoints{ + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cloudformation": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cloudfront": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "cloudfront.amazonaws.com", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "cloudhsm": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cloudhsmv2": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "cloudhsm", + }, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cloudsearch": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cloudtrail": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "codebuild": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "codebuild-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "codebuild-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "codebuild-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "codebuild-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "codecommit": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips": endpoint{ + Hostname: "codecommit-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "codedeploy": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "codedeploy-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "codedeploy-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "codepipeline": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "codestar": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cognito-identity": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cognito-idp": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cognito-sync": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "comprehend": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "comprehendmedical": service{ + + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "config": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "cur": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "data.mediastore": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "datapipeline": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "datasync": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "dax": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "devicefarm": service{ + + Endpoints: endpoints{ + "us-west-2": endpoint{}, + }, + }, + "directconnect": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "discovery": service{ + + Endpoints: endpoints{ + "us-west-2": endpoint{}, + }, + }, + "dms": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "docdb": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{ + Hostname: "rds.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "rds.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "eu-central-1": endpoint{ + Hostname: "rds.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "rds.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "us-east-1": endpoint{ + Hostname: "rds.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "rds.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "rds.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "ds": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "local": endpoint{ + Hostname: "localhost:8000", + Protocols: []string{"http"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "ec2": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "ec2metadata": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, + }, + }, + }, + "ecs": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elasticache": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips": endpoint{ + Hostname: "elasticache-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elasticbeanstalk": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elasticfilesystem": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elasticloadbalancing": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elasticmapreduce": service{ + Defaults: endpoint{ + SSLCommonName: "{region}.{service}.{dnsSuffix}", + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{ + SSLCommonName: "{service}.{region}.{dnsSuffix}", + }, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + SSLCommonName: "{service}.{region}.{dnsSuffix}", + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "elastictranscoder": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "email": service{ + + Endpoints: endpoints{ + "ap-south-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "entitlement.marketplace": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "aws-marketplace", + }, + }, + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "es": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips": endpoint{ + Hostname: "es-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "events": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "firehose": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "fms": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "fsx": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "gamelift": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "glacier": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "glue": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "greengrass": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "guardduty": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "health": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "iam": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "iam.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "importexport": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "importexport.amazonaws.com", + SignatureVersions: []string{"v2", "v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + Service: "IngestionService", + }, + }, + }, + }, + "inspector": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "iot": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "execute-api", + }, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "iotanalytics": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "kafka": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "kinesis": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "kinesisanalytics": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "kinesisvideo": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "kms": service{ + + Endpoints: endpoints{ + "ProdFips": endpoint{ + Hostname: "kms-fips.ca-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "lambda": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "license-manager": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "lightsail": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "logs": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "machinelearning": service{ + + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + }, + }, + "marketplacecommerceanalytics": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "mediaconnect": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "mediaconvert": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "medialive": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "mediapackage": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "mediastore": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "metering.marketplace": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "aws-marketplace", + }, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "mgh": service{ + + Endpoints: endpoints{ + "us-west-2": endpoint{}, + }, + }, + "mobileanalytics": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "models.lex": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "lex", + }, + }, + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "monitoring": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "mq": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "mturk-requester": service{ + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "sandbox": endpoint{ + Hostname: "mturk-requester-sandbox.us-east-1.amazonaws.com", + }, + "us-east-1": endpoint{}, + }, + }, + "neptune": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{ + Hostname: "rds.ap-northeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "rds.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "rds.ap-south-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "rds.ap-southeast-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "rds.ap-southeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "eu-central-1": endpoint{ + Hostname: "rds.eu-central-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "rds.eu-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "rds.eu-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "us-east-1": endpoint{ + Hostname: "rds.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "rds.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{ + Hostname: "rds.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "opsworks": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "opsworks-cm": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "organizations": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "organizations.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "pinpoint": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "mobiletargeting", + }, + }, + Endpoints: endpoints{ + "ap-south-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "polly": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "projects.iot1click": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "ram": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "rds": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + SSLCommonName: "{service}.{dnsSuffix}", + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "rekognition": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "resource-groups": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "robomaker": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "route53": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "route53.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "route53domains": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "route53resolver": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "runtime.lex": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "lex", + }, + }, + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "runtime.sagemaker": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "s3": service{ + PartitionEndpoint: "us-east-1", + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"s3v4"}, + + HasDualStack: boxedTrue, + DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{ + Hostname: "s3.ap-northeast-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{ + Hostname: "s3.ap-southeast-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "ap-southeast-2": endpoint{ + Hostname: "s3.ap-southeast-2.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{ + Hostname: "s3.eu-west-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "s3-external-1": endpoint{ + Hostname: "s3-external-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "sa-east-1": endpoint{ + Hostname: "s3.sa-east-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "us-east-1": endpoint{ + Hostname: "s3.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{ + Hostname: "s3.us-west-1.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + "us-west-2": endpoint{ + Hostname: "s3.us-west-2.amazonaws.com", + SignatureVersions: []string{"s3", "s3v4"}, + }, + }, + }, + "s3-control": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + SignatureVersions: []string{"s3v4"}, + + HasDualStack: boxedTrue, + DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{ + Hostname: "s3-control.ap-northeast-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-northeast-1", + }, + }, + "ap-northeast-2": endpoint{ + Hostname: "s3-control.ap-northeast-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{ + Hostname: "s3-control.ap-south-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-south-1", + }, + }, + "ap-southeast-1": endpoint{ + Hostname: "s3-control.ap-southeast-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-southeast-1", + }, + }, + "ap-southeast-2": endpoint{ + Hostname: "s3-control.ap-southeast-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ap-southeast-2", + }, + }, + "ca-central-1": endpoint{ + Hostname: "s3-control.ca-central-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "ca-central-1", + }, + }, + "eu-central-1": endpoint{ + Hostname: "s3-control.eu-central-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-central-1", + }, + }, + "eu-north-1": endpoint{ + Hostname: "s3-control.eu-north-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-north-1", + }, + }, + "eu-west-1": endpoint{ + Hostname: "s3-control.eu-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-west-1", + }, + }, + "eu-west-2": endpoint{ + Hostname: "s3-control.eu-west-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-west-2", + }, + }, + "eu-west-3": endpoint{ + Hostname: "s3-control.eu-west-3.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "eu-west-3", + }, + }, + "sa-east-1": endpoint{ + Hostname: "s3-control.sa-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "sa-east-1", + }, + }, + "us-east-1": endpoint{ + Hostname: "s3-control.us-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-1-fips": endpoint{ + Hostname: "s3-control-fips.us-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{ + Hostname: "s3-control.us-east-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-east-2-fips": endpoint{ + Hostname: "s3-control-fips.us-east-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{ + Hostname: "s3-control.us-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-1-fips": endpoint{ + Hostname: "s3-control-fips.us-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{ + Hostname: "s3-control.us-west-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "us-west-2-fips": endpoint{ + Hostname: "s3-control-fips.us-west-2.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "sdb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"v2"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + Hostname: "sdb.amazonaws.com", + }, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "secretsmanager": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "secretsmanager-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "secretsmanager-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "secretsmanager-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "secretsmanager-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "securityhub": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "serverlessrepo": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-northeast-2": endpoint{ + Protocols: []string{"https"}, + }, + "ap-south-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-southeast-1": endpoint{ + Protocols: []string{"https"}, + }, + "ap-southeast-2": endpoint{ + Protocols: []string{"https"}, + }, + "ca-central-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-central-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-north-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-west-1": endpoint{ + Protocols: []string{"https"}, + }, + "eu-west-2": endpoint{ + Protocols: []string{"https"}, + }, + "eu-west-3": endpoint{ + Protocols: []string{"https"}, + }, + "sa-east-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-east-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-east-2": endpoint{ + Protocols: []string{"https"}, + }, + "us-west-1": endpoint{ + Protocols: []string{"https"}, + }, + "us-west-2": endpoint{ + Protocols: []string{"https"}, + }, + }, + }, + "servicecatalog": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "servicecatalog-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "servicecatalog-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "servicecatalog-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "servicecatalog-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "servicediscovery": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "shield": service{ + IsRegionalized: boxedFalse, + Defaults: endpoint{ + SSLCommonName: "shield.us-east-1.amazonaws.com", + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "sms": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "snowball": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "sns": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "sqs": service{ + Defaults: endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "fips-us-east-1": endpoint{ + Hostname: "sqs-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "fips-us-east-2": endpoint{ + Hostname: "sqs-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "fips-us-west-1": endpoint{ + Hostname: "sqs-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "fips-us-west-2": endpoint{ + Hostname: "sqs-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{ + SSLCommonName: "queue.{dnsSuffix}", + }, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "ssm": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "states": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "storagegateway": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "streams.dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "dynamodb", + }, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "local": endpoint{ + Hostname: "localhost:8000", + Protocols: []string{"http"}, + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "sts": service{ + PartitionEndpoint: "aws-global", + Defaults: endpoint{ + Hostname: "sts.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + Endpoints: endpoints{ + "ap-east-1": endpoint{ + Hostname: "sts.ap-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-east-1", + }, + }, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{ + Hostname: "sts.ap-northeast-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "ap-northeast-2", + }, + }, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "aws-global": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "sts-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "sts-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-1": endpoint{}, + "us-west-1-fips": endpoint{ + Hostname: "sts-fips.us-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-1", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "sts-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "support": service{ + + Endpoints: endpoints{ + "us-east-1": endpoint{}, + }, + }, + "swf": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "tagging": service{ + + Endpoints: endpoints{ + "ap-east-1": endpoint{}, + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "transfer": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "translate": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-1-fips": endpoint{ + Hostname: "translate-fips.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + "us-east-2": endpoint{}, + "us-east-2-fips": endpoint{ + Hostname: "translate-fips.us-east-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-2", + }, + }, + "us-west-2": endpoint{}, + "us-west-2-fips": endpoint{ + Hostname: "translate-fips.us-west-2.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-west-2", + }, + }, + }, + }, + "waf": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "waf.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, + "waf-regional": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "workdocs": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "workmail": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "eu-west-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "workspaces": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + "xray": service{ + + Endpoints: endpoints{ + "ap-northeast-1": endpoint{}, + "ap-northeast-2": endpoint{}, + "ap-south-1": endpoint{}, + "ap-southeast-1": endpoint{}, + "ap-southeast-2": endpoint{}, + "ca-central-1": endpoint{}, + "eu-central-1": endpoint{}, + "eu-north-1": endpoint{}, + "eu-west-1": endpoint{}, + "eu-west-2": endpoint{}, + "eu-west-3": endpoint{}, + "sa-east-1": endpoint{}, + "us-east-1": endpoint{}, + "us-east-2": endpoint{}, + "us-west-1": endpoint{}, + "us-west-2": endpoint{}, + }, + }, + }, +} + +// AwsCnPartition returns the Resolver for AWS China. +func AwsCnPartition() Partition { + return awscnPartition.Partition() +} + +var awscnPartition = partition{ + ID: "aws-cn", + Name: "AWS China", + DNSSuffix: "amazonaws.com.cn", + RegionRegex: regionRegex{ + Regexp: func() *regexp.Regexp { + reg, _ := regexp.Compile("^cn\\-\\w+\\-\\d+$") + return reg + }(), + }, + Defaults: endpoint{ + Hostname: "{service}.{region}.{dnsSuffix}", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + Regions: regions{ + "cn-north-1": region{ + Description: "China (Beijing)", + }, + "cn-northwest-1": region{ + Description: "China (Ningxia)", + }, + }, + Services: services{ + "api.ecr": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{ + Hostname: "api.ecr.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + "cn-northwest-1": endpoint{ + Hostname: "api.ecr.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "apigateway": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "application-autoscaling": service{ + Defaults: endpoint{ + Hostname: "autoscaling.{region}.amazonaws.com.cn", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "application-autoscaling", + }, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "autoscaling": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "cloudformation": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "cloudfront": service{ + PartitionEndpoint: "aws-cn-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-cn-global": endpoint{ + Hostname: "cloudfront.cn-northwest-1.amazonaws.com.cn", + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "cloudtrail": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "codebuild": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "codedeploy": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "cognito-identity": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "config": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "directconnect": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "dms": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ds": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ec2": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ec2metadata": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, + }, + }, + }, + "ecs": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticache": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticbeanstalk": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticloadbalancing": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "elasticmapreduce": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "es": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "events": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "firehose": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "gamelift": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "glacier": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "iam": service{ + PartitionEndpoint: "aws-cn-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-cn-global": endpoint{ + Hostname: "iam.cn-north-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + }, + }, + "iot": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "execute-api", + }, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "kinesis": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "lambda": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "logs": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "mediaconvert": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{ + Hostname: "subscribe.mediaconvert.cn-northwest-1.amazonaws.com.cn", + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "monitoring": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "polly": service{ + + Endpoints: endpoints{ + "cn-northwest-1": endpoint{}, + }, + }, + "rds": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "s3": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + SignatureVersions: []string{"s3v4"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "s3-control": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + SignatureVersions: []string{"s3v4"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{ + Hostname: "s3-control.cn-north-1.amazonaws.com.cn", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "cn-north-1", + }, + }, + "cn-northwest-1": endpoint{ + Hostname: "s3-control.cn-northwest-1.amazonaws.com.cn", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "cn-northwest-1", + }, + }, + }, + }, + "sms": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "snowball": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "sns": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "sqs": service{ + Defaults: endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "ssm": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "states": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "storagegateway": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + }, + }, + "streams.dynamodb": service{ + Defaults: endpoint{ + Protocols: []string{"http", "https"}, + CredentialScope: credentialScope{ + Service: "dynamodb", + }, + }, + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "sts": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "swf": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + "tagging": service{ + + Endpoints: endpoints{ + "cn-north-1": endpoint{}, + "cn-northwest-1": endpoint{}, + }, + }, + }, +} + +// AwsUsGovPartition returns the Resolver for AWS GovCloud (US). +func AwsUsGovPartition() Partition { + return awsusgovPartition.Partition() +} + +var awsusgovPartition = partition{ + ID: "aws-us-gov", + Name: "AWS GovCloud (US)", + DNSSuffix: "amazonaws.com", + RegionRegex: regionRegex{ + Regexp: func() *regexp.Regexp { + reg, _ := regexp.Compile("^us\\-gov\\-\\w+\\-\\d+$") + return reg + }(), + }, + Defaults: endpoint{ + Hostname: "{service}.{region}.{dnsSuffix}", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + Regions: regions{ + "us-gov-east-1": region{ + Description: "AWS GovCloud (US-East)", + }, + "us-gov-west-1": region{ + Description: "AWS GovCloud (US)", + }, + }, + Services: services{ + "acm": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "acm-pca": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "api.ecr": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{ + Hostname: "api.ecr.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{ + Hostname: "api.ecr.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "api.sagemaker": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "apigateway": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "application-autoscaling": service{ + Defaults: endpoint{ + Hostname: "autoscaling.{region}.amazonaws.com", + CredentialScope: credentialScope{ + Service: "application-autoscaling", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "athena": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "autoscaling": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "clouddirectory": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "cloudformation": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "cloudhsm": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "cloudhsmv2": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "cloudhsm", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "cloudtrail": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "codecommit": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "codedeploy": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-east-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-gov-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "codedeploy-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "comprehend": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "config": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "directconnect": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "dms": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "ds": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "dynamodb": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "dynamodb.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "ec2": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "ec2metadata": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-global": endpoint{ + Hostname: "169.254.169.254/latest", + Protocols: []string{"http"}, + }, + }, + }, + "ecs": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticache": service{ + + Endpoints: endpoints{ + "fips": endpoint{ + Hostname: "elasticache-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticbeanstalk": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "elasticfilesystem": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "elasticloadbalancing": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "elasticmapreduce": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"https"}, + }, + }, + }, + "es": service{ + + Endpoints: endpoints{ + "fips": endpoint{ + Hostname: "es-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "events": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "firehose": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "glacier": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "glue": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "guardduty": service{ + IsRegionalized: boxedTrue, + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "iam": service{ + PartitionEndpoint: "aws-us-gov-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-us-gov-global": endpoint{ + Hostname: "iam.us-gov.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "inspector": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "iot": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "execute-api", + }, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "kinesis": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "kms": service{ + + Endpoints: endpoints{ + "ProdFips": endpoint{ + Hostname: "kms-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "lambda": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "license-manager": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "logs": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "mediaconvert": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "metering.marketplace": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "aws-marketplace", + }, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "monitoring": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "organizations": service{ + PartitionEndpoint: "aws-us-gov-global", + IsRegionalized: boxedFalse, + + Endpoints: endpoints{ + "aws-us-gov-global": endpoint{ + Hostname: "organizations.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "polly": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "rds": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "redshift": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "rekognition": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "runtime.sagemaker": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "s3": service{ + Defaults: endpoint{ + SignatureVersions: []string{"s3", "s3v4"}, + }, + Endpoints: endpoints{ + "fips-us-gov-west-1": endpoint{ + Hostname: "s3-fips-us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-east-1": endpoint{ + Hostname: "s3.us-gov-east-1.amazonaws.com", + Protocols: []string{"http", "https"}, + }, + "us-gov-west-1": endpoint{ + Hostname: "s3.us-gov-west-1.amazonaws.com", + Protocols: []string{"http", "https"}, + }, + }, + }, + "s3-control": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + SignatureVersions: []string{"s3v4"}, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{ + Hostname: "s3-control.us-gov-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-east-1-fips": endpoint{ + Hostname: "s3-control-fips.us-gov-east-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-east-1", + }, + }, + "us-gov-west-1": endpoint{ + Hostname: "s3-control.us-gov-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + "us-gov-west-1-fips": endpoint{ + Hostname: "s3-control-fips.us-gov-west-1.amazonaws.com", + SignatureVersions: []string{"s3v4"}, + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "sms": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "snowball": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "sns": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + Protocols: []string{"http", "https"}, + }, + }, + }, + "sqs": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{ + SSLCommonName: "{region}.queue.{dnsSuffix}", + Protocols: []string{"http", "https"}, + }, + }, + }, + "ssm": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "states": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "storagegateway": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "streams.dynamodb": service{ + Defaults: endpoint{ + CredentialScope: credentialScope{ + Service: "dynamodb", + }, + }, + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "dynamodb.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "sts": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "swf": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "tagging": service{ + + Endpoints: endpoints{ + "us-gov-east-1": endpoint{}, + "us-gov-west-1": endpoint{}, + }, + }, + "translate": service{ + Defaults: endpoint{ + Protocols: []string{"https"}, + }, + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + "us-gov-west-1-fips": endpoint{ + Hostname: "translate-fips.us-gov-west-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-gov-west-1", + }, + }, + }, + }, + "waf-regional": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + "workspaces": service{ + + Endpoints: endpoints{ + "us-gov-west-1": endpoint{}, + }, + }, + }, +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go new file mode 100644 index 000000000..ca8fc828e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go @@ -0,0 +1,141 @@ +package endpoints + +// Service identifiers +// +// Deprecated: Use client package's EndpointsID value instead of these +// ServiceIDs. These IDs are not maintained, and are out of date. +const ( + A4bServiceID = "a4b" // A4b. + AcmServiceID = "acm" // Acm. + AcmPcaServiceID = "acm-pca" // AcmPca. + ApiMediatailorServiceID = "api.mediatailor" // ApiMediatailor. + ApiPricingServiceID = "api.pricing" // ApiPricing. + ApiSagemakerServiceID = "api.sagemaker" // ApiSagemaker. + ApigatewayServiceID = "apigateway" // Apigateway. + ApplicationAutoscalingServiceID = "application-autoscaling" // ApplicationAutoscaling. + Appstream2ServiceID = "appstream2" // Appstream2. + AppsyncServiceID = "appsync" // Appsync. + AthenaServiceID = "athena" // Athena. + AutoscalingServiceID = "autoscaling" // Autoscaling. + AutoscalingPlansServiceID = "autoscaling-plans" // AutoscalingPlans. + BatchServiceID = "batch" // Batch. + BudgetsServiceID = "budgets" // Budgets. + CeServiceID = "ce" // Ce. + ChimeServiceID = "chime" // Chime. + Cloud9ServiceID = "cloud9" // Cloud9. + ClouddirectoryServiceID = "clouddirectory" // Clouddirectory. + CloudformationServiceID = "cloudformation" // Cloudformation. + CloudfrontServiceID = "cloudfront" // Cloudfront. + CloudhsmServiceID = "cloudhsm" // Cloudhsm. + Cloudhsmv2ServiceID = "cloudhsmv2" // Cloudhsmv2. + CloudsearchServiceID = "cloudsearch" // Cloudsearch. + CloudtrailServiceID = "cloudtrail" // Cloudtrail. + CodebuildServiceID = "codebuild" // Codebuild. + CodecommitServiceID = "codecommit" // Codecommit. + CodedeployServiceID = "codedeploy" // Codedeploy. + CodepipelineServiceID = "codepipeline" // Codepipeline. + CodestarServiceID = "codestar" // Codestar. + CognitoIdentityServiceID = "cognito-identity" // CognitoIdentity. + CognitoIdpServiceID = "cognito-idp" // CognitoIdp. + CognitoSyncServiceID = "cognito-sync" // CognitoSync. + ComprehendServiceID = "comprehend" // Comprehend. + ConfigServiceID = "config" // Config. + CurServiceID = "cur" // Cur. + DatapipelineServiceID = "datapipeline" // Datapipeline. + DaxServiceID = "dax" // Dax. + DevicefarmServiceID = "devicefarm" // Devicefarm. + DirectconnectServiceID = "directconnect" // Directconnect. + DiscoveryServiceID = "discovery" // Discovery. + DmsServiceID = "dms" // Dms. + DsServiceID = "ds" // Ds. + DynamodbServiceID = "dynamodb" // Dynamodb. + Ec2ServiceID = "ec2" // Ec2. + Ec2metadataServiceID = "ec2metadata" // Ec2metadata. + EcrServiceID = "ecr" // Ecr. + EcsServiceID = "ecs" // Ecs. + ElasticacheServiceID = "elasticache" // Elasticache. + ElasticbeanstalkServiceID = "elasticbeanstalk" // Elasticbeanstalk. + ElasticfilesystemServiceID = "elasticfilesystem" // Elasticfilesystem. + ElasticloadbalancingServiceID = "elasticloadbalancing" // Elasticloadbalancing. + ElasticmapreduceServiceID = "elasticmapreduce" // Elasticmapreduce. + ElastictranscoderServiceID = "elastictranscoder" // Elastictranscoder. + EmailServiceID = "email" // Email. + EntitlementMarketplaceServiceID = "entitlement.marketplace" // EntitlementMarketplace. + EsServiceID = "es" // Es. + EventsServiceID = "events" // Events. + FirehoseServiceID = "firehose" // Firehose. + FmsServiceID = "fms" // Fms. + GameliftServiceID = "gamelift" // Gamelift. + GlacierServiceID = "glacier" // Glacier. + GlueServiceID = "glue" // Glue. + GreengrassServiceID = "greengrass" // Greengrass. + GuarddutyServiceID = "guardduty" // Guardduty. + HealthServiceID = "health" // Health. + IamServiceID = "iam" // Iam. + ImportexportServiceID = "importexport" // Importexport. + InspectorServiceID = "inspector" // Inspector. + IotServiceID = "iot" // Iot. + IotanalyticsServiceID = "iotanalytics" // Iotanalytics. + KinesisServiceID = "kinesis" // Kinesis. + KinesisanalyticsServiceID = "kinesisanalytics" // Kinesisanalytics. + KinesisvideoServiceID = "kinesisvideo" // Kinesisvideo. + KmsServiceID = "kms" // Kms. + LambdaServiceID = "lambda" // Lambda. + LightsailServiceID = "lightsail" // Lightsail. + LogsServiceID = "logs" // Logs. + MachinelearningServiceID = "machinelearning" // Machinelearning. + MarketplacecommerceanalyticsServiceID = "marketplacecommerceanalytics" // Marketplacecommerceanalytics. + MediaconvertServiceID = "mediaconvert" // Mediaconvert. + MedialiveServiceID = "medialive" // Medialive. + MediapackageServiceID = "mediapackage" // Mediapackage. + MediastoreServiceID = "mediastore" // Mediastore. + MeteringMarketplaceServiceID = "metering.marketplace" // MeteringMarketplace. + MghServiceID = "mgh" // Mgh. + MobileanalyticsServiceID = "mobileanalytics" // Mobileanalytics. + ModelsLexServiceID = "models.lex" // ModelsLex. + MonitoringServiceID = "monitoring" // Monitoring. + MturkRequesterServiceID = "mturk-requester" // MturkRequester. + NeptuneServiceID = "neptune" // Neptune. + OpsworksServiceID = "opsworks" // Opsworks. + OpsworksCmServiceID = "opsworks-cm" // OpsworksCm. + OrganizationsServiceID = "organizations" // Organizations. + PinpointServiceID = "pinpoint" // Pinpoint. + PollyServiceID = "polly" // Polly. + RdsServiceID = "rds" // Rds. + RedshiftServiceID = "redshift" // Redshift. + RekognitionServiceID = "rekognition" // Rekognition. + ResourceGroupsServiceID = "resource-groups" // ResourceGroups. + Route53ServiceID = "route53" // Route53. + Route53domainsServiceID = "route53domains" // Route53domains. + RuntimeLexServiceID = "runtime.lex" // RuntimeLex. + RuntimeSagemakerServiceID = "runtime.sagemaker" // RuntimeSagemaker. + S3ServiceID = "s3" // S3. + S3ControlServiceID = "s3-control" // S3Control. + SagemakerServiceID = "api.sagemaker" // Sagemaker. + SdbServiceID = "sdb" // Sdb. + SecretsmanagerServiceID = "secretsmanager" // Secretsmanager. + ServerlessrepoServiceID = "serverlessrepo" // Serverlessrepo. + ServicecatalogServiceID = "servicecatalog" // Servicecatalog. + ServicediscoveryServiceID = "servicediscovery" // Servicediscovery. + ShieldServiceID = "shield" // Shield. + SmsServiceID = "sms" // Sms. + SnowballServiceID = "snowball" // Snowball. + SnsServiceID = "sns" // Sns. + SqsServiceID = "sqs" // Sqs. + SsmServiceID = "ssm" // Ssm. + StatesServiceID = "states" // States. + StoragegatewayServiceID = "storagegateway" // Storagegateway. + StreamsDynamodbServiceID = "streams.dynamodb" // StreamsDynamodb. + StsServiceID = "sts" // Sts. + SupportServiceID = "support" // Support. + SwfServiceID = "swf" // Swf. + TaggingServiceID = "tagging" // Tagging. + TransferServiceID = "transfer" // Transfer. + TranslateServiceID = "translate" // Translate. + WafServiceID = "waf" // Waf. + WafRegionalServiceID = "waf-regional" // WafRegional. + WorkdocsServiceID = "workdocs" // Workdocs. + WorkmailServiceID = "workmail" // Workmail. + WorkspacesServiceID = "workspaces" // Workspaces. + XrayServiceID = "xray" // Xray. +) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go new file mode 100644 index 000000000..84316b92c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go @@ -0,0 +1,66 @@ +// Package endpoints provides the types and functionality for defining regions +// and endpoints, as well as querying those definitions. +// +// The SDK's Regions and Endpoints metadata is code generated into the endpoints +// package, and is accessible via the DefaultResolver function. This function +// returns a endpoint Resolver will search the metadata and build an associated +// endpoint if one is found. The default resolver will search all partitions +// known by the SDK. e.g AWS Standard (aws), AWS China (aws-cn), and +// AWS GovCloud (US) (aws-us-gov). +// . +// +// Enumerating Regions and Endpoint Metadata +// +// Casting the Resolver returned by DefaultResolver to a EnumPartitions interface +// will allow you to get access to the list of underlying Partitions with the +// Partitions method. This is helpful if you want to limit the SDK's endpoint +// resolving to a single partition, or enumerate regions, services, and endpoints +// in the partition. +// +// resolver := endpoints.DefaultResolver() +// partitions := resolver.(endpoints.EnumPartitions).Partitions() +// +// for _, p := range partitions { +// fmt.Println("Regions for", p.ID()) +// for id, _ := range p.Regions() { +// fmt.Println("*", id) +// } +// +// fmt.Println("Services for", p.ID()) +// for id, _ := range p.Services() { +// fmt.Println("*", id) +// } +// } +// +// Using Custom Endpoints +// +// The endpoints package also gives you the ability to use your own logic how +// endpoints are resolved. This is a great way to define a custom endpoint +// for select services, without passing that logic down through your code. +// +// If a type implements the Resolver interface it can be used to resolve +// endpoints. To use this with the SDK's Session and Config set the value +// of the type to the EndpointsResolver field of aws.Config when initializing +// the session, or service client. +// +// In addition the ResolverFunc is a wrapper for a func matching the signature +// of Resolver.EndpointFor, converting it to a type that satisfies the +// Resolver interface. +// +// +// myCustomResolver := func(service, region string, optFns ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) { +// if service == endpoints.S3ServiceID { +// return endpoints.ResolvedEndpoint{ +// URL: "s3.custom.endpoint.com", +// SigningRegion: "custom-signing-region", +// }, nil +// } +// +// return endpoints.DefaultResolver().EndpointFor(service, region, optFns...) +// } +// +// sess := session.Must(session.NewSession(&aws.Config{ +// Region: aws.String("us-west-2"), +// EndpointResolver: endpoints.ResolverFunc(myCustomResolver), +// })) +package endpoints diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go new file mode 100644 index 000000000..f82babf6f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go @@ -0,0 +1,449 @@ +package endpoints + +import ( + "fmt" + "regexp" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +// Options provide the configuration needed to direct how the +// endpoints will be resolved. +type Options struct { + // DisableSSL forces the endpoint to be resolved as HTTP. + // instead of HTTPS if the service supports it. + DisableSSL bool + + // Sets the resolver to resolve the endpoint as a dualstack endpoint + // for the service. If dualstack support for a service is not known and + // StrictMatching is not enabled a dualstack endpoint for the service will + // be returned. This endpoint may not be valid. If StrictMatching is + // enabled only services that are known to support dualstack will return + // dualstack endpoints. + UseDualStack bool + + // Enables strict matching of services and regions resolved endpoints. + // If the partition doesn't enumerate the exact service and region an + // error will be returned. This option will prevent returning endpoints + // that look valid, but may not resolve to any real endpoint. + StrictMatching bool + + // Enables resolving a service endpoint based on the region provided if the + // service does not exist. The service endpoint ID will be used as the service + // domain name prefix. By default the endpoint resolver requires the service + // to be known when resolving endpoints. + // + // If resolving an endpoint on the partition list the provided region will + // be used to determine which partition's domain name pattern to the service + // endpoint ID with. If both the service and region are unknown and resolving + // the endpoint on partition list an UnknownEndpointError error will be returned. + // + // If resolving and endpoint on a partition specific resolver that partition's + // domain name pattern will be used with the service endpoint ID. If both + // region and service do not exist when resolving an endpoint on a specific + // partition the partition's domain pattern will be used to combine the + // endpoint and region together. + // + // This option is ignored if StrictMatching is enabled. + ResolveUnknownService bool +} + +// Set combines all of the option functions together. +func (o *Options) Set(optFns ...func(*Options)) { + for _, fn := range optFns { + fn(o) + } +} + +// DisableSSLOption sets the DisableSSL options. Can be used as a functional +// option when resolving endpoints. +func DisableSSLOption(o *Options) { + o.DisableSSL = true +} + +// UseDualStackOption sets the UseDualStack option. Can be used as a functional +// option when resolving endpoints. +func UseDualStackOption(o *Options) { + o.UseDualStack = true +} + +// StrictMatchingOption sets the StrictMatching option. Can be used as a functional +// option when resolving endpoints. +func StrictMatchingOption(o *Options) { + o.StrictMatching = true +} + +// ResolveUnknownServiceOption sets the ResolveUnknownService option. Can be used +// as a functional option when resolving endpoints. +func ResolveUnknownServiceOption(o *Options) { + o.ResolveUnknownService = true +} + +// A Resolver provides the interface for functionality to resolve endpoints. +// The build in Partition and DefaultResolver return value satisfy this interface. +type Resolver interface { + EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) +} + +// ResolverFunc is a helper utility that wraps a function so it satisfies the +// Resolver interface. This is useful when you want to add additional endpoint +// resolving logic, or stub out specific endpoints with custom values. +type ResolverFunc func(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) + +// EndpointFor wraps the ResolverFunc function to satisfy the Resolver interface. +func (fn ResolverFunc) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) { + return fn(service, region, opts...) +} + +var schemeRE = regexp.MustCompile("^([^:]+)://") + +// AddScheme adds the HTTP or HTTPS schemes to a endpoint URL if there is no +// scheme. If disableSSL is true HTTP will set HTTP instead of the default HTTPS. +// +// If disableSSL is set, it will only set the URL's scheme if the URL does not +// contain a scheme. +func AddScheme(endpoint string, disableSSL bool) string { + if !schemeRE.MatchString(endpoint) { + scheme := "https" + if disableSSL { + scheme = "http" + } + endpoint = fmt.Sprintf("%s://%s", scheme, endpoint) + } + + return endpoint +} + +// EnumPartitions a provides a way to retrieve the underlying partitions that +// make up the SDK's default Resolver, or any resolver decoded from a model +// file. +// +// Use this interface with DefaultResolver and DecodeModels to get the list of +// Partitions. +type EnumPartitions interface { + Partitions() []Partition +} + +// RegionsForService returns a map of regions for the partition and service. +// If either the partition or service does not exist false will be returned +// as the second parameter. +// +// This example shows how to get the regions for DynamoDB in the AWS partition. +// rs, exists := endpoints.RegionsForService(endpoints.DefaultPartitions(), endpoints.AwsPartitionID, endpoints.DynamodbServiceID) +// +// This is equivalent to using the partition directly. +// rs := endpoints.AwsPartition().Services()[endpoints.DynamodbServiceID].Regions() +func RegionsForService(ps []Partition, partitionID, serviceID string) (map[string]Region, bool) { + for _, p := range ps { + if p.ID() != partitionID { + continue + } + if _, ok := p.p.Services[serviceID]; !ok { + break + } + + s := Service{ + id: serviceID, + p: p.p, + } + return s.Regions(), true + } + + return map[string]Region{}, false +} + +// PartitionForRegion returns the first partition which includes the region +// passed in. This includes both known regions and regions which match +// a pattern supported by the partition which may include regions that are +// not explicitly known by the partition. Use the Regions method of the +// returned Partition if explicit support is needed. +func PartitionForRegion(ps []Partition, regionID string) (Partition, bool) { + for _, p := range ps { + if _, ok := p.p.Regions[regionID]; ok || p.p.RegionRegex.MatchString(regionID) { + return p, true + } + } + + return Partition{}, false +} + +// A Partition provides the ability to enumerate the partition's regions +// and services. +type Partition struct { + id string + p *partition +} + +// ID returns the identifier of the partition. +func (p Partition) ID() string { return p.id } + +// EndpointFor attempts to resolve the endpoint based on service and region. +// See Options for information on configuring how the endpoint is resolved. +// +// If the service cannot be found in the metadata the UnknownServiceError +// error will be returned. This validation will occur regardless if +// StrictMatching is enabled. To enable resolving unknown services set the +// "ResolveUnknownService" option to true. When StrictMatching is disabled +// this option allows the partition resolver to resolve a endpoint based on +// the service endpoint ID provided. +// +// When resolving endpoints you can choose to enable StrictMatching. This will +// require the provided service and region to be known by the partition. +// If the endpoint cannot be strictly resolved an error will be returned. This +// mode is useful to ensure the endpoint resolved is valid. Without +// StrictMatching enabled the endpoint returned my look valid but may not work. +// StrictMatching requires the SDK to be updated if you want to take advantage +// of new regions and services expansions. +// +// Errors that can be returned. +// * UnknownServiceError +// * UnknownEndpointError +func (p Partition) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) { + return p.p.EndpointFor(service, region, opts...) +} + +// Regions returns a map of Regions indexed by their ID. This is useful for +// enumerating over the regions in a partition. +func (p Partition) Regions() map[string]Region { + rs := map[string]Region{} + for id, r := range p.p.Regions { + rs[id] = Region{ + id: id, + desc: r.Description, + p: p.p, + } + } + + return rs +} + +// Services returns a map of Service indexed by their ID. This is useful for +// enumerating over the services in a partition. +func (p Partition) Services() map[string]Service { + ss := map[string]Service{} + for id := range p.p.Services { + ss[id] = Service{ + id: id, + p: p.p, + } + } + + return ss +} + +// A Region provides information about a region, and ability to resolve an +// endpoint from the context of a region, given a service. +type Region struct { + id, desc string + p *partition +} + +// ID returns the region's identifier. +func (r Region) ID() string { return r.id } + +// Description returns the region's description. The region description +// is free text, it can be empty, and it may change between SDK releases. +func (r Region) Description() string { return r.desc } + +// ResolveEndpoint resolves an endpoint from the context of the region given +// a service. See Partition.EndpointFor for usage and errors that can be returned. +func (r Region) ResolveEndpoint(service string, opts ...func(*Options)) (ResolvedEndpoint, error) { + return r.p.EndpointFor(service, r.id, opts...) +} + +// Services returns a list of all services that are known to be in this region. +func (r Region) Services() map[string]Service { + ss := map[string]Service{} + for id, s := range r.p.Services { + if _, ok := s.Endpoints[r.id]; ok { + ss[id] = Service{ + id: id, + p: r.p, + } + } + } + + return ss +} + +// A Service provides information about a service, and ability to resolve an +// endpoint from the context of a service, given a region. +type Service struct { + id string + p *partition +} + +// ID returns the identifier for the service. +func (s Service) ID() string { return s.id } + +// ResolveEndpoint resolves an endpoint from the context of a service given +// a region. See Partition.EndpointFor for usage and errors that can be returned. +func (s Service) ResolveEndpoint(region string, opts ...func(*Options)) (ResolvedEndpoint, error) { + return s.p.EndpointFor(s.id, region, opts...) +} + +// Regions returns a map of Regions that the service is present in. +// +// A region is the AWS region the service exists in. Whereas a Endpoint is +// an URL that can be resolved to a instance of a service. +func (s Service) Regions() map[string]Region { + rs := map[string]Region{} + for id := range s.p.Services[s.id].Endpoints { + if r, ok := s.p.Regions[id]; ok { + rs[id] = Region{ + id: id, + desc: r.Description, + p: s.p, + } + } + } + + return rs +} + +// Endpoints returns a map of Endpoints indexed by their ID for all known +// endpoints for a service. +// +// A region is the AWS region the service exists in. Whereas a Endpoint is +// an URL that can be resolved to a instance of a service. +func (s Service) Endpoints() map[string]Endpoint { + es := map[string]Endpoint{} + for id := range s.p.Services[s.id].Endpoints { + es[id] = Endpoint{ + id: id, + serviceID: s.id, + p: s.p, + } + } + + return es +} + +// A Endpoint provides information about endpoints, and provides the ability +// to resolve that endpoint for the service, and the region the endpoint +// represents. +type Endpoint struct { + id string + serviceID string + p *partition +} + +// ID returns the identifier for an endpoint. +func (e Endpoint) ID() string { return e.id } + +// ServiceID returns the identifier the endpoint belongs to. +func (e Endpoint) ServiceID() string { return e.serviceID } + +// ResolveEndpoint resolves an endpoint from the context of a service and +// region the endpoint represents. See Partition.EndpointFor for usage and +// errors that can be returned. +func (e Endpoint) ResolveEndpoint(opts ...func(*Options)) (ResolvedEndpoint, error) { + return e.p.EndpointFor(e.serviceID, e.id, opts...) +} + +// A ResolvedEndpoint is an endpoint that has been resolved based on a partition +// service, and region. +type ResolvedEndpoint struct { + // The endpoint URL + URL string + + // The region that should be used for signing requests. + SigningRegion string + + // The service name that should be used for signing requests. + SigningName string + + // States that the signing name for this endpoint was derived from metadata + // passed in, but was not explicitly modeled. + SigningNameDerived bool + + // The signing method that should be used for signing requests. + SigningMethod string +} + +// So that the Error interface type can be included as an anonymous field +// in the requestError struct and not conflict with the error.Error() method. +type awsError awserr.Error + +// A EndpointNotFoundError is returned when in StrictMatching mode, and the +// endpoint for the service and region cannot be found in any of the partitions. +type EndpointNotFoundError struct { + awsError + Partition string + Service string + Region string +} + +// A UnknownServiceError is returned when the service does not resolve to an +// endpoint. Includes a list of all known services for the partition. Returned +// when a partition does not support the service. +type UnknownServiceError struct { + awsError + Partition string + Service string + Known []string +} + +// NewUnknownServiceError builds and returns UnknownServiceError. +func NewUnknownServiceError(p, s string, known []string) UnknownServiceError { + return UnknownServiceError{ + awsError: awserr.New("UnknownServiceError", + "could not resolve endpoint for unknown service", nil), + Partition: p, + Service: s, + Known: known, + } +} + +// String returns the string representation of the error. +func (e UnknownServiceError) Error() string { + extra := fmt.Sprintf("partition: %q, service: %q", + e.Partition, e.Service) + if len(e.Known) > 0 { + extra += fmt.Sprintf(", known: %v", e.Known) + } + return awserr.SprintError(e.Code(), e.Message(), extra, e.OrigErr()) +} + +// String returns the string representation of the error. +func (e UnknownServiceError) String() string { + return e.Error() +} + +// A UnknownEndpointError is returned when in StrictMatching mode and the +// service is valid, but the region does not resolve to an endpoint. Includes +// a list of all known endpoints for the service. +type UnknownEndpointError struct { + awsError + Partition string + Service string + Region string + Known []string +} + +// NewUnknownEndpointError builds and returns UnknownEndpointError. +func NewUnknownEndpointError(p, s, r string, known []string) UnknownEndpointError { + return UnknownEndpointError{ + awsError: awserr.New("UnknownEndpointError", + "could not resolve endpoint", nil), + Partition: p, + Service: s, + Region: r, + Known: known, + } +} + +// String returns the string representation of the error. +func (e UnknownEndpointError) Error() string { + extra := fmt.Sprintf("partition: %q, service: %q, region: %q", + e.Partition, e.Service, e.Region) + if len(e.Known) > 0 { + extra += fmt.Sprintf(", known: %v", e.Known) + } + return awserr.SprintError(e.Code(), e.Message(), extra, e.OrigErr()) +} + +// String returns the string representation of the error. +func (e UnknownEndpointError) String() string { + return e.Error() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go new file mode 100644 index 000000000..ff6f76db6 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go @@ -0,0 +1,307 @@ +package endpoints + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +type partitions []partition + +func (ps partitions) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) { + var opt Options + opt.Set(opts...) + + for i := 0; i < len(ps); i++ { + if !ps[i].canResolveEndpoint(service, region, opt.StrictMatching) { + continue + } + + return ps[i].EndpointFor(service, region, opts...) + } + + // If loose matching fallback to first partition format to use + // when resolving the endpoint. + if !opt.StrictMatching && len(ps) > 0 { + return ps[0].EndpointFor(service, region, opts...) + } + + return ResolvedEndpoint{}, NewUnknownEndpointError("all partitions", service, region, []string{}) +} + +// Partitions satisfies the EnumPartitions interface and returns a list +// of Partitions representing each partition represented in the SDK's +// endpoints model. +func (ps partitions) Partitions() []Partition { + parts := make([]Partition, 0, len(ps)) + for i := 0; i < len(ps); i++ { + parts = append(parts, ps[i].Partition()) + } + + return parts +} + +type partition struct { + ID string `json:"partition"` + Name string `json:"partitionName"` + DNSSuffix string `json:"dnsSuffix"` + RegionRegex regionRegex `json:"regionRegex"` + Defaults endpoint `json:"defaults"` + Regions regions `json:"regions"` + Services services `json:"services"` +} + +func (p partition) Partition() Partition { + return Partition{ + id: p.ID, + p: &p, + } +} + +func (p partition) canResolveEndpoint(service, region string, strictMatch bool) bool { + s, hasService := p.Services[service] + _, hasEndpoint := s.Endpoints[region] + + if hasEndpoint && hasService { + return true + } + + if strictMatch { + return false + } + + return p.RegionRegex.MatchString(region) +} + +func (p partition) EndpointFor(service, region string, opts ...func(*Options)) (resolved ResolvedEndpoint, err error) { + var opt Options + opt.Set(opts...) + + s, hasService := p.Services[service] + if !(hasService || opt.ResolveUnknownService) { + // Only return error if the resolver will not fallback to creating + // endpoint based on service endpoint ID passed in. + return resolved, NewUnknownServiceError(p.ID, service, serviceList(p.Services)) + } + + e, hasEndpoint := s.endpointForRegion(region) + if !hasEndpoint && opt.StrictMatching { + return resolved, NewUnknownEndpointError(p.ID, service, region, endpointList(s.Endpoints)) + } + + defs := []endpoint{p.Defaults, s.Defaults} + return e.resolve(service, region, p.DNSSuffix, defs, opt), nil +} + +func serviceList(ss services) []string { + list := make([]string, 0, len(ss)) + for k := range ss { + list = append(list, k) + } + return list +} +func endpointList(es endpoints) []string { + list := make([]string, 0, len(es)) + for k := range es { + list = append(list, k) + } + return list +} + +type regionRegex struct { + *regexp.Regexp +} + +func (rr *regionRegex) UnmarshalJSON(b []byte) (err error) { + // Strip leading and trailing quotes + regex, err := strconv.Unquote(string(b)) + if err != nil { + return fmt.Errorf("unable to strip quotes from regex, %v", err) + } + + rr.Regexp, err = regexp.Compile(regex) + if err != nil { + return fmt.Errorf("unable to unmarshal region regex, %v", err) + } + return nil +} + +type regions map[string]region + +type region struct { + Description string `json:"description"` +} + +type services map[string]service + +type service struct { + PartitionEndpoint string `json:"partitionEndpoint"` + IsRegionalized boxedBool `json:"isRegionalized,omitempty"` + Defaults endpoint `json:"defaults"` + Endpoints endpoints `json:"endpoints"` +} + +func (s *service) endpointForRegion(region string) (endpoint, bool) { + if s.IsRegionalized == boxedFalse { + return s.Endpoints[s.PartitionEndpoint], region == s.PartitionEndpoint + } + + if e, ok := s.Endpoints[region]; ok { + return e, true + } + + // Unable to find any matching endpoint, return + // blank that will be used for generic endpoint creation. + return endpoint{}, false +} + +type endpoints map[string]endpoint + +type endpoint struct { + Hostname string `json:"hostname"` + Protocols []string `json:"protocols"` + CredentialScope credentialScope `json:"credentialScope"` + + // Custom fields not modeled + HasDualStack boxedBool `json:"-"` + DualStackHostname string `json:"-"` + + // Signature Version not used + SignatureVersions []string `json:"signatureVersions"` + + // SSLCommonName not used. + SSLCommonName string `json:"sslCommonName"` +} + +const ( + defaultProtocol = "https" + defaultSigner = "v4" +) + +var ( + protocolPriority = []string{"https", "http"} + signerPriority = []string{"v4", "v2"} +) + +func getByPriority(s []string, p []string, def string) string { + if len(s) == 0 { + return def + } + + for i := 0; i < len(p); i++ { + for j := 0; j < len(s); j++ { + if s[j] == p[i] { + return s[j] + } + } + } + + return s[0] +} + +func (e endpoint) resolve(service, region, dnsSuffix string, defs []endpoint, opts Options) ResolvedEndpoint { + var merged endpoint + for _, def := range defs { + merged.mergeIn(def) + } + merged.mergeIn(e) + e = merged + + hostname := e.Hostname + + // Offset the hostname for dualstack if enabled + if opts.UseDualStack && e.HasDualStack == boxedTrue { + hostname = e.DualStackHostname + } + + u := strings.Replace(hostname, "{service}", service, 1) + u = strings.Replace(u, "{region}", region, 1) + u = strings.Replace(u, "{dnsSuffix}", dnsSuffix, 1) + + scheme := getEndpointScheme(e.Protocols, opts.DisableSSL) + u = fmt.Sprintf("%s://%s", scheme, u) + + signingRegion := e.CredentialScope.Region + if len(signingRegion) == 0 { + signingRegion = region + } + + signingName := e.CredentialScope.Service + var signingNameDerived bool + if len(signingName) == 0 { + signingName = service + signingNameDerived = true + } + + return ResolvedEndpoint{ + URL: u, + SigningRegion: signingRegion, + SigningName: signingName, + SigningNameDerived: signingNameDerived, + SigningMethod: getByPriority(e.SignatureVersions, signerPriority, defaultSigner), + } +} + +func getEndpointScheme(protocols []string, disableSSL bool) string { + if disableSSL { + return "http" + } + + return getByPriority(protocols, protocolPriority, defaultProtocol) +} + +func (e *endpoint) mergeIn(other endpoint) { + if len(other.Hostname) > 0 { + e.Hostname = other.Hostname + } + if len(other.Protocols) > 0 { + e.Protocols = other.Protocols + } + if len(other.SignatureVersions) > 0 { + e.SignatureVersions = other.SignatureVersions + } + if len(other.CredentialScope.Region) > 0 { + e.CredentialScope.Region = other.CredentialScope.Region + } + if len(other.CredentialScope.Service) > 0 { + e.CredentialScope.Service = other.CredentialScope.Service + } + if len(other.SSLCommonName) > 0 { + e.SSLCommonName = other.SSLCommonName + } + if other.HasDualStack != boxedBoolUnset { + e.HasDualStack = other.HasDualStack + } + if len(other.DualStackHostname) > 0 { + e.DualStackHostname = other.DualStackHostname + } +} + +type credentialScope struct { + Region string `json:"region"` + Service string `json:"service"` +} + +type boxedBool int + +func (b *boxedBool) UnmarshalJSON(buf []byte) error { + v, err := strconv.ParseBool(string(buf)) + if err != nil { + return err + } + + if v { + *b = boxedTrue + } else { + *b = boxedFalse + } + + return nil +} + +const ( + boxedBoolUnset boxedBool = iota + boxedFalse + boxedTrue +) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go new file mode 100644 index 000000000..0fdfcc56e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go @@ -0,0 +1,351 @@ +// +build codegen + +package endpoints + +import ( + "fmt" + "io" + "reflect" + "strings" + "text/template" + "unicode" +) + +// A CodeGenOptions are the options for code generating the endpoints into +// Go code from the endpoints model definition. +type CodeGenOptions struct { + // Options for how the model will be decoded. + DecodeModelOptions DecodeModelOptions + + // Disables code generation of the service endpoint prefix IDs defined in + // the model. + DisableGenerateServiceIDs bool +} + +// Set combines all of the option functions together +func (d *CodeGenOptions) Set(optFns ...func(*CodeGenOptions)) { + for _, fn := range optFns { + fn(d) + } +} + +// CodeGenModel given a endpoints model file will decode it and attempt to +// generate Go code from the model definition. Error will be returned if +// the code is unable to be generated, or decoded. +func CodeGenModel(modelFile io.Reader, outFile io.Writer, optFns ...func(*CodeGenOptions)) error { + var opts CodeGenOptions + opts.Set(optFns...) + + resolver, err := DecodeModel(modelFile, func(d *DecodeModelOptions) { + *d = opts.DecodeModelOptions + }) + if err != nil { + return err + } + + v := struct { + Resolver + CodeGenOptions + }{ + Resolver: resolver, + CodeGenOptions: opts, + } + + tmpl := template.Must(template.New("tmpl").Funcs(funcMap).Parse(v3Tmpl)) + if err := tmpl.ExecuteTemplate(outFile, "defaults", v); err != nil { + return fmt.Errorf("failed to execute template, %v", err) + } + + return nil +} + +func toSymbol(v string) string { + out := []rune{} + for _, c := range strings.Title(v) { + if !(unicode.IsNumber(c) || unicode.IsLetter(c)) { + continue + } + + out = append(out, c) + } + + return string(out) +} + +func quoteString(v string) string { + return fmt.Sprintf("%q", v) +} + +func regionConstName(p, r string) string { + return toSymbol(p) + toSymbol(r) +} + +func partitionGetter(id string) string { + return fmt.Sprintf("%sPartition", toSymbol(id)) +} + +func partitionVarName(id string) string { + return fmt.Sprintf("%sPartition", strings.ToLower(toSymbol(id))) +} + +func listPartitionNames(ps partitions) string { + names := []string{} + switch len(ps) { + case 1: + return ps[0].Name + case 2: + return fmt.Sprintf("%s and %s", ps[0].Name, ps[1].Name) + default: + for i, p := range ps { + if i == len(ps)-1 { + names = append(names, "and "+p.Name) + } else { + names = append(names, p.Name) + } + } + return strings.Join(names, ", ") + } +} + +func boxedBoolIfSet(msg string, v boxedBool) string { + switch v { + case boxedTrue: + return fmt.Sprintf(msg, "boxedTrue") + case boxedFalse: + return fmt.Sprintf(msg, "boxedFalse") + default: + return "" + } +} + +func stringIfSet(msg, v string) string { + if len(v) == 0 { + return "" + } + + return fmt.Sprintf(msg, v) +} + +func stringSliceIfSet(msg string, vs []string) string { + if len(vs) == 0 { + return "" + } + + names := []string{} + for _, v := range vs { + names = append(names, `"`+v+`"`) + } + + return fmt.Sprintf(msg, strings.Join(names, ",")) +} + +func endpointIsSet(v endpoint) bool { + return !reflect.DeepEqual(v, endpoint{}) +} + +func serviceSet(ps partitions) map[string]struct{} { + set := map[string]struct{}{} + for _, p := range ps { + for id := range p.Services { + set[id] = struct{}{} + } + } + + return set +} + +var funcMap = template.FuncMap{ + "ToSymbol": toSymbol, + "QuoteString": quoteString, + "RegionConst": regionConstName, + "PartitionGetter": partitionGetter, + "PartitionVarName": partitionVarName, + "ListPartitionNames": listPartitionNames, + "BoxedBoolIfSet": boxedBoolIfSet, + "StringIfSet": stringIfSet, + "StringSliceIfSet": stringSliceIfSet, + "EndpointIsSet": endpointIsSet, + "ServicesSet": serviceSet, +} + +const v3Tmpl = ` +{{ define "defaults" -}} +// Code generated by aws/endpoints/v3model_codegen.go. DO NOT EDIT. + +package endpoints + +import ( + "regexp" +) + + {{ template "partition consts" $.Resolver }} + + {{ range $_, $partition := $.Resolver }} + {{ template "partition region consts" $partition }} + {{ end }} + + {{ if not $.DisableGenerateServiceIDs -}} + {{ template "service consts" $.Resolver }} + {{- end }} + + {{ template "endpoint resolvers" $.Resolver }} +{{- end }} + +{{ define "partition consts" }} + // Partition identifiers + const ( + {{ range $_, $p := . -}} + {{ ToSymbol $p.ID }}PartitionID = {{ QuoteString $p.ID }} // {{ $p.Name }} partition. + {{ end -}} + ) +{{- end }} + +{{ define "partition region consts" }} + // {{ .Name }} partition's regions. + const ( + {{ range $id, $region := .Regions -}} + {{ ToSymbol $id }}RegionID = {{ QuoteString $id }} // {{ $region.Description }}. + {{ end -}} + ) +{{- end }} + +{{ define "service consts" }} + // Service identifiers + const ( + {{ $serviceSet := ServicesSet . -}} + {{ range $id, $_ := $serviceSet -}} + {{ ToSymbol $id }}ServiceID = {{ QuoteString $id }} // {{ ToSymbol $id }}. + {{ end -}} + ) +{{- end }} + +{{ define "endpoint resolvers" }} + // DefaultResolver returns an Endpoint resolver that will be able + // to resolve endpoints for: {{ ListPartitionNames . }}. + // + // Use DefaultPartitions() to get the list of the default partitions. + func DefaultResolver() Resolver { + return defaultPartitions + } + + // DefaultPartitions returns a list of the partitions the SDK is bundled + // with. The available partitions are: {{ ListPartitionNames . }}. + // + // partitions := endpoints.DefaultPartitions + // for _, p := range partitions { + // // ... inspect partitions + // } + func DefaultPartitions() []Partition { + return defaultPartitions.Partitions() + } + + var defaultPartitions = partitions{ + {{ range $_, $partition := . -}} + {{ PartitionVarName $partition.ID }}, + {{ end }} + } + + {{ range $_, $partition := . -}} + {{ $name := PartitionGetter $partition.ID -}} + // {{ $name }} returns the Resolver for {{ $partition.Name }}. + func {{ $name }}() Partition { + return {{ PartitionVarName $partition.ID }}.Partition() + } + var {{ PartitionVarName $partition.ID }} = {{ template "gocode Partition" $partition }} + {{ end }} +{{ end }} + +{{ define "default partitions" }} + func DefaultPartitions() []Partition { + return []partition{ + {{ range $_, $partition := . -}} + // {{ ToSymbol $partition.ID}}Partition(), + {{ end }} + } + } +{{ end }} + +{{ define "gocode Partition" -}} +partition{ + {{ StringIfSet "ID: %q,\n" .ID -}} + {{ StringIfSet "Name: %q,\n" .Name -}} + {{ StringIfSet "DNSSuffix: %q,\n" .DNSSuffix -}} + RegionRegex: {{ template "gocode RegionRegex" .RegionRegex }}, + {{ if EndpointIsSet .Defaults -}} + Defaults: {{ template "gocode Endpoint" .Defaults }}, + {{- end }} + Regions: {{ template "gocode Regions" .Regions }}, + Services: {{ template "gocode Services" .Services }}, +} +{{- end }} + +{{ define "gocode RegionRegex" -}} +regionRegex{ + Regexp: func() *regexp.Regexp{ + reg, _ := regexp.Compile({{ QuoteString .Regexp.String }}) + return reg + }(), +} +{{- end }} + +{{ define "gocode Regions" -}} +regions{ + {{ range $id, $region := . -}} + "{{ $id }}": {{ template "gocode Region" $region }}, + {{ end -}} +} +{{- end }} + +{{ define "gocode Region" -}} +region{ + {{ StringIfSet "Description: %q,\n" .Description -}} +} +{{- end }} + +{{ define "gocode Services" -}} +services{ + {{ range $id, $service := . -}} + "{{ $id }}": {{ template "gocode Service" $service }}, + {{ end }} +} +{{- end }} + +{{ define "gocode Service" -}} +service{ + {{ StringIfSet "PartitionEndpoint: %q,\n" .PartitionEndpoint -}} + {{ BoxedBoolIfSet "IsRegionalized: %s,\n" .IsRegionalized -}} + {{ if EndpointIsSet .Defaults -}} + Defaults: {{ template "gocode Endpoint" .Defaults -}}, + {{- end }} + {{ if .Endpoints -}} + Endpoints: {{ template "gocode Endpoints" .Endpoints }}, + {{- end }} +} +{{- end }} + +{{ define "gocode Endpoints" -}} +endpoints{ + {{ range $id, $endpoint := . -}} + "{{ $id }}": {{ template "gocode Endpoint" $endpoint }}, + {{ end }} +} +{{- end }} + +{{ define "gocode Endpoint" -}} +endpoint{ + {{ StringIfSet "Hostname: %q,\n" .Hostname -}} + {{ StringIfSet "SSLCommonName: %q,\n" .SSLCommonName -}} + {{ StringSliceIfSet "Protocols: []string{%s},\n" .Protocols -}} + {{ StringSliceIfSet "SignatureVersions: []string{%s},\n" .SignatureVersions -}} + {{ if or .CredentialScope.Region .CredentialScope.Service -}} + CredentialScope: credentialScope{ + {{ StringIfSet "Region: %q,\n" .CredentialScope.Region -}} + {{ StringIfSet "Service: %q,\n" .CredentialScope.Service -}} + }, + {{- end }} + {{ BoxedBoolIfSet "HasDualStack: %s,\n" .HasDualStack -}} + {{ StringIfSet "DualStackHostname: %q,\n" .DualStackHostname -}} + +} +{{- end }} +` diff --git a/vendor/github.com/aws/aws-sdk-go/aws/errors.go b/vendor/github.com/aws/aws-sdk-go/aws/errors.go new file mode 100644 index 000000000..fa06f7a8f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/errors.go @@ -0,0 +1,13 @@ +package aws + +import "github.com/aws/aws-sdk-go/aws/awserr" + +var ( + // ErrMissingRegion is an error that is returned if region configuration is + // not found. + ErrMissingRegion = awserr.New("MissingRegion", "could not find region configuration", nil) + + // ErrMissingEndpoint is an error that is returned if an endpoint cannot be + // resolved for a service. + ErrMissingEndpoint = awserr.New("MissingEndpoint", "'Endpoint' configuration is required for this service", nil) +) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go b/vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go new file mode 100644 index 000000000..91a6f277a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go @@ -0,0 +1,12 @@ +package aws + +// JSONValue is a representation of a grab bag type that will be marshaled +// into a json string. This type can be used just like any other map. +// +// Example: +// +// values := aws.JSONValue{ +// "Foo": "Bar", +// } +// values["Baz"] = "Qux" +type JSONValue map[string]interface{} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/logger.go b/vendor/github.com/aws/aws-sdk-go/aws/logger.go new file mode 100644 index 000000000..6ed15b2ec --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/logger.go @@ -0,0 +1,118 @@ +package aws + +import ( + "log" + "os" +) + +// A LogLevelType defines the level logging should be performed at. Used to instruct +// the SDK which statements should be logged. +type LogLevelType uint + +// LogLevel returns the pointer to a LogLevel. Should be used to workaround +// not being able to take the address of a non-composite literal. +func LogLevel(l LogLevelType) *LogLevelType { + return &l +} + +// Value returns the LogLevel value or the default value LogOff if the LogLevel +// is nil. Safe to use on nil value LogLevelTypes. +func (l *LogLevelType) Value() LogLevelType { + if l != nil { + return *l + } + return LogOff +} + +// Matches returns true if the v LogLevel is enabled by this LogLevel. Should be +// used with logging sub levels. Is safe to use on nil value LogLevelTypes. If +// LogLevel is nil, will default to LogOff comparison. +func (l *LogLevelType) Matches(v LogLevelType) bool { + c := l.Value() + return c&v == v +} + +// AtLeast returns true if this LogLevel is at least high enough to satisfies v. +// Is safe to use on nil value LogLevelTypes. If LogLevel is nil, will default +// to LogOff comparison. +func (l *LogLevelType) AtLeast(v LogLevelType) bool { + c := l.Value() + return c >= v +} + +const ( + // LogOff states that no logging should be performed by the SDK. This is the + // default state of the SDK, and should be use to disable all logging. + LogOff LogLevelType = iota * 0x1000 + + // LogDebug state that debug output should be logged by the SDK. This should + // be used to inspect request made and responses received. + LogDebug +) + +// Debug Logging Sub Levels +const ( + // LogDebugWithSigning states that the SDK should log request signing and + // presigning events. This should be used to log the signing details of + // requests for debugging. Will also enable LogDebug. + LogDebugWithSigning LogLevelType = LogDebug | (1 << iota) + + // LogDebugWithHTTPBody states the SDK should log HTTP request and response + // HTTP bodys in addition to the headers and path. This should be used to + // see the body content of requests and responses made while using the SDK + // Will also enable LogDebug. + LogDebugWithHTTPBody + + // LogDebugWithRequestRetries states the SDK should log when service requests will + // be retried. This should be used to log when you want to log when service + // requests are being retried. Will also enable LogDebug. + LogDebugWithRequestRetries + + // LogDebugWithRequestErrors states the SDK should log when service requests fail + // to build, send, validate, or unmarshal. + LogDebugWithRequestErrors + + // LogDebugWithEventStreamBody states the SDK should log EventStream + // request and response bodys. This should be used to log the EventStream + // wire unmarshaled message content of requests and responses made while + // using the SDK Will also enable LogDebug. + LogDebugWithEventStreamBody +) + +// A Logger is a minimalistic interface for the SDK to log messages to. Should +// be used to provide custom logging writers for the SDK to use. +type Logger interface { + Log(...interface{}) +} + +// A LoggerFunc is a convenience type to convert a function taking a variadic +// list of arguments and wrap it so the Logger interface can be used. +// +// Example: +// s3.New(sess, &aws.Config{Logger: aws.LoggerFunc(func(args ...interface{}) { +// fmt.Fprintln(os.Stdout, args...) +// })}) +type LoggerFunc func(...interface{}) + +// Log calls the wrapped function with the arguments provided +func (f LoggerFunc) Log(args ...interface{}) { + f(args...) +} + +// NewDefaultLogger returns a Logger which will write log messages to stdout, and +// use same formatting runes as the stdlib log.Logger +func NewDefaultLogger() Logger { + return &defaultLogger{ + logger: log.New(os.Stdout, "", log.LstdFlags), + } +} + +// A defaultLogger provides a minimalistic logger satisfying the Logger interface. +type defaultLogger struct { + logger *log.Logger +} + +// Log logs the parameters to the stdlib logger. See log.Println. +func (l defaultLogger) Log(args ...interface{}) { + l.logger.Println(args...) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go new file mode 100644 index 000000000..271da432c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go @@ -0,0 +1,19 @@ +// +build !appengine,!plan9 + +package request + +import ( + "net" + "os" + "syscall" +) + +func isErrConnectionReset(err error) bool { + if opErr, ok := err.(*net.OpError); ok { + if sysErr, ok := opErr.Err.(*os.SyscallError); ok { + return sysErr.Err == syscall.ECONNRESET + } + } + + return false +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go new file mode 100644 index 000000000..daf9eca43 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go @@ -0,0 +1,11 @@ +// +build appengine plan9 + +package request + +import ( + "strings" +) + +func isErrConnectionReset(err error) bool { + return strings.Contains(err.Error(), "connection reset") +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go new file mode 100644 index 000000000..8ef8548a9 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go @@ -0,0 +1,277 @@ +package request + +import ( + "fmt" + "strings" +) + +// A Handlers provides a collection of request handlers for various +// stages of handling requests. +type Handlers struct { + Validate HandlerList + Build HandlerList + Sign HandlerList + Send HandlerList + ValidateResponse HandlerList + Unmarshal HandlerList + UnmarshalStream HandlerList + UnmarshalMeta HandlerList + UnmarshalError HandlerList + Retry HandlerList + AfterRetry HandlerList + CompleteAttempt HandlerList + Complete HandlerList +} + +// Copy returns of this handler's lists. +func (h *Handlers) Copy() Handlers { + return Handlers{ + Validate: h.Validate.copy(), + Build: h.Build.copy(), + Sign: h.Sign.copy(), + Send: h.Send.copy(), + ValidateResponse: h.ValidateResponse.copy(), + Unmarshal: h.Unmarshal.copy(), + UnmarshalStream: h.UnmarshalStream.copy(), + UnmarshalError: h.UnmarshalError.copy(), + UnmarshalMeta: h.UnmarshalMeta.copy(), + Retry: h.Retry.copy(), + AfterRetry: h.AfterRetry.copy(), + CompleteAttempt: h.CompleteAttempt.copy(), + Complete: h.Complete.copy(), + } +} + +// Clear removes callback functions for all handlers +func (h *Handlers) Clear() { + h.Validate.Clear() + h.Build.Clear() + h.Send.Clear() + h.Sign.Clear() + h.Unmarshal.Clear() + h.UnmarshalStream.Clear() + h.UnmarshalMeta.Clear() + h.UnmarshalError.Clear() + h.ValidateResponse.Clear() + h.Retry.Clear() + h.AfterRetry.Clear() + h.CompleteAttempt.Clear() + h.Complete.Clear() +} + +// A HandlerListRunItem represents an entry in the HandlerList which +// is being run. +type HandlerListRunItem struct { + Index int + Handler NamedHandler + Request *Request +} + +// A HandlerList manages zero or more handlers in a list. +type HandlerList struct { + list []NamedHandler + + // Called after each request handler in the list is called. If set + // and the func returns true the HandlerList will continue to iterate + // over the request handlers. If false is returned the HandlerList + // will stop iterating. + // + // Should be used if extra logic to be performed between each handler + // in the list. This can be used to terminate a list's iteration + // based on a condition such as error like, HandlerListStopOnError. + // Or for logging like HandlerListLogItem. + AfterEachFn func(item HandlerListRunItem) bool +} + +// A NamedHandler is a struct that contains a name and function callback. +type NamedHandler struct { + Name string + Fn func(*Request) +} + +// copy creates a copy of the handler list. +func (l *HandlerList) copy() HandlerList { + n := HandlerList{ + AfterEachFn: l.AfterEachFn, + } + if len(l.list) == 0 { + return n + } + + n.list = append(make([]NamedHandler, 0, len(l.list)), l.list...) + return n +} + +// Clear clears the handler list. +func (l *HandlerList) Clear() { + l.list = l.list[0:0] +} + +// Len returns the number of handlers in the list. +func (l *HandlerList) Len() int { + return len(l.list) +} + +// PushBack pushes handler f to the back of the handler list. +func (l *HandlerList) PushBack(f func(*Request)) { + l.PushBackNamed(NamedHandler{"__anonymous", f}) +} + +// PushBackNamed pushes named handler f to the back of the handler list. +func (l *HandlerList) PushBackNamed(n NamedHandler) { + if cap(l.list) == 0 { + l.list = make([]NamedHandler, 0, 5) + } + l.list = append(l.list, n) +} + +// PushFront pushes handler f to the front of the handler list. +func (l *HandlerList) PushFront(f func(*Request)) { + l.PushFrontNamed(NamedHandler{"__anonymous", f}) +} + +// PushFrontNamed pushes named handler f to the front of the handler list. +func (l *HandlerList) PushFrontNamed(n NamedHandler) { + if cap(l.list) == len(l.list) { + // Allocating new list required + l.list = append([]NamedHandler{n}, l.list...) + } else { + // Enough room to prepend into list. + l.list = append(l.list, NamedHandler{}) + copy(l.list[1:], l.list) + l.list[0] = n + } +} + +// Remove removes a NamedHandler n +func (l *HandlerList) Remove(n NamedHandler) { + l.RemoveByName(n.Name) +} + +// RemoveByName removes a NamedHandler by name. +func (l *HandlerList) RemoveByName(name string) { + for i := 0; i < len(l.list); i++ { + m := l.list[i] + if m.Name == name { + // Shift array preventing creating new arrays + copy(l.list[i:], l.list[i+1:]) + l.list[len(l.list)-1] = NamedHandler{} + l.list = l.list[:len(l.list)-1] + + // decrement list so next check to length is correct + i-- + } + } +} + +// SwapNamed will swap out any existing handlers with the same name as the +// passed in NamedHandler returning true if handlers were swapped. False is +// returned otherwise. +func (l *HandlerList) SwapNamed(n NamedHandler) (swapped bool) { + for i := 0; i < len(l.list); i++ { + if l.list[i].Name == n.Name { + l.list[i].Fn = n.Fn + swapped = true + } + } + + return swapped +} + +// Swap will swap out all handlers matching the name passed in. The matched +// handlers will be swapped in. True is returned if the handlers were swapped. +func (l *HandlerList) Swap(name string, replace NamedHandler) bool { + var swapped bool + + for i := 0; i < len(l.list); i++ { + if l.list[i].Name == name { + l.list[i] = replace + swapped = true + } + } + + return swapped +} + +// SetBackNamed will replace the named handler if it exists in the handler list. +// If the handler does not exist the handler will be added to the end of the list. +func (l *HandlerList) SetBackNamed(n NamedHandler) { + if !l.SwapNamed(n) { + l.PushBackNamed(n) + } +} + +// SetFrontNamed will replace the named handler if it exists in the handler list. +// If the handler does not exist the handler will be added to the beginning of +// the list. +func (l *HandlerList) SetFrontNamed(n NamedHandler) { + if !l.SwapNamed(n) { + l.PushFrontNamed(n) + } +} + +// Run executes all handlers in the list with a given request object. +func (l *HandlerList) Run(r *Request) { + for i, h := range l.list { + h.Fn(r) + item := HandlerListRunItem{ + Index: i, Handler: h, Request: r, + } + if l.AfterEachFn != nil && !l.AfterEachFn(item) { + return + } + } +} + +// HandlerListLogItem logs the request handler and the state of the +// request's Error value. Always returns true to continue iterating +// request handlers in a HandlerList. +func HandlerListLogItem(item HandlerListRunItem) bool { + if item.Request.Config.Logger == nil { + return true + } + item.Request.Config.Logger.Log("DEBUG: RequestHandler", + item.Index, item.Handler.Name, item.Request.Error) + + return true +} + +// HandlerListStopOnError returns false to stop the HandlerList iterating +// over request handlers if Request.Error is not nil. True otherwise +// to continue iterating. +func HandlerListStopOnError(item HandlerListRunItem) bool { + return item.Request.Error == nil +} + +// WithAppendUserAgent will add a string to the user agent prefixed with a +// single white space. +func WithAppendUserAgent(s string) Option { + return func(r *Request) { + r.Handlers.Build.PushBack(func(r2 *Request) { + AddToUserAgent(r, s) + }) + } +} + +// MakeAddToUserAgentHandler will add the name/version pair to the User-Agent request +// header. If the extra parameters are provided they will be added as metadata to the +// name/version pair resulting in the following format. +// "name/version (extra0; extra1; ...)" +// The user agent part will be concatenated with this current request's user agent string. +func MakeAddToUserAgentHandler(name, version string, extra ...string) func(*Request) { + ua := fmt.Sprintf("%s/%s", name, version) + if len(extra) > 0 { + ua += fmt.Sprintf(" (%s)", strings.Join(extra, "; ")) + } + return func(r *Request) { + AddToUserAgent(r, ua) + } +} + +// MakeAddToUserAgentFreeFormHandler adds the input to the User-Agent request header. +// The input string will be concatenated with the current request's user agent string. +func MakeAddToUserAgentFreeFormHandler(s string) func(*Request) { + return func(r *Request) { + AddToUserAgent(r, s) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go new file mode 100644 index 000000000..79f79602b --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go @@ -0,0 +1,24 @@ +package request + +import ( + "io" + "net/http" + "net/url" +) + +func copyHTTPRequest(r *http.Request, body io.ReadCloser) *http.Request { + req := new(http.Request) + *req = *r + req.URL = &url.URL{} + *req.URL = *r.URL + req.Body = body + + req.Header = http.Header{} + for k, v := range r.Header { + for _, vv := range v { + req.Header.Add(k, vv) + } + } + + return req +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go new file mode 100644 index 000000000..b0c2ef4fe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go @@ -0,0 +1,60 @@ +package request + +import ( + "io" + "sync" + + "github.com/aws/aws-sdk-go/internal/sdkio" +) + +// offsetReader is a thread-safe io.ReadCloser to prevent racing +// with retrying requests +type offsetReader struct { + buf io.ReadSeeker + lock sync.Mutex + closed bool +} + +func newOffsetReader(buf io.ReadSeeker, offset int64) *offsetReader { + reader := &offsetReader{} + buf.Seek(offset, sdkio.SeekStart) + + reader.buf = buf + return reader +} + +// Close will close the instance of the offset reader's access to +// the underlying io.ReadSeeker. +func (o *offsetReader) Close() error { + o.lock.Lock() + defer o.lock.Unlock() + o.closed = true + return nil +} + +// Read is a thread-safe read of the underlying io.ReadSeeker +func (o *offsetReader) Read(p []byte) (int, error) { + o.lock.Lock() + defer o.lock.Unlock() + + if o.closed { + return 0, io.EOF + } + + return o.buf.Read(p) +} + +// Seek is a thread-safe seeking operation. +func (o *offsetReader) Seek(offset int64, whence int) (int64, error) { + o.lock.Lock() + defer o.lock.Unlock() + + return o.buf.Seek(offset, whence) +} + +// CloseAndCopy will return a new offsetReader with a copy of the old buffer +// and close the old buffer. +func (o *offsetReader) CloseAndCopy(offset int64) *offsetReader { + o.Close() + return newOffsetReader(o.buf, offset) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go new file mode 100644 index 000000000..19da3fcd8 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go @@ -0,0 +1,673 @@ +package request + +import ( + "bytes" + "fmt" + "io" + "net/http" + "net/url" + "reflect" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/internal/sdkio" +) + +const ( + // ErrCodeSerialization is the serialization error code that is received + // during protocol unmarshaling. + ErrCodeSerialization = "SerializationError" + + // ErrCodeRead is an error that is returned during HTTP reads. + ErrCodeRead = "ReadError" + + // ErrCodeResponseTimeout is the connection timeout error that is received + // during body reads. + ErrCodeResponseTimeout = "ResponseTimeout" + + // ErrCodeInvalidPresignExpire is returned when the expire time provided to + // presign is invalid + ErrCodeInvalidPresignExpire = "InvalidPresignExpireError" + + // CanceledErrorCode is the error code that will be returned by an + // API request that was canceled. Requests given a aws.Context may + // return this error when canceled. + CanceledErrorCode = "RequestCanceled" +) + +// A Request is the service request to be made. +type Request struct { + Config aws.Config + ClientInfo metadata.ClientInfo + Handlers Handlers + + Retryer + AttemptTime time.Time + Time time.Time + Operation *Operation + HTTPRequest *http.Request + HTTPResponse *http.Response + Body io.ReadSeeker + BodyStart int64 // offset from beginning of Body that the request body starts + Params interface{} + Error error + Data interface{} + RequestID string + RetryCount int + Retryable *bool + RetryDelay time.Duration + NotHoist bool + SignedHeaderVals http.Header + LastSignedAt time.Time + DisableFollowRedirects bool + + // A value greater than 0 instructs the request to be signed as Presigned URL + // You should not set this field directly. Instead use Request's + // Presign or PresignRequest methods. + ExpireTime time.Duration + + context aws.Context + + built bool + + // Need to persist an intermediate body between the input Body and HTTP + // request body because the HTTP Client's transport can maintain a reference + // to the HTTP request's body after the client has returned. This value is + // safe to use concurrently and wrap the input Body for each HTTP request. + safeBody *offsetReader +} + +// An Operation is the service API operation to be made. +type Operation struct { + Name string + HTTPMethod string + HTTPPath string + *Paginator + + BeforePresignFn func(r *Request) error +} + +// New returns a new Request pointer for the service API +// operation and parameters. +// +// Params is any value of input parameters to be the request payload. +// Data is pointer value to an object which the request's response +// payload will be deserialized to. +func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers, + retryer Retryer, operation *Operation, params interface{}, data interface{}) *Request { + + method := operation.HTTPMethod + if method == "" { + method = "POST" + } + + httpReq, _ := http.NewRequest(method, "", nil) + + var err error + httpReq.URL, err = url.Parse(clientInfo.Endpoint + operation.HTTPPath) + if err != nil { + httpReq.URL = &url.URL{} + err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err) + } + + SanitizeHostForHeader(httpReq) + + r := &Request{ + Config: cfg, + ClientInfo: clientInfo, + Handlers: handlers.Copy(), + + Retryer: retryer, + Time: time.Now(), + ExpireTime: 0, + Operation: operation, + HTTPRequest: httpReq, + Body: nil, + Params: params, + Error: err, + Data: data, + } + r.SetBufferBody([]byte{}) + + return r +} + +// A Option is a functional option that can augment or modify a request when +// using a WithContext API operation method. +type Option func(*Request) + +// WithGetResponseHeader builds a request Option which will retrieve a single +// header value from the HTTP Response. If there are multiple values for the +// header key use WithGetResponseHeaders instead to access the http.Header +// map directly. The passed in val pointer must be non-nil. +// +// This Option can be used multiple times with a single API operation. +// +// var id2, versionID string +// svc.PutObjectWithContext(ctx, params, +// request.WithGetResponseHeader("x-amz-id-2", &id2), +// request.WithGetResponseHeader("x-amz-version-id", &versionID), +// ) +func WithGetResponseHeader(key string, val *string) Option { + return func(r *Request) { + r.Handlers.Complete.PushBack(func(req *Request) { + *val = req.HTTPResponse.Header.Get(key) + }) + } +} + +// WithGetResponseHeaders builds a request Option which will retrieve the +// headers from the HTTP response and assign them to the passed in headers +// variable. The passed in headers pointer must be non-nil. +// +// var headers http.Header +// svc.PutObjectWithContext(ctx, params, request.WithGetResponseHeaders(&headers)) +func WithGetResponseHeaders(headers *http.Header) Option { + return func(r *Request) { + r.Handlers.Complete.PushBack(func(req *Request) { + *headers = req.HTTPResponse.Header + }) + } +} + +// WithLogLevel is a request option that will set the request to use a specific +// log level when the request is made. +// +// svc.PutObjectWithContext(ctx, params, request.WithLogLevel(aws.LogDebugWithHTTPBody) +func WithLogLevel(l aws.LogLevelType) Option { + return func(r *Request) { + r.Config.LogLevel = aws.LogLevel(l) + } +} + +// ApplyOptions will apply each option to the request calling them in the order +// the were provided. +func (r *Request) ApplyOptions(opts ...Option) { + for _, opt := range opts { + opt(r) + } +} + +// Context will always returns a non-nil context. If Request does not have a +// context aws.BackgroundContext will be returned. +func (r *Request) Context() aws.Context { + if r.context != nil { + return r.context + } + return aws.BackgroundContext() +} + +// SetContext adds a Context to the current request that can be used to cancel +// a in-flight request. The Context value must not be nil, or this method will +// panic. +// +// Unlike http.Request.WithContext, SetContext does not return a copy of the +// Request. It is not safe to use use a single Request value for multiple +// requests. A new Request should be created for each API operation request. +// +// Go 1.6 and below: +// The http.Request's Cancel field will be set to the Done() value of +// the context. This will overwrite the Cancel field's value. +// +// Go 1.7 and above: +// The http.Request.WithContext will be used to set the context on the underlying +// http.Request. This will create a shallow copy of the http.Request. The SDK +// may create sub contexts in the future for nested requests such as retries. +func (r *Request) SetContext(ctx aws.Context) { + if ctx == nil { + panic("context cannot be nil") + } + setRequestContext(r, ctx) +} + +// WillRetry returns if the request's can be retried. +func (r *Request) WillRetry() bool { + if !aws.IsReaderSeekable(r.Body) && r.HTTPRequest.Body != NoBody { + return false + } + return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries() +} + +// ParamsFilled returns if the request's parameters have been populated +// and the parameters are valid. False is returned if no parameters are +// provided or invalid. +func (r *Request) ParamsFilled() bool { + return r.Params != nil && reflect.ValueOf(r.Params).Elem().IsValid() +} + +// DataFilled returns true if the request's data for response deserialization +// target has been set and is a valid. False is returned if data is not +// set, or is invalid. +func (r *Request) DataFilled() bool { + return r.Data != nil && reflect.ValueOf(r.Data).Elem().IsValid() +} + +// SetBufferBody will set the request's body bytes that will be sent to +// the service API. +func (r *Request) SetBufferBody(buf []byte) { + r.SetReaderBody(bytes.NewReader(buf)) +} + +// SetStringBody sets the body of the request to be backed by a string. +func (r *Request) SetStringBody(s string) { + r.SetReaderBody(strings.NewReader(s)) +} + +// SetReaderBody will set the request's body reader. +func (r *Request) SetReaderBody(reader io.ReadSeeker) { + r.Body = reader + r.BodyStart, _ = reader.Seek(0, sdkio.SeekCurrent) // Get the Bodies current offset. + r.ResetBody() +} + +// Presign returns the request's signed URL. Error will be returned +// if the signing fails. The expire parameter is only used for presigned Amazon +// S3 API requests. All other AWS services will use a fixed expiration +// time of 15 minutes. +// +// It is invalid to create a presigned URL with a expire duration 0 or less. An +// error is returned if expire duration is 0 or less. +func (r *Request) Presign(expire time.Duration) (string, error) { + r = r.copy() + + // Presign requires all headers be hoisted. There is no way to retrieve + // the signed headers not hoisted without this. Making the presigned URL + // useless. + r.NotHoist = false + + u, _, err := getPresignedURL(r, expire) + return u, err +} + +// PresignRequest behaves just like presign, with the addition of returning a +// set of headers that were signed. The expire parameter is only used for +// presigned Amazon S3 API requests. All other AWS services will use a fixed +// expiration time of 15 minutes. +// +// It is invalid to create a presigned URL with a expire duration 0 or less. An +// error is returned if expire duration is 0 or less. +// +// Returns the URL string for the API operation with signature in the query string, +// and the HTTP headers that were included in the signature. These headers must +// be included in any HTTP request made with the presigned URL. +// +// To prevent hoisting any headers to the query string set NotHoist to true on +// this Request value prior to calling PresignRequest. +func (r *Request) PresignRequest(expire time.Duration) (string, http.Header, error) { + r = r.copy() + return getPresignedURL(r, expire) +} + +// IsPresigned returns true if the request represents a presigned API url. +func (r *Request) IsPresigned() bool { + return r.ExpireTime != 0 +} + +func getPresignedURL(r *Request, expire time.Duration) (string, http.Header, error) { + if expire <= 0 { + return "", nil, awserr.New( + ErrCodeInvalidPresignExpire, + "presigned URL requires an expire duration greater than 0", + nil, + ) + } + + r.ExpireTime = expire + + if r.Operation.BeforePresignFn != nil { + if err := r.Operation.BeforePresignFn(r); err != nil { + return "", nil, err + } + } + + if err := r.Sign(); err != nil { + return "", nil, err + } + + return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil +} + +func debugLogReqError(r *Request, stage string, retrying bool, err error) { + if !r.Config.LogLevel.Matches(aws.LogDebugWithRequestErrors) { + return + } + + retryStr := "not retrying" + if retrying { + retryStr = "will retry" + } + + r.Config.Logger.Log(fmt.Sprintf("DEBUG: %s %s/%s failed, %s, error %v", + stage, r.ClientInfo.ServiceName, r.Operation.Name, retryStr, err)) +} + +// Build will build the request's object so it can be signed and sent +// to the service. Build will also validate all the request's parameters. +// Any additional build Handlers set on this request will be run +// in the order they were set. +// +// The request will only be built once. Multiple calls to build will have +// no effect. +// +// If any Validate or Build errors occur the build will stop and the error +// which occurred will be returned. +func (r *Request) Build() error { + if !r.built { + r.Handlers.Validate.Run(r) + if r.Error != nil { + debugLogReqError(r, "Validate Request", false, r.Error) + return r.Error + } + r.Handlers.Build.Run(r) + if r.Error != nil { + debugLogReqError(r, "Build Request", false, r.Error) + return r.Error + } + r.built = true + } + + return r.Error +} + +// Sign will sign the request, returning error if errors are encountered. +// +// Sign will build the request prior to signing. All Sign Handlers will +// be executed in the order they were set. +func (r *Request) Sign() error { + r.Build() + if r.Error != nil { + debugLogReqError(r, "Build Request", false, r.Error) + return r.Error + } + + r.Handlers.Sign.Run(r) + return r.Error +} + +func (r *Request) getNextRequestBody() (io.ReadCloser, error) { + if r.safeBody != nil { + r.safeBody.Close() + } + + r.safeBody = newOffsetReader(r.Body, r.BodyStart) + + // Go 1.8 tightened and clarified the rules code needs to use when building + // requests with the http package. Go 1.8 removed the automatic detection + // of if the Request.Body was empty, or actually had bytes in it. The SDK + // always sets the Request.Body even if it is empty and should not actually + // be sent. This is incorrect. + // + // Go 1.8 did add a http.NoBody value that the SDK can use to tell the http + // client that the request really should be sent without a body. The + // Request.Body cannot be set to nil, which is preferable, because the + // field is exported and could introduce nil pointer dereferences for users + // of the SDK if they used that field. + // + // Related golang/go#18257 + l, err := aws.SeekerLen(r.Body) + if err != nil { + return nil, awserr.New(ErrCodeSerialization, "failed to compute request body size", err) + } + + var body io.ReadCloser + if l == 0 { + body = NoBody + } else if l > 0 { + body = r.safeBody + } else { + // Hack to prevent sending bodies for methods where the body + // should be ignored by the server. Sending bodies on these + // methods without an associated ContentLength will cause the + // request to socket timeout because the server does not handle + // Transfer-Encoding: chunked bodies for these methods. + // + // This would only happen if a aws.ReaderSeekerCloser was used with + // a io.Reader that was not also an io.Seeker, or did not implement + // Len() method. + switch r.Operation.HTTPMethod { + case "GET", "HEAD", "DELETE": + body = NoBody + default: + body = r.safeBody + } + } + + return body, nil +} + +// GetBody will return an io.ReadSeeker of the Request's underlying +// input body with a concurrency safe wrapper. +func (r *Request) GetBody() io.ReadSeeker { + return r.safeBody +} + +// Send will send the request, returning error if errors are encountered. +// +// Send will sign the request prior to sending. All Send Handlers will +// be executed in the order they were set. +// +// Canceling a request is non-deterministic. If a request has been canceled, +// then the transport will choose, randomly, one of the state channels during +// reads or getting the connection. +// +// readLoop() and getConn(req *Request, cm connectMethod) +// https://github.com/golang/go/blob/master/src/net/http/transport.go +// +// Send will not close the request.Request's body. +func (r *Request) Send() error { + defer func() { + // Regardless of success or failure of the request trigger the Complete + // request handlers. + r.Handlers.Complete.Run(r) + }() + + if err := r.Error; err != nil { + return err + } + + for { + r.Error = nil + r.AttemptTime = time.Now() + + if err := r.Sign(); err != nil { + debugLogReqError(r, "Sign Request", false, err) + return err + } + + if err := r.sendRequest(); err == nil { + return nil + } else if !shouldRetryCancel(r.Error) { + return err + } else { + r.Handlers.Retry.Run(r) + r.Handlers.AfterRetry.Run(r) + + if r.Error != nil || !aws.BoolValue(r.Retryable) { + return r.Error + } + + r.prepareRetry() + continue + } + } +} + +func (r *Request) prepareRetry() { + if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) { + r.Config.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d", + r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount)) + } + + // The previous http.Request will have a reference to the r.Body + // and the HTTP Client's Transport may still be reading from + // the request's body even though the Client's Do returned. + r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil) + r.ResetBody() + + // Closing response body to ensure that no response body is leaked + // between retry attempts. + if r.HTTPResponse != nil && r.HTTPResponse.Body != nil { + r.HTTPResponse.Body.Close() + } +} + +func (r *Request) sendRequest() (sendErr error) { + defer r.Handlers.CompleteAttempt.Run(r) + + r.Retryable = nil + r.Handlers.Send.Run(r) + if r.Error != nil { + debugLogReqError(r, "Send Request", r.WillRetry(), r.Error) + return r.Error + } + + r.Handlers.UnmarshalMeta.Run(r) + r.Handlers.ValidateResponse.Run(r) + if r.Error != nil { + r.Handlers.UnmarshalError.Run(r) + debugLogReqError(r, "Validate Response", r.WillRetry(), r.Error) + return r.Error + } + + r.Handlers.Unmarshal.Run(r) + if r.Error != nil { + debugLogReqError(r, "Unmarshal Response", r.WillRetry(), r.Error) + return r.Error + } + + return nil +} + +// copy will copy a request which will allow for local manipulation of the +// request. +func (r *Request) copy() *Request { + req := &Request{} + *req = *r + req.Handlers = r.Handlers.Copy() + op := *r.Operation + req.Operation = &op + return req +} + +// AddToUserAgent adds the string to the end of the request's current user agent. +func AddToUserAgent(r *Request, s string) { + curUA := r.HTTPRequest.Header.Get("User-Agent") + if len(curUA) > 0 { + s = curUA + " " + s + } + r.HTTPRequest.Header.Set("User-Agent", s) +} + +type temporary interface { + Temporary() bool +} + +func shouldRetryCancel(err error) bool { + switch err := err.(type) { + case awserr.Error: + if err.Code() == CanceledErrorCode { + return false + } + return shouldRetryCancel(err.OrigErr()) + case *url.Error: + if strings.Contains(err.Error(), "connection refused") { + // Refused connections should be retried as the service may not yet + // be running on the port. Go TCP dial considers refused + // connections as not temporary. + return true + } + // *url.Error only implements Temporary after golang 1.6 but since + // url.Error only wraps the error: + return shouldRetryCancel(err.Err) + case temporary: + // If the error is temporary, we want to allow continuation of the + // retry process + return err.Temporary() + case nil: + // `awserr.Error.OrigErr()` can be nil, meaning there was an error but + // because we don't know the cause, it is marked as retryable. See + // TestRequest4xxUnretryable for an example. + return true + default: + switch err.Error() { + case "net/http: request canceled", + "net/http: request canceled while waiting for connection": + // known 1.5 error case when an http request is cancelled + return false + } + // here we don't know the error; so we allow a retry. + return true + } +} + +// SanitizeHostForHeader removes default port from host and updates request.Host +func SanitizeHostForHeader(r *http.Request) { + host := getHost(r) + port := portOnly(host) + if port != "" && isDefaultPort(r.URL.Scheme, port) { + r.Host = stripPort(host) + } +} + +// Returns host from request +func getHost(r *http.Request) string { + if r.Host != "" { + return r.Host + } + + return r.URL.Host +} + +// Hostname returns u.Host, without any port number. +// +// If Host is an IPv6 literal with a port number, Hostname returns the +// IPv6 literal without the square brackets. IPv6 literals may include +// a zone identifier. +// +// Copied from the Go 1.8 standard library (net/url) +func stripPort(hostport string) string { + colon := strings.IndexByte(hostport, ':') + if colon == -1 { + return hostport + } + if i := strings.IndexByte(hostport, ']'); i != -1 { + return strings.TrimPrefix(hostport[:i], "[") + } + return hostport[:colon] +} + +// Port returns the port part of u.Host, without the leading colon. +// If u.Host doesn't contain a port, Port returns an empty string. +// +// Copied from the Go 1.8 standard library (net/url) +func portOnly(hostport string) string { + colon := strings.IndexByte(hostport, ':') + if colon == -1 { + return "" + } + if i := strings.Index(hostport, "]:"); i != -1 { + return hostport[i+len("]:"):] + } + if strings.Contains(hostport, "]") { + return "" + } + return hostport[colon+len(":"):] +} + +// Returns true if the specified URI is using the standard port +// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs) +func isDefaultPort(scheme, port string) bool { + if port == "" { + return true + } + + lowerCaseScheme := strings.ToLower(scheme) + if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") { + return true + } + + return false +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go new file mode 100644 index 000000000..e36e468b7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go @@ -0,0 +1,39 @@ +// +build !go1.8 + +package request + +import "io" + +// NoBody is an io.ReadCloser with no bytes. Read always returns EOF +// and Close always returns nil. It can be used in an outgoing client +// request to explicitly signal that a request has zero bytes. +// An alternative, however, is to simply set Request.Body to nil. +// +// Copy of Go 1.8 NoBody type from net/http/http.go +type noBody struct{} + +func (noBody) Read([]byte) (int, error) { return 0, io.EOF } +func (noBody) Close() error { return nil } +func (noBody) WriteTo(io.Writer) (int64, error) { return 0, nil } + +// NoBody is an empty reader that will trigger the Go HTTP client to not include +// and body in the HTTP request. +var NoBody = noBody{} + +// ResetBody rewinds the request body back to its starting position, and +// sets the HTTP Request body reference. When the body is read prior +// to being sent in the HTTP request it will need to be rewound. +// +// ResetBody will automatically be called by the SDK's build handler, but if +// the request is being used directly ResetBody must be called before the request +// is Sent. SetStringBody, SetBufferBody, and SetReaderBody will automatically +// call ResetBody. +func (r *Request) ResetBody() { + body, err := r.getNextRequestBody() + if err != nil { + r.Error = err + return + } + + r.HTTPRequest.Body = body +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go new file mode 100644 index 000000000..7c6a8000f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go @@ -0,0 +1,33 @@ +// +build go1.8 + +package request + +import ( + "net/http" +) + +// NoBody is a http.NoBody reader instructing Go HTTP client to not include +// and body in the HTTP request. +var NoBody = http.NoBody + +// ResetBody rewinds the request body back to its starting position, and +// sets the HTTP Request body reference. When the body is read prior +// to being sent in the HTTP request it will need to be rewound. +// +// ResetBody will automatically be called by the SDK's build handler, but if +// the request is being used directly ResetBody must be called before the request +// is Sent. SetStringBody, SetBufferBody, and SetReaderBody will automatically +// call ResetBody. +// +// Will also set the Go 1.8's http.Request.GetBody member to allow retrying +// PUT/POST redirects. +func (r *Request) ResetBody() { + body, err := r.getNextRequestBody() + if err != nil { + r.Error = err + return + } + + r.HTTPRequest.Body = body + r.HTTPRequest.GetBody = r.getNextRequestBody +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go new file mode 100644 index 000000000..a7365cd1e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go @@ -0,0 +1,14 @@ +// +build go1.7 + +package request + +import "github.com/aws/aws-sdk-go/aws" + +// setContext updates the Request to use the passed in context for cancellation. +// Context will also be used for request retry delay. +// +// Creates shallow copy of the http.Request with the WithContext method. +func setRequestContext(r *Request, ctx aws.Context) { + r.context = ctx + r.HTTPRequest = r.HTTPRequest.WithContext(ctx) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go new file mode 100644 index 000000000..307fa0705 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go @@ -0,0 +1,14 @@ +// +build !go1.7 + +package request + +import "github.com/aws/aws-sdk-go/aws" + +// setContext updates the Request to use the passed in context for cancellation. +// Context will also be used for request retry delay. +// +// Creates shallow copy of the http.Request with the WithContext method. +func setRequestContext(r *Request, ctx aws.Context) { + r.context = ctx + r.HTTPRequest.Cancel = ctx.Done() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go new file mode 100644 index 000000000..a633ed5ac --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go @@ -0,0 +1,264 @@ +package request + +import ( + "reflect" + "sync/atomic" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awsutil" +) + +// A Pagination provides paginating of SDK API operations which are paginatable. +// Generally you should not use this type directly, but use the "Pages" API +// operations method to automatically perform pagination for you. Such as, +// "S3.ListObjectsPages", and "S3.ListObjectsPagesWithContext" methods. +// +// Pagination differs from a Paginator type in that pagination is the type that +// does the pagination between API operations, and Paginator defines the +// configuration that will be used per page request. +// +// cont := true +// for p.Next() && cont { +// data := p.Page().(*s3.ListObjectsOutput) +// // process the page's data +// } +// return p.Err() +// +// See service client API operation Pages methods for examples how the SDK will +// use the Pagination type. +type Pagination struct { + // Function to return a Request value for each pagination request. + // Any configuration or handlers that need to be applied to the request + // prior to getting the next page should be done here before the request + // returned. + // + // NewRequest should always be built from the same API operations. It is + // undefined if different API operations are returned on subsequent calls. + NewRequest func() (*Request, error) + // EndPageOnSameToken, when enabled, will allow the paginator to stop on + // token that are the same as its previous tokens. + EndPageOnSameToken bool + + started bool + prevTokens []interface{} + nextTokens []interface{} + + err error + curPage interface{} +} + +// HasNextPage will return true if Pagination is able to determine that the API +// operation has additional pages. False will be returned if there are no more +// pages remaining. +// +// Will always return true if Next has not been called yet. +func (p *Pagination) HasNextPage() bool { + if !p.started { + return true + } + + hasNextPage := len(p.nextTokens) != 0 + if p.EndPageOnSameToken { + return hasNextPage && !awsutil.DeepEqual(p.nextTokens, p.prevTokens) + } + return hasNextPage +} + +// Err returns the error Pagination encountered when retrieving the next page. +func (p *Pagination) Err() error { + return p.err +} + +// Page returns the current page. Page should only be called after a successful +// call to Next. It is undefined what Page will return if Page is called after +// Next returns false. +func (p *Pagination) Page() interface{} { + return p.curPage +} + +// Next will attempt to retrieve the next page for the API operation. When a page +// is retrieved true will be returned. If the page cannot be retrieved, or there +// are no more pages false will be returned. +// +// Use the Page method to retrieve the current page data. The data will need +// to be cast to the API operation's output type. +// +// Use the Err method to determine if an error occurred if Page returns false. +func (p *Pagination) Next() bool { + if !p.HasNextPage() { + return false + } + + req, err := p.NewRequest() + if err != nil { + p.err = err + return false + } + + if p.started { + for i, intok := range req.Operation.InputTokens { + awsutil.SetValueAtPath(req.Params, intok, p.nextTokens[i]) + } + } + p.started = true + + err = req.Send() + if err != nil { + p.err = err + return false + } + + p.prevTokens = p.nextTokens + p.nextTokens = req.nextPageTokens() + p.curPage = req.Data + + return true +} + +// A Paginator is the configuration data that defines how an API operation +// should be paginated. This type is used by the API service models to define +// the generated pagination config for service APIs. +// +// The Pagination type is what provides iterating between pages of an API. It +// is only used to store the token metadata the SDK should use for performing +// pagination. +type Paginator struct { + InputTokens []string + OutputTokens []string + LimitToken string + TruncationToken string +} + +// nextPageTokens returns the tokens to use when asking for the next page of data. +func (r *Request) nextPageTokens() []interface{} { + if r.Operation.Paginator == nil { + return nil + } + if r.Operation.TruncationToken != "" { + tr, _ := awsutil.ValuesAtPath(r.Data, r.Operation.TruncationToken) + if len(tr) == 0 { + return nil + } + + switch v := tr[0].(type) { + case *bool: + if !aws.BoolValue(v) { + return nil + } + case bool: + if v == false { + return nil + } + } + } + + tokens := []interface{}{} + tokenAdded := false + for _, outToken := range r.Operation.OutputTokens { + vs, _ := awsutil.ValuesAtPath(r.Data, outToken) + if len(vs) == 0 { + tokens = append(tokens, nil) + continue + } + v := vs[0] + + switch tv := v.(type) { + case *string: + if len(aws.StringValue(tv)) == 0 { + tokens = append(tokens, nil) + continue + } + case string: + if len(tv) == 0 { + tokens = append(tokens, nil) + continue + } + } + + tokenAdded = true + tokens = append(tokens, v) + } + if !tokenAdded { + return nil + } + + return tokens +} + +// Ensure a deprecated item is only logged once instead of each time its used. +func logDeprecatedf(logger aws.Logger, flag *int32, msg string) { + if logger == nil { + return + } + if atomic.CompareAndSwapInt32(flag, 0, 1) { + logger.Log(msg) + } +} + +var ( + logDeprecatedHasNextPage int32 + logDeprecatedNextPage int32 + logDeprecatedEachPage int32 +) + +// HasNextPage returns true if this request has more pages of data available. +// +// Deprecated Use Pagination type for configurable pagination of API operations +func (r *Request) HasNextPage() bool { + logDeprecatedf(r.Config.Logger, &logDeprecatedHasNextPage, + "Request.HasNextPage deprecated. Use Pagination type for configurable pagination of API operations") + + return len(r.nextPageTokens()) > 0 +} + +// NextPage returns a new Request that can be executed to return the next +// page of result data. Call .Send() on this request to execute it. +// +// Deprecated Use Pagination type for configurable pagination of API operations +func (r *Request) NextPage() *Request { + logDeprecatedf(r.Config.Logger, &logDeprecatedNextPage, + "Request.NextPage deprecated. Use Pagination type for configurable pagination of API operations") + + tokens := r.nextPageTokens() + if len(tokens) == 0 { + return nil + } + + data := reflect.New(reflect.TypeOf(r.Data).Elem()).Interface() + nr := New(r.Config, r.ClientInfo, r.Handlers, r.Retryer, r.Operation, awsutil.CopyOf(r.Params), data) + for i, intok := range nr.Operation.InputTokens { + awsutil.SetValueAtPath(nr.Params, intok, tokens[i]) + } + return nr +} + +// EachPage iterates over each page of a paginated request object. The fn +// parameter should be a function with the following sample signature: +// +// func(page *T, lastPage bool) bool { +// return true // return false to stop iterating +// } +// +// Where "T" is the structure type matching the output structure of the given +// operation. For example, a request object generated by +// DynamoDB.ListTablesRequest() would expect to see dynamodb.ListTablesOutput +// as the structure "T". The lastPage value represents whether the page is +// the last page of data or not. The return value of this function should +// return true to keep iterating or false to stop. +// +// Deprecated Use Pagination type for configurable pagination of API operations +func (r *Request) EachPage(fn func(data interface{}, isLastPage bool) (shouldContinue bool)) error { + logDeprecatedf(r.Config.Logger, &logDeprecatedEachPage, + "Request.EachPage deprecated. Use Pagination type for configurable pagination of API operations") + + for page := r; page != nil; page = page.NextPage() { + if err := page.Send(); err != nil { + return err + } + if getNextPage := fn(page.Data, !page.HasNextPage()); !getNextPage { + return page.Error + } + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go new file mode 100644 index 000000000..d0aa54c6d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go @@ -0,0 +1,163 @@ +package request + +import ( + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" +) + +// Retryer is an interface to control retry logic for a given service. +// The default implementation used by most services is the client.DefaultRetryer +// structure, which contains basic retry logic using exponential backoff. +type Retryer interface { + RetryRules(*Request) time.Duration + ShouldRetry(*Request) bool + MaxRetries() int +} + +// WithRetryer sets a config Retryer value to the given Config returning it +// for chaining. +func WithRetryer(cfg *aws.Config, retryer Retryer) *aws.Config { + cfg.Retryer = retryer + return cfg +} + +// retryableCodes is a collection of service response codes which are retry-able +// without any further action. +var retryableCodes = map[string]struct{}{ + "RequestError": {}, + "RequestTimeout": {}, + ErrCodeResponseTimeout: {}, + "RequestTimeoutException": {}, // Glacier's flavor of RequestTimeout +} + +var throttleCodes = map[string]struct{}{ + "ProvisionedThroughputExceededException": {}, + "Throttling": {}, + "ThrottlingException": {}, + "RequestLimitExceeded": {}, + "RequestThrottled": {}, + "RequestThrottledException": {}, + "TooManyRequestsException": {}, // Lambda functions + "PriorRequestNotComplete": {}, // Route53 + "TransactionInProgressException": {}, +} + +// credsExpiredCodes is a collection of error codes which signify the credentials +// need to be refreshed. Expired tokens require refreshing of credentials, and +// resigning before the request can be retried. +var credsExpiredCodes = map[string]struct{}{ + "ExpiredToken": {}, + "ExpiredTokenException": {}, + "RequestExpired": {}, // EC2 Only +} + +func isCodeThrottle(code string) bool { + _, ok := throttleCodes[code] + return ok +} + +func isCodeRetryable(code string) bool { + if _, ok := retryableCodes[code]; ok { + return true + } + + return isCodeExpiredCreds(code) +} + +func isCodeExpiredCreds(code string) bool { + _, ok := credsExpiredCodes[code] + return ok +} + +var validParentCodes = map[string]struct{}{ + ErrCodeSerialization: {}, + ErrCodeRead: {}, +} + +type temporaryError interface { + Temporary() bool +} + +func isNestedErrorRetryable(parentErr awserr.Error) bool { + if parentErr == nil { + return false + } + + if _, ok := validParentCodes[parentErr.Code()]; !ok { + return false + } + + err := parentErr.OrigErr() + if err == nil { + return false + } + + if aerr, ok := err.(awserr.Error); ok { + return isCodeRetryable(aerr.Code()) + } + + if t, ok := err.(temporaryError); ok { + return t.Temporary() || isErrConnectionReset(err) + } + + return isErrConnectionReset(err) +} + +// IsErrorRetryable returns whether the error is retryable, based on its Code. +// Returns false if error is nil. +func IsErrorRetryable(err error) bool { + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + return isCodeRetryable(aerr.Code()) || isNestedErrorRetryable(aerr) + } + } + return false +} + +// IsErrorThrottle returns whether the error is to be throttled based on its code. +// Returns false if error is nil. +func IsErrorThrottle(err error) bool { + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + return isCodeThrottle(aerr.Code()) + } + } + return false +} + +// IsErrorExpiredCreds returns whether the error code is a credential expiry error. +// Returns false if error is nil. +func IsErrorExpiredCreds(err error) bool { + if err != nil { + if aerr, ok := err.(awserr.Error); ok { + return isCodeExpiredCreds(aerr.Code()) + } + } + return false +} + +// IsErrorRetryable returns whether the error is retryable, based on its Code. +// Returns false if the request has no Error set. +// +// Alias for the utility function IsErrorRetryable +func (r *Request) IsErrorRetryable() bool { + return IsErrorRetryable(r.Error) +} + +// IsErrorThrottle returns whether the error is to be throttled based on its code. +// Returns false if the request has no Error set +// +// Alias for the utility function IsErrorThrottle +func (r *Request) IsErrorThrottle() bool { + return IsErrorThrottle(r.Error) +} + +// IsErrorExpired returns whether the error code is a credential expiry error. +// Returns false if the request has no Error set. +// +// Alias for the utility function IsErrorExpiredCreds +func (r *Request) IsErrorExpired() bool { + return IsErrorExpiredCreds(r.Error) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go b/vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go new file mode 100644 index 000000000..09a44eb98 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go @@ -0,0 +1,94 @@ +package request + +import ( + "io" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +var timeoutErr = awserr.New( + ErrCodeResponseTimeout, + "read on body has reached the timeout limit", + nil, +) + +type readResult struct { + n int + err error +} + +// timeoutReadCloser will handle body reads that take too long. +// We will return a ErrReadTimeout error if a timeout occurs. +type timeoutReadCloser struct { + reader io.ReadCloser + duration time.Duration +} + +// Read will spin off a goroutine to call the reader's Read method. We will +// select on the timer's channel or the read's channel. Whoever completes first +// will be returned. +func (r *timeoutReadCloser) Read(b []byte) (int, error) { + timer := time.NewTimer(r.duration) + c := make(chan readResult, 1) + + go func() { + n, err := r.reader.Read(b) + timer.Stop() + c <- readResult{n: n, err: err} + }() + + select { + case data := <-c: + return data.n, data.err + case <-timer.C: + return 0, timeoutErr + } +} + +func (r *timeoutReadCloser) Close() error { + return r.reader.Close() +} + +const ( + // HandlerResponseTimeout is what we use to signify the name of the + // response timeout handler. + HandlerResponseTimeout = "ResponseTimeoutHandler" +) + +// adaptToResponseTimeoutError is a handler that will replace any top level error +// to a ErrCodeResponseTimeout, if its child is that. +func adaptToResponseTimeoutError(req *Request) { + if err, ok := req.Error.(awserr.Error); ok { + aerr, ok := err.OrigErr().(awserr.Error) + if ok && aerr.Code() == ErrCodeResponseTimeout { + req.Error = aerr + } + } +} + +// WithResponseReadTimeout is a request option that will wrap the body in a timeout read closer. +// This will allow for per read timeouts. If a timeout occurred, we will return the +// ErrCodeResponseTimeout. +// +// svc.PutObjectWithContext(ctx, params, request.WithTimeoutReadCloser(30 * time.Second) +func WithResponseReadTimeout(duration time.Duration) Option { + return func(r *Request) { + + var timeoutHandler = NamedHandler{ + HandlerResponseTimeout, + func(req *Request) { + req.HTTPResponse.Body = &timeoutReadCloser{ + reader: req.HTTPResponse.Body, + duration: duration, + } + }} + + // remove the handler so we are not stomping over any new durations. + r.Handlers.Send.RemoveByName(HandlerResponseTimeout) + r.Handlers.Send.PushBackNamed(timeoutHandler) + + r.Handlers.Unmarshal.PushBack(adaptToResponseTimeoutError) + r.Handlers.UnmarshalError.PushBack(adaptToResponseTimeoutError) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go b/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go new file mode 100644 index 000000000..8630683f3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go @@ -0,0 +1,286 @@ +package request + +import ( + "bytes" + "fmt" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +const ( + // InvalidParameterErrCode is the error code for invalid parameters errors + InvalidParameterErrCode = "InvalidParameter" + // ParamRequiredErrCode is the error code for required parameter errors + ParamRequiredErrCode = "ParamRequiredError" + // ParamMinValueErrCode is the error code for fields with too low of a + // number value. + ParamMinValueErrCode = "ParamMinValueError" + // ParamMinLenErrCode is the error code for fields without enough elements. + ParamMinLenErrCode = "ParamMinLenError" + // ParamMaxLenErrCode is the error code for value being too long. + ParamMaxLenErrCode = "ParamMaxLenError" + + // ParamFormatErrCode is the error code for a field with invalid + // format or characters. + ParamFormatErrCode = "ParamFormatInvalidError" +) + +// Validator provides a way for types to perform validation logic on their +// input values that external code can use to determine if a type's values +// are valid. +type Validator interface { + Validate() error +} + +// An ErrInvalidParams provides wrapping of invalid parameter errors found when +// validating API operation input parameters. +type ErrInvalidParams struct { + // Context is the base context of the invalid parameter group. + Context string + errs []ErrInvalidParam +} + +// Add adds a new invalid parameter error to the collection of invalid +// parameters. The context of the invalid parameter will be updated to reflect +// this collection. +func (e *ErrInvalidParams) Add(err ErrInvalidParam) { + err.SetContext(e.Context) + e.errs = append(e.errs, err) +} + +// AddNested adds the invalid parameter errors from another ErrInvalidParams +// value into this collection. The nested errors will have their nested context +// updated and base context to reflect the merging. +// +// Use for nested validations errors. +func (e *ErrInvalidParams) AddNested(nestedCtx string, nested ErrInvalidParams) { + for _, err := range nested.errs { + err.SetContext(e.Context) + err.AddNestedContext(nestedCtx) + e.errs = append(e.errs, err) + } +} + +// Len returns the number of invalid parameter errors +func (e ErrInvalidParams) Len() int { + return len(e.errs) +} + +// Code returns the code of the error +func (e ErrInvalidParams) Code() string { + return InvalidParameterErrCode +} + +// Message returns the message of the error +func (e ErrInvalidParams) Message() string { + return fmt.Sprintf("%d validation error(s) found.", len(e.errs)) +} + +// Error returns the string formatted form of the invalid parameters. +func (e ErrInvalidParams) Error() string { + w := &bytes.Buffer{} + fmt.Fprintf(w, "%s: %s\n", e.Code(), e.Message()) + + for _, err := range e.errs { + fmt.Fprintf(w, "- %s\n", err.Message()) + } + + return w.String() +} + +// OrigErr returns the invalid parameters as a awserr.BatchedErrors value +func (e ErrInvalidParams) OrigErr() error { + return awserr.NewBatchError( + InvalidParameterErrCode, e.Message(), e.OrigErrs()) +} + +// OrigErrs returns a slice of the invalid parameters +func (e ErrInvalidParams) OrigErrs() []error { + errs := make([]error, len(e.errs)) + for i := 0; i < len(errs); i++ { + errs[i] = e.errs[i] + } + + return errs +} + +// An ErrInvalidParam represents an invalid parameter error type. +type ErrInvalidParam interface { + awserr.Error + + // Field name the error occurred on. + Field() string + + // SetContext updates the context of the error. + SetContext(string) + + // AddNestedContext updates the error's context to include a nested level. + AddNestedContext(string) +} + +type errInvalidParam struct { + context string + nestedContext string + field string + code string + msg string +} + +// Code returns the error code for the type of invalid parameter. +func (e *errInvalidParam) Code() string { + return e.code +} + +// Message returns the reason the parameter was invalid, and its context. +func (e *errInvalidParam) Message() string { + return fmt.Sprintf("%s, %s.", e.msg, e.Field()) +} + +// Error returns the string version of the invalid parameter error. +func (e *errInvalidParam) Error() string { + return fmt.Sprintf("%s: %s", e.code, e.Message()) +} + +// OrigErr returns nil, Implemented for awserr.Error interface. +func (e *errInvalidParam) OrigErr() error { + return nil +} + +// Field Returns the field and context the error occurred. +func (e *errInvalidParam) Field() string { + field := e.context + if len(field) > 0 { + field += "." + } + if len(e.nestedContext) > 0 { + field += fmt.Sprintf("%s.", e.nestedContext) + } + field += e.field + + return field +} + +// SetContext updates the base context of the error. +func (e *errInvalidParam) SetContext(ctx string) { + e.context = ctx +} + +// AddNestedContext prepends a context to the field's path. +func (e *errInvalidParam) AddNestedContext(ctx string) { + if len(e.nestedContext) == 0 { + e.nestedContext = ctx + } else { + e.nestedContext = fmt.Sprintf("%s.%s", ctx, e.nestedContext) + } + +} + +// An ErrParamRequired represents an required parameter error. +type ErrParamRequired struct { + errInvalidParam +} + +// NewErrParamRequired creates a new required parameter error. +func NewErrParamRequired(field string) *ErrParamRequired { + return &ErrParamRequired{ + errInvalidParam{ + code: ParamRequiredErrCode, + field: field, + msg: fmt.Sprintf("missing required field"), + }, + } +} + +// An ErrParamMinValue represents a minimum value parameter error. +type ErrParamMinValue struct { + errInvalidParam + min float64 +} + +// NewErrParamMinValue creates a new minimum value parameter error. +func NewErrParamMinValue(field string, min float64) *ErrParamMinValue { + return &ErrParamMinValue{ + errInvalidParam: errInvalidParam{ + code: ParamMinValueErrCode, + field: field, + msg: fmt.Sprintf("minimum field value of %v", min), + }, + min: min, + } +} + +// MinValue returns the field's require minimum value. +// +// float64 is returned for both int and float min values. +func (e *ErrParamMinValue) MinValue() float64 { + return e.min +} + +// An ErrParamMinLen represents a minimum length parameter error. +type ErrParamMinLen struct { + errInvalidParam + min int +} + +// NewErrParamMinLen creates a new minimum length parameter error. +func NewErrParamMinLen(field string, min int) *ErrParamMinLen { + return &ErrParamMinLen{ + errInvalidParam: errInvalidParam{ + code: ParamMinLenErrCode, + field: field, + msg: fmt.Sprintf("minimum field size of %v", min), + }, + min: min, + } +} + +// MinLen returns the field's required minimum length. +func (e *ErrParamMinLen) MinLen() int { + return e.min +} + +// An ErrParamMaxLen represents a maximum length parameter error. +type ErrParamMaxLen struct { + errInvalidParam + max int +} + +// NewErrParamMaxLen creates a new maximum length parameter error. +func NewErrParamMaxLen(field string, max int, value string) *ErrParamMaxLen { + return &ErrParamMaxLen{ + errInvalidParam: errInvalidParam{ + code: ParamMaxLenErrCode, + field: field, + msg: fmt.Sprintf("maximum size of %v, %v", max, value), + }, + max: max, + } +} + +// MaxLen returns the field's required minimum length. +func (e *ErrParamMaxLen) MaxLen() int { + return e.max +} + +// An ErrParamFormat represents a invalid format parameter error. +type ErrParamFormat struct { + errInvalidParam + format string +} + +// NewErrParamFormat creates a new invalid format parameter error. +func NewErrParamFormat(field string, format, value string) *ErrParamFormat { + return &ErrParamFormat{ + errInvalidParam: errInvalidParam{ + code: ParamFormatErrCode, + field: field, + msg: fmt.Sprintf("format %v, %v", format, value), + }, + format: format, + } +} + +// Format returns the field's required format. +func (e *ErrParamFormat) Format() string { + return e.format +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go b/vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go new file mode 100644 index 000000000..4601f883c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go @@ -0,0 +1,295 @@ +package request + +import ( + "fmt" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/awsutil" +) + +// WaiterResourceNotReadyErrorCode is the error code returned by a waiter when +// the waiter's max attempts have been exhausted. +const WaiterResourceNotReadyErrorCode = "ResourceNotReady" + +// A WaiterOption is a function that will update the Waiter value's fields to +// configure the waiter. +type WaiterOption func(*Waiter) + +// WithWaiterMaxAttempts returns the maximum number of times the waiter should +// attempt to check the resource for the target state. +func WithWaiterMaxAttempts(max int) WaiterOption { + return func(w *Waiter) { + w.MaxAttempts = max + } +} + +// WaiterDelay will return a delay the waiter should pause between attempts to +// check the resource state. The passed in attempt is the number of times the +// Waiter has checked the resource state. +// +// Attempt is the number of attempts the Waiter has made checking the resource +// state. +type WaiterDelay func(attempt int) time.Duration + +// ConstantWaiterDelay returns a WaiterDelay that will always return a constant +// delay the waiter should use between attempts. It ignores the number of +// attempts made. +func ConstantWaiterDelay(delay time.Duration) WaiterDelay { + return func(attempt int) time.Duration { + return delay + } +} + +// WithWaiterDelay will set the Waiter to use the WaiterDelay passed in. +func WithWaiterDelay(delayer WaiterDelay) WaiterOption { + return func(w *Waiter) { + w.Delay = delayer + } +} + +// WithWaiterLogger returns a waiter option to set the logger a waiter +// should use to log warnings and errors to. +func WithWaiterLogger(logger aws.Logger) WaiterOption { + return func(w *Waiter) { + w.Logger = logger + } +} + +// WithWaiterRequestOptions returns a waiter option setting the request +// options for each request the waiter makes. Appends to waiter's request +// options already set. +func WithWaiterRequestOptions(opts ...Option) WaiterOption { + return func(w *Waiter) { + w.RequestOptions = append(w.RequestOptions, opts...) + } +} + +// A Waiter provides the functionality to perform a blocking call which will +// wait for a resource state to be satisfied by a service. +// +// This type should not be used directly. The API operations provided in the +// service packages prefixed with "WaitUntil" should be used instead. +type Waiter struct { + Name string + Acceptors []WaiterAcceptor + Logger aws.Logger + + MaxAttempts int + Delay WaiterDelay + + RequestOptions []Option + NewRequest func([]Option) (*Request, error) + SleepWithContext func(aws.Context, time.Duration) error +} + +// ApplyOptions updates the waiter with the list of waiter options provided. +func (w *Waiter) ApplyOptions(opts ...WaiterOption) { + for _, fn := range opts { + fn(w) + } +} + +// WaiterState are states the waiter uses based on WaiterAcceptor definitions +// to identify if the resource state the waiter is waiting on has occurred. +type WaiterState int + +// String returns the string representation of the waiter state. +func (s WaiterState) String() string { + switch s { + case SuccessWaiterState: + return "success" + case FailureWaiterState: + return "failure" + case RetryWaiterState: + return "retry" + default: + return "unknown waiter state" + } +} + +// States the waiter acceptors will use to identify target resource states. +const ( + SuccessWaiterState WaiterState = iota // waiter successful + FailureWaiterState // waiter failed + RetryWaiterState // waiter needs to be retried +) + +// WaiterMatchMode is the mode that the waiter will use to match the WaiterAcceptor +// definition's Expected attribute. +type WaiterMatchMode int + +// Modes the waiter will use when inspecting API response to identify target +// resource states. +const ( + PathAllWaiterMatch WaiterMatchMode = iota // match on all paths + PathWaiterMatch // match on specific path + PathAnyWaiterMatch // match on any path + PathListWaiterMatch // match on list of paths + StatusWaiterMatch // match on status code + ErrorWaiterMatch // match on error +) + +// String returns the string representation of the waiter match mode. +func (m WaiterMatchMode) String() string { + switch m { + case PathAllWaiterMatch: + return "pathAll" + case PathWaiterMatch: + return "path" + case PathAnyWaiterMatch: + return "pathAny" + case PathListWaiterMatch: + return "pathList" + case StatusWaiterMatch: + return "status" + case ErrorWaiterMatch: + return "error" + default: + return "unknown waiter match mode" + } +} + +// WaitWithContext will make requests for the API operation using NewRequest to +// build API requests. The request's response will be compared against the +// Waiter's Acceptors to determine the successful state of the resource the +// waiter is inspecting. +// +// The passed in context must not be nil. If it is nil a panic will occur. The +// Context will be used to cancel the waiter's pending requests and retry delays. +// Use aws.BackgroundContext if no context is available. +// +// The waiter will continue until the target state defined by the Acceptors, +// or the max attempts expires. +// +// Will return the WaiterResourceNotReadyErrorCode error code if the waiter's +// retryer ShouldRetry returns false. This normally will happen when the max +// wait attempts expires. +func (w Waiter) WaitWithContext(ctx aws.Context) error { + + for attempt := 1; ; attempt++ { + req, err := w.NewRequest(w.RequestOptions) + if err != nil { + waiterLogf(w.Logger, "unable to create request %v", err) + return err + } + req.Handlers.Build.PushBack(MakeAddToUserAgentFreeFormHandler("Waiter")) + err = req.Send() + + // See if any of the acceptors match the request's response, or error + for _, a := range w.Acceptors { + if matched, matchErr := a.match(w.Name, w.Logger, req, err); matched { + return matchErr + } + } + + // The Waiter should only check the resource state MaxAttempts times + // This is here instead of in the for loop above to prevent delaying + // unnecessary when the waiter will not retry. + if attempt == w.MaxAttempts { + break + } + + // Delay to wait before inspecting the resource again + delay := w.Delay(attempt) + if sleepFn := req.Config.SleepDelay; sleepFn != nil { + // Support SleepDelay for backwards compatibility and testing + sleepFn(delay) + } else { + sleepCtxFn := w.SleepWithContext + if sleepCtxFn == nil { + sleepCtxFn = aws.SleepWithContext + } + + if err := sleepCtxFn(ctx, delay); err != nil { + return awserr.New(CanceledErrorCode, "waiter context canceled", err) + } + } + } + + return awserr.New(WaiterResourceNotReadyErrorCode, "exceeded wait attempts", nil) +} + +// A WaiterAcceptor provides the information needed to wait for an API operation +// to complete. +type WaiterAcceptor struct { + State WaiterState + Matcher WaiterMatchMode + Argument string + Expected interface{} +} + +// match returns if the acceptor found a match with the passed in request +// or error. True is returned if the acceptor made a match, error is returned +// if there was an error attempting to perform the match. +func (a *WaiterAcceptor) match(name string, l aws.Logger, req *Request, err error) (bool, error) { + result := false + var vals []interface{} + + switch a.Matcher { + case PathAllWaiterMatch, PathWaiterMatch: + // Require all matches to be equal for result to match + vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument) + if len(vals) == 0 { + break + } + result = true + for _, val := range vals { + if !awsutil.DeepEqual(val, a.Expected) { + result = false + break + } + } + case PathAnyWaiterMatch: + // Only a single match needs to equal for the result to match + vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument) + for _, val := range vals { + if awsutil.DeepEqual(val, a.Expected) { + result = true + break + } + } + case PathListWaiterMatch: + // ignored matcher + case StatusWaiterMatch: + s := a.Expected.(int) + result = s == req.HTTPResponse.StatusCode + case ErrorWaiterMatch: + if aerr, ok := err.(awserr.Error); ok { + result = aerr.Code() == a.Expected.(string) + } + default: + waiterLogf(l, "WARNING: Waiter %s encountered unexpected matcher: %s", + name, a.Matcher) + } + + if !result { + // If there was no matching result found there is nothing more to do + // for this response, retry the request. + return false, nil + } + + switch a.State { + case SuccessWaiterState: + // waiter completed + return true, nil + case FailureWaiterState: + // Waiter failure state triggered + return true, awserr.New(WaiterResourceNotReadyErrorCode, + "failed waiting for successful resource state", err) + case RetryWaiterState: + // clear the error and retry the operation + return false, nil + default: + waiterLogf(l, "WARNING: Waiter %s encountered unexpected state: %s", + name, a.State) + return false, nil + } +} + +func waiterLogf(logger aws.Logger, msg string, args ...interface{}) { + if logger != nil { + logger.Log(fmt.Sprintf(msg, args...)) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go new file mode 100644 index 000000000..ea9ebb6f6 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go @@ -0,0 +1,26 @@ +// +build go1.7 + +package session + +import ( + "net" + "net/http" + "time" +) + +// Transport that should be used when a custom CA bundle is specified with the +// SDK. +func getCABundleTransport() *http.Transport { + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + }).DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go new file mode 100644 index 000000000..fec39dfc1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go @@ -0,0 +1,22 @@ +// +build !go1.6,go1.5 + +package session + +import ( + "net" + "net/http" + "time" +) + +// Transport that should be used when a custom CA bundle is specified with the +// SDK. +func getCABundleTransport() *http.Transport { + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go new file mode 100644 index 000000000..1c5a5391e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go @@ -0,0 +1,23 @@ +// +build !go1.7,go1.6 + +package session + +import ( + "net" + "net/http" + "time" +) + +// Transport that should be used when a custom CA bundle is specified with the +// SDK. +func getCABundleTransport() *http.Transport { + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go new file mode 100644 index 000000000..38a7b05a6 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go @@ -0,0 +1,273 @@ +/* +Package session provides configuration for the SDK's service clients. + +Sessions can be shared across all service clients that share the same base +configuration. The Session is built from the SDK's default configuration and +request handlers. + +Sessions should be cached when possible, because creating a new Session will +load all configuration values from the environment, and config files each time +the Session is created. Sharing the Session value across all of your service +clients will ensure the configuration is loaded the fewest number of times possible. + +Concurrency + +Sessions are safe to use concurrently as long as the Session is not being +modified. The SDK will not modify the Session once the Session has been created. +Creating service clients concurrently from a shared Session is safe. + +Sessions from Shared Config + +Sessions can be created using the method above that will only load the +additional config if the AWS_SDK_LOAD_CONFIG environment variable is set. +Alternatively you can explicitly create a Session with shared config enabled. +To do this you can use NewSessionWithOptions to configure how the Session will +be created. Using the NewSessionWithOptions with SharedConfigState set to +SharedConfigEnable will create the session as if the AWS_SDK_LOAD_CONFIG +environment variable was set. + +Creating Sessions + +When creating Sessions optional aws.Config values can be passed in that will +override the default, or loaded config values the Session is being created +with. This allows you to provide additional, or case based, configuration +as needed. + +By default NewSession will only load credentials from the shared credentials +file (~/.aws/credentials). If the AWS_SDK_LOAD_CONFIG environment variable is +set to a truthy value the Session will be created from the configuration +values from the shared config (~/.aws/config) and shared credentials +(~/.aws/credentials) files. See the section Sessions from Shared Config for +more information. + +Create a Session with the default config and request handlers. With credentials +region, and profile loaded from the environment and shared config automatically. +Requires the AWS_PROFILE to be set, or "default" is used. + + // Create Session + sess := session.Must(session.NewSession()) + + // Create a Session with a custom region + sess := session.Must(session.NewSession(&aws.Config{ + Region: aws.String("us-east-1"), + })) + + // Create a S3 client instance from a session + sess := session.Must(session.NewSession()) + + svc := s3.New(sess) + +Create Session With Option Overrides + +In addition to NewSession, Sessions can be created using NewSessionWithOptions. +This func allows you to control and override how the Session will be created +through code instead of being driven by environment variables only. + +Use NewSessionWithOptions when you want to provide the config profile, or +override the shared config state (AWS_SDK_LOAD_CONFIG). + + // Equivalent to session.NewSession() + sess := session.Must(session.NewSessionWithOptions(session.Options{ + // Options + })) + + // Specify profile to load for the session's config + sess := session.Must(session.NewSessionWithOptions(session.Options{ + Profile: "profile_name", + })) + + // Specify profile for config and region for requests + sess := session.Must(session.NewSessionWithOptions(session.Options{ + Config: aws.Config{Region: aws.String("us-east-1")}, + Profile: "profile_name", + })) + + // Force enable Shared Config support + sess := session.Must(session.NewSessionWithOptions(session.Options{ + SharedConfigState: session.SharedConfigEnable, + })) + +Adding Handlers + +You can add handlers to a session for processing HTTP requests. All service +clients that use the session inherit the handlers. For example, the following +handler logs every request and its payload made by a service client: + + // Create a session, and add additional handlers for all service + // clients created with the Session to inherit. Adds logging handler. + sess := session.Must(session.NewSession()) + + sess.Handlers.Send.PushFront(func(r *request.Request) { + // Log every request made and its payload + logger.Printf("Request: %s/%s, Payload: %s", + r.ClientInfo.ServiceName, r.Operation, r.Params) + }) + +Deprecated "New" function + +The New session function has been deprecated because it does not provide good +way to return errors that occur when loading the configuration files and values. +Because of this, NewSession was created so errors can be retrieved when +creating a session fails. + +Shared Config Fields + +By default the SDK will only load the shared credentials file's (~/.aws/credentials) +credentials values, and all other config is provided by the environment variables, +SDK defaults, and user provided aws.Config values. + +If the AWS_SDK_LOAD_CONFIG environment variable is set, or SharedConfigEnable +option is used to create the Session the full shared config values will be +loaded. This includes credentials, region, and support for assume role. In +addition the Session will load its configuration from both the shared config +file (~/.aws/config) and shared credentials file (~/.aws/credentials). Both +files have the same format. + +If both config files are present the configuration from both files will be +read. The Session will be created from configuration values from the shared +credentials file (~/.aws/credentials) over those in the shared config file (~/.aws/config). + +Credentials are the values the SDK should use for authenticating requests with +AWS Services. They are from a configuration file will need to include both +aws_access_key_id and aws_secret_access_key must be provided together in the +same file to be considered valid. The values will be ignored if not a complete +group. aws_session_token is an optional field that can be provided if both of +the other two fields are also provided. + + aws_access_key_id = AKID + aws_secret_access_key = SECRET + aws_session_token = TOKEN + +Assume Role values allow you to configure the SDK to assume an IAM role using +a set of credentials provided in a config file via the source_profile field. +Both "role_arn" and "source_profile" are required. The SDK supports assuming +a role with MFA token if the session option AssumeRoleTokenProvider +is set. + + role_arn = arn:aws:iam:::role/ + source_profile = profile_with_creds + external_id = 1234 + mfa_serial = + role_session_name = session_name + +Region is the region the SDK should use for looking up AWS service endpoints +and signing requests. + + region = us-east-1 + +Assume Role with MFA token + +To create a session with support for assuming an IAM role with MFA set the +session option AssumeRoleTokenProvider to a function that will prompt for the +MFA token code when the SDK assumes the role and refreshes the role's credentials. +This allows you to configure the SDK via the shared config to assumea role +with MFA tokens. + +In order for the SDK to assume a role with MFA the SharedConfigState +session option must be set to SharedConfigEnable, or AWS_SDK_LOAD_CONFIG +environment variable set. + +The shared configuration instructs the SDK to assume an IAM role with MFA +when the mfa_serial configuration field is set in the shared config +(~/.aws/config) or shared credentials (~/.aws/credentials) file. + +If mfa_serial is set in the configuration, the SDK will assume the role, and +the AssumeRoleTokenProvider session option is not set an an error will +be returned when creating the session. + + sess := session.Must(session.NewSessionWithOptions(session.Options{ + AssumeRoleTokenProvider: stscreds.StdinTokenProvider, + })) + + // Create service client value configured for credentials + // from assumed role. + svc := s3.New(sess) + +To setup assume role outside of a session see the stscreds.AssumeRoleProvider +documentation. + +Environment Variables + +When a Session is created several environment variables can be set to adjust +how the SDK functions, and what configuration data it loads when creating +Sessions. All environment values are optional, but some values like credentials +require multiple of the values to set or the partial values will be ignored. +All environment variable values are strings unless otherwise noted. + +Environment configuration values. If set both Access Key ID and Secret Access +Key must be provided. Session Token and optionally also be provided, but is +not required. + + # Access Key ID + AWS_ACCESS_KEY_ID=AKID + AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set. + + # Secret Access Key + AWS_SECRET_ACCESS_KEY=SECRET + AWS_SECRET_KEY=SECRET=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set. + + # Session Token + AWS_SESSION_TOKEN=TOKEN + +Region value will instruct the SDK where to make service API requests to. If is +not provided in the environment the region must be provided before a service +client request is made. + + AWS_REGION=us-east-1 + + # AWS_DEFAULT_REGION is only read if AWS_SDK_LOAD_CONFIG is also set, + # and AWS_REGION is not also set. + AWS_DEFAULT_REGION=us-east-1 + +Profile name the SDK should load use when loading shared config from the +configuration files. If not provided "default" will be used as the profile name. + + AWS_PROFILE=my_profile + + # AWS_DEFAULT_PROFILE is only read if AWS_SDK_LOAD_CONFIG is also set, + # and AWS_PROFILE is not also set. + AWS_DEFAULT_PROFILE=my_profile + +SDK load config instructs the SDK to load the shared config in addition to +shared credentials. This also expands the configuration loaded so the shared +credentials will have parity with the shared config file. This also enables +Region and Profile support for the AWS_DEFAULT_REGION and AWS_DEFAULT_PROFILE +env values as well. + + AWS_SDK_LOAD_CONFIG=1 + +Shared credentials file path can be set to instruct the SDK to use an alternative +file for the shared credentials. If not set the file will be loaded from +$HOME/.aws/credentials on Linux/Unix based systems, and +%USERPROFILE%\.aws\credentials on Windows. + + AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials + +Shared config file path can be set to instruct the SDK to use an alternative +file for the shared config. If not set the file will be loaded from +$HOME/.aws/config on Linux/Unix based systems, and +%USERPROFILE%\.aws\config on Windows. + + AWS_CONFIG_FILE=$HOME/my_shared_config + +Path to a custom Credentials Authority (CA) bundle PEM file that the SDK +will use instead of the default system's root CA bundle. Use this only +if you want to replace the CA bundle the SDK uses for TLS requests. + + AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle + +Enabling this option will attempt to merge the Transport into the SDK's HTTP +client. If the client's Transport is not a http.Transport an error will be +returned. If the Transport's TLS config is set this option will cause the SDK +to overwrite the Transport's TLS config's RootCAs value. If the CA bundle file +contains multiple certificates all of them will be loaded. + +The Session option CustomCABundle is also available when creating sessions +to also enable this feature. CustomCABundle session option field has priority +over the AWS_CA_BUNDLE environment variable, and will be used if both are set. + +Setting a custom HTTPClient in the aws.Config options will override this setting. +To use this option and custom HTTP client, the HTTP client needs to be provided +when creating the session. Not the service client. +*/ +package session diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go b/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go new file mode 100644 index 000000000..e3959b959 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go @@ -0,0 +1,236 @@ +package session + +import ( + "os" + "strconv" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/defaults" +) + +// EnvProviderName provides a name of the provider when config is loaded from environment. +const EnvProviderName = "EnvConfigCredentials" + +// envConfig is a collection of environment values the SDK will read +// setup config from. All environment values are optional. But some values +// such as credentials require multiple values to be complete or the values +// will be ignored. +type envConfig struct { + // Environment configuration values. If set both Access Key ID and Secret Access + // Key must be provided. Session Token and optionally also be provided, but is + // not required. + // + // # Access Key ID + // AWS_ACCESS_KEY_ID=AKID + // AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set. + // + // # Secret Access Key + // AWS_SECRET_ACCESS_KEY=SECRET + // AWS_SECRET_KEY=SECRET=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set. + // + // # Session Token + // AWS_SESSION_TOKEN=TOKEN + Creds credentials.Value + + // Region value will instruct the SDK where to make service API requests to. If is + // not provided in the environment the region must be provided before a service + // client request is made. + // + // AWS_REGION=us-east-1 + // + // # AWS_DEFAULT_REGION is only read if AWS_SDK_LOAD_CONFIG is also set, + // # and AWS_REGION is not also set. + // AWS_DEFAULT_REGION=us-east-1 + Region string + + // Profile name the SDK should load use when loading shared configuration from the + // shared configuration files. If not provided "default" will be used as the + // profile name. + // + // AWS_PROFILE=my_profile + // + // # AWS_DEFAULT_PROFILE is only read if AWS_SDK_LOAD_CONFIG is also set, + // # and AWS_PROFILE is not also set. + // AWS_DEFAULT_PROFILE=my_profile + Profile string + + // SDK load config instructs the SDK to load the shared config in addition to + // shared credentials. This also expands the configuration loaded from the shared + // credentials to have parity with the shared config file. This also enables + // Region and Profile support for the AWS_DEFAULT_REGION and AWS_DEFAULT_PROFILE + // env values as well. + // + // AWS_SDK_LOAD_CONFIG=1 + EnableSharedConfig bool + + // Shared credentials file path can be set to instruct the SDK to use an alternate + // file for the shared credentials. If not set the file will be loaded from + // $HOME/.aws/credentials on Linux/Unix based systems, and + // %USERPROFILE%\.aws\credentials on Windows. + // + // AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials + SharedCredentialsFile string + + // Shared config file path can be set to instruct the SDK to use an alternate + // file for the shared config. If not set the file will be loaded from + // $HOME/.aws/config on Linux/Unix based systems, and + // %USERPROFILE%\.aws\config on Windows. + // + // AWS_CONFIG_FILE=$HOME/my_shared_config + SharedConfigFile string + + // Sets the path to a custom Credentials Authority (CA) Bundle PEM file + // that the SDK will use instead of the system's root CA bundle. + // Only use this if you want to configure the SDK to use a custom set + // of CAs. + // + // Enabling this option will attempt to merge the Transport + // into the SDK's HTTP client. If the client's Transport is + // not a http.Transport an error will be returned. If the + // Transport's TLS config is set this option will cause the + // SDK to overwrite the Transport's TLS config's RootCAs value. + // + // Setting a custom HTTPClient in the aws.Config options will override this setting. + // To use this option and custom HTTP client, the HTTP client needs to be provided + // when creating the session. Not the service client. + // + // AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle + CustomCABundle string + + csmEnabled string + CSMEnabled bool + CSMPort string + CSMClientID string + + enableEndpointDiscovery string + // Enables endpoint discovery via environment variables. + // + // AWS_ENABLE_ENDPOINT_DISCOVERY=true + EnableEndpointDiscovery *bool +} + +var ( + csmEnabledEnvKey = []string{ + "AWS_CSM_ENABLED", + } + csmPortEnvKey = []string{ + "AWS_CSM_PORT", + } + csmClientIDEnvKey = []string{ + "AWS_CSM_CLIENT_ID", + } + credAccessEnvKey = []string{ + "AWS_ACCESS_KEY_ID", + "AWS_ACCESS_KEY", + } + credSecretEnvKey = []string{ + "AWS_SECRET_ACCESS_KEY", + "AWS_SECRET_KEY", + } + credSessionEnvKey = []string{ + "AWS_SESSION_TOKEN", + } + + enableEndpointDiscoveryEnvKey = []string{ + "AWS_ENABLE_ENDPOINT_DISCOVERY", + } + + regionEnvKeys = []string{ + "AWS_REGION", + "AWS_DEFAULT_REGION", // Only read if AWS_SDK_LOAD_CONFIG is also set + } + profileEnvKeys = []string{ + "AWS_PROFILE", + "AWS_DEFAULT_PROFILE", // Only read if AWS_SDK_LOAD_CONFIG is also set + } + sharedCredsFileEnvKey = []string{ + "AWS_SHARED_CREDENTIALS_FILE", + } + sharedConfigFileEnvKey = []string{ + "AWS_CONFIG_FILE", + } +) + +// loadEnvConfig retrieves the SDK's environment configuration. +// See `envConfig` for the values that will be retrieved. +// +// If the environment variable `AWS_SDK_LOAD_CONFIG` is set to a truthy value +// the shared SDK config will be loaded in addition to the SDK's specific +// configuration values. +func loadEnvConfig() envConfig { + enableSharedConfig, _ := strconv.ParseBool(os.Getenv("AWS_SDK_LOAD_CONFIG")) + return envConfigLoad(enableSharedConfig) +} + +// loadEnvSharedConfig retrieves the SDK's environment configuration, and the +// SDK shared config. See `envConfig` for the values that will be retrieved. +// +// Loads the shared configuration in addition to the SDK's specific configuration. +// This will load the same values as `loadEnvConfig` if the `AWS_SDK_LOAD_CONFIG` +// environment variable is set. +func loadSharedEnvConfig() envConfig { + return envConfigLoad(true) +} + +func envConfigLoad(enableSharedConfig bool) envConfig { + cfg := envConfig{} + + cfg.EnableSharedConfig = enableSharedConfig + + setFromEnvVal(&cfg.Creds.AccessKeyID, credAccessEnvKey) + setFromEnvVal(&cfg.Creds.SecretAccessKey, credSecretEnvKey) + setFromEnvVal(&cfg.Creds.SessionToken, credSessionEnvKey) + + // CSM environment variables + setFromEnvVal(&cfg.csmEnabled, csmEnabledEnvKey) + setFromEnvVal(&cfg.CSMPort, csmPortEnvKey) + setFromEnvVal(&cfg.CSMClientID, csmClientIDEnvKey) + cfg.CSMEnabled = len(cfg.csmEnabled) > 0 + + // Require logical grouping of credentials + if len(cfg.Creds.AccessKeyID) == 0 || len(cfg.Creds.SecretAccessKey) == 0 { + cfg.Creds = credentials.Value{} + } else { + cfg.Creds.ProviderName = EnvProviderName + } + + regionKeys := regionEnvKeys + profileKeys := profileEnvKeys + if !cfg.EnableSharedConfig { + regionKeys = regionKeys[:1] + profileKeys = profileKeys[:1] + } + + setFromEnvVal(&cfg.Region, regionKeys) + setFromEnvVal(&cfg.Profile, profileKeys) + + // endpoint discovery is in reference to it being enabled. + setFromEnvVal(&cfg.enableEndpointDiscovery, enableEndpointDiscoveryEnvKey) + if len(cfg.enableEndpointDiscovery) > 0 { + cfg.EnableEndpointDiscovery = aws.Bool(cfg.enableEndpointDiscovery != "false") + } + + setFromEnvVal(&cfg.SharedCredentialsFile, sharedCredsFileEnvKey) + setFromEnvVal(&cfg.SharedConfigFile, sharedConfigFileEnvKey) + + if len(cfg.SharedCredentialsFile) == 0 { + cfg.SharedCredentialsFile = defaults.SharedCredentialsFilename() + } + if len(cfg.SharedConfigFile) == 0 { + cfg.SharedConfigFile = defaults.SharedConfigFilename() + } + + cfg.CustomCABundle = os.Getenv("AWS_CA_BUNDLE") + + return cfg +} + +func setFromEnvVal(dst *string, keys []string) { + for _, k := range keys { + if v := os.Getenv(k); len(v) > 0 { + *dst = v + break + } + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go new file mode 100644 index 000000000..be4b5f077 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go @@ -0,0 +1,719 @@ +package session + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/corehandlers" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/credentials/processcreds" + "github.com/aws/aws-sdk-go/aws/credentials/stscreds" + "github.com/aws/aws-sdk-go/aws/csm" + "github.com/aws/aws-sdk-go/aws/defaults" + "github.com/aws/aws-sdk-go/aws/endpoints" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/shareddefaults" +) + +const ( + // ErrCodeSharedConfig represents an error that occurs in the shared + // configuration logic + ErrCodeSharedConfig = "SharedConfigErr" +) + +// ErrSharedConfigSourceCollision will be returned if a section contains both +// source_profile and credential_source +var ErrSharedConfigSourceCollision = awserr.New(ErrCodeSharedConfig, "only source profile or credential source can be specified, not both", nil) + +// ErrSharedConfigECSContainerEnvVarEmpty will be returned if the environment +// variables are empty and Environment was set as the credential source +var ErrSharedConfigECSContainerEnvVarEmpty = awserr.New(ErrCodeSharedConfig, "EcsContainer was specified as the credential_source, but 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' was not set", nil) + +// ErrSharedConfigInvalidCredSource will be returned if an invalid credential source was provided +var ErrSharedConfigInvalidCredSource = awserr.New(ErrCodeSharedConfig, "credential source values must be EcsContainer, Ec2InstanceMetadata, or Environment", nil) + +// A Session provides a central location to create service clients from and +// store configurations and request handlers for those services. +// +// Sessions are safe to create service clients concurrently, but it is not safe +// to mutate the Session concurrently. +// +// The Session satisfies the service client's client.ConfigProvider. +type Session struct { + Config *aws.Config + Handlers request.Handlers +} + +// New creates a new instance of the handlers merging in the provided configs +// on top of the SDK's default configurations. Once the Session is created it +// can be mutated to modify the Config or Handlers. The Session is safe to be +// read concurrently, but it should not be written to concurrently. +// +// If the AWS_SDK_LOAD_CONFIG environment is set to a truthy value, the New +// method could now encounter an error when loading the configuration. When +// The environment variable is set, and an error occurs, New will return a +// session that will fail all requests reporting the error that occurred while +// loading the session. Use NewSession to get the error when creating the +// session. +// +// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value +// the shared config file (~/.aws/config) will also be loaded, in addition to +// the shared credentials file (~/.aws/credentials). Values set in both the +// shared config, and shared credentials will be taken from the shared +// credentials file. +// +// Deprecated: Use NewSession functions to create sessions instead. NewSession +// has the same functionality as New except an error can be returned when the +// func is called instead of waiting to receive an error until a request is made. +func New(cfgs ...*aws.Config) *Session { + // load initial config from environment + envCfg := loadEnvConfig() + + if envCfg.EnableSharedConfig { + var cfg aws.Config + cfg.MergeIn(cfgs...) + s, err := NewSessionWithOptions(Options{ + Config: cfg, + SharedConfigState: SharedConfigEnable, + }) + if err != nil { + // Old session.New expected all errors to be discovered when + // a request is made, and would report the errors then. This + // needs to be replicated if an error occurs while creating + // the session. + msg := "failed to create session with AWS_SDK_LOAD_CONFIG enabled. " + + "Use session.NewSession to handle errors occurring during session creation." + + // Session creation failed, need to report the error and prevent + // any requests from succeeding. + s = &Session{Config: defaults.Config()} + s.Config.MergeIn(cfgs...) + s.Config.Logger.Log("ERROR:", msg, "Error:", err) + s.Handlers.Validate.PushBack(func(r *request.Request) { + r.Error = err + }) + } + + return s + } + + s := deprecatedNewSession(cfgs...) + if envCfg.CSMEnabled { + enableCSM(&s.Handlers, envCfg.CSMClientID, envCfg.CSMPort, s.Config.Logger) + } + + return s +} + +// NewSession returns a new Session created from SDK defaults, config files, +// environment, and user provided config files. Once the Session is created +// it can be mutated to modify the Config or Handlers. The Session is safe to +// be read concurrently, but it should not be written to concurrently. +// +// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value +// the shared config file (~/.aws/config) will also be loaded in addition to +// the shared credentials file (~/.aws/credentials). Values set in both the +// shared config, and shared credentials will be taken from the shared +// credentials file. Enabling the Shared Config will also allow the Session +// to be built with retrieving credentials with AssumeRole set in the config. +// +// See the NewSessionWithOptions func for information on how to override or +// control through code how the Session will be created. Such as specifying the +// config profile, and controlling if shared config is enabled or not. +func NewSession(cfgs ...*aws.Config) (*Session, error) { + opts := Options{} + opts.Config.MergeIn(cfgs...) + + return NewSessionWithOptions(opts) +} + +// SharedConfigState provides the ability to optionally override the state +// of the session's creation based on the shared config being enabled or +// disabled. +type SharedConfigState int + +const ( + // SharedConfigStateFromEnv does not override any state of the + // AWS_SDK_LOAD_CONFIG env var. It is the default value of the + // SharedConfigState type. + SharedConfigStateFromEnv SharedConfigState = iota + + // SharedConfigDisable overrides the AWS_SDK_LOAD_CONFIG env var value + // and disables the shared config functionality. + SharedConfigDisable + + // SharedConfigEnable overrides the AWS_SDK_LOAD_CONFIG env var value + // and enables the shared config functionality. + SharedConfigEnable +) + +// Options provides the means to control how a Session is created and what +// configuration values will be loaded. +// +type Options struct { + // Provides config values for the SDK to use when creating service clients + // and making API requests to services. Any value set in with this field + // will override the associated value provided by the SDK defaults, + // environment or config files where relevant. + // + // If not set, configuration values from from SDK defaults, environment, + // config will be used. + Config aws.Config + + // Overrides the config profile the Session should be created from. If not + // set the value of the environment variable will be loaded (AWS_PROFILE, + // or AWS_DEFAULT_PROFILE if the Shared Config is enabled). + // + // If not set and environment variables are not set the "default" + // (DefaultSharedConfigProfile) will be used as the profile to load the + // session config from. + Profile string + + // Instructs how the Session will be created based on the AWS_SDK_LOAD_CONFIG + // environment variable. By default a Session will be created using the + // value provided by the AWS_SDK_LOAD_CONFIG environment variable. + // + // Setting this value to SharedConfigEnable or SharedConfigDisable + // will allow you to override the AWS_SDK_LOAD_CONFIG environment variable + // and enable or disable the shared config functionality. + SharedConfigState SharedConfigState + + // Ordered list of files the session will load configuration from. + // It will override environment variable AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE. + SharedConfigFiles []string + + // When the SDK's shared config is configured to assume a role with MFA + // this option is required in order to provide the mechanism that will + // retrieve the MFA token. There is no default value for this field. If + // it is not set an error will be returned when creating the session. + // + // This token provider will be called when ever the assumed role's + // credentials need to be refreshed. Within the context of service clients + // all sharing the same session the SDK will ensure calls to the token + // provider are atomic. When sharing a token provider across multiple + // sessions additional synchronization logic is needed to ensure the + // token providers do not introduce race conditions. It is recommend to + // share the session where possible. + // + // stscreds.StdinTokenProvider is a basic implementation that will prompt + // from stdin for the MFA token code. + // + // This field is only used if the shared configuration is enabled, and + // the config enables assume role wit MFA via the mfa_serial field. + AssumeRoleTokenProvider func() (string, error) + + // Reader for a custom Credentials Authority (CA) bundle in PEM format that + // the SDK will use instead of the default system's root CA bundle. Use this + // only if you want to replace the CA bundle the SDK uses for TLS requests. + // + // Enabling this option will attempt to merge the Transport into the SDK's HTTP + // client. If the client's Transport is not a http.Transport an error will be + // returned. If the Transport's TLS config is set this option will cause the SDK + // to overwrite the Transport's TLS config's RootCAs value. If the CA + // bundle reader contains multiple certificates all of them will be loaded. + // + // The Session option CustomCABundle is also available when creating sessions + // to also enable this feature. CustomCABundle session option field has priority + // over the AWS_CA_BUNDLE environment variable, and will be used if both are set. + CustomCABundle io.Reader +} + +// NewSessionWithOptions returns a new Session created from SDK defaults, config files, +// environment, and user provided config files. This func uses the Options +// values to configure how the Session is created. +// +// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value +// the shared config file (~/.aws/config) will also be loaded in addition to +// the shared credentials file (~/.aws/credentials). Values set in both the +// shared config, and shared credentials will be taken from the shared +// credentials file. Enabling the Shared Config will also allow the Session +// to be built with retrieving credentials with AssumeRole set in the config. +// +// // Equivalent to session.New +// sess := session.Must(session.NewSessionWithOptions(session.Options{})) +// +// // Specify profile to load for the session's config +// sess := session.Must(session.NewSessionWithOptions(session.Options{ +// Profile: "profile_name", +// })) +// +// // Specify profile for config and region for requests +// sess := session.Must(session.NewSessionWithOptions(session.Options{ +// Config: aws.Config{Region: aws.String("us-east-1")}, +// Profile: "profile_name", +// })) +// +// // Force enable Shared Config support +// sess := session.Must(session.NewSessionWithOptions(session.Options{ +// SharedConfigState: session.SharedConfigEnable, +// })) +func NewSessionWithOptions(opts Options) (*Session, error) { + var envCfg envConfig + if opts.SharedConfigState == SharedConfigEnable { + envCfg = loadSharedEnvConfig() + } else { + envCfg = loadEnvConfig() + } + + if len(opts.Profile) > 0 { + envCfg.Profile = opts.Profile + } + + switch opts.SharedConfigState { + case SharedConfigDisable: + envCfg.EnableSharedConfig = false + case SharedConfigEnable: + envCfg.EnableSharedConfig = true + } + + // Only use AWS_CA_BUNDLE if session option is not provided. + if len(envCfg.CustomCABundle) != 0 && opts.CustomCABundle == nil { + f, err := os.Open(envCfg.CustomCABundle) + if err != nil { + return nil, awserr.New("LoadCustomCABundleError", + "failed to open custom CA bundle PEM file", err) + } + defer f.Close() + opts.CustomCABundle = f + } + + return newSession(opts, envCfg, &opts.Config) +} + +// Must is a helper function to ensure the Session is valid and there was no +// error when calling a NewSession function. +// +// This helper is intended to be used in variable initialization to load the +// Session and configuration at startup. Such as: +// +// var sess = session.Must(session.NewSession()) +func Must(sess *Session, err error) *Session { + if err != nil { + panic(err) + } + + return sess +} + +func deprecatedNewSession(cfgs ...*aws.Config) *Session { + cfg := defaults.Config() + handlers := defaults.Handlers() + + // Apply the passed in configs so the configuration can be applied to the + // default credential chain + cfg.MergeIn(cfgs...) + if cfg.EndpointResolver == nil { + // An endpoint resolver is required for a session to be able to provide + // endpoints for service client configurations. + cfg.EndpointResolver = endpoints.DefaultResolver() + } + cfg.Credentials = defaults.CredChain(cfg, handlers) + + // Reapply any passed in configs to override credentials if set + cfg.MergeIn(cfgs...) + + s := &Session{ + Config: cfg, + Handlers: handlers, + } + + initHandlers(s) + return s +} + +func enableCSM(handlers *request.Handlers, clientID string, port string, logger aws.Logger) { + logger.Log("Enabling CSM") + if len(port) == 0 { + port = csm.DefaultPort + } + + r, err := csm.Start(clientID, "127.0.0.1:"+port) + if err != nil { + return + } + r.InjectHandlers(handlers) +} + +func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) { + cfg := defaults.Config() + handlers := defaults.Handlers() + + // Get a merged version of the user provided config to determine if + // credentials were. + userCfg := &aws.Config{} + userCfg.MergeIn(cfgs...) + + // Ordered config files will be loaded in with later files overwriting + // previous config file values. + var cfgFiles []string + if opts.SharedConfigFiles != nil { + cfgFiles = opts.SharedConfigFiles + } else { + cfgFiles = []string{envCfg.SharedConfigFile, envCfg.SharedCredentialsFile} + if !envCfg.EnableSharedConfig { + // The shared config file (~/.aws/config) is only loaded if instructed + // to load via the envConfig.EnableSharedConfig (AWS_SDK_LOAD_CONFIG). + cfgFiles = cfgFiles[1:] + } + } + + // Load additional config from file(s) + sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles) + if err != nil { + return nil, err + } + + if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil { + return nil, err + } + + s := &Session{ + Config: cfg, + Handlers: handlers, + } + + initHandlers(s) + if envCfg.CSMEnabled { + enableCSM(&s.Handlers, envCfg.CSMClientID, envCfg.CSMPort, s.Config.Logger) + } + + // Setup HTTP client with custom cert bundle if enabled + if opts.CustomCABundle != nil { + if err := loadCustomCABundle(s, opts.CustomCABundle); err != nil { + return nil, err + } + } + + return s, nil +} + +func loadCustomCABundle(s *Session, bundle io.Reader) error { + var t *http.Transport + switch v := s.Config.HTTPClient.Transport.(type) { + case *http.Transport: + t = v + default: + if s.Config.HTTPClient.Transport != nil { + return awserr.New("LoadCustomCABundleError", + "unable to load custom CA bundle, HTTPClient's transport unsupported type", nil) + } + } + if t == nil { + // Nil transport implies `http.DefaultTransport` should be used. Since + // the SDK cannot modify, nor copy the `DefaultTransport` specifying + // the values the next closest behavior. + t = getCABundleTransport() + } + + p, err := loadCertPool(bundle) + if err != nil { + return err + } + if t.TLSClientConfig == nil { + t.TLSClientConfig = &tls.Config{} + } + t.TLSClientConfig.RootCAs = p + + s.Config.HTTPClient.Transport = t + + return nil +} + +func loadCertPool(r io.Reader) (*x509.CertPool, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, awserr.New("LoadCustomCABundleError", + "failed to read custom CA bundle PEM file", err) + } + + p := x509.NewCertPool() + if !p.AppendCertsFromPEM(b) { + return nil, awserr.New("LoadCustomCABundleError", + "failed to load custom CA bundle PEM file", err) + } + + return p, nil +} + +func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg sharedConfig, handlers request.Handlers, sessOpts Options) error { + // Merge in user provided configuration + cfg.MergeIn(userCfg) + + // Region if not already set by user + if len(aws.StringValue(cfg.Region)) == 0 { + if len(envCfg.Region) > 0 { + cfg.WithRegion(envCfg.Region) + } else if envCfg.EnableSharedConfig && len(sharedCfg.Region) > 0 { + cfg.WithRegion(sharedCfg.Region) + } + } + + if cfg.EnableEndpointDiscovery == nil { + if envCfg.EnableEndpointDiscovery != nil { + cfg.WithEndpointDiscovery(*envCfg.EnableEndpointDiscovery) + } else if envCfg.EnableSharedConfig && sharedCfg.EnableEndpointDiscovery != nil { + cfg.WithEndpointDiscovery(*sharedCfg.EnableEndpointDiscovery) + } + } + + // Configure credentials if not already set + if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil { + + // inspect the profile to see if a credential source has been specified. + if envCfg.EnableSharedConfig && len(sharedCfg.AssumeRole.CredentialSource) > 0 { + + // if both credential_source and source_profile have been set, return an error + // as this is undefined behavior. + if len(sharedCfg.AssumeRole.SourceProfile) > 0 { + return ErrSharedConfigSourceCollision + } + + // valid credential source values + const ( + credSourceEc2Metadata = "Ec2InstanceMetadata" + credSourceEnvironment = "Environment" + credSourceECSContainer = "EcsContainer" + ) + + switch sharedCfg.AssumeRole.CredentialSource { + case credSourceEc2Metadata: + cfgCp := *cfg + p := defaults.RemoteCredProvider(cfgCp, handlers) + cfgCp.Credentials = credentials.NewCredentials(p) + + if len(sharedCfg.AssumeRole.MFASerial) > 0 && sessOpts.AssumeRoleTokenProvider == nil { + // AssumeRole Token provider is required if doing Assume Role + // with MFA. + return AssumeRoleTokenProviderNotSetError{} + } + + cfg.Credentials = assumeRoleCredentials(cfgCp, handlers, sharedCfg, sessOpts) + case credSourceEnvironment: + cfg.Credentials = credentials.NewStaticCredentialsFromCreds( + envCfg.Creds, + ) + case credSourceECSContainer: + if len(os.Getenv(shareddefaults.ECSCredsProviderEnvVar)) == 0 { + return ErrSharedConfigECSContainerEnvVarEmpty + } + + cfgCp := *cfg + p := defaults.RemoteCredProvider(cfgCp, handlers) + creds := credentials.NewCredentials(p) + + cfg.Credentials = creds + default: + return ErrSharedConfigInvalidCredSource + } + + return nil + } + + if len(envCfg.Creds.AccessKeyID) > 0 { + cfg.Credentials = credentials.NewStaticCredentialsFromCreds( + envCfg.Creds, + ) + } else if envCfg.EnableSharedConfig && len(sharedCfg.AssumeRole.RoleARN) > 0 && sharedCfg.AssumeRoleSource != nil { + cfgCp := *cfg + cfgCp.Credentials = credentials.NewStaticCredentialsFromCreds( + sharedCfg.AssumeRoleSource.Creds, + ) + + if len(sharedCfg.AssumeRole.MFASerial) > 0 && sessOpts.AssumeRoleTokenProvider == nil { + // AssumeRole Token provider is required if doing Assume Role + // with MFA. + return AssumeRoleTokenProviderNotSetError{} + } + + cfg.Credentials = assumeRoleCredentials(cfgCp, handlers, sharedCfg, sessOpts) + } else if len(sharedCfg.Creds.AccessKeyID) > 0 { + cfg.Credentials = credentials.NewStaticCredentialsFromCreds( + sharedCfg.Creds, + ) + } else if len(sharedCfg.CredentialProcess) > 0 { + cfg.Credentials = processcreds.NewCredentials( + sharedCfg.CredentialProcess, + ) + } else { + // Fallback to default credentials provider, include mock errors + // for the credential chain so user can identify why credentials + // failed to be retrieved. + cfg.Credentials = credentials.NewCredentials(&credentials.ChainProvider{ + VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), + Providers: []credentials.Provider{ + &credProviderError{Err: awserr.New("EnvAccessKeyNotFound", "failed to find credentials in the environment.", nil)}, + &credProviderError{Err: awserr.New("SharedCredsLoad", fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil)}, + defaults.RemoteCredProvider(*cfg, handlers), + }, + }) + } + } + + return nil +} + +func assumeRoleCredentials(cfg aws.Config, handlers request.Handlers, sharedCfg sharedConfig, sessOpts Options) *credentials.Credentials { + return stscreds.NewCredentials( + &Session{ + Config: &cfg, + Handlers: handlers.Copy(), + }, + sharedCfg.AssumeRole.RoleARN, + func(opt *stscreds.AssumeRoleProvider) { + opt.RoleSessionName = sharedCfg.AssumeRole.RoleSessionName + + // Assume role with external ID + if len(sharedCfg.AssumeRole.ExternalID) > 0 { + opt.ExternalID = aws.String(sharedCfg.AssumeRole.ExternalID) + } + + // Assume role with MFA + if len(sharedCfg.AssumeRole.MFASerial) > 0 { + opt.SerialNumber = aws.String(sharedCfg.AssumeRole.MFASerial) + opt.TokenProvider = sessOpts.AssumeRoleTokenProvider + } + }, + ) +} + +// AssumeRoleTokenProviderNotSetError is an error returned when creating a session when the +// MFAToken option is not set when shared config is configured load assume a +// role with an MFA token. +type AssumeRoleTokenProviderNotSetError struct{} + +// Code is the short id of the error. +func (e AssumeRoleTokenProviderNotSetError) Code() string { + return "AssumeRoleTokenProviderNotSetError" +} + +// Message is the description of the error +func (e AssumeRoleTokenProviderNotSetError) Message() string { + return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.") +} + +// OrigErr is the underlying error that caused the failure. +func (e AssumeRoleTokenProviderNotSetError) OrigErr() error { + return nil +} + +// Error satisfies the error interface. +func (e AssumeRoleTokenProviderNotSetError) Error() string { + return awserr.SprintError(e.Code(), e.Message(), "", nil) +} + +type credProviderError struct { + Err error +} + +var emptyCreds = credentials.Value{} + +func (c credProviderError) Retrieve() (credentials.Value, error) { + return credentials.Value{}, c.Err +} +func (c credProviderError) IsExpired() bool { + return true +} + +func initHandlers(s *Session) { + // Add the Validate parameter handler if it is not disabled. + s.Handlers.Validate.Remove(corehandlers.ValidateParametersHandler) + if !aws.BoolValue(s.Config.DisableParamValidation) { + s.Handlers.Validate.PushBackNamed(corehandlers.ValidateParametersHandler) + } +} + +// Copy creates and returns a copy of the current Session, coping the config +// and handlers. If any additional configs are provided they will be merged +// on top of the Session's copied config. +// +// // Create a copy of the current Session, configured for the us-west-2 region. +// sess.Copy(&aws.Config{Region: aws.String("us-west-2")}) +func (s *Session) Copy(cfgs ...*aws.Config) *Session { + newSession := &Session{ + Config: s.Config.Copy(cfgs...), + Handlers: s.Handlers.Copy(), + } + + initHandlers(newSession) + + return newSession +} + +// ClientConfig satisfies the client.ConfigProvider interface and is used to +// configure the service client instances. Passing the Session to the service +// client's constructor (New) will use this method to configure the client. +func (s *Session) ClientConfig(serviceName string, cfgs ...*aws.Config) client.Config { + // Backwards compatibility, the error will be eaten if user calls ClientConfig + // directly. All SDK services will use ClientconfigWithError. + cfg, _ := s.clientConfigWithErr(serviceName, cfgs...) + + return cfg +} + +func (s *Session) clientConfigWithErr(serviceName string, cfgs ...*aws.Config) (client.Config, error) { + s = s.Copy(cfgs...) + + var resolved endpoints.ResolvedEndpoint + var err error + + region := aws.StringValue(s.Config.Region) + + if endpoint := aws.StringValue(s.Config.Endpoint); len(endpoint) != 0 { + resolved.URL = endpoints.AddScheme(endpoint, aws.BoolValue(s.Config.DisableSSL)) + resolved.SigningRegion = region + } else { + resolved, err = s.Config.EndpointResolver.EndpointFor( + serviceName, region, + func(opt *endpoints.Options) { + opt.DisableSSL = aws.BoolValue(s.Config.DisableSSL) + opt.UseDualStack = aws.BoolValue(s.Config.UseDualStack) + + // Support the condition where the service is modeled but its + // endpoint metadata is not available. + opt.ResolveUnknownService = true + }, + ) + } + + return client.Config{ + Config: s.Config, + Handlers: s.Handlers, + Endpoint: resolved.URL, + SigningRegion: resolved.SigningRegion, + SigningNameDerived: resolved.SigningNameDerived, + SigningName: resolved.SigningName, + }, err +} + +// ClientConfigNoResolveEndpoint is the same as ClientConfig with the exception +// that the EndpointResolver will not be used to resolve the endpoint. The only +// endpoint set must come from the aws.Config.Endpoint field. +func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Config { + s = s.Copy(cfgs...) + + var resolved endpoints.ResolvedEndpoint + + region := aws.StringValue(s.Config.Region) + + if ep := aws.StringValue(s.Config.Endpoint); len(ep) > 0 { + resolved.URL = endpoints.AddScheme(ep, aws.BoolValue(s.Config.DisableSSL)) + resolved.SigningRegion = region + } + + return client.Config{ + Config: s.Config, + Handlers: s.Handlers, + Endpoint: resolved.URL, + SigningRegion: resolved.SigningRegion, + SigningNameDerived: resolved.SigningNameDerived, + SigningName: resolved.SigningName, + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go b/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go new file mode 100644 index 000000000..7cb44021b --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go @@ -0,0 +1,329 @@ +package session + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + + "github.com/aws/aws-sdk-go/internal/ini" +) + +const ( + // Static Credentials group + accessKeyIDKey = `aws_access_key_id` // group required + secretAccessKey = `aws_secret_access_key` // group required + sessionTokenKey = `aws_session_token` // optional + + // Assume Role Credentials group + roleArnKey = `role_arn` // group required + sourceProfileKey = `source_profile` // group required (or credential_source) + credentialSourceKey = `credential_source` // group required (or source_profile) + externalIDKey = `external_id` // optional + mfaSerialKey = `mfa_serial` // optional + roleSessionNameKey = `role_session_name` // optional + + // Additional Config fields + regionKey = `region` + + // endpoint discovery group + enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional + // External Credential Process + credentialProcessKey = `credential_process` + + // DefaultSharedConfigProfile is the default profile to be used when + // loading configuration from the config files if another profile name + // is not provided. + DefaultSharedConfigProfile = `default` +) + +type assumeRoleConfig struct { + RoleARN string + SourceProfile string + CredentialSource string + ExternalID string + MFASerial string + RoleSessionName string +} + +// sharedConfig represents the configuration fields of the SDK config files. +type sharedConfig struct { + // Credentials values from the config file. Both aws_access_key_id + // and aws_secret_access_key must be provided together in the same file + // to be considered valid. The values will be ignored if not a complete group. + // aws_session_token is an optional field that can be provided if both of the + // other two fields are also provided. + // + // aws_access_key_id + // aws_secret_access_key + // aws_session_token + Creds credentials.Value + + AssumeRole assumeRoleConfig + AssumeRoleSource *sharedConfig + + // An external process to request credentials + CredentialProcess string + + // Region is the region the SDK should use for looking up AWS service endpoints + // and signing requests. + // + // region + Region string + + // EnableEndpointDiscovery can be enabled in the shared config by setting + // endpoint_discovery_enabled to true + // + // endpoint_discovery_enabled = true + EnableEndpointDiscovery *bool +} + +type sharedConfigFile struct { + Filename string + IniData ini.Sections +} + +// loadSharedConfig retrieves the configuration from the list of files +// using the profile provided. The order the files are listed will determine +// precedence. Values in subsequent files will overwrite values defined in +// earlier files. +// +// For example, given two files A and B. Both define credentials. If the order +// of the files are A then B, B's credential values will be used instead of A's. +// +// See sharedConfig.setFromFile for information how the config files +// will be loaded. +func loadSharedConfig(profile string, filenames []string) (sharedConfig, error) { + if len(profile) == 0 { + profile = DefaultSharedConfigProfile + } + + files, err := loadSharedConfigIniFiles(filenames) + if err != nil { + return sharedConfig{}, err + } + + cfg := sharedConfig{} + if err = cfg.setFromIniFiles(profile, files); err != nil { + return sharedConfig{}, err + } + + if len(cfg.AssumeRole.SourceProfile) > 0 { + if err := cfg.setAssumeRoleSource(profile, files); err != nil { + return sharedConfig{}, err + } + } + + return cfg, nil +} + +func loadSharedConfigIniFiles(filenames []string) ([]sharedConfigFile, error) { + files := make([]sharedConfigFile, 0, len(filenames)) + + for _, filename := range filenames { + sections, err := ini.OpenFile(filename) + if aerr, ok := err.(awserr.Error); ok && aerr.Code() == ini.ErrCodeUnableToReadFile { + // Skip files which can't be opened and read for whatever reason + continue + } else if err != nil { + return nil, SharedConfigLoadError{Filename: filename, Err: err} + } + + files = append(files, sharedConfigFile{ + Filename: filename, IniData: sections, + }) + } + + return files, nil +} + +func (cfg *sharedConfig) setAssumeRoleSource(origProfile string, files []sharedConfigFile) error { + var assumeRoleSrc sharedConfig + + if len(cfg.AssumeRole.CredentialSource) > 0 { + // setAssumeRoleSource is only called when source_profile is found. + // If both source_profile and credential_source are set, then + // ErrSharedConfigSourceCollision will be returned + return ErrSharedConfigSourceCollision + } + + // Multiple level assume role chains are not support + if cfg.AssumeRole.SourceProfile == origProfile { + assumeRoleSrc = *cfg + assumeRoleSrc.AssumeRole = assumeRoleConfig{} + } else { + err := assumeRoleSrc.setFromIniFiles(cfg.AssumeRole.SourceProfile, files) + if err != nil { + return err + } + } + + if len(assumeRoleSrc.Creds.AccessKeyID) == 0 { + return SharedConfigAssumeRoleError{RoleARN: cfg.AssumeRole.RoleARN} + } + + cfg.AssumeRoleSource = &assumeRoleSrc + + return nil +} + +func (cfg *sharedConfig) setFromIniFiles(profile string, files []sharedConfigFile) error { + // Trim files from the list that don't exist. + for _, f := range files { + if err := cfg.setFromIniFile(profile, f); err != nil { + if _, ok := err.(SharedConfigProfileNotExistsError); ok { + // Ignore proviles missings + continue + } + return err + } + } + + return nil +} + +// setFromFile loads the configuration from the file using +// the profile provided. A sharedConfig pointer type value is used so that +// multiple config file loadings can be chained. +// +// Only loads complete logically grouped values, and will not set fields in cfg +// for incomplete grouped values in the config. Such as credentials. For example +// if a config file only includes aws_access_key_id but no aws_secret_access_key +// the aws_access_key_id will be ignored. +func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile) error { + section, ok := file.IniData.GetSection(profile) + if !ok { + // Fallback to to alternate profile name: profile + section, ok = file.IniData.GetSection(fmt.Sprintf("profile %s", profile)) + if !ok { + return SharedConfigProfileNotExistsError{Profile: profile, Err: nil} + } + } + + // Shared Credentials + akid := section.String(accessKeyIDKey) + secret := section.String(secretAccessKey) + if len(akid) > 0 && len(secret) > 0 { + cfg.Creds = credentials.Value{ + AccessKeyID: akid, + SecretAccessKey: secret, + SessionToken: section.String(sessionTokenKey), + ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename), + } + } + + // Assume Role + roleArn := section.String(roleArnKey) + srcProfile := section.String(sourceProfileKey) + credentialSource := section.String(credentialSourceKey) + hasSource := len(srcProfile) > 0 || len(credentialSource) > 0 + if len(roleArn) > 0 && hasSource { + cfg.AssumeRole = assumeRoleConfig{ + RoleARN: roleArn, + SourceProfile: srcProfile, + CredentialSource: credentialSource, + ExternalID: section.String(externalIDKey), + MFASerial: section.String(mfaSerialKey), + RoleSessionName: section.String(roleSessionNameKey), + } + } + + // `credential_process` + if credProc := section.String(credentialProcessKey); len(credProc) > 0 { + cfg.CredentialProcess = credProc + } + + // Region + if v := section.String(regionKey); len(v) > 0 { + cfg.Region = v + } + + // Endpoint discovery + if section.Has(enableEndpointDiscoveryKey) { + v := section.Bool(enableEndpointDiscoveryKey) + cfg.EnableEndpointDiscovery = &v + } + + return nil +} + +// SharedConfigLoadError is an error for the shared config file failed to load. +type SharedConfigLoadError struct { + Filename string + Err error +} + +// Code is the short id of the error. +func (e SharedConfigLoadError) Code() string { + return "SharedConfigLoadError" +} + +// Message is the description of the error +func (e SharedConfigLoadError) Message() string { + return fmt.Sprintf("failed to load config file, %s", e.Filename) +} + +// OrigErr is the underlying error that caused the failure. +func (e SharedConfigLoadError) OrigErr() error { + return e.Err +} + +// Error satisfies the error interface. +func (e SharedConfigLoadError) Error() string { + return awserr.SprintError(e.Code(), e.Message(), "", e.Err) +} + +// SharedConfigProfileNotExistsError is an error for the shared config when +// the profile was not find in the config file. +type SharedConfigProfileNotExistsError struct { + Profile string + Err error +} + +// Code is the short id of the error. +func (e SharedConfigProfileNotExistsError) Code() string { + return "SharedConfigProfileNotExistsError" +} + +// Message is the description of the error +func (e SharedConfigProfileNotExistsError) Message() string { + return fmt.Sprintf("failed to get profile, %s", e.Profile) +} + +// OrigErr is the underlying error that caused the failure. +func (e SharedConfigProfileNotExistsError) OrigErr() error { + return e.Err +} + +// Error satisfies the error interface. +func (e SharedConfigProfileNotExistsError) Error() string { + return awserr.SprintError(e.Code(), e.Message(), "", e.Err) +} + +// SharedConfigAssumeRoleError is an error for the shared config when the +// profile contains assume role information, but that information is invalid +// or not complete. +type SharedConfigAssumeRoleError struct { + RoleARN string +} + +// Code is the short id of the error. +func (e SharedConfigAssumeRoleError) Code() string { + return "SharedConfigAssumeRoleError" +} + +// Message is the description of the error +func (e SharedConfigAssumeRoleError) Message() string { + return fmt.Sprintf("failed to load assume role for %s, source profile has no shared credentials", + e.RoleARN) +} + +// OrigErr is the underlying error that caused the failure. +func (e SharedConfigAssumeRoleError) OrigErr() error { + return nil +} + +// Error satisfies the error interface. +func (e SharedConfigAssumeRoleError) Error() string { + return awserr.SprintError(e.Code(), e.Message(), "", nil) +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go new file mode 100644 index 000000000..244c86da0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go @@ -0,0 +1,82 @@ +package v4 + +import ( + "net/http" + "strings" +) + +// validator houses a set of rule needed for validation of a +// string value +type rules []rule + +// rule interface allows for more flexible rules and just simply +// checks whether or not a value adheres to that rule +type rule interface { + IsValid(value string) bool +} + +// IsValid will iterate through all rules and see if any rules +// apply to the value and supports nested rules +func (r rules) IsValid(value string) bool { + for _, rule := range r { + if rule.IsValid(value) { + return true + } + } + return false +} + +// mapRule generic rule for maps +type mapRule map[string]struct{} + +// IsValid for the map rule satisfies whether it exists in the map +func (m mapRule) IsValid(value string) bool { + _, ok := m[value] + return ok +} + +// whitelist is a generic rule for whitelisting +type whitelist struct { + rule +} + +// IsValid for whitelist checks if the value is within the whitelist +func (w whitelist) IsValid(value string) bool { + return w.rule.IsValid(value) +} + +// blacklist is a generic rule for blacklisting +type blacklist struct { + rule +} + +// IsValid for whitelist checks if the value is within the whitelist +func (b blacklist) IsValid(value string) bool { + return !b.rule.IsValid(value) +} + +type patterns []string + +// IsValid for patterns checks each pattern and returns if a match has +// been found +func (p patterns) IsValid(value string) bool { + for _, pattern := range p { + if strings.HasPrefix(http.CanonicalHeaderKey(value), pattern) { + return true + } + } + return false +} + +// inclusiveRules rules allow for rules to depend on one another +type inclusiveRules []rule + +// IsValid will return true if all rules are true +func (r inclusiveRules) IsValid(value string) bool { + for _, rule := range r { + if !rule.IsValid(value) { + return false + } + } + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go new file mode 100644 index 000000000..6aa2ed241 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go @@ -0,0 +1,7 @@ +package v4 + +// WithUnsignedPayload will enable and set the UnsignedPayload field to +// true of the signer. +func WithUnsignedPayload(v4 *Signer) { + v4.UnsignedPayload = true +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go new file mode 100644 index 000000000..bd082e9d1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go @@ -0,0 +1,24 @@ +// +build go1.5 + +package v4 + +import ( + "net/url" + "strings" +) + +func getURIPath(u *url.URL) string { + var uri string + + if len(u.Opaque) > 0 { + uri = "/" + strings.Join(strings.Split(u.Opaque, "/")[3:], "/") + } else { + uri = u.EscapedPath() + } + + if len(uri) == 0 { + uri = "/" + } + + return uri +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go new file mode 100644 index 000000000..523db79f8 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go @@ -0,0 +1,796 @@ +// Package v4 implements signing for AWS V4 signer +// +// Provides request signing for request that need to be signed with +// AWS V4 Signatures. +// +// Standalone Signer +// +// Generally using the signer outside of the SDK should not require any additional +// logic when using Go v1.5 or higher. The signer does this by taking advantage +// of the URL.EscapedPath method. If your request URI requires additional escaping +// you many need to use the URL.Opaque to define what the raw URI should be sent +// to the service as. +// +// The signer will first check the URL.Opaque field, and use its value if set. +// The signer does require the URL.Opaque field to be set in the form of: +// +// "///" +// +// // e.g. +// "//example.com/some/path" +// +// The leading "//" and hostname are required or the URL.Opaque escaping will +// not work correctly. +// +// If URL.Opaque is not set the signer will fallback to the URL.EscapedPath() +// method and using the returned value. If you're using Go v1.4 you must set +// URL.Opaque if the URI path needs escaping. If URL.Opaque is not set with +// Go v1.5 the signer will fallback to URL.Path. +// +// AWS v4 signature validation requires that the canonical string's URI path +// element must be the URI escaped form of the HTTP request's path. +// http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html +// +// The Go HTTP client will perform escaping automatically on the request. Some +// of these escaping may cause signature validation errors because the HTTP +// request differs from the URI path or query that the signature was generated. +// https://golang.org/pkg/net/url/#URL.EscapedPath +// +// Because of this, it is recommended that when using the signer outside of the +// SDK that explicitly escaping the request prior to being signed is preferable, +// and will help prevent signature validation errors. This can be done by setting +// the URL.Opaque or URL.RawPath. The SDK will use URL.Opaque first and then +// call URL.EscapedPath() if Opaque is not set. +// +// If signing a request intended for HTTP2 server, and you're using Go 1.6.2 +// through 1.7.4 you should use the URL.RawPath as the pre-escaped form of the +// request URL. https://github.com/golang/go/issues/16847 points to a bug in +// Go pre 1.8 that fails to make HTTP2 requests using absolute URL in the HTTP +// message. URL.Opaque generally will force Go to make requests with absolute URL. +// URL.RawPath does not do this, but RawPath must be a valid escaping of Path +// or url.EscapedPath will ignore the RawPath escaping. +// +// Test `TestStandaloneSign` provides a complete example of using the signer +// outside of the SDK and pre-escaping the URI path. +package v4 + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "sort" + "strconv" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/internal/sdkio" + "github.com/aws/aws-sdk-go/private/protocol/rest" +) + +const ( + authHeaderPrefix = "AWS4-HMAC-SHA256" + timeFormat = "20060102T150405Z" + shortTimeFormat = "20060102" + + // emptyStringSHA256 is a SHA256 of an empty string + emptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` +) + +var ignoredHeaders = rules{ + blacklist{ + mapRule{ + "Authorization": struct{}{}, + "User-Agent": struct{}{}, + "X-Amzn-Trace-Id": struct{}{}, + }, + }, +} + +// requiredSignedHeaders is a whitelist for build canonical headers. +var requiredSignedHeaders = rules{ + whitelist{ + mapRule{ + "Cache-Control": struct{}{}, + "Content-Disposition": struct{}{}, + "Content-Encoding": struct{}{}, + "Content-Language": struct{}{}, + "Content-Md5": struct{}{}, + "Content-Type": struct{}{}, + "Expires": struct{}{}, + "If-Match": struct{}{}, + "If-Modified-Since": struct{}{}, + "If-None-Match": struct{}{}, + "If-Unmodified-Since": struct{}{}, + "Range": struct{}{}, + "X-Amz-Acl": struct{}{}, + "X-Amz-Copy-Source": struct{}{}, + "X-Amz-Copy-Source-If-Match": struct{}{}, + "X-Amz-Copy-Source-If-Modified-Since": struct{}{}, + "X-Amz-Copy-Source-If-None-Match": struct{}{}, + "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{}, + "X-Amz-Copy-Source-Range": struct{}{}, + "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, + "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, + "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, + "X-Amz-Grant-Full-control": struct{}{}, + "X-Amz-Grant-Read": struct{}{}, + "X-Amz-Grant-Read-Acp": struct{}{}, + "X-Amz-Grant-Write": struct{}{}, + "X-Amz-Grant-Write-Acp": struct{}{}, + "X-Amz-Metadata-Directive": struct{}{}, + "X-Amz-Mfa": struct{}{}, + "X-Amz-Request-Payer": struct{}{}, + "X-Amz-Server-Side-Encryption": struct{}{}, + "X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id": struct{}{}, + "X-Amz-Server-Side-Encryption-Customer-Algorithm": struct{}{}, + "X-Amz-Server-Side-Encryption-Customer-Key": struct{}{}, + "X-Amz-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, + "X-Amz-Storage-Class": struct{}{}, + "X-Amz-Tagging": struct{}{}, + "X-Amz-Website-Redirect-Location": struct{}{}, + "X-Amz-Content-Sha256": struct{}{}, + }, + }, + patterns{"X-Amz-Meta-"}, +} + +// allowedHoisting is a whitelist for build query headers. The boolean value +// represents whether or not it is a pattern. +var allowedQueryHoisting = inclusiveRules{ + blacklist{requiredSignedHeaders}, + patterns{"X-Amz-"}, +} + +// Signer applies AWS v4 signing to given request. Use this to sign requests +// that need to be signed with AWS V4 Signatures. +type Signer struct { + // The authentication credentials the request will be signed against. + // This value must be set to sign requests. + Credentials *credentials.Credentials + + // Sets the log level the signer should use when reporting information to + // the logger. If the logger is nil nothing will be logged. See + // aws.LogLevelType for more information on available logging levels + // + // By default nothing will be logged. + Debug aws.LogLevelType + + // The logger loging information will be written to. If there the logger + // is nil, nothing will be logged. + Logger aws.Logger + + // Disables the Signer's moving HTTP header key/value pairs from the HTTP + // request header to the request's query string. This is most commonly used + // with pre-signed requests preventing headers from being added to the + // request's query string. + DisableHeaderHoisting bool + + // Disables the automatic escaping of the URI path of the request for the + // siganture's canonical string's path. For services that do not need additional + // escaping then use this to disable the signer escaping the path. + // + // S3 is an example of a service that does not need additional escaping. + // + // http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html + DisableURIPathEscaping bool + + // Disables the automatical setting of the HTTP request's Body field with the + // io.ReadSeeker passed in to the signer. This is useful if you're using a + // custom wrapper around the body for the io.ReadSeeker and want to preserve + // the Body value on the Request.Body. + // + // This does run the risk of signing a request with a body that will not be + // sent in the request. Need to ensure that the underlying data of the Body + // values are the same. + DisableRequestBodyOverwrite bool + + // currentTimeFn returns the time value which represents the current time. + // This value should only be used for testing. If it is nil the default + // time.Now will be used. + currentTimeFn func() time.Time + + // UnsignedPayload will prevent signing of the payload. This will only + // work for services that have support for this. + UnsignedPayload bool +} + +// NewSigner returns a Signer pointer configured with the credentials and optional +// option values provided. If not options are provided the Signer will use its +// default configuration. +func NewSigner(credentials *credentials.Credentials, options ...func(*Signer)) *Signer { + v4 := &Signer{ + Credentials: credentials, + } + + for _, option := range options { + option(v4) + } + + return v4 +} + +type signingCtx struct { + ServiceName string + Region string + Request *http.Request + Body io.ReadSeeker + Query url.Values + Time time.Time + ExpireTime time.Duration + SignedHeaderVals http.Header + + DisableURIPathEscaping bool + + credValues credentials.Value + isPresign bool + formattedTime string + formattedShortTime string + unsignedPayload bool + + bodyDigest string + signedHeaders string + canonicalHeaders string + canonicalString string + credentialString string + stringToSign string + signature string + authorization string +} + +// Sign signs AWS v4 requests with the provided body, service name, region the +// request is made to, and time the request is signed at. The signTime allows +// you to specify that a request is signed for the future, and cannot be +// used until then. +// +// Returns a list of HTTP headers that were included in the signature or an +// error if signing the request failed. Generally for signed requests this value +// is not needed as the full request context will be captured by the http.Request +// value. It is included for reference though. +// +// Sign will set the request's Body to be the `body` parameter passed in. If +// the body is not already an io.ReadCloser, it will be wrapped within one. If +// a `nil` body parameter passed to Sign, the request's Body field will be +// also set to nil. Its important to note that this functionality will not +// change the request's ContentLength of the request. +// +// Sign differs from Presign in that it will sign the request using HTTP +// header values. This type of signing is intended for http.Request values that +// will not be shared, or are shared in a way the header values on the request +// will not be lost. +// +// The requests body is an io.ReadSeeker so the SHA256 of the body can be +// generated. To bypass the signer computing the hash you can set the +// "X-Amz-Content-Sha256" header with a precomputed value. The signer will +// only compute the hash if the request header value is empty. +func (v4 Signer) Sign(r *http.Request, body io.ReadSeeker, service, region string, signTime time.Time) (http.Header, error) { + return v4.signWithBody(r, body, service, region, 0, false, signTime) +} + +// Presign signs AWS v4 requests with the provided body, service name, region +// the request is made to, and time the request is signed at. The signTime +// allows you to specify that a request is signed for the future, and cannot +// be used until then. +// +// Returns a list of HTTP headers that were included in the signature or an +// error if signing the request failed. For presigned requests these headers +// and their values must be included on the HTTP request when it is made. This +// is helpful to know what header values need to be shared with the party the +// presigned request will be distributed to. +// +// Presign differs from Sign in that it will sign the request using query string +// instead of header values. This allows you to share the Presigned Request's +// URL with third parties, or distribute it throughout your system with minimal +// dependencies. +// +// Presign also takes an exp value which is the duration the +// signed request will be valid after the signing time. This is allows you to +// set when the request will expire. +// +// The requests body is an io.ReadSeeker so the SHA256 of the body can be +// generated. To bypass the signer computing the hash you can set the +// "X-Amz-Content-Sha256" header with a precomputed value. The signer will +// only compute the hash if the request header value is empty. +// +// Presigning a S3 request will not compute the body's SHA256 hash by default. +// This is done due to the general use case for S3 presigned URLs is to share +// PUT/GET capabilities. If you would like to include the body's SHA256 in the +// presigned request's signature you can set the "X-Amz-Content-Sha256" +// HTTP header and that will be included in the request's signature. +func (v4 Signer) Presign(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, signTime time.Time) (http.Header, error) { + return v4.signWithBody(r, body, service, region, exp, true, signTime) +} + +func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, isPresign bool, signTime time.Time) (http.Header, error) { + currentTimeFn := v4.currentTimeFn + if currentTimeFn == nil { + currentTimeFn = time.Now + } + + ctx := &signingCtx{ + Request: r, + Body: body, + Query: r.URL.Query(), + Time: signTime, + ExpireTime: exp, + isPresign: isPresign, + ServiceName: service, + Region: region, + DisableURIPathEscaping: v4.DisableURIPathEscaping, + unsignedPayload: v4.UnsignedPayload, + } + + for key := range ctx.Query { + sort.Strings(ctx.Query[key]) + } + + if ctx.isRequestSigned() { + ctx.Time = currentTimeFn() + ctx.handlePresignRemoval() + } + + var err error + ctx.credValues, err = v4.Credentials.Get() + if err != nil { + return http.Header{}, err + } + + ctx.sanitizeHostForHeader() + ctx.assignAmzQueryValues() + if err := ctx.build(v4.DisableHeaderHoisting); err != nil { + return nil, err + } + + // If the request is not presigned the body should be attached to it. This + // prevents the confusion of wanting to send a signed request without + // the body the request was signed for attached. + if !(v4.DisableRequestBodyOverwrite || ctx.isPresign) { + var reader io.ReadCloser + if body != nil { + var ok bool + if reader, ok = body.(io.ReadCloser); !ok { + reader = ioutil.NopCloser(body) + } + } + r.Body = reader + } + + if v4.Debug.Matches(aws.LogDebugWithSigning) { + v4.logSigningInfo(ctx) + } + + return ctx.SignedHeaderVals, nil +} + +func (ctx *signingCtx) sanitizeHostForHeader() { + request.SanitizeHostForHeader(ctx.Request) +} + +func (ctx *signingCtx) handlePresignRemoval() { + if !ctx.isPresign { + return + } + + // The credentials have expired for this request. The current signing + // is invalid, and needs to be request because the request will fail. + ctx.removePresign() + + // Update the request's query string to ensure the values stays in + // sync in the case retrieving the new credentials fails. + ctx.Request.URL.RawQuery = ctx.Query.Encode() +} + +func (ctx *signingCtx) assignAmzQueryValues() { + if ctx.isPresign { + ctx.Query.Set("X-Amz-Algorithm", authHeaderPrefix) + if ctx.credValues.SessionToken != "" { + ctx.Query.Set("X-Amz-Security-Token", ctx.credValues.SessionToken) + } else { + ctx.Query.Del("X-Amz-Security-Token") + } + + return + } + + if ctx.credValues.SessionToken != "" { + ctx.Request.Header.Set("X-Amz-Security-Token", ctx.credValues.SessionToken) + } +} + +// SignRequestHandler is a named request handler the SDK will use to sign +// service client request with using the V4 signature. +var SignRequestHandler = request.NamedHandler{ + Name: "v4.SignRequestHandler", Fn: SignSDKRequest, +} + +// SignSDKRequest signs an AWS request with the V4 signature. This +// request handler should only be used with the SDK's built in service client's +// API operation requests. +// +// This function should not be used on its on its own, but in conjunction with +// an AWS service client's API operation call. To sign a standalone request +// not created by a service client's API operation method use the "Sign" or +// "Presign" functions of the "Signer" type. +// +// If the credentials of the request's config are set to +// credentials.AnonymousCredentials the request will not be signed. +func SignSDKRequest(req *request.Request) { + SignSDKRequestWithCurrentTime(req, time.Now) +} + +// BuildNamedHandler will build a generic handler for signing. +func BuildNamedHandler(name string, opts ...func(*Signer)) request.NamedHandler { + return request.NamedHandler{ + Name: name, + Fn: func(req *request.Request) { + SignSDKRequestWithCurrentTime(req, time.Now, opts...) + }, + } +} + +// SignSDKRequestWithCurrentTime will sign the SDK's request using the time +// function passed in. Behaves the same as SignSDKRequest with the exception +// the request is signed with the value returned by the current time function. +func SignSDKRequestWithCurrentTime(req *request.Request, curTimeFn func() time.Time, opts ...func(*Signer)) { + // If the request does not need to be signed ignore the signing of the + // request if the AnonymousCredentials object is used. + if req.Config.Credentials == credentials.AnonymousCredentials { + return + } + + region := req.ClientInfo.SigningRegion + if region == "" { + region = aws.StringValue(req.Config.Region) + } + + name := req.ClientInfo.SigningName + if name == "" { + name = req.ClientInfo.ServiceName + } + + v4 := NewSigner(req.Config.Credentials, func(v4 *Signer) { + v4.Debug = req.Config.LogLevel.Value() + v4.Logger = req.Config.Logger + v4.DisableHeaderHoisting = req.NotHoist + v4.currentTimeFn = curTimeFn + if name == "s3" { + // S3 service should not have any escaping applied + v4.DisableURIPathEscaping = true + } + // Prevents setting the HTTPRequest's Body. Since the Body could be + // wrapped in a custom io.Closer that we do not want to be stompped + // on top of by the signer. + v4.DisableRequestBodyOverwrite = true + }) + + for _, opt := range opts { + opt(v4) + } + + curTime := curTimeFn() + signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.GetBody(), + name, region, req.ExpireTime, req.ExpireTime > 0, curTime, + ) + if err != nil { + req.Error = err + req.SignedHeaderVals = nil + return + } + + req.SignedHeaderVals = signedHeaders + req.LastSignedAt = curTime +} + +const logSignInfoMsg = `DEBUG: Request Signature: +---[ CANONICAL STRING ]----------------------------- +%s +---[ STRING TO SIGN ]-------------------------------- +%s%s +-----------------------------------------------------` +const logSignedURLMsg = ` +---[ SIGNED URL ]------------------------------------ +%s` + +func (v4 *Signer) logSigningInfo(ctx *signingCtx) { + signedURLMsg := "" + if ctx.isPresign { + signedURLMsg = fmt.Sprintf(logSignedURLMsg, ctx.Request.URL.String()) + } + msg := fmt.Sprintf(logSignInfoMsg, ctx.canonicalString, ctx.stringToSign, signedURLMsg) + v4.Logger.Log(msg) +} + +func (ctx *signingCtx) build(disableHeaderHoisting bool) error { + ctx.buildTime() // no depends + ctx.buildCredentialString() // no depends + + if err := ctx.buildBodyDigest(); err != nil { + return err + } + + unsignedHeaders := ctx.Request.Header + if ctx.isPresign { + if !disableHeaderHoisting { + urlValues := url.Values{} + urlValues, unsignedHeaders = buildQuery(allowedQueryHoisting, unsignedHeaders) // no depends + for k := range urlValues { + ctx.Query[k] = urlValues[k] + } + } + } + + ctx.buildCanonicalHeaders(ignoredHeaders, unsignedHeaders) + ctx.buildCanonicalString() // depends on canon headers / signed headers + ctx.buildStringToSign() // depends on canon string + ctx.buildSignature() // depends on string to sign + + if ctx.isPresign { + ctx.Request.URL.RawQuery += "&X-Amz-Signature=" + ctx.signature + } else { + parts := []string{ + authHeaderPrefix + " Credential=" + ctx.credValues.AccessKeyID + "/" + ctx.credentialString, + "SignedHeaders=" + ctx.signedHeaders, + "Signature=" + ctx.signature, + } + ctx.Request.Header.Set("Authorization", strings.Join(parts, ", ")) + } + + return nil +} + +func (ctx *signingCtx) buildTime() { + ctx.formattedTime = ctx.Time.UTC().Format(timeFormat) + ctx.formattedShortTime = ctx.Time.UTC().Format(shortTimeFormat) + + if ctx.isPresign { + duration := int64(ctx.ExpireTime / time.Second) + ctx.Query.Set("X-Amz-Date", ctx.formattedTime) + ctx.Query.Set("X-Amz-Expires", strconv.FormatInt(duration, 10)) + } else { + ctx.Request.Header.Set("X-Amz-Date", ctx.formattedTime) + } +} + +func (ctx *signingCtx) buildCredentialString() { + ctx.credentialString = strings.Join([]string{ + ctx.formattedShortTime, + ctx.Region, + ctx.ServiceName, + "aws4_request", + }, "/") + + if ctx.isPresign { + ctx.Query.Set("X-Amz-Credential", ctx.credValues.AccessKeyID+"/"+ctx.credentialString) + } +} + +func buildQuery(r rule, header http.Header) (url.Values, http.Header) { + query := url.Values{} + unsignedHeaders := http.Header{} + for k, h := range header { + if r.IsValid(k) { + query[k] = h + } else { + unsignedHeaders[k] = h + } + } + + return query, unsignedHeaders +} +func (ctx *signingCtx) buildCanonicalHeaders(r rule, header http.Header) { + var headers []string + headers = append(headers, "host") + for k, v := range header { + canonicalKey := http.CanonicalHeaderKey(k) + if !r.IsValid(canonicalKey) { + continue // ignored header + } + if ctx.SignedHeaderVals == nil { + ctx.SignedHeaderVals = make(http.Header) + } + + lowerCaseKey := strings.ToLower(k) + if _, ok := ctx.SignedHeaderVals[lowerCaseKey]; ok { + // include additional values + ctx.SignedHeaderVals[lowerCaseKey] = append(ctx.SignedHeaderVals[lowerCaseKey], v...) + continue + } + + headers = append(headers, lowerCaseKey) + ctx.SignedHeaderVals[lowerCaseKey] = v + } + sort.Strings(headers) + + ctx.signedHeaders = strings.Join(headers, ";") + + if ctx.isPresign { + ctx.Query.Set("X-Amz-SignedHeaders", ctx.signedHeaders) + } + + headerValues := make([]string, len(headers)) + for i, k := range headers { + if k == "host" { + if ctx.Request.Host != "" { + headerValues[i] = "host:" + ctx.Request.Host + } else { + headerValues[i] = "host:" + ctx.Request.URL.Host + } + } else { + headerValues[i] = k + ":" + + strings.Join(ctx.SignedHeaderVals[k], ",") + } + } + stripExcessSpaces(headerValues) + ctx.canonicalHeaders = strings.Join(headerValues, "\n") +} + +func (ctx *signingCtx) buildCanonicalString() { + ctx.Request.URL.RawQuery = strings.Replace(ctx.Query.Encode(), "+", "%20", -1) + + uri := getURIPath(ctx.Request.URL) + + if !ctx.DisableURIPathEscaping { + uri = rest.EscapePath(uri, false) + } + + ctx.canonicalString = strings.Join([]string{ + ctx.Request.Method, + uri, + ctx.Request.URL.RawQuery, + ctx.canonicalHeaders + "\n", + ctx.signedHeaders, + ctx.bodyDigest, + }, "\n") +} + +func (ctx *signingCtx) buildStringToSign() { + ctx.stringToSign = strings.Join([]string{ + authHeaderPrefix, + ctx.formattedTime, + ctx.credentialString, + hex.EncodeToString(makeSha256([]byte(ctx.canonicalString))), + }, "\n") +} + +func (ctx *signingCtx) buildSignature() { + secret := ctx.credValues.SecretAccessKey + date := makeHmac([]byte("AWS4"+secret), []byte(ctx.formattedShortTime)) + region := makeHmac(date, []byte(ctx.Region)) + service := makeHmac(region, []byte(ctx.ServiceName)) + credentials := makeHmac(service, []byte("aws4_request")) + signature := makeHmac(credentials, []byte(ctx.stringToSign)) + ctx.signature = hex.EncodeToString(signature) +} + +func (ctx *signingCtx) buildBodyDigest() error { + hash := ctx.Request.Header.Get("X-Amz-Content-Sha256") + if hash == "" { + includeSHA256Header := ctx.unsignedPayload || + ctx.ServiceName == "s3" || + ctx.ServiceName == "glacier" + + s3Presign := ctx.isPresign && ctx.ServiceName == "s3" + + if ctx.unsignedPayload || s3Presign { + hash = "UNSIGNED-PAYLOAD" + includeSHA256Header = !s3Presign + } else if ctx.Body == nil { + hash = emptyStringSHA256 + } else { + if !aws.IsReaderSeekable(ctx.Body) { + return fmt.Errorf("cannot use unseekable request body %T, for signed request with body", ctx.Body) + } + hash = hex.EncodeToString(makeSha256Reader(ctx.Body)) + } + + if includeSHA256Header { + ctx.Request.Header.Set("X-Amz-Content-Sha256", hash) + } + } + ctx.bodyDigest = hash + + return nil +} + +// isRequestSigned returns if the request is currently signed or presigned +func (ctx *signingCtx) isRequestSigned() bool { + if ctx.isPresign && ctx.Query.Get("X-Amz-Signature") != "" { + return true + } + if ctx.Request.Header.Get("Authorization") != "" { + return true + } + + return false +} + +// unsign removes signing flags for both signed and presigned requests. +func (ctx *signingCtx) removePresign() { + ctx.Query.Del("X-Amz-Algorithm") + ctx.Query.Del("X-Amz-Signature") + ctx.Query.Del("X-Amz-Security-Token") + ctx.Query.Del("X-Amz-Date") + ctx.Query.Del("X-Amz-Expires") + ctx.Query.Del("X-Amz-Credential") + ctx.Query.Del("X-Amz-SignedHeaders") +} + +func makeHmac(key []byte, data []byte) []byte { + hash := hmac.New(sha256.New, key) + hash.Write(data) + return hash.Sum(nil) +} + +func makeSha256(data []byte) []byte { + hash := sha256.New() + hash.Write(data) + return hash.Sum(nil) +} + +func makeSha256Reader(reader io.ReadSeeker) []byte { + hash := sha256.New() + start, _ := reader.Seek(0, sdkio.SeekCurrent) + defer reader.Seek(start, sdkio.SeekStart) + + // Use CopyN to avoid allocating the 32KB buffer in io.Copy for bodies + // smaller than 32KB. Fall back to io.Copy if we fail to determine the size. + size, err := aws.SeekerLen(reader) + if err != nil { + io.Copy(hash, reader) + } else { + io.CopyN(hash, reader, size) + } + + return hash.Sum(nil) +} + +const doubleSpace = " " + +// stripExcessSpaces will rewrite the passed in slice's string values to not +// contain multiple side-by-side spaces. +func stripExcessSpaces(vals []string) { + var j, k, l, m, spaces int + for i, str := range vals { + // Trim trailing spaces + for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- { + } + + // Trim leading spaces + for k = 0; k < j && str[k] == ' '; k++ { + } + str = str[k : j+1] + + // Strip multiple spaces. + j = strings.Index(str, doubleSpace) + if j < 0 { + vals[i] = str + continue + } + + buf := []byte(str) + for k, m, l = j, j, len(buf); k < l; k++ { + if buf[k] == ' ' { + if spaces == 0 { + // First space. + buf[m] = buf[k] + m++ + } + spaces++ + } else { + // End of multiple spaces. + spaces = 0 + buf[m] = buf[k] + m++ + } + } + + vals[i] = string(buf[:m]) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/types.go b/vendor/github.com/aws/aws-sdk-go/aws/types.go new file mode 100644 index 000000000..8b6f23425 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/types.go @@ -0,0 +1,201 @@ +package aws + +import ( + "io" + "sync" + + "github.com/aws/aws-sdk-go/internal/sdkio" +) + +// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Should +// only be used with an io.Reader that is also an io.Seeker. Doing so may +// cause request signature errors, or request body's not sent for GET, HEAD +// and DELETE HTTP methods. +// +// Deprecated: Should only be used with io.ReadSeeker. If using for +// S3 PutObject to stream content use s3manager.Uploader instead. +func ReadSeekCloser(r io.Reader) ReaderSeekerCloser { + return ReaderSeekerCloser{r} +} + +// ReaderSeekerCloser represents a reader that can also delegate io.Seeker and +// io.Closer interfaces to the underlying object if they are available. +type ReaderSeekerCloser struct { + r io.Reader +} + +// IsReaderSeekable returns if the underlying reader type can be seeked. A +// io.Reader might not actually be seekable if it is the ReaderSeekerCloser +// type. +func IsReaderSeekable(r io.Reader) bool { + switch v := r.(type) { + case ReaderSeekerCloser: + return v.IsSeeker() + case *ReaderSeekerCloser: + return v.IsSeeker() + case io.ReadSeeker: + return true + default: + return false + } +} + +// Read reads from the reader up to size of p. The number of bytes read, and +// error if it occurred will be returned. +// +// If the reader is not an io.Reader zero bytes read, and nil error will be returned. +// +// Performs the same functionality as io.Reader Read +func (r ReaderSeekerCloser) Read(p []byte) (int, error) { + switch t := r.r.(type) { + case io.Reader: + return t.Read(p) + } + return 0, nil +} + +// Seek sets the offset for the next Read to offset, interpreted according to +// whence: 0 means relative to the origin of the file, 1 means relative to the +// current offset, and 2 means relative to the end. Seek returns the new offset +// and an error, if any. +// +// If the ReaderSeekerCloser is not an io.Seeker nothing will be done. +func (r ReaderSeekerCloser) Seek(offset int64, whence int) (int64, error) { + switch t := r.r.(type) { + case io.Seeker: + return t.Seek(offset, whence) + } + return int64(0), nil +} + +// IsSeeker returns if the underlying reader is also a seeker. +func (r ReaderSeekerCloser) IsSeeker() bool { + _, ok := r.r.(io.Seeker) + return ok +} + +// HasLen returns the length of the underlying reader if the value implements +// the Len() int method. +func (r ReaderSeekerCloser) HasLen() (int, bool) { + type lenner interface { + Len() int + } + + if lr, ok := r.r.(lenner); ok { + return lr.Len(), true + } + + return 0, false +} + +// GetLen returns the length of the bytes remaining in the underlying reader. +// Checks first for Len(), then io.Seeker to determine the size of the +// underlying reader. +// +// Will return -1 if the length cannot be determined. +func (r ReaderSeekerCloser) GetLen() (int64, error) { + if l, ok := r.HasLen(); ok { + return int64(l), nil + } + + if s, ok := r.r.(io.Seeker); ok { + return seekerLen(s) + } + + return -1, nil +} + +// SeekerLen attempts to get the number of bytes remaining at the seeker's +// current position. Returns the number of bytes remaining or error. +func SeekerLen(s io.Seeker) (int64, error) { + // Determine if the seeker is actually seekable. ReaderSeekerCloser + // hides the fact that a io.Readers might not actually be seekable. + switch v := s.(type) { + case ReaderSeekerCloser: + return v.GetLen() + case *ReaderSeekerCloser: + return v.GetLen() + } + + return seekerLen(s) +} + +func seekerLen(s io.Seeker) (int64, error) { + curOffset, err := s.Seek(0, sdkio.SeekCurrent) + if err != nil { + return 0, err + } + + endOffset, err := s.Seek(0, sdkio.SeekEnd) + if err != nil { + return 0, err + } + + _, err = s.Seek(curOffset, sdkio.SeekStart) + if err != nil { + return 0, err + } + + return endOffset - curOffset, nil +} + +// Close closes the ReaderSeekerCloser. +// +// If the ReaderSeekerCloser is not an io.Closer nothing will be done. +func (r ReaderSeekerCloser) Close() error { + switch t := r.r.(type) { + case io.Closer: + return t.Close() + } + return nil +} + +// A WriteAtBuffer provides a in memory buffer supporting the io.WriterAt interface +// Can be used with the s3manager.Downloader to download content to a buffer +// in memory. Safe to use concurrently. +type WriteAtBuffer struct { + buf []byte + m sync.Mutex + + // GrowthCoeff defines the growth rate of the internal buffer. By + // default, the growth rate is 1, where expanding the internal + // buffer will allocate only enough capacity to fit the new expected + // length. + GrowthCoeff float64 +} + +// NewWriteAtBuffer creates a WriteAtBuffer with an internal buffer +// provided by buf. +func NewWriteAtBuffer(buf []byte) *WriteAtBuffer { + return &WriteAtBuffer{buf: buf} +} + +// WriteAt writes a slice of bytes to a buffer starting at the position provided +// The number of bytes written will be returned, or error. Can overwrite previous +// written slices if the write ats overlap. +func (b *WriteAtBuffer) WriteAt(p []byte, pos int64) (n int, err error) { + pLen := len(p) + expLen := pos + int64(pLen) + b.m.Lock() + defer b.m.Unlock() + if int64(len(b.buf)) < expLen { + if int64(cap(b.buf)) < expLen { + if b.GrowthCoeff < 1 { + b.GrowthCoeff = 1 + } + newBuf := make([]byte, expLen, int64(b.GrowthCoeff*float64(expLen))) + copy(newBuf, b.buf) + b.buf = newBuf + } + b.buf = b.buf[:expLen] + } + copy(b.buf[pos:], p) + return pLen, nil +} + +// Bytes returns a slice of bytes written to the buffer. +func (b *WriteAtBuffer) Bytes() []byte { + b.m.Lock() + defer b.m.Unlock() + return b.buf +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/url.go b/vendor/github.com/aws/aws-sdk-go/aws/url.go new file mode 100644 index 000000000..6192b2455 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/url.go @@ -0,0 +1,12 @@ +// +build go1.8 + +package aws + +import "net/url" + +// URLHostname will extract the Hostname without port from the URL value. +// +// Wrapper of net/url#URL.Hostname for backwards Go version compatibility. +func URLHostname(url *url.URL) string { + return url.Hostname() +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go new file mode 100644 index 000000000..0210d2720 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go @@ -0,0 +1,29 @@ +// +build !go1.8 + +package aws + +import ( + "net/url" + "strings" +) + +// URLHostname will extract the Hostname without port from the URL value. +// +// Copy of Go 1.8's net/url#URL.Hostname functionality. +func URLHostname(url *url.URL) string { + return stripPort(url.Host) + +} + +// stripPort is copy of Go 1.8 url#URL.Hostname functionality. +// https://golang.org/src/net/url/url.go +func stripPort(hostport string) string { + colon := strings.IndexByte(hostport, ':') + if colon == -1 { + return hostport + } + if i := strings.IndexByte(hostport, ']'); i != -1 { + return strings.TrimPrefix(hostport[:i], "[") + } + return hostport[:colon] +} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go new file mode 100644 index 000000000..5d662cd33 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go @@ -0,0 +1,8 @@ +// Package aws provides core functionality for making requests to AWS services. +package aws + +// SDKName is the name of this AWS SDK +const SDKName = "aws-sdk-go" + +// SDKVersion is the version of this SDK +const SDKVersion = "1.19.38" diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go new file mode 100644 index 000000000..e83a99886 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go @@ -0,0 +1,120 @@ +package ini + +// ASTKind represents different states in the parse table +// and the type of AST that is being constructed +type ASTKind int + +// ASTKind* is used in the parse table to transition between +// the different states +const ( + ASTKindNone = ASTKind(iota) + ASTKindStart + ASTKindExpr + ASTKindEqualExpr + ASTKindStatement + ASTKindSkipStatement + ASTKindExprStatement + ASTKindSectionStatement + ASTKindNestedSectionStatement + ASTKindCompletedNestedSectionStatement + ASTKindCommentStatement + ASTKindCompletedSectionStatement +) + +func (k ASTKind) String() string { + switch k { + case ASTKindNone: + return "none" + case ASTKindStart: + return "start" + case ASTKindExpr: + return "expr" + case ASTKindStatement: + return "stmt" + case ASTKindSectionStatement: + return "section_stmt" + case ASTKindExprStatement: + return "expr_stmt" + case ASTKindCommentStatement: + return "comment" + case ASTKindNestedSectionStatement: + return "nested_section_stmt" + case ASTKindCompletedSectionStatement: + return "completed_stmt" + case ASTKindSkipStatement: + return "skip" + default: + return "" + } +} + +// AST interface allows us to determine what kind of node we +// are on and casting may not need to be necessary. +// +// The root is always the first node in Children +type AST struct { + Kind ASTKind + Root Token + RootToken bool + Children []AST +} + +func newAST(kind ASTKind, root AST, children ...AST) AST { + return AST{ + Kind: kind, + Children: append([]AST{root}, children...), + } +} + +func newASTWithRootToken(kind ASTKind, root Token, children ...AST) AST { + return AST{ + Kind: kind, + Root: root, + RootToken: true, + Children: children, + } +} + +// AppendChild will append to the list of children an AST has. +func (a *AST) AppendChild(child AST) { + a.Children = append(a.Children, child) +} + +// GetRoot will return the root AST which can be the first entry +// in the children list or a token. +func (a *AST) GetRoot() AST { + if a.RootToken { + return *a + } + + if len(a.Children) == 0 { + return AST{} + } + + return a.Children[0] +} + +// GetChildren will return the current AST's list of children +func (a *AST) GetChildren() []AST { + if len(a.Children) == 0 { + return []AST{} + } + + if a.RootToken { + return a.Children + } + + return a.Children[1:] +} + +// SetChildren will set and override all children of the AST. +func (a *AST) SetChildren(children []AST) { + if a.RootToken { + a.Children = children + } else { + a.Children = append(a.Children[:1], children...) + } +} + +// Start is used to indicate the starting state of the parse table. +var Start = newAST(ASTKindStart, AST{}) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go new file mode 100644 index 000000000..0895d53cb --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go @@ -0,0 +1,11 @@ +package ini + +var commaRunes = []rune(",") + +func isComma(b rune) bool { + return b == ',' +} + +func newCommaToken() Token { + return newToken(TokenComma, commaRunes, NoneType) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go new file mode 100644 index 000000000..0b76999ba --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go @@ -0,0 +1,35 @@ +package ini + +// isComment will return whether or not the next byte(s) is a +// comment. +func isComment(b []rune) bool { + if len(b) == 0 { + return false + } + + switch b[0] { + case ';': + return true + case '#': + return true + } + + return false +} + +// newCommentToken will create a comment token and +// return how many bytes were read. +func newCommentToken(b []rune) (Token, int, error) { + i := 0 + for ; i < len(b); i++ { + if b[i] == '\n' { + break + } + + if len(b)-i > 2 && b[i] == '\r' && b[i+1] == '\n' { + break + } + } + + return newToken(TokenComment, b[:i], NoneType), i, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go new file mode 100644 index 000000000..25ce0fe13 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go @@ -0,0 +1,29 @@ +// Package ini is an LL(1) parser for configuration files. +// +// Example: +// sections, err := ini.OpenFile("/path/to/file") +// if err != nil { +// panic(err) +// } +// +// profile := "foo" +// section, ok := sections.GetSection(profile) +// if !ok { +// fmt.Printf("section %q could not be found", profile) +// } +// +// Below is the BNF that describes this parser +// Grammar: +// stmt -> value stmt' +// stmt' -> epsilon | op stmt +// value -> number | string | boolean | quoted_string +// +// section -> [ section' +// section' -> value section_close +// section_close -> ] +// +// SkipState will skip (NL WS)+ +// +// comment -> # comment' | ; comment' +// comment' -> epsilon | value +package ini diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go new file mode 100644 index 000000000..04345a54c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go @@ -0,0 +1,4 @@ +package ini + +// emptyToken is used to satisfy the Token interface +var emptyToken = newToken(TokenNone, []rune{}, NoneType) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go new file mode 100644 index 000000000..91ba2a59d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go @@ -0,0 +1,24 @@ +package ini + +// newExpression will return an expression AST. +// Expr represents an expression +// +// grammar: +// expr -> string | number +func newExpression(tok Token) AST { + return newASTWithRootToken(ASTKindExpr, tok) +} + +func newEqualExpr(left AST, tok Token) AST { + return newASTWithRootToken(ASTKindEqualExpr, tok, left) +} + +// EqualExprKey will return a LHS value in the equal expr +func EqualExprKey(ast AST) string { + children := ast.GetChildren() + if len(children) == 0 || ast.Kind != ASTKindEqualExpr { + return "" + } + + return string(children[0].Root.Raw()) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go new file mode 100644 index 000000000..8d462f77e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go @@ -0,0 +1,17 @@ +// +build gofuzz + +package ini + +import ( + "bytes" +) + +func Fuzz(data []byte) int { + b := bytes.NewReader(data) + + if _, err := Parse(b); err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go new file mode 100644 index 000000000..3b0ca7afe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go @@ -0,0 +1,51 @@ +package ini + +import ( + "io" + "os" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +// OpenFile takes a path to a given file, and will open and parse +// that file. +func OpenFile(path string) (Sections, error) { + f, err := os.Open(path) + if err != nil { + return Sections{}, awserr.New(ErrCodeUnableToReadFile, "unable to open file", err) + } + defer f.Close() + + return Parse(f) +} + +// Parse will parse the given file using the shared config +// visitor. +func Parse(f io.Reader) (Sections, error) { + tree, err := ParseAST(f) + if err != nil { + return Sections{}, err + } + + v := NewDefaultVisitor() + if err = Walk(tree, v); err != nil { + return Sections{}, err + } + + return v.Sections, nil +} + +// ParseBytes will parse the given bytes and return the parsed sections. +func ParseBytes(b []byte) (Sections, error) { + tree, err := ParseASTBytes(b) + if err != nil { + return Sections{}, err + } + + v := NewDefaultVisitor() + if err = Walk(tree, v); err != nil { + return Sections{}, err + } + + return v.Sections, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go new file mode 100644 index 000000000..582c024ad --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go @@ -0,0 +1,165 @@ +package ini + +import ( + "bytes" + "io" + "io/ioutil" + + "github.com/aws/aws-sdk-go/aws/awserr" +) + +const ( + // ErrCodeUnableToReadFile is used when a file is failed to be + // opened or read from. + ErrCodeUnableToReadFile = "FailedRead" +) + +// TokenType represents the various different tokens types +type TokenType int + +func (t TokenType) String() string { + switch t { + case TokenNone: + return "none" + case TokenLit: + return "literal" + case TokenSep: + return "sep" + case TokenOp: + return "op" + case TokenWS: + return "ws" + case TokenNL: + return "newline" + case TokenComment: + return "comment" + case TokenComma: + return "comma" + default: + return "" + } +} + +// TokenType enums +const ( + TokenNone = TokenType(iota) + TokenLit + TokenSep + TokenComma + TokenOp + TokenWS + TokenNL + TokenComment +) + +type iniLexer struct{} + +// Tokenize will return a list of tokens during lexical analysis of the +// io.Reader. +func (l *iniLexer) Tokenize(r io.Reader) ([]Token, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, awserr.New(ErrCodeUnableToReadFile, "unable to read file", err) + } + + return l.tokenize(b) +} + +func (l *iniLexer) tokenize(b []byte) ([]Token, error) { + runes := bytes.Runes(b) + var err error + n := 0 + tokenAmount := countTokens(runes) + tokens := make([]Token, tokenAmount) + count := 0 + + for len(runes) > 0 && count < tokenAmount { + switch { + case isWhitespace(runes[0]): + tokens[count], n, err = newWSToken(runes) + case isComma(runes[0]): + tokens[count], n = newCommaToken(), 1 + case isComment(runes): + tokens[count], n, err = newCommentToken(runes) + case isNewline(runes): + tokens[count], n, err = newNewlineToken(runes) + case isSep(runes): + tokens[count], n, err = newSepToken(runes) + case isOp(runes): + tokens[count], n, err = newOpToken(runes) + default: + tokens[count], n, err = newLitToken(runes) + } + + if err != nil { + return nil, err + } + + count++ + + runes = runes[n:] + } + + return tokens[:count], nil +} + +func countTokens(runes []rune) int { + count, n := 0, 0 + var err error + + for len(runes) > 0 { + switch { + case isWhitespace(runes[0]): + _, n, err = newWSToken(runes) + case isComma(runes[0]): + _, n = newCommaToken(), 1 + case isComment(runes): + _, n, err = newCommentToken(runes) + case isNewline(runes): + _, n, err = newNewlineToken(runes) + case isSep(runes): + _, n, err = newSepToken(runes) + case isOp(runes): + _, n, err = newOpToken(runes) + default: + _, n, err = newLitToken(runes) + } + + if err != nil { + return 0 + } + + count++ + runes = runes[n:] + } + + return count + 1 +} + +// Token indicates a metadata about a given value. +type Token struct { + t TokenType + ValueType ValueType + base int + raw []rune +} + +var emptyValue = Value{} + +func newToken(t TokenType, raw []rune, v ValueType) Token { + return Token{ + t: t, + raw: raw, + ValueType: v, + } +} + +// Raw return the raw runes that were consumed +func (tok Token) Raw() []rune { + return tok.raw +} + +// Type returns the token type +func (tok Token) Type() TokenType { + return tok.t +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go new file mode 100644 index 000000000..f99703372 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go @@ -0,0 +1,347 @@ +package ini + +import ( + "fmt" + "io" +) + +// State enums for the parse table +const ( + InvalidState = iota + // stmt -> value stmt' + StatementState + // stmt' -> MarkComplete | op stmt + StatementPrimeState + // value -> number | string | boolean | quoted_string + ValueState + // section -> [ section' + OpenScopeState + // section' -> value section_close + SectionState + // section_close -> ] + CloseScopeState + // SkipState will skip (NL WS)+ + SkipState + // SkipTokenState will skip any token and push the previous + // state onto the stack. + SkipTokenState + // comment -> # comment' | ; comment' + // comment' -> MarkComplete | value + CommentState + // MarkComplete state will complete statements and move that + // to the completed AST list + MarkCompleteState + // TerminalState signifies that the tokens have been fully parsed + TerminalState +) + +// parseTable is a state machine to dictate the grammar above. +var parseTable = map[ASTKind]map[TokenType]int{ + ASTKindStart: map[TokenType]int{ + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: TerminalState, + }, + ASTKindCommentStatement: map[TokenType]int{ + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindExpr: map[TokenType]int{ + TokenOp: StatementPrimeState, + TokenLit: ValueState, + TokenSep: OpenScopeState, + TokenWS: ValueState, + TokenNL: SkipState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindEqualExpr: map[TokenType]int{ + TokenLit: ValueState, + TokenWS: SkipTokenState, + TokenNL: SkipState, + }, + ASTKindStatement: map[TokenType]int{ + TokenLit: SectionState, + TokenSep: CloseScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindExprStatement: map[TokenType]int{ + TokenLit: ValueState, + TokenSep: OpenScopeState, + TokenOp: ValueState, + TokenWS: ValueState, + TokenNL: MarkCompleteState, + TokenComment: CommentState, + TokenNone: TerminalState, + TokenComma: SkipState, + }, + ASTKindSectionStatement: map[TokenType]int{ + TokenLit: SectionState, + TokenOp: SectionState, + TokenSep: CloseScopeState, + TokenWS: SectionState, + TokenNL: SkipTokenState, + }, + ASTKindCompletedSectionStatement: map[TokenType]int{ + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenComment: CommentState, + TokenNone: MarkCompleteState, + }, + ASTKindSkipStatement: map[TokenType]int{ + TokenLit: StatementState, + TokenSep: OpenScopeState, + TokenWS: SkipTokenState, + TokenNL: SkipTokenState, + TokenComment: CommentState, + TokenNone: TerminalState, + }, +} + +// ParseAST will parse input from an io.Reader using +// an LL(1) parser. +func ParseAST(r io.Reader) ([]AST, error) { + lexer := iniLexer{} + tokens, err := lexer.Tokenize(r) + if err != nil { + return []AST{}, err + } + + return parse(tokens) +} + +// ParseASTBytes will parse input from a byte slice using +// an LL(1) parser. +func ParseASTBytes(b []byte) ([]AST, error) { + lexer := iniLexer{} + tokens, err := lexer.tokenize(b) + if err != nil { + return []AST{}, err + } + + return parse(tokens) +} + +func parse(tokens []Token) ([]AST, error) { + start := Start + stack := newParseStack(3, len(tokens)) + + stack.Push(start) + s := newSkipper() + +loop: + for stack.Len() > 0 { + k := stack.Pop() + + var tok Token + if len(tokens) == 0 { + // this occurs when all the tokens have been processed + // but reduction of what's left on the stack needs to + // occur. + tok = emptyToken + } else { + tok = tokens[0] + } + + step := parseTable[k.Kind][tok.Type()] + if s.ShouldSkip(tok) { + // being in a skip state with no tokens will break out of + // the parse loop since there is nothing left to process. + if len(tokens) == 0 { + break loop + } + + step = SkipTokenState + } + + switch step { + case TerminalState: + // Finished parsing. Push what should be the last + // statement to the stack. If there is anything left + // on the stack, an error in parsing has occurred. + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + break loop + case SkipTokenState: + // When skipping a token, the previous state was popped off the stack. + // To maintain the correct state, the previous state will be pushed + // onto the stack. + stack.Push(k) + case StatementState: + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + expr := newExpression(tok) + stack.Push(expr) + case StatementPrimeState: + if tok.Type() != TokenOp { + stack.MarkComplete(k) + continue + } + + if k.Kind != ASTKindExpr { + return nil, NewParseError( + fmt.Sprintf("invalid expression: expected Expr type, but found %T type", k), + ) + } + + k = trimSpaces(k) + expr := newEqualExpr(k, tok) + stack.Push(expr) + case ValueState: + // ValueState requires the previous state to either be an equal expression + // or an expression statement. + // + // This grammar occurs when the RHS is a number, word, or quoted string. + // equal_expr -> lit op equal_expr' + // equal_expr' -> number | string | quoted_string + // quoted_string -> " quoted_string' + // quoted_string' -> string quoted_string_end + // quoted_string_end -> " + // + // otherwise + // expr_stmt -> equal_expr (expr_stmt')* + // expr_stmt' -> ws S | op S | MarkComplete + // S -> equal_expr' expr_stmt' + switch k.Kind { + case ASTKindEqualExpr: + // assiging a value to some key + k.AppendChild(newExpression(tok)) + stack.Push(newExprStatement(k)) + case ASTKindExpr: + k.Root.raw = append(k.Root.raw, tok.Raw()...) + stack.Push(k) + case ASTKindExprStatement: + root := k.GetRoot() + children := root.GetChildren() + if len(children) == 0 { + return nil, NewParseError( + fmt.Sprintf("invalid expression: AST contains no children %s", k.Kind), + ) + } + + rhs := children[len(children)-1] + + if rhs.Root.ValueType != QuotedStringType { + rhs.Root.ValueType = StringType + rhs.Root.raw = append(rhs.Root.raw, tok.Raw()...) + + } + + children[len(children)-1] = rhs + k.SetChildren(children) + + stack.Push(k) + } + case OpenScopeState: + if !runeCompare(tok.Raw(), openBrace) { + return nil, NewParseError("expected '['") + } + + stmt := newStatement() + stack.Push(stmt) + case CloseScopeState: + if !runeCompare(tok.Raw(), closeBrace) { + return nil, NewParseError("expected ']'") + } + + k = trimSpaces(k) + stack.Push(newCompletedSectionStatement(k)) + case SectionState: + var stmt AST + + switch k.Kind { + case ASTKindStatement: + // If there are multiple literals inside of a scope declaration, + // then the current token's raw value will be appended to the Name. + // + // This handles cases like [ profile default ] + // + // k will represent a SectionStatement with the children representing + // the label of the section + stmt = newSectionStatement(tok) + case ASTKindSectionStatement: + k.Root.raw = append(k.Root.raw, tok.Raw()...) + stmt = k + default: + return nil, NewParseError( + fmt.Sprintf("invalid statement: expected statement: %v", k.Kind), + ) + } + + stack.Push(stmt) + case MarkCompleteState: + if k.Kind != ASTKindStart { + stack.MarkComplete(k) + } + + if stack.Len() == 0 { + stack.Push(start) + } + case SkipState: + stack.Push(newSkipStatement(k)) + s.Skip() + case CommentState: + if k.Kind == ASTKindStart { + stack.Push(k) + } else { + stack.MarkComplete(k) + } + + stmt := newCommentStatement(tok) + stack.Push(stmt) + default: + return nil, NewParseError(fmt.Sprintf("invalid state with ASTKind %v and TokenType %v", k, tok)) + } + + if len(tokens) > 0 { + tokens = tokens[1:] + } + } + + // this occurs when a statement has not been completed + if stack.top > 1 { + return nil, NewParseError(fmt.Sprintf("incomplete expression: %v", stack.container)) + } + + // returns a sublist which excludes the start symbol + return stack.List(), nil +} + +// trimSpaces will trim spaces on the left and right hand side of +// the literal. +func trimSpaces(k AST) AST { + // trim left hand side of spaces + for i := 0; i < len(k.Root.raw); i++ { + if !isWhitespace(k.Root.raw[i]) { + break + } + + k.Root.raw = k.Root.raw[1:] + i-- + } + + // trim right hand side of spaces + for i := len(k.Root.raw) - 1; i >= 0; i-- { + if !isWhitespace(k.Root.raw[i]) { + break + } + + k.Root.raw = k.Root.raw[:len(k.Root.raw)-1] + } + + return k +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go new file mode 100644 index 000000000..24df543d3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go @@ -0,0 +1,324 @@ +package ini + +import ( + "fmt" + "strconv" + "strings" +) + +var ( + runesTrue = []rune("true") + runesFalse = []rune("false") +) + +var literalValues = [][]rune{ + runesTrue, + runesFalse, +} + +func isBoolValue(b []rune) bool { + for _, lv := range literalValues { + if isLitValue(lv, b) { + return true + } + } + return false +} + +func isLitValue(want, have []rune) bool { + if len(have) < len(want) { + return false + } + + for i := 0; i < len(want); i++ { + if want[i] != have[i] { + return false + } + } + + return true +} + +// isNumberValue will return whether not the leading characters in +// a byte slice is a number. A number is delimited by whitespace or +// the newline token. +// +// A number is defined to be in a binary, octal, decimal (int | float), hex format, +// or in scientific notation. +func isNumberValue(b []rune) bool { + negativeIndex := 0 + helper := numberHelper{} + needDigit := false + + for i := 0; i < len(b); i++ { + negativeIndex++ + + switch b[i] { + case '-': + if helper.IsNegative() || negativeIndex != 1 { + return false + } + helper.Determine(b[i]) + needDigit = true + continue + case 'e', 'E': + if err := helper.Determine(b[i]); err != nil { + return false + } + negativeIndex = 0 + needDigit = true + continue + case 'b': + if helper.numberFormat == hex { + break + } + fallthrough + case 'o', 'x': + needDigit = true + if i == 0 { + return false + } + + fallthrough + case '.': + if err := helper.Determine(b[i]); err != nil { + return false + } + needDigit = true + continue + } + + if i > 0 && (isNewline(b[i:]) || isWhitespace(b[i])) { + return !needDigit + } + + if !helper.CorrectByte(b[i]) { + return false + } + needDigit = false + } + + return !needDigit +} + +func isValid(b []rune) (bool, int, error) { + if len(b) == 0 { + // TODO: should probably return an error + return false, 0, nil + } + + return isValidRune(b[0]), 1, nil +} + +func isValidRune(r rune) bool { + return r != ':' && r != '=' && r != '[' && r != ']' && r != ' ' && r != '\n' +} + +// ValueType is an enum that will signify what type +// the Value is +type ValueType int + +func (v ValueType) String() string { + switch v { + case NoneType: + return "NONE" + case DecimalType: + return "FLOAT" + case IntegerType: + return "INT" + case StringType: + return "STRING" + case BoolType: + return "BOOL" + } + + return "" +} + +// ValueType enums +const ( + NoneType = ValueType(iota) + DecimalType + IntegerType + StringType + QuotedStringType + BoolType +) + +// Value is a union container +type Value struct { + Type ValueType + raw []rune + + integer int64 + decimal float64 + boolean bool + str string +} + +func newValue(t ValueType, base int, raw []rune) (Value, error) { + v := Value{ + Type: t, + raw: raw, + } + var err error + + switch t { + case DecimalType: + v.decimal, err = strconv.ParseFloat(string(raw), 64) + case IntegerType: + if base != 10 { + raw = raw[2:] + } + + v.integer, err = strconv.ParseInt(string(raw), base, 64) + case StringType: + v.str = string(raw) + case QuotedStringType: + v.str = string(raw[1 : len(raw)-1]) + case BoolType: + v.boolean = runeCompare(v.raw, runesTrue) + } + + // issue 2253 + // + // if the value trying to be parsed is too large, then we will use + // the 'StringType' and raw value instead. + if nerr, ok := err.(*strconv.NumError); ok && nerr.Err == strconv.ErrRange { + v.Type = StringType + v.str = string(raw) + err = nil + } + + return v, err +} + +// Append will append values and change the type to a string +// type. +func (v *Value) Append(tok Token) { + r := tok.Raw() + if v.Type != QuotedStringType { + v.Type = StringType + r = tok.raw[1 : len(tok.raw)-1] + } + if tok.Type() != TokenLit { + v.raw = append(v.raw, tok.Raw()...) + } else { + v.raw = append(v.raw, r...) + } +} + +func (v Value) String() string { + switch v.Type { + case DecimalType: + return fmt.Sprintf("decimal: %f", v.decimal) + case IntegerType: + return fmt.Sprintf("integer: %d", v.integer) + case StringType: + return fmt.Sprintf("string: %s", string(v.raw)) + case QuotedStringType: + return fmt.Sprintf("quoted string: %s", string(v.raw)) + case BoolType: + return fmt.Sprintf("bool: %t", v.boolean) + default: + return "union not set" + } +} + +func newLitToken(b []rune) (Token, int, error) { + n := 0 + var err error + + token := Token{} + if b[0] == '"' { + n, err = getStringValue(b) + if err != nil { + return token, n, err + } + + token = newToken(TokenLit, b[:n], QuotedStringType) + } else if isNumberValue(b) { + var base int + base, n, err = getNumericalValue(b) + if err != nil { + return token, 0, err + } + + value := b[:n] + vType := IntegerType + if contains(value, '.') || hasExponent(value) { + vType = DecimalType + } + token = newToken(TokenLit, value, vType) + token.base = base + } else if isBoolValue(b) { + n, err = getBoolValue(b) + + token = newToken(TokenLit, b[:n], BoolType) + } else { + n, err = getValue(b) + token = newToken(TokenLit, b[:n], StringType) + } + + return token, n, err +} + +// IntValue returns an integer value +func (v Value) IntValue() int64 { + return v.integer +} + +// FloatValue returns a float value +func (v Value) FloatValue() float64 { + return v.decimal +} + +// BoolValue returns a bool value +func (v Value) BoolValue() bool { + return v.boolean +} + +func isTrimmable(r rune) bool { + switch r { + case '\n', ' ': + return true + } + return false +} + +// StringValue returns the string value +func (v Value) StringValue() string { + switch v.Type { + case StringType: + return strings.TrimFunc(string(v.raw), isTrimmable) + case QuotedStringType: + // preserve all characters in the quotes + return string(removeEscapedCharacters(v.raw[1 : len(v.raw)-1])) + default: + return strings.TrimFunc(string(v.raw), isTrimmable) + } +} + +func contains(runes []rune, c rune) bool { + for i := 0; i < len(runes); i++ { + if runes[i] == c { + return true + } + } + + return false +} + +func runeCompare(v1 []rune, v2 []rune) bool { + if len(v1) != len(v2) { + return false + } + + for i := 0; i < len(v1); i++ { + if v1[i] != v2[i] { + return false + } + } + + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go new file mode 100644 index 000000000..e52ac399f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go @@ -0,0 +1,30 @@ +package ini + +func isNewline(b []rune) bool { + if len(b) == 0 { + return false + } + + if b[0] == '\n' { + return true + } + + if len(b) < 2 { + return false + } + + return b[0] == '\r' && b[1] == '\n' +} + +func newNewlineToken(b []rune) (Token, int, error) { + i := 1 + if b[0] == '\r' && isNewline(b[1:]) { + i++ + } + + if !isNewline([]rune(b[:i])) { + return emptyToken, 0, NewParseError("invalid new line token") + } + + return newToken(TokenNL, b[:i], NoneType), i, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go new file mode 100644 index 000000000..a45c0bc56 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go @@ -0,0 +1,152 @@ +package ini + +import ( + "bytes" + "fmt" + "strconv" +) + +const ( + none = numberFormat(iota) + binary + octal + decimal + hex + exponent +) + +type numberFormat int + +// numberHelper is used to dictate what format a number is in +// and what to do for negative values. Since -1e-4 is a valid +// number, we cannot just simply check for duplicate negatives. +type numberHelper struct { + numberFormat numberFormat + + negative bool + negativeExponent bool +} + +func (b numberHelper) Exists() bool { + return b.numberFormat != none +} + +func (b numberHelper) IsNegative() bool { + return b.negative || b.negativeExponent +} + +func (b *numberHelper) Determine(c rune) error { + if b.Exists() { + return NewParseError(fmt.Sprintf("multiple number formats: 0%v", string(c))) + } + + switch c { + case 'b': + b.numberFormat = binary + case 'o': + b.numberFormat = octal + case 'x': + b.numberFormat = hex + case 'e', 'E': + b.numberFormat = exponent + case '-': + if b.numberFormat != exponent { + b.negative = true + } else { + b.negativeExponent = true + } + case '.': + b.numberFormat = decimal + default: + return NewParseError(fmt.Sprintf("invalid number character: %v", string(c))) + } + + return nil +} + +func (b numberHelper) CorrectByte(c rune) bool { + switch { + case b.numberFormat == binary: + if !isBinaryByte(c) { + return false + } + case b.numberFormat == octal: + if !isOctalByte(c) { + return false + } + case b.numberFormat == hex: + if !isHexByte(c) { + return false + } + case b.numberFormat == decimal: + if !isDigit(c) { + return false + } + case b.numberFormat == exponent: + if !isDigit(c) { + return false + } + case b.negativeExponent: + if !isDigit(c) { + return false + } + case b.negative: + if !isDigit(c) { + return false + } + default: + if !isDigit(c) { + return false + } + } + + return true +} + +func (b numberHelper) Base() int { + switch b.numberFormat { + case binary: + return 2 + case octal: + return 8 + case hex: + return 16 + default: + return 10 + } +} + +func (b numberHelper) String() string { + buf := bytes.Buffer{} + i := 0 + + switch b.numberFormat { + case binary: + i++ + buf.WriteString(strconv.Itoa(i) + ": binary format\n") + case octal: + i++ + buf.WriteString(strconv.Itoa(i) + ": octal format\n") + case hex: + i++ + buf.WriteString(strconv.Itoa(i) + ": hex format\n") + case exponent: + i++ + buf.WriteString(strconv.Itoa(i) + ": exponent format\n") + default: + i++ + buf.WriteString(strconv.Itoa(i) + ": integer format\n") + } + + if b.negative { + i++ + buf.WriteString(strconv.Itoa(i) + ": negative format\n") + } + + if b.negativeExponent { + i++ + buf.WriteString(strconv.Itoa(i) + ": negative exponent format\n") + } + + return buf.String() +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go new file mode 100644 index 000000000..8a84c7cbe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go @@ -0,0 +1,39 @@ +package ini + +import ( + "fmt" +) + +var ( + equalOp = []rune("=") + equalColonOp = []rune(":") +) + +func isOp(b []rune) bool { + if len(b) == 0 { + return false + } + + switch b[0] { + case '=': + return true + case ':': + return true + default: + return false + } +} + +func newOpToken(b []rune) (Token, int, error) { + tok := Token{} + + switch b[0] { + case '=': + tok = newToken(TokenOp, equalOp, NoneType) + case ':': + tok = newToken(TokenOp, equalColonOp, NoneType) + default: + return tok, 0, NewParseError(fmt.Sprintf("unexpected op type, %v", b[0])) + } + return tok, 1, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go new file mode 100644 index 000000000..457287019 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go @@ -0,0 +1,43 @@ +package ini + +import "fmt" + +const ( + // ErrCodeParseError is returned when a parsing error + // has occurred. + ErrCodeParseError = "INIParseError" +) + +// ParseError is an error which is returned during any part of +// the parsing process. +type ParseError struct { + msg string +} + +// NewParseError will return a new ParseError where message +// is the description of the error. +func NewParseError(message string) *ParseError { + return &ParseError{ + msg: message, + } +} + +// Code will return the ErrCodeParseError +func (err *ParseError) Code() string { + return ErrCodeParseError +} + +// Message returns the error's message +func (err *ParseError) Message() string { + return err.msg +} + +// OrigError return nothing since there will never be any +// original error. +func (err *ParseError) OrigError() error { + return nil +} + +func (err *ParseError) Error() string { + return fmt.Sprintf("%s: %s", err.Code(), err.Message()) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go new file mode 100644 index 000000000..7f01cf7c7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go @@ -0,0 +1,60 @@ +package ini + +import ( + "bytes" + "fmt" +) + +// ParseStack is a stack that contains a container, the stack portion, +// and the list which is the list of ASTs that have been successfully +// parsed. +type ParseStack struct { + top int + container []AST + list []AST + index int +} + +func newParseStack(sizeContainer, sizeList int) ParseStack { + return ParseStack{ + container: make([]AST, sizeContainer), + list: make([]AST, sizeList), + } +} + +// Pop will return and truncate the last container element. +func (s *ParseStack) Pop() AST { + s.top-- + return s.container[s.top] +} + +// Push will add the new AST to the container +func (s *ParseStack) Push(ast AST) { + s.container[s.top] = ast + s.top++ +} + +// MarkComplete will append the AST to the list of completed statements +func (s *ParseStack) MarkComplete(ast AST) { + s.list[s.index] = ast + s.index++ +} + +// List will return the completed statements +func (s ParseStack) List() []AST { + return s.list[:s.index] +} + +// Len will return the length of the container +func (s *ParseStack) Len() int { + return s.top +} + +func (s ParseStack) String() string { + buf := bytes.Buffer{} + for i, node := range s.list { + buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node)) + } + + return buf.String() +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go new file mode 100644 index 000000000..f82095ba2 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go @@ -0,0 +1,41 @@ +package ini + +import ( + "fmt" +) + +var ( + emptyRunes = []rune{} +) + +func isSep(b []rune) bool { + if len(b) == 0 { + return false + } + + switch b[0] { + case '[', ']': + return true + default: + return false + } +} + +var ( + openBrace = []rune("[") + closeBrace = []rune("]") +) + +func newSepToken(b []rune) (Token, int, error) { + tok := Token{} + + switch b[0] { + case '[': + tok = newToken(TokenSep, openBrace, NoneType) + case ']': + tok = newToken(TokenSep, closeBrace, NoneType) + default: + return tok, 0, NewParseError(fmt.Sprintf("unexpected sep type, %v", b[0])) + } + return tok, 1, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go new file mode 100644 index 000000000..6bb696447 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go @@ -0,0 +1,45 @@ +package ini + +// skipper is used to skip certain blocks of an ini file. +// Currently skipper is used to skip nested blocks of ini +// files. See example below +// +// [ foo ] +// nested = ; this section will be skipped +// a=b +// c=d +// bar=baz ; this will be included +type skipper struct { + shouldSkip bool + TokenSet bool + prevTok Token +} + +func newSkipper() skipper { + return skipper{ + prevTok: emptyToken, + } +} + +func (s *skipper) ShouldSkip(tok Token) bool { + if s.shouldSkip && + s.prevTok.Type() == TokenNL && + tok.Type() != TokenWS { + + s.Continue() + return false + } + s.prevTok = tok + + return s.shouldSkip +} + +func (s *skipper) Skip() { + s.shouldSkip = true + s.prevTok = emptyToken +} + +func (s *skipper) Continue() { + s.shouldSkip = false + s.prevTok = emptyToken +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go new file mode 100644 index 000000000..18f3fe893 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go @@ -0,0 +1,35 @@ +package ini + +// Statement is an empty AST mostly used for transitioning states. +func newStatement() AST { + return newAST(ASTKindStatement, AST{}) +} + +// SectionStatement represents a section AST +func newSectionStatement(tok Token) AST { + return newASTWithRootToken(ASTKindSectionStatement, tok) +} + +// ExprStatement represents a completed expression AST +func newExprStatement(ast AST) AST { + return newAST(ASTKindExprStatement, ast) +} + +// CommentStatement represents a comment in the ini definition. +// +// grammar: +// comment -> #comment' | ;comment' +// comment' -> epsilon | value +func newCommentStatement(tok Token) AST { + return newAST(ASTKindCommentStatement, newExpression(tok)) +} + +// CompletedSectionStatement represents a completed section +func newCompletedSectionStatement(ast AST) AST { + return newAST(ASTKindCompletedSectionStatement, ast) +} + +// SkipStatement is used to skip whole statements +func newSkipStatement(ast AST) AST { + return newAST(ASTKindSkipStatement, ast) +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go new file mode 100644 index 000000000..305999d29 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go @@ -0,0 +1,284 @@ +package ini + +import ( + "fmt" +) + +// getStringValue will return a quoted string and the amount +// of bytes read +// +// an error will be returned if the string is not properly formatted +func getStringValue(b []rune) (int, error) { + if b[0] != '"' { + return 0, NewParseError("strings must start with '\"'") + } + + endQuote := false + i := 1 + + for ; i < len(b) && !endQuote; i++ { + if escaped := isEscaped(b[:i], b[i]); b[i] == '"' && !escaped { + endQuote = true + break + } else if escaped { + /*c, err := getEscapedByte(b[i]) + if err != nil { + return 0, err + } + + b[i-1] = c + b = append(b[:i], b[i+1:]...) + i--*/ + + continue + } + } + + if !endQuote { + return 0, NewParseError("missing '\"' in string value") + } + + return i + 1, nil +} + +// getBoolValue will return a boolean and the amount +// of bytes read +// +// an error will be returned if the boolean is not of a correct +// value +func getBoolValue(b []rune) (int, error) { + if len(b) < 4 { + return 0, NewParseError("invalid boolean value") + } + + n := 0 + for _, lv := range literalValues { + if len(lv) > len(b) { + continue + } + + if isLitValue(lv, b) { + n = len(lv) + } + } + + if n == 0 { + return 0, NewParseError("invalid boolean value") + } + + return n, nil +} + +// getNumericalValue will return a numerical string, the amount +// of bytes read, and the base of the number +// +// an error will be returned if the number is not of a correct +// value +func getNumericalValue(b []rune) (int, int, error) { + if !isDigit(b[0]) { + return 0, 0, NewParseError("invalid digit value") + } + + i := 0 + helper := numberHelper{} + +loop: + for negativeIndex := 0; i < len(b); i++ { + negativeIndex++ + + if !isDigit(b[i]) { + switch b[i] { + case '-': + if helper.IsNegative() || negativeIndex != 1 { + return 0, 0, NewParseError("parse error '-'") + } + + n := getNegativeNumber(b[i:]) + i += (n - 1) + helper.Determine(b[i]) + continue + case '.': + if err := helper.Determine(b[i]); err != nil { + return 0, 0, err + } + case 'e', 'E': + if err := helper.Determine(b[i]); err != nil { + return 0, 0, err + } + + negativeIndex = 0 + case 'b': + if helper.numberFormat == hex { + break + } + fallthrough + case 'o', 'x': + if i == 0 && b[i] != '0' { + return 0, 0, NewParseError("incorrect base format, expected leading '0'") + } + + if i != 1 { + return 0, 0, NewParseError(fmt.Sprintf("incorrect base format found %s at %d index", string(b[i]), i)) + } + + if err := helper.Determine(b[i]); err != nil { + return 0, 0, err + } + default: + if isWhitespace(b[i]) { + break loop + } + + if isNewline(b[i:]) { + break loop + } + + if !(helper.numberFormat == hex && isHexByte(b[i])) { + if i+2 < len(b) && !isNewline(b[i:i+2]) { + return 0, 0, NewParseError("invalid numerical character") + } else if !isNewline([]rune{b[i]}) { + return 0, 0, NewParseError("invalid numerical character") + } + + break loop + } + } + } + } + + return helper.Base(), i, nil +} + +// isDigit will return whether or not something is an integer +func isDigit(b rune) bool { + return b >= '0' && b <= '9' +} + +func hasExponent(v []rune) bool { + return contains(v, 'e') || contains(v, 'E') +} + +func isBinaryByte(b rune) bool { + switch b { + case '0', '1': + return true + default: + return false + } +} + +func isOctalByte(b rune) bool { + switch b { + case '0', '1', '2', '3', '4', '5', '6', '7': + return true + default: + return false + } +} + +func isHexByte(b rune) bool { + if isDigit(b) { + return true + } + return (b >= 'A' && b <= 'F') || + (b >= 'a' && b <= 'f') +} + +func getValue(b []rune) (int, error) { + i := 0 + + for i < len(b) { + if isNewline(b[i:]) { + break + } + + if isOp(b[i:]) { + break + } + + valid, n, err := isValid(b[i:]) + if err != nil { + return 0, err + } + + if !valid { + break + } + + i += n + } + + return i, nil +} + +// getNegativeNumber will return a negative number from a +// byte slice. This will iterate through all characters until +// a non-digit has been found. +func getNegativeNumber(b []rune) int { + if b[0] != '-' { + return 0 + } + + i := 1 + for ; i < len(b); i++ { + if !isDigit(b[i]) { + return i + } + } + + return i +} + +// isEscaped will return whether or not the character is an escaped +// character. +func isEscaped(value []rune, b rune) bool { + if len(value) == 0 { + return false + } + + switch b { + case '\'': // single quote + case '"': // quote + case 'n': // newline + case 't': // tab + case '\\': // backslash + default: + return false + } + + return value[len(value)-1] == '\\' +} + +func getEscapedByte(b rune) (rune, error) { + switch b { + case '\'': // single quote + return '\'', nil + case '"': // quote + return '"', nil + case 'n': // newline + return '\n', nil + case 't': // table + return '\t', nil + case '\\': // backslash + return '\\', nil + default: + return b, NewParseError(fmt.Sprintf("invalid escaped character %c", b)) + } +} + +func removeEscapedCharacters(b []rune) []rune { + for i := 0; i < len(b); i++ { + if isEscaped(b[:i], b[i]) { + c, err := getEscapedByte(b[i]) + if err != nil { + return b + } + + b[i-1] = c + b = append(b[:i], b[i+1:]...) + i-- + } + } + + return b +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go new file mode 100644 index 000000000..94841c324 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go @@ -0,0 +1,166 @@ +package ini + +import ( + "fmt" + "sort" +) + +// Visitor is an interface used by walkers that will +// traverse an array of ASTs. +type Visitor interface { + VisitExpr(AST) error + VisitStatement(AST) error +} + +// DefaultVisitor is used to visit statements and expressions +// and ensure that they are both of the correct format. +// In addition, upon visiting this will build sections and populate +// the Sections field which can be used to retrieve profile +// configuration. +type DefaultVisitor struct { + scope string + Sections Sections +} + +// NewDefaultVisitor return a DefaultVisitor +func NewDefaultVisitor() *DefaultVisitor { + return &DefaultVisitor{ + Sections: Sections{ + container: map[string]Section{}, + }, + } +} + +// VisitExpr visits expressions... +func (v *DefaultVisitor) VisitExpr(expr AST) error { + t := v.Sections.container[v.scope] + if t.values == nil { + t.values = values{} + } + + switch expr.Kind { + case ASTKindExprStatement: + opExpr := expr.GetRoot() + switch opExpr.Kind { + case ASTKindEqualExpr: + children := opExpr.GetChildren() + if len(children) <= 1 { + return NewParseError("unexpected token type") + } + + rhs := children[1] + + if rhs.Root.Type() != TokenLit { + return NewParseError("unexpected token type") + } + + key := EqualExprKey(opExpr) + v, err := newValue(rhs.Root.ValueType, rhs.Root.base, rhs.Root.Raw()) + if err != nil { + return err + } + + t.values[key] = v + default: + return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) + } + default: + return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) + } + + v.Sections.container[v.scope] = t + return nil +} + +// VisitStatement visits statements... +func (v *DefaultVisitor) VisitStatement(stmt AST) error { + switch stmt.Kind { + case ASTKindCompletedSectionStatement: + child := stmt.GetRoot() + if child.Kind != ASTKindSectionStatement { + return NewParseError(fmt.Sprintf("unsupported child statement: %T", child)) + } + + name := string(child.Root.Raw()) + v.Sections.container[name] = Section{} + v.scope = name + default: + return NewParseError(fmt.Sprintf("unsupported statement: %s", stmt.Kind)) + } + + return nil +} + +// Sections is a map of Section structures that represent +// a configuration. +type Sections struct { + container map[string]Section +} + +// GetSection will return section p. If section p does not exist, +// false will be returned in the second parameter. +func (t Sections) GetSection(p string) (Section, bool) { + v, ok := t.container[p] + return v, ok +} + +// values represents a map of union values. +type values map[string]Value + +// List will return a list of all sections that were successfully +// parsed. +func (t Sections) List() []string { + keys := make([]string, len(t.container)) + i := 0 + for k := range t.container { + keys[i] = k + i++ + } + + sort.Strings(keys) + return keys +} + +// Section contains a name and values. This represent +// a sectioned entry in a configuration file. +type Section struct { + Name string + values values +} + +// Has will return whether or not an entry exists in a given section +func (t Section) Has(k string) bool { + _, ok := t.values[k] + return ok +} + +// ValueType will returned what type the union is set to. If +// k was not found, the NoneType will be returned. +func (t Section) ValueType(k string) (ValueType, bool) { + v, ok := t.values[k] + return v.Type, ok +} + +// Bool returns a bool value at k +func (t Section) Bool(k string) bool { + return t.values[k].BoolValue() +} + +// Int returns an integer value at k +func (t Section) Int(k string) int64 { + return t.values[k].IntValue() +} + +// Float64 returns a float value at k +func (t Section) Float64(k string) float64 { + return t.values[k].FloatValue() +} + +// String returns the string value at k +func (t Section) String(k string) string { + _, ok := t.values[k] + if !ok { + return "" + } + return t.values[k].StringValue() +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go new file mode 100644 index 000000000..99915f7f7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go @@ -0,0 +1,25 @@ +package ini + +// Walk will traverse the AST using the v, the Visitor. +func Walk(tree []AST, v Visitor) error { + for _, node := range tree { + switch node.Kind { + case ASTKindExpr, + ASTKindExprStatement: + + if err := v.VisitExpr(node); err != nil { + return err + } + case ASTKindStatement, + ASTKindCompletedSectionStatement, + ASTKindNestedSectionStatement, + ASTKindCompletedNestedSectionStatement: + + if err := v.VisitStatement(node); err != nil { + return err + } + } + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go new file mode 100644 index 000000000..7ffb4ae06 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go @@ -0,0 +1,24 @@ +package ini + +import ( + "unicode" +) + +// isWhitespace will return whether or not the character is +// a whitespace character. +// +// Whitespace is defined as a space or tab. +func isWhitespace(c rune) bool { + return unicode.IsSpace(c) && c != '\n' && c != '\r' +} + +func newWSToken(b []rune) (Token, int, error) { + i := 0 + for ; i < len(b); i++ { + if !isWhitespace(b[i]) { + break + } + } + + return newToken(TokenWS, b[:i], NoneType), i, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go new file mode 100644 index 000000000..5aa9137e0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go @@ -0,0 +1,10 @@ +// +build !go1.7 + +package sdkio + +// Copy of Go 1.7 io package's Seeker constants. +const ( + SeekStart = 0 // seek relative to the origin of the file + SeekCurrent = 1 // seek relative to the current offset + SeekEnd = 2 // seek relative to the end +) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go new file mode 100644 index 000000000..e5f005613 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go @@ -0,0 +1,12 @@ +// +build go1.7 + +package sdkio + +import "io" + +// Alias for Go 1.7 io package Seeker constants +const ( + SeekStart = io.SeekStart // seek relative to the origin of the file + SeekCurrent = io.SeekCurrent // seek relative to the current offset + SeekEnd = io.SeekEnd // seek relative to the end +) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go new file mode 100644 index 000000000..0c9802d87 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go @@ -0,0 +1,29 @@ +package sdkrand + +import ( + "math/rand" + "sync" + "time" +) + +// lockedSource is a thread-safe implementation of rand.Source +type lockedSource struct { + lk sync.Mutex + src rand.Source +} + +func (r *lockedSource) Int63() (n int64) { + r.lk.Lock() + n = r.src.Int63() + r.lk.Unlock() + return +} + +func (r *lockedSource) Seed(seed int64) { + r.lk.Lock() + r.src.Seed(seed) + r.lk.Unlock() +} + +// SeededRand is a new RNG using a thread safe implementation of rand.Source +var SeededRand = rand.New(&lockedSource{src: rand.NewSource(time.Now().UnixNano())}) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go new file mode 100644 index 000000000..38ea61afe --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go @@ -0,0 +1,23 @@ +package sdkuri + +import ( + "path" + "strings" +) + +// PathJoin will join the elements of the path delimited by the "/" +// character. Similar to path.Join with the exception the trailing "/" +// character is preserved if present. +func PathJoin(elems ...string) string { + if len(elems) == 0 { + return "" + } + + hasTrailing := strings.HasSuffix(elems[len(elems)-1], "/") + str := path.Join(elems...) + if hasTrailing && str != "/" { + str += "/" + } + + return str +} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go new file mode 100644 index 000000000..7da8a49ce --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go @@ -0,0 +1,12 @@ +package shareddefaults + +const ( + // ECSCredsProviderEnvVar is an environmental variable key used to + // determine which path needs to be hit. + ECSCredsProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" +) + +// ECSContainerCredentialsURI is the endpoint to retrieve container +// credentials. This can be overridden to test to ensure the credential process +// is behaving correctly. +var ECSContainerCredentialsURI = "http://169.254.170.2" diff --git a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go new file mode 100644 index 000000000..ebcbc2b40 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go @@ -0,0 +1,40 @@ +package shareddefaults + +import ( + "os" + "path/filepath" + "runtime" +) + +// SharedCredentialsFilename returns the SDK's default file path +// for the shared credentials file. +// +// Builds the shared config file path based on the OS's platform. +// +// - Linux/Unix: $HOME/.aws/credentials +// - Windows: %USERPROFILE%\.aws\credentials +func SharedCredentialsFilename() string { + return filepath.Join(UserHomeDir(), ".aws", "credentials") +} + +// SharedConfigFilename returns the SDK's default file path for +// the shared config file. +// +// Builds the shared config file path based on the OS's platform. +// +// - Linux/Unix: $HOME/.aws/config +// - Windows: %USERPROFILE%\.aws\config +func SharedConfigFilename() string { + return filepath.Join(UserHomeDir(), ".aws", "config") +} + +// UserHomeDir returns the home directory for the user the process is +// running under. +func UserHomeDir() string { + if runtime.GOOS == "windows" { // Windows + return os.Getenv("USERPROFILE") + } + + // *nix + return os.Getenv("HOME") +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go new file mode 100644 index 000000000..d7d42db0a --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go @@ -0,0 +1,68 @@ +package protocol + +import ( + "strings" + + "github.com/aws/aws-sdk-go/aws/request" +) + +// ValidateEndpointHostHandler is a request handler that will validate the +// request endpoint's hosts is a valid RFC 3986 host. +var ValidateEndpointHostHandler = request.NamedHandler{ + Name: "awssdk.protocol.ValidateEndpointHostHandler", + Fn: func(r *request.Request) { + err := ValidateEndpointHost(r.Operation.Name, r.HTTPRequest.URL.Host) + if err != nil { + r.Error = err + } + }, +} + +// ValidateEndpointHost validates that the host string passed in is a valid RFC +// 3986 host. Returns error if the host is not valid. +func ValidateEndpointHost(opName, host string) error { + paramErrs := request.ErrInvalidParams{Context: opName} + labels := strings.Split(host, ".") + + for i, label := range labels { + if i == len(labels)-1 && len(label) == 0 { + // Allow trailing dot for FQDN hosts. + continue + } + + if !ValidHostLabel(label) { + paramErrs.Add(request.NewErrParamFormat( + "endpoint host label", "[a-zA-Z0-9-]{1,63}", label)) + } + } + + if len(host) > 255 { + paramErrs.Add(request.NewErrParamMaxLen( + "endpoint host", 255, host, + )) + } + + if paramErrs.Len() > 0 { + return paramErrs + } + return nil +} + +// ValidHostLabel returns if the label is a valid RFC 3986 host label. +func ValidHostLabel(label string) bool { + if l := len(label); l == 0 || l > 63 { + return false + } + for _, r := range label { + switch { + case r >= '0' && r <= '9': + case r >= 'A' && r <= 'Z': + case r >= 'a' && r <= 'z': + case r == '-': + default: + return false + } + } + + return true +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go new file mode 100644 index 000000000..915b0fcaf --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go @@ -0,0 +1,54 @@ +package protocol + +import ( + "strings" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" +) + +// HostPrefixHandlerName is the handler name for the host prefix request +// handler. +const HostPrefixHandlerName = "awssdk.endpoint.HostPrefixHandler" + +// NewHostPrefixHandler constructs a build handler +func NewHostPrefixHandler(prefix string, labelsFn func() map[string]string) request.NamedHandler { + builder := HostPrefixBuilder{ + Prefix: prefix, + LabelsFn: labelsFn, + } + + return request.NamedHandler{ + Name: HostPrefixHandlerName, + Fn: builder.Build, + } +} + +// HostPrefixBuilder provides the request handler to expand and prepend +// the host prefix into the operation's request endpoint host. +type HostPrefixBuilder struct { + Prefix string + LabelsFn func() map[string]string +} + +// Build updates the passed in Request with the HostPrefix template expanded. +func (h HostPrefixBuilder) Build(r *request.Request) { + if aws.BoolValue(r.Config.DisableEndpointHostPrefix) { + return + } + + var labels map[string]string + if h.LabelsFn != nil { + labels = h.LabelsFn() + } + + prefix := h.Prefix + for name, value := range labels { + prefix = strings.Replace(prefix, "{"+name+"}", value, -1) + } + + r.HTTPRequest.URL.Host = prefix + r.HTTPRequest.URL.Host + if len(r.HTTPRequest.Host) > 0 { + r.HTTPRequest.Host = prefix + r.HTTPRequest.Host + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go new file mode 100644 index 000000000..53831dff9 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go @@ -0,0 +1,75 @@ +package protocol + +import ( + "crypto/rand" + "fmt" + "reflect" +) + +// RandReader is the random reader the protocol package will use to read +// random bytes from. This is exported for testing, and should not be used. +var RandReader = rand.Reader + +const idempotencyTokenFillTag = `idempotencyToken` + +// CanSetIdempotencyToken returns true if the struct field should be +// automatically populated with a Idempotency token. +// +// Only *string and string type fields that are tagged with idempotencyToken +// which are not already set can be auto filled. +func CanSetIdempotencyToken(v reflect.Value, f reflect.StructField) bool { + switch u := v.Interface().(type) { + // To auto fill an Idempotency token the field must be a string, + // tagged for auto fill, and have a zero value. + case *string: + return u == nil && len(f.Tag.Get(idempotencyTokenFillTag)) != 0 + case string: + return len(u) == 0 && len(f.Tag.Get(idempotencyTokenFillTag)) != 0 + } + + return false +} + +// GetIdempotencyToken returns a randomly generated idempotency token. +func GetIdempotencyToken() string { + b := make([]byte, 16) + RandReader.Read(b) + + return UUIDVersion4(b) +} + +// SetIdempotencyToken will set the value provided with a Idempotency Token. +// Given that the value can be set. Will panic if value is not setable. +func SetIdempotencyToken(v reflect.Value) { + if v.Kind() == reflect.Ptr { + if v.IsNil() && v.CanSet() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + } + v = reflect.Indirect(v) + + if !v.CanSet() { + panic(fmt.Sprintf("unable to set idempotnecy token %v", v)) + } + + b := make([]byte, 16) + _, err := rand.Read(b) + if err != nil { + // TODO handle error + return + } + + v.Set(reflect.ValueOf(UUIDVersion4(b))) +} + +// UUIDVersion4 returns a Version 4 random UUID from the byte slice provided +func UUIDVersion4(u []byte) string { + // https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 + // 13th character is "4" + u[6] = (u[6] | 0x40) & 0x4F + // 17th character is "8", "9", "a", or "b" + u[8] = (u[8] | 0x80) & 0xBF + + return fmt.Sprintf(`%X-%X-%X-%X-%X`, u[0:4], u[4:6], u[6:8], u[8:10], u[10:]) +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go new file mode 100644 index 000000000..864fb6704 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go @@ -0,0 +1,296 @@ +// Package jsonutil provides JSON serialization of AWS requests and responses. +package jsonutil + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/private/protocol" +) + +var timeType = reflect.ValueOf(time.Time{}).Type() +var byteSliceType = reflect.ValueOf([]byte{}).Type() + +// BuildJSON builds a JSON string for a given object v. +func BuildJSON(v interface{}) ([]byte, error) { + var buf bytes.Buffer + + err := buildAny(reflect.ValueOf(v), &buf, "") + return buf.Bytes(), err +} + +func buildAny(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { + origVal := value + value = reflect.Indirect(value) + if !value.IsValid() { + return nil + } + + vtype := value.Type() + + t := tag.Get("type") + if t == "" { + switch vtype.Kind() { + case reflect.Struct: + // also it can't be a time object + if value.Type() != timeType { + t = "structure" + } + case reflect.Slice: + // also it can't be a byte slice + if _, ok := value.Interface().([]byte); !ok { + t = "list" + } + case reflect.Map: + // cannot be a JSONValue map + if _, ok := value.Interface().(aws.JSONValue); !ok { + t = "map" + } + } + } + + switch t { + case "structure": + if field, ok := vtype.FieldByName("_"); ok { + tag = field.Tag + } + return buildStruct(value, buf, tag) + case "list": + return buildList(value, buf, tag) + case "map": + return buildMap(value, buf, tag) + default: + return buildScalar(origVal, buf, tag) + } +} + +func buildStruct(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { + if !value.IsValid() { + return nil + } + + // unwrap payloads + if payload := tag.Get("payload"); payload != "" { + field, _ := value.Type().FieldByName(payload) + tag = field.Tag + value = elemOf(value.FieldByName(payload)) + + if !value.IsValid() { + return nil + } + } + + buf.WriteByte('{') + + t := value.Type() + first := true + for i := 0; i < t.NumField(); i++ { + member := value.Field(i) + + // This allocates the most memory. + // Additionally, we cannot skip nil fields due to + // idempotency auto filling. + field := t.Field(i) + + if field.PkgPath != "" { + continue // ignore unexported fields + } + if field.Tag.Get("json") == "-" { + continue + } + if field.Tag.Get("location") != "" { + continue // ignore non-body elements + } + if field.Tag.Get("ignore") != "" { + continue + } + + if protocol.CanSetIdempotencyToken(member, field) { + token := protocol.GetIdempotencyToken() + member = reflect.ValueOf(&token) + } + + if (member.Kind() == reflect.Ptr || member.Kind() == reflect.Slice || member.Kind() == reflect.Map) && member.IsNil() { + continue // ignore unset fields + } + + if first { + first = false + } else { + buf.WriteByte(',') + } + + // figure out what this field is called + name := field.Name + if locName := field.Tag.Get("locationName"); locName != "" { + name = locName + } + + writeString(name, buf) + buf.WriteString(`:`) + + err := buildAny(member, buf, field.Tag) + if err != nil { + return err + } + + } + + buf.WriteString("}") + + return nil +} + +func buildList(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { + buf.WriteString("[") + + for i := 0; i < value.Len(); i++ { + buildAny(value.Index(i), buf, "") + + if i < value.Len()-1 { + buf.WriteString(",") + } + } + + buf.WriteString("]") + + return nil +} + +type sortedValues []reflect.Value + +func (sv sortedValues) Len() int { return len(sv) } +func (sv sortedValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } +func (sv sortedValues) Less(i, j int) bool { return sv[i].String() < sv[j].String() } + +func buildMap(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { + buf.WriteString("{") + + sv := sortedValues(value.MapKeys()) + sort.Sort(sv) + + for i, k := range sv { + if i > 0 { + buf.WriteByte(',') + } + + writeString(k.String(), buf) + buf.WriteString(`:`) + + buildAny(value.MapIndex(k), buf, "") + } + + buf.WriteString("}") + + return nil +} + +func buildScalar(v reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { + // prevents allocation on the heap. + scratch := [64]byte{} + switch value := reflect.Indirect(v); value.Kind() { + case reflect.String: + writeString(value.String(), buf) + case reflect.Bool: + if value.Bool() { + buf.WriteString("true") + } else { + buf.WriteString("false") + } + case reflect.Int64: + buf.Write(strconv.AppendInt(scratch[:0], value.Int(), 10)) + case reflect.Float64: + f := value.Float() + if math.IsInf(f, 0) || math.IsNaN(f) { + return &json.UnsupportedValueError{Value: v, Str: strconv.FormatFloat(f, 'f', -1, 64)} + } + buf.Write(strconv.AppendFloat(scratch[:0], f, 'f', -1, 64)) + default: + switch converted := value.Interface().(type) { + case time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.UnixTimeFormatName + } + + ts := protocol.FormatTime(format, converted) + if format != protocol.UnixTimeFormatName { + ts = `"` + ts + `"` + } + + buf.WriteString(ts) + case []byte: + if !value.IsNil() { + buf.WriteByte('"') + if len(converted) < 1024 { + // for small buffers, using Encode directly is much faster. + dst := make([]byte, base64.StdEncoding.EncodedLen(len(converted))) + base64.StdEncoding.Encode(dst, converted) + buf.Write(dst) + } else { + // for large buffers, avoid unnecessary extra temporary + // buffer space. + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(converted) + enc.Close() + } + buf.WriteByte('"') + } + case aws.JSONValue: + str, err := protocol.EncodeJSONValue(converted, protocol.QuotedEscape) + if err != nil { + return fmt.Errorf("unable to encode JSONValue, %v", err) + } + buf.WriteString(str) + default: + return fmt.Errorf("unsupported JSON value %v (%s)", value.Interface(), value.Type()) + } + } + return nil +} + +var hex = "0123456789abcdef" + +func writeString(s string, buf *bytes.Buffer) { + buf.WriteByte('"') + for i := 0; i < len(s); i++ { + if s[i] == '"' { + buf.WriteString(`\"`) + } else if s[i] == '\\' { + buf.WriteString(`\\`) + } else if s[i] == '\b' { + buf.WriteString(`\b`) + } else if s[i] == '\f' { + buf.WriteString(`\f`) + } else if s[i] == '\r' { + buf.WriteString(`\r`) + } else if s[i] == '\t' { + buf.WriteString(`\t`) + } else if s[i] == '\n' { + buf.WriteString(`\n`) + } else if s[i] < 32 { + buf.WriteString("\\u00") + buf.WriteByte(hex[s[i]>>4]) + buf.WriteByte(hex[s[i]&0xF]) + } else { + buf.WriteByte(s[i]) + } + } + buf.WriteByte('"') +} + +// Returns the reflection element of a value, if it is a pointer. +func elemOf(value reflect.Value) reflect.Value { + for value.Kind() == reflect.Ptr { + value = value.Elem() + } + return value +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go new file mode 100644 index 000000000..ea0da79a5 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go @@ -0,0 +1,250 @@ +package jsonutil + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "reflect" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/private/protocol" +) + +// UnmarshalJSONError unmarshal's the reader's JSON document into the passed in +// type. The value to unmarshal the json document into must be a pointer to the +// type. +func UnmarshalJSONError(v interface{}, stream io.Reader) error { + var errBuf bytes.Buffer + body := io.TeeReader(stream, &errBuf) + + err := json.NewDecoder(body).Decode(v) + if err != nil { + msg := "failed decoding error message" + if err == io.EOF { + msg = "error message missing" + err = nil + } + return awserr.NewUnmarshalError(err, msg, errBuf.Bytes()) + } + + return nil +} + +// UnmarshalJSON reads a stream and unmarshals the results in object v. +func UnmarshalJSON(v interface{}, stream io.Reader) error { + var out interface{} + + err := json.NewDecoder(stream).Decode(&out) + if err == io.EOF { + return nil + } else if err != nil { + return err + } + + return unmarshalAny(reflect.ValueOf(v), out, "") +} + +func unmarshalAny(value reflect.Value, data interface{}, tag reflect.StructTag) error { + vtype := value.Type() + if vtype.Kind() == reflect.Ptr { + vtype = vtype.Elem() // check kind of actual element type + } + + t := tag.Get("type") + if t == "" { + switch vtype.Kind() { + case reflect.Struct: + // also it can't be a time object + if _, ok := value.Interface().(*time.Time); !ok { + t = "structure" + } + case reflect.Slice: + // also it can't be a byte slice + if _, ok := value.Interface().([]byte); !ok { + t = "list" + } + case reflect.Map: + // cannot be a JSONValue map + if _, ok := value.Interface().(aws.JSONValue); !ok { + t = "map" + } + } + } + + switch t { + case "structure": + if field, ok := vtype.FieldByName("_"); ok { + tag = field.Tag + } + return unmarshalStruct(value, data, tag) + case "list": + return unmarshalList(value, data, tag) + case "map": + return unmarshalMap(value, data, tag) + default: + return unmarshalScalar(value, data, tag) + } +} + +func unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTag) error { + if data == nil { + return nil + } + mapData, ok := data.(map[string]interface{}) + if !ok { + return fmt.Errorf("JSON value is not a structure (%#v)", data) + } + + t := value.Type() + if value.Kind() == reflect.Ptr { + if value.IsNil() { // create the structure if it's nil + s := reflect.New(value.Type().Elem()) + value.Set(s) + value = s + } + + value = value.Elem() + t = t.Elem() + } + + // unwrap any payloads + if payload := tag.Get("payload"); payload != "" { + field, _ := t.FieldByName(payload) + return unmarshalAny(value.FieldByName(payload), data, field.Tag) + } + + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + if field.PkgPath != "" { + continue // ignore unexported fields + } + + // figure out what this field is called + name := field.Name + if locName := field.Tag.Get("locationName"); locName != "" { + name = locName + } + + member := value.FieldByIndex(field.Index) + err := unmarshalAny(member, mapData[name], field.Tag) + if err != nil { + return err + } + } + return nil +} + +func unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) error { + if data == nil { + return nil + } + listData, ok := data.([]interface{}) + if !ok { + return fmt.Errorf("JSON value is not a list (%#v)", data) + } + + if value.IsNil() { + l := len(listData) + value.Set(reflect.MakeSlice(value.Type(), l, l)) + } + + for i, c := range listData { + err := unmarshalAny(value.Index(i), c, "") + if err != nil { + return err + } + } + + return nil +} + +func unmarshalMap(value reflect.Value, data interface{}, tag reflect.StructTag) error { + if data == nil { + return nil + } + mapData, ok := data.(map[string]interface{}) + if !ok { + return fmt.Errorf("JSON value is not a map (%#v)", data) + } + + if value.IsNil() { + value.Set(reflect.MakeMap(value.Type())) + } + + for k, v := range mapData { + kvalue := reflect.ValueOf(k) + vvalue := reflect.New(value.Type().Elem()).Elem() + + unmarshalAny(vvalue, v, "") + value.SetMapIndex(kvalue, vvalue) + } + + return nil +} + +func unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTag) error { + + switch d := data.(type) { + case nil: + return nil // nothing to do here + case string: + switch value.Interface().(type) { + case *string: + value.Set(reflect.ValueOf(&d)) + case []byte: + b, err := base64.StdEncoding.DecodeString(d) + if err != nil { + return err + } + value.Set(reflect.ValueOf(b)) + case *time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + t, err := protocol.ParseTime(format, d) + if err != nil { + return err + } + value.Set(reflect.ValueOf(&t)) + case aws.JSONValue: + // No need to use escaping as the value is a non-quoted string. + v, err := protocol.DecodeJSONValue(d, protocol.NoEscape) + if err != nil { + return err + } + value.Set(reflect.ValueOf(v)) + default: + return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) + } + case float64: + switch value.Interface().(type) { + case *int64: + di := int64(d) + value.Set(reflect.ValueOf(&di)) + case *float64: + value.Set(reflect.ValueOf(&d)) + case *time.Time: + // Time unmarshaled from a float64 can only be epoch seconds + t := time.Unix(int64(d), 0).UTC() + value.Set(reflect.ValueOf(&t)) + default: + return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) + } + case bool: + switch value.Interface().(type) { + case *bool: + value.Set(reflect.ValueOf(&d)) + default: + return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) + } + default: + return fmt.Errorf("unsupported JSON value (%v)", data) + } + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go new file mode 100644 index 000000000..776d11018 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go @@ -0,0 +1,76 @@ +package protocol + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "strconv" + + "github.com/aws/aws-sdk-go/aws" +) + +// EscapeMode is the mode that should be use for escaping a value +type EscapeMode uint + +// The modes for escaping a value before it is marshaled, and unmarshaled. +const ( + NoEscape EscapeMode = iota + Base64Escape + QuotedEscape +) + +// EncodeJSONValue marshals the value into a JSON string, and optionally base64 +// encodes the string before returning it. +// +// Will panic if the escape mode is unknown. +func EncodeJSONValue(v aws.JSONValue, escape EscapeMode) (string, error) { + b, err := json.Marshal(v) + if err != nil { + return "", err + } + + switch escape { + case NoEscape: + return string(b), nil + case Base64Escape: + return base64.StdEncoding.EncodeToString(b), nil + case QuotedEscape: + return strconv.Quote(string(b)), nil + } + + panic(fmt.Sprintf("EncodeJSONValue called with unknown EscapeMode, %v", escape)) +} + +// DecodeJSONValue will attempt to decode the string input as a JSONValue. +// Optionally decoding base64 the value first before JSON unmarshaling. +// +// Will panic if the escape mode is unknown. +func DecodeJSONValue(v string, escape EscapeMode) (aws.JSONValue, error) { + var b []byte + var err error + + switch escape { + case NoEscape: + b = []byte(v) + case Base64Escape: + b, err = base64.StdEncoding.DecodeString(v) + case QuotedEscape: + var u string + u, err = strconv.Unquote(v) + b = []byte(u) + default: + panic(fmt.Sprintf("DecodeJSONValue called with unknown EscapeMode, %v", escape)) + } + + if err != nil { + return nil, err + } + + m := aws.JSONValue{} + err = json.Unmarshal(b, &m) + if err != nil { + return nil, err + } + + return m, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go new file mode 100644 index 000000000..e21614a12 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go @@ -0,0 +1,81 @@ +package protocol + +import ( + "io" + "io/ioutil" + "net/http" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/aws/request" +) + +// PayloadUnmarshaler provides the interface for unmarshaling a payload's +// reader into a SDK shape. +type PayloadUnmarshaler interface { + UnmarshalPayload(io.Reader, interface{}) error +} + +// HandlerPayloadUnmarshal implements the PayloadUnmarshaler from a +// HandlerList. This provides the support for unmarshaling a payload reader to +// a shape without needing a SDK request first. +type HandlerPayloadUnmarshal struct { + Unmarshalers request.HandlerList +} + +// UnmarshalPayload unmarshals the io.Reader payload into the SDK shape using +// the Unmarshalers HandlerList provided. Returns an error if unable +// unmarshaling fails. +func (h HandlerPayloadUnmarshal) UnmarshalPayload(r io.Reader, v interface{}) error { + req := &request.Request{ + HTTPRequest: &http.Request{}, + HTTPResponse: &http.Response{ + StatusCode: 200, + Header: http.Header{}, + Body: ioutil.NopCloser(r), + }, + Data: v, + } + + h.Unmarshalers.Run(req) + + return req.Error +} + +// PayloadMarshaler provides the interface for marshaling a SDK shape into and +// io.Writer. +type PayloadMarshaler interface { + MarshalPayload(io.Writer, interface{}) error +} + +// HandlerPayloadMarshal implements the PayloadMarshaler from a HandlerList. +// This provides support for marshaling a SDK shape into an io.Writer without +// needing a SDK request first. +type HandlerPayloadMarshal struct { + Marshalers request.HandlerList +} + +// MarshalPayload marshals the SDK shape into the io.Writer using the +// Marshalers HandlerList provided. Returns an error if unable if marshal +// fails. +func (h HandlerPayloadMarshal) MarshalPayload(w io.Writer, v interface{}) error { + req := request.New( + aws.Config{}, + metadata.ClientInfo{}, + request.Handlers{}, + nil, + &request.Operation{HTTPMethod: "GET"}, + v, + nil, + ) + + h.Marshalers.Run(req) + + if req.Error != nil { + return req.Error + } + + io.Copy(w, req.GetBody()) + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go new file mode 100644 index 000000000..0cb99eb57 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go @@ -0,0 +1,36 @@ +// Package query provides serialization of AWS query requests, and responses. +package query + +//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/input/query.json build_test.go + +import ( + "net/url" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol/query/queryutil" +) + +// BuildHandler is a named request handler for building query protocol requests +var BuildHandler = request.NamedHandler{Name: "awssdk.query.Build", Fn: Build} + +// Build builds a request for an AWS Query service. +func Build(r *request.Request) { + body := url.Values{ + "Action": {r.Operation.Name}, + "Version": {r.ClientInfo.APIVersion}, + } + if err := queryutil.Parse(body, r.Params, false); err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "failed encoding Query request", err) + return + } + + if !r.IsPresigned() { + r.HTTPRequest.Method = "POST" + r.HTTPRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8") + r.SetBufferBody([]byte(body.Encode())) + } else { // This is a pre-signed request + r.HTTPRequest.Method = "GET" + r.HTTPRequest.URL.RawQuery = body.Encode() + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go new file mode 100644 index 000000000..75866d012 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go @@ -0,0 +1,246 @@ +package queryutil + +import ( + "encoding/base64" + "fmt" + "net/url" + "reflect" + "sort" + "strconv" + "strings" + "time" + + "github.com/aws/aws-sdk-go/private/protocol" +) + +// Parse parses an object i and fills a url.Values object. The isEC2 flag +// indicates if this is the EC2 Query sub-protocol. +func Parse(body url.Values, i interface{}, isEC2 bool) error { + q := queryParser{isEC2: isEC2} + return q.parseValue(body, reflect.ValueOf(i), "", "") +} + +func elemOf(value reflect.Value) reflect.Value { + for value.Kind() == reflect.Ptr { + value = value.Elem() + } + return value +} + +type queryParser struct { + isEC2 bool +} + +func (q *queryParser) parseValue(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error { + value = elemOf(value) + + // no need to handle zero values + if !value.IsValid() { + return nil + } + + t := tag.Get("type") + if t == "" { + switch value.Kind() { + case reflect.Struct: + t = "structure" + case reflect.Slice: + t = "list" + case reflect.Map: + t = "map" + } + } + + switch t { + case "structure": + return q.parseStruct(v, value, prefix) + case "list": + return q.parseList(v, value, prefix, tag) + case "map": + return q.parseMap(v, value, prefix, tag) + default: + return q.parseScalar(v, value, prefix, tag) + } +} + +func (q *queryParser) parseStruct(v url.Values, value reflect.Value, prefix string) error { + if !value.IsValid() { + return nil + } + + t := value.Type() + for i := 0; i < value.NumField(); i++ { + elemValue := elemOf(value.Field(i)) + field := t.Field(i) + + if field.PkgPath != "" { + continue // ignore unexported fields + } + if field.Tag.Get("ignore") != "" { + continue + } + + if protocol.CanSetIdempotencyToken(value.Field(i), field) { + token := protocol.GetIdempotencyToken() + elemValue = reflect.ValueOf(token) + } + + var name string + if q.isEC2 { + name = field.Tag.Get("queryName") + } + if name == "" { + if field.Tag.Get("flattened") != "" && field.Tag.Get("locationNameList") != "" { + name = field.Tag.Get("locationNameList") + } else if locName := field.Tag.Get("locationName"); locName != "" { + name = locName + } + if name != "" && q.isEC2 { + name = strings.ToUpper(name[0:1]) + name[1:] + } + } + if name == "" { + name = field.Name + } + + if prefix != "" { + name = prefix + "." + name + } + + if err := q.parseValue(v, elemValue, name, field.Tag); err != nil { + return err + } + } + return nil +} + +func (q *queryParser) parseList(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error { + // If it's empty, generate an empty value + if !value.IsNil() && value.Len() == 0 { + v.Set(prefix, "") + return nil + } + + if _, ok := value.Interface().([]byte); ok { + return q.parseScalar(v, value, prefix, tag) + } + + // check for unflattened list member + if !q.isEC2 && tag.Get("flattened") == "" { + if listName := tag.Get("locationNameList"); listName == "" { + prefix += ".member" + } else { + prefix += "." + listName + } + } + + for i := 0; i < value.Len(); i++ { + slicePrefix := prefix + if slicePrefix == "" { + slicePrefix = strconv.Itoa(i + 1) + } else { + slicePrefix = slicePrefix + "." + strconv.Itoa(i+1) + } + if err := q.parseValue(v, value.Index(i), slicePrefix, ""); err != nil { + return err + } + } + return nil +} + +func (q *queryParser) parseMap(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error { + // If it's empty, generate an empty value + if !value.IsNil() && value.Len() == 0 { + v.Set(prefix, "") + return nil + } + + // check for unflattened list member + if !q.isEC2 && tag.Get("flattened") == "" { + prefix += ".entry" + } + + // sort keys for improved serialization consistency. + // this is not strictly necessary for protocol support. + mapKeyValues := value.MapKeys() + mapKeys := map[string]reflect.Value{} + mapKeyNames := make([]string, len(mapKeyValues)) + for i, mapKey := range mapKeyValues { + name := mapKey.String() + mapKeys[name] = mapKey + mapKeyNames[i] = name + } + sort.Strings(mapKeyNames) + + for i, mapKeyName := range mapKeyNames { + mapKey := mapKeys[mapKeyName] + mapValue := value.MapIndex(mapKey) + + kname := tag.Get("locationNameKey") + if kname == "" { + kname = "key" + } + vname := tag.Get("locationNameValue") + if vname == "" { + vname = "value" + } + + // serialize key + var keyName string + if prefix == "" { + keyName = strconv.Itoa(i+1) + "." + kname + } else { + keyName = prefix + "." + strconv.Itoa(i+1) + "." + kname + } + + if err := q.parseValue(v, mapKey, keyName, ""); err != nil { + return err + } + + // serialize value + var valueName string + if prefix == "" { + valueName = strconv.Itoa(i+1) + "." + vname + } else { + valueName = prefix + "." + strconv.Itoa(i+1) + "." + vname + } + + if err := q.parseValue(v, mapValue, valueName, ""); err != nil { + return err + } + } + + return nil +} + +func (q *queryParser) parseScalar(v url.Values, r reflect.Value, name string, tag reflect.StructTag) error { + switch value := r.Interface().(type) { + case string: + v.Set(name, value) + case []byte: + if !r.IsNil() { + v.Set(name, base64.StdEncoding.EncodeToString(value)) + } + case bool: + v.Set(name, strconv.FormatBool(value)) + case int64: + v.Set(name, strconv.FormatInt(value, 10)) + case int: + v.Set(name, strconv.Itoa(value)) + case float64: + v.Set(name, strconv.FormatFloat(value, 'f', -1, 64)) + case float32: + v.Set(name, strconv.FormatFloat(float64(value), 'f', -1, 32)) + case time.Time: + const ISO8601UTC = "2006-01-02T15:04:05Z" + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + v.Set(name, protocol.FormatTime(format, value)) + default: + return fmt.Errorf("unsupported value for param %s: %v (%s)", name, r.Interface(), r.Type().Name()) + } + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go new file mode 100644 index 000000000..f69c1efc9 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go @@ -0,0 +1,39 @@ +package query + +//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/output/query.json unmarshal_test.go + +import ( + "encoding/xml" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil" +) + +// UnmarshalHandler is a named request handler for unmarshaling query protocol requests +var UnmarshalHandler = request.NamedHandler{Name: "awssdk.query.Unmarshal", Fn: Unmarshal} + +// UnmarshalMetaHandler is a named request handler for unmarshaling query protocol request metadata +var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalMeta", Fn: UnmarshalMeta} + +// Unmarshal unmarshals a response for an AWS Query service. +func Unmarshal(r *request.Request) { + defer r.HTTPResponse.Body.Close() + if r.DataFilled() { + decoder := xml.NewDecoder(r.HTTPResponse.Body) + err := xmlutil.UnmarshalXML(r.Data, decoder, r.Operation.Name+"Result") + if err != nil { + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, "failed decoding Query response", err), + r.HTTPResponse.StatusCode, + r.RequestID, + ) + return + } + } +} + +// UnmarshalMeta unmarshals header response values for an AWS Query service. +func UnmarshalMeta(r *request.Request) { + r.RequestID = r.HTTPResponse.Header.Get("X-Amzn-Requestid") +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go new file mode 100644 index 000000000..831b0110c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go @@ -0,0 +1,69 @@ +package query + +import ( + "encoding/xml" + "fmt" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil" +) + +// UnmarshalErrorHandler is a name request handler to unmarshal request errors +var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError} + +type xmlErrorResponse struct { + Code string `xml:"Error>Code"` + Message string `xml:"Error>Message"` + RequestID string `xml:"RequestId"` +} + +type xmlResponseError struct { + xmlErrorResponse +} + +func (e *xmlResponseError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + const svcUnavailableTagName = "ServiceUnavailableException" + const errorResponseTagName = "ErrorResponse" + + switch start.Name.Local { + case svcUnavailableTagName: + e.Code = svcUnavailableTagName + e.Message = "service is unavailable" + return d.Skip() + + case errorResponseTagName: + return d.DecodeElement(&e.xmlErrorResponse, &start) + + default: + return fmt.Errorf("unknown error response tag, %v", start) + } +} + +// UnmarshalError unmarshals an error response for an AWS Query service. +func UnmarshalError(r *request.Request) { + defer r.HTTPResponse.Body.Close() + + var respErr xmlResponseError + err := xmlutil.UnmarshalXMLError(&respErr, r.HTTPResponse.Body) + if err != nil { + r.Error = awserr.NewRequestFailure( + awserr.New(request.ErrCodeSerialization, + "failed to unmarshal error message", err), + r.HTTPResponse.StatusCode, + r.RequestID, + ) + return + } + + reqID := respErr.RequestID + if len(reqID) == 0 { + reqID = r.RequestID + } + + r.Error = awserr.NewRequestFailure( + awserr.New(respErr.Code, respErr.Message, nil), + r.HTTPResponse.StatusCode, + reqID, + ) +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go new file mode 100644 index 000000000..1301b149d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go @@ -0,0 +1,310 @@ +// Package rest provides RESTful serialization of AWS requests and responses. +package rest + +import ( + "bytes" + "encoding/base64" + "fmt" + "io" + "net/http" + "net/url" + "path" + "reflect" + "strconv" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol" +) + +// Whether the byte value can be sent without escaping in AWS URLs +var noEscape [256]bool + +var errValueNotSet = fmt.Errorf("value not set") + +var byteSliceType = reflect.TypeOf([]byte{}) + +func init() { + for i := 0; i < len(noEscape); i++ { + // AWS expects every character except these to be escaped + noEscape[i] = (i >= 'A' && i <= 'Z') || + (i >= 'a' && i <= 'z') || + (i >= '0' && i <= '9') || + i == '-' || + i == '.' || + i == '_' || + i == '~' + } +} + +// BuildHandler is a named request handler for building rest protocol requests +var BuildHandler = request.NamedHandler{Name: "awssdk.rest.Build", Fn: Build} + +// Build builds the REST component of a service request. +func Build(r *request.Request) { + if r.ParamsFilled() { + v := reflect.ValueOf(r.Params).Elem() + buildLocationElements(r, v, false) + buildBody(r, v) + } +} + +// BuildAsGET builds the REST component of a service request with the ability to hoist +// data from the body. +func BuildAsGET(r *request.Request) { + if r.ParamsFilled() { + v := reflect.ValueOf(r.Params).Elem() + buildLocationElements(r, v, true) + buildBody(r, v) + } +} + +func buildLocationElements(r *request.Request, v reflect.Value, buildGETQuery bool) { + query := r.HTTPRequest.URL.Query() + + // Setup the raw path to match the base path pattern. This is needed + // so that when the path is mutated a custom escaped version can be + // stored in RawPath that will be used by the Go client. + r.HTTPRequest.URL.RawPath = r.HTTPRequest.URL.Path + + for i := 0; i < v.NumField(); i++ { + m := v.Field(i) + if n := v.Type().Field(i).Name; n[0:1] == strings.ToLower(n[0:1]) { + continue + } + + if m.IsValid() { + field := v.Type().Field(i) + name := field.Tag.Get("locationName") + if name == "" { + name = field.Name + } + if kind := m.Kind(); kind == reflect.Ptr { + m = m.Elem() + } else if kind == reflect.Interface { + if !m.Elem().IsValid() { + continue + } + } + if !m.IsValid() { + continue + } + if field.Tag.Get("ignore") != "" { + continue + } + + // Support the ability to customize values to be marshaled as a + // blob even though they were modeled as a string. Required for S3 + // API operations like SSECustomerKey is modeled as stirng but + // required to be base64 encoded in request. + if field.Tag.Get("marshal-as") == "blob" { + m = m.Convert(byteSliceType) + } + + var err error + switch field.Tag.Get("location") { + case "headers": // header maps + err = buildHeaderMap(&r.HTTPRequest.Header, m, field.Tag) + case "header": + err = buildHeader(&r.HTTPRequest.Header, m, name, field.Tag) + case "uri": + err = buildURI(r.HTTPRequest.URL, m, name, field.Tag) + case "querystring": + err = buildQueryString(query, m, name, field.Tag) + default: + if buildGETQuery { + err = buildQueryString(query, m, name, field.Tag) + } + } + r.Error = err + } + if r.Error != nil { + return + } + } + + r.HTTPRequest.URL.RawQuery = query.Encode() + if !aws.BoolValue(r.Config.DisableRestProtocolURICleaning) { + cleanPath(r.HTTPRequest.URL) + } +} + +func buildBody(r *request.Request, v reflect.Value) { + if field, ok := v.Type().FieldByName("_"); ok { + if payloadName := field.Tag.Get("payload"); payloadName != "" { + pfield, _ := v.Type().FieldByName(payloadName) + if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" { + payload := reflect.Indirect(v.FieldByName(payloadName)) + if payload.IsValid() && payload.Interface() != nil { + switch reader := payload.Interface().(type) { + case io.ReadSeeker: + r.SetReaderBody(reader) + case []byte: + r.SetBufferBody(reader) + case string: + r.SetStringBody(reader) + default: + r.Error = awserr.New(request.ErrCodeSerialization, + "failed to encode REST request", + fmt.Errorf("unknown payload type %s", payload.Type())) + } + } + } + } + } +} + +func buildHeader(header *http.Header, v reflect.Value, name string, tag reflect.StructTag) error { + str, err := convertType(v, tag) + if err == errValueNotSet { + return nil + } else if err != nil { + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) + } + + name = strings.TrimSpace(name) + str = strings.TrimSpace(str) + + header.Add(name, str) + + return nil +} + +func buildHeaderMap(header *http.Header, v reflect.Value, tag reflect.StructTag) error { + prefix := tag.Get("locationName") + for _, key := range v.MapKeys() { + str, err := convertType(v.MapIndex(key), tag) + if err == errValueNotSet { + continue + } else if err != nil { + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) + + } + keyStr := strings.TrimSpace(key.String()) + str = strings.TrimSpace(str) + + header.Add(prefix+keyStr, str) + } + return nil +} + +func buildURI(u *url.URL, v reflect.Value, name string, tag reflect.StructTag) error { + value, err := convertType(v, tag) + if err == errValueNotSet { + return nil + } else if err != nil { + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) + } + + u.Path = strings.Replace(u.Path, "{"+name+"}", value, -1) + u.Path = strings.Replace(u.Path, "{"+name+"+}", value, -1) + + u.RawPath = strings.Replace(u.RawPath, "{"+name+"}", EscapePath(value, true), -1) + u.RawPath = strings.Replace(u.RawPath, "{"+name+"+}", EscapePath(value, false), -1) + + return nil +} + +func buildQueryString(query url.Values, v reflect.Value, name string, tag reflect.StructTag) error { + switch value := v.Interface().(type) { + case []*string: + for _, item := range value { + query.Add(name, *item) + } + case map[string]*string: + for key, item := range value { + query.Add(key, *item) + } + case map[string][]*string: + for key, items := range value { + for _, item := range items { + query.Add(key, *item) + } + } + default: + str, err := convertType(v, tag) + if err == errValueNotSet { + return nil + } else if err != nil { + return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) + } + query.Set(name, str) + } + + return nil +} + +func cleanPath(u *url.URL) { + hasSlash := strings.HasSuffix(u.Path, "/") + + // clean up path, removing duplicate `/` + u.Path = path.Clean(u.Path) + u.RawPath = path.Clean(u.RawPath) + + if hasSlash && !strings.HasSuffix(u.Path, "/") { + u.Path += "/" + u.RawPath += "/" + } +} + +// EscapePath escapes part of a URL path in Amazon style +func EscapePath(path string, encodeSep bool) string { + var buf bytes.Buffer + for i := 0; i < len(path); i++ { + c := path[i] + if noEscape[c] || (c == '/' && !encodeSep) { + buf.WriteByte(c) + } else { + fmt.Fprintf(&buf, "%%%02X", c) + } + } + return buf.String() +} + +func convertType(v reflect.Value, tag reflect.StructTag) (str string, err error) { + v = reflect.Indirect(v) + if !v.IsValid() { + return "", errValueNotSet + } + + switch value := v.Interface().(type) { + case string: + str = value + case []byte: + str = base64.StdEncoding.EncodeToString(value) + case bool: + str = strconv.FormatBool(value) + case int64: + str = strconv.FormatInt(value, 10) + case float64: + str = strconv.FormatFloat(value, 'f', -1, 64) + case time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.RFC822TimeFormatName + if tag.Get("location") == "querystring" { + format = protocol.ISO8601TimeFormatName + } + } + str = protocol.FormatTime(format, value) + case aws.JSONValue: + if len(value) == 0 { + return "", errValueNotSet + } + escaping := protocol.NoEscape + if tag.Get("location") == "header" { + escaping = protocol.Base64Escape + } + str, err = protocol.EncodeJSONValue(value, escaping) + if err != nil { + return "", fmt.Errorf("unable to encode JSONValue, %v", err) + } + default: + err := fmt.Errorf("unsupported value for param %v (%s)", v.Interface(), v.Type()) + return "", err + } + return str, nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go new file mode 100644 index 000000000..4366de2e1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go @@ -0,0 +1,45 @@ +package rest + +import "reflect" + +// PayloadMember returns the payload field member of i if there is one, or nil. +func PayloadMember(i interface{}) interface{} { + if i == nil { + return nil + } + + v := reflect.ValueOf(i).Elem() + if !v.IsValid() { + return nil + } + if field, ok := v.Type().FieldByName("_"); ok { + if payloadName := field.Tag.Get("payload"); payloadName != "" { + field, _ := v.Type().FieldByName(payloadName) + if field.Tag.Get("type") != "structure" { + return nil + } + + payload := v.FieldByName(payloadName) + if payload.IsValid() || (payload.Kind() == reflect.Ptr && !payload.IsNil()) { + return payload.Interface() + } + } + } + return nil +} + +// PayloadType returns the type of a payload field member of i if there is one, or "". +func PayloadType(i interface{}) string { + v := reflect.Indirect(reflect.ValueOf(i)) + if !v.IsValid() { + return "" + } + if field, ok := v.Type().FieldByName("_"); ok { + if payloadName := field.Tag.Get("payload"); payloadName != "" { + if member, ok := v.Type().FieldByName(payloadName); ok { + return member.Tag.Get("type") + } + } + } + return "" +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go new file mode 100644 index 000000000..de021367d --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go @@ -0,0 +1,225 @@ +package rest + +import ( + "bytes" + "encoding/base64" + "fmt" + "io" + "io/ioutil" + "net/http" + "reflect" + "strconv" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/private/protocol" +) + +// UnmarshalHandler is a named request handler for unmarshaling rest protocol requests +var UnmarshalHandler = request.NamedHandler{Name: "awssdk.rest.Unmarshal", Fn: Unmarshal} + +// UnmarshalMetaHandler is a named request handler for unmarshaling rest protocol request metadata +var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.rest.UnmarshalMeta", Fn: UnmarshalMeta} + +// Unmarshal unmarshals the REST component of a response in a REST service. +func Unmarshal(r *request.Request) { + if r.DataFilled() { + v := reflect.Indirect(reflect.ValueOf(r.Data)) + unmarshalBody(r, v) + } +} + +// UnmarshalMeta unmarshals the REST metadata of a response in a REST service +func UnmarshalMeta(r *request.Request) { + r.RequestID = r.HTTPResponse.Header.Get("X-Amzn-Requestid") + if r.RequestID == "" { + // Alternative version of request id in the header + r.RequestID = r.HTTPResponse.Header.Get("X-Amz-Request-Id") + } + if r.DataFilled() { + v := reflect.Indirect(reflect.ValueOf(r.Data)) + unmarshalLocationElements(r, v) + } +} + +func unmarshalBody(r *request.Request, v reflect.Value) { + if field, ok := v.Type().FieldByName("_"); ok { + if payloadName := field.Tag.Get("payload"); payloadName != "" { + pfield, _ := v.Type().FieldByName(payloadName) + if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" { + payload := v.FieldByName(payloadName) + if payload.IsValid() { + switch payload.Interface().(type) { + case []byte: + defer r.HTTPResponse.Body.Close() + b, err := ioutil.ReadAll(r.HTTPResponse.Body) + if err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) + } else { + payload.Set(reflect.ValueOf(b)) + } + case *string: + defer r.HTTPResponse.Body.Close() + b, err := ioutil.ReadAll(r.HTTPResponse.Body) + if err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) + } else { + str := string(b) + payload.Set(reflect.ValueOf(&str)) + } + default: + switch payload.Type().String() { + case "io.ReadCloser": + payload.Set(reflect.ValueOf(r.HTTPResponse.Body)) + case "io.ReadSeeker": + b, err := ioutil.ReadAll(r.HTTPResponse.Body) + if err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, + "failed to read response body", err) + return + } + payload.Set(reflect.ValueOf(ioutil.NopCloser(bytes.NewReader(b)))) + default: + io.Copy(ioutil.Discard, r.HTTPResponse.Body) + defer r.HTTPResponse.Body.Close() + r.Error = awserr.New(request.ErrCodeSerialization, + "failed to decode REST response", + fmt.Errorf("unknown payload type %s", payload.Type())) + } + } + } + } + } + } +} + +func unmarshalLocationElements(r *request.Request, v reflect.Value) { + for i := 0; i < v.NumField(); i++ { + m, field := v.Field(i), v.Type().Field(i) + if n := field.Name; n[0:1] == strings.ToLower(n[0:1]) { + continue + } + + if m.IsValid() { + name := field.Tag.Get("locationName") + if name == "" { + name = field.Name + } + + switch field.Tag.Get("location") { + case "statusCode": + unmarshalStatusCode(m, r.HTTPResponse.StatusCode) + case "header": + err := unmarshalHeader(m, r.HTTPResponse.Header.Get(name), field.Tag) + if err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) + break + } + case "headers": + prefix := field.Tag.Get("locationName") + err := unmarshalHeaderMap(m, r.HTTPResponse.Header, prefix) + if err != nil { + r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) + break + } + } + } + if r.Error != nil { + return + } + } +} + +func unmarshalStatusCode(v reflect.Value, statusCode int) { + if !v.IsValid() { + return + } + + switch v.Interface().(type) { + case *int64: + s := int64(statusCode) + v.Set(reflect.ValueOf(&s)) + } +} + +func unmarshalHeaderMap(r reflect.Value, headers http.Header, prefix string) error { + switch r.Interface().(type) { + case map[string]*string: // we only support string map value types + out := map[string]*string{} + for k, v := range headers { + k = http.CanonicalHeaderKey(k) + if strings.HasPrefix(strings.ToLower(k), strings.ToLower(prefix)) { + out[k[len(prefix):]] = &v[0] + } + } + r.Set(reflect.ValueOf(out)) + } + return nil +} + +func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) error { + isJSONValue := tag.Get("type") == "jsonvalue" + if isJSONValue { + if len(header) == 0 { + return nil + } + } else if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) { + return nil + } + + switch v.Interface().(type) { + case *string: + v.Set(reflect.ValueOf(&header)) + case []byte: + b, err := base64.StdEncoding.DecodeString(header) + if err != nil { + return err + } + v.Set(reflect.ValueOf(&b)) + case *bool: + b, err := strconv.ParseBool(header) + if err != nil { + return err + } + v.Set(reflect.ValueOf(&b)) + case *int64: + i, err := strconv.ParseInt(header, 10, 64) + if err != nil { + return err + } + v.Set(reflect.ValueOf(&i)) + case *float64: + f, err := strconv.ParseFloat(header, 64) + if err != nil { + return err + } + v.Set(reflect.ValueOf(&f)) + case *time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.RFC822TimeFormatName + } + t, err := protocol.ParseTime(format, header) + if err != nil { + return err + } + v.Set(reflect.ValueOf(&t)) + case aws.JSONValue: + escaping := protocol.NoEscape + if tag.Get("location") == "header" { + escaping = protocol.Base64Escape + } + m, err := protocol.DecodeJSONValue(header, escaping) + if err != nil { + return err + } + v.Set(reflect.ValueOf(m)) + default: + err := fmt.Errorf("Unsupported value for param %v (%s)", v.Interface(), v.Type()) + return err + } + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go new file mode 100644 index 000000000..b7ed6c6f8 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go @@ -0,0 +1,72 @@ +package protocol + +import ( + "strconv" + "time" +) + +// Names of time formats supported by the SDK +const ( + RFC822TimeFormatName = "rfc822" + ISO8601TimeFormatName = "iso8601" + UnixTimeFormatName = "unixTimestamp" +) + +// Time formats supported by the SDK +const ( + // RFC 7231#section-7.1.1.1 timetamp format. e.g Tue, 29 Apr 2014 18:30:38 GMT + RFC822TimeFormat = "Mon, 2 Jan 2006 15:04:05 GMT" + + // RFC3339 a subset of the ISO8601 timestamp format. e.g 2014-04-29T18:30:38Z + ISO8601TimeFormat = "2006-01-02T15:04:05Z" +) + +// IsKnownTimestampFormat returns if the timestamp format name +// is know to the SDK's protocols. +func IsKnownTimestampFormat(name string) bool { + switch name { + case RFC822TimeFormatName: + fallthrough + case ISO8601TimeFormatName: + fallthrough + case UnixTimeFormatName: + return true + default: + return false + } +} + +// FormatTime returns a string value of the time. +func FormatTime(name string, t time.Time) string { + t = t.UTC() + + switch name { + case RFC822TimeFormatName: + return t.Format(RFC822TimeFormat) + case ISO8601TimeFormatName: + return t.Format(ISO8601TimeFormat) + case UnixTimeFormatName: + return strconv.FormatInt(t.Unix(), 10) + default: + panic("unknown timestamp format name, " + name) + } +} + +// ParseTime attempts to parse the time given the format. Returns +// the time if it was able to be parsed, and fails otherwise. +func ParseTime(formatName, value string) (time.Time, error) { + switch formatName { + case RFC822TimeFormatName: + return time.Parse(RFC822TimeFormat, value) + case ISO8601TimeFormatName: + return time.Parse(ISO8601TimeFormat, value) + case UnixTimeFormatName: + v, err := strconv.ParseFloat(value, 64) + if err != nil { + return time.Time{}, err + } + return time.Unix(int64(v), 0), nil + default: + panic("unknown timestamp format name, " + formatName) + } +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go new file mode 100644 index 000000000..da1a68111 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go @@ -0,0 +1,21 @@ +package protocol + +import ( + "io" + "io/ioutil" + + "github.com/aws/aws-sdk-go/aws/request" +) + +// UnmarshalDiscardBodyHandler is a named request handler to empty and close a response's body +var UnmarshalDiscardBodyHandler = request.NamedHandler{Name: "awssdk.shared.UnmarshalDiscardBody", Fn: UnmarshalDiscardBody} + +// UnmarshalDiscardBody is a request handler to empty a response's body and closing it. +func UnmarshalDiscardBody(r *request.Request) { + if r.HTTPResponse == nil || r.HTTPResponse.Body == nil { + return + } + + io.Copy(ioutil.Discard, r.HTTPResponse.Body) + r.HTTPResponse.Body.Close() +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go new file mode 100644 index 000000000..cf981fe95 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go @@ -0,0 +1,306 @@ +// Package xmlutil provides XML serialization of AWS requests and responses. +package xmlutil + +import ( + "encoding/base64" + "encoding/xml" + "fmt" + "reflect" + "sort" + "strconv" + "time" + + "github.com/aws/aws-sdk-go/private/protocol" +) + +// BuildXML will serialize params into an xml.Encoder. Error will be returned +// if the serialization of any of the params or nested values fails. +func BuildXML(params interface{}, e *xml.Encoder) error { + return buildXML(params, e, false) +} + +func buildXML(params interface{}, e *xml.Encoder, sorted bool) error { + b := xmlBuilder{encoder: e, namespaces: map[string]string{}} + root := NewXMLElement(xml.Name{}) + if err := b.buildValue(reflect.ValueOf(params), root, ""); err != nil { + return err + } + for _, c := range root.Children { + for _, v := range c { + return StructToXML(e, v, sorted) + } + } + return nil +} + +// Returns the reflection element of a value, if it is a pointer. +func elemOf(value reflect.Value) reflect.Value { + for value.Kind() == reflect.Ptr { + value = value.Elem() + } + return value +} + +// A xmlBuilder serializes values from Go code to XML +type xmlBuilder struct { + encoder *xml.Encoder + namespaces map[string]string +} + +// buildValue generic XMLNode builder for any type. Will build value for their specific type +// struct, list, map, scalar. +// +// Also takes a "type" tag value to set what type a value should be converted to XMLNode as. If +// type is not provided reflect will be used to determine the value's type. +func (b *xmlBuilder) buildValue(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { + value = elemOf(value) + if !value.IsValid() { // no need to handle zero values + return nil + } else if tag.Get("location") != "" { // don't handle non-body location values + return nil + } + + t := tag.Get("type") + if t == "" { + switch value.Kind() { + case reflect.Struct: + t = "structure" + case reflect.Slice: + t = "list" + case reflect.Map: + t = "map" + } + } + + switch t { + case "structure": + if field, ok := value.Type().FieldByName("_"); ok { + tag = tag + reflect.StructTag(" ") + field.Tag + } + return b.buildStruct(value, current, tag) + case "list": + return b.buildList(value, current, tag) + case "map": + return b.buildMap(value, current, tag) + default: + return b.buildScalar(value, current, tag) + } +} + +// buildStruct adds a struct and its fields to the current XMLNode. All fields and any nested +// types are converted to XMLNodes also. +func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { + if !value.IsValid() { + return nil + } + + // unwrap payloads + if payload := tag.Get("payload"); payload != "" { + field, _ := value.Type().FieldByName(payload) + tag = field.Tag + value = elemOf(value.FieldByName(payload)) + + if !value.IsValid() { + return nil + } + } + + child := NewXMLElement(xml.Name{Local: tag.Get("locationName")}) + + // there is an xmlNamespace associated with this struct + if prefix, uri := tag.Get("xmlPrefix"), tag.Get("xmlURI"); uri != "" { + ns := xml.Attr{ + Name: xml.Name{Local: "xmlns"}, + Value: uri, + } + if prefix != "" { + b.namespaces[prefix] = uri // register the namespace + ns.Name.Local = "xmlns:" + prefix + } + + child.Attr = append(child.Attr, ns) + } + + var payloadFields, nonPayloadFields int + + t := value.Type() + for i := 0; i < value.NumField(); i++ { + member := elemOf(value.Field(i)) + field := t.Field(i) + + if field.PkgPath != "" { + continue // ignore unexported fields + } + if field.Tag.Get("ignore") != "" { + continue + } + + mTag := field.Tag + if mTag.Get("location") != "" { // skip non-body members + nonPayloadFields++ + continue + } + payloadFields++ + + if protocol.CanSetIdempotencyToken(value.Field(i), field) { + token := protocol.GetIdempotencyToken() + member = reflect.ValueOf(token) + } + + memberName := mTag.Get("locationName") + if memberName == "" { + memberName = field.Name + mTag = reflect.StructTag(string(mTag) + ` locationName:"` + memberName + `"`) + } + if err := b.buildValue(member, child, mTag); err != nil { + return err + } + } + + // Only case where the child shape is not added is if the shape only contains + // non-payload fields, e.g headers/query. + if !(payloadFields == 0 && nonPayloadFields > 0) { + current.AddChild(child) + } + + return nil +} + +// buildList adds the value's list items to the current XMLNode as children nodes. All +// nested values in the list are converted to XMLNodes also. +func (b *xmlBuilder) buildList(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { + if value.IsNil() { // don't build omitted lists + return nil + } + + // check for unflattened list member + flattened := tag.Get("flattened") != "" + + xname := xml.Name{Local: tag.Get("locationName")} + if flattened { + for i := 0; i < value.Len(); i++ { + child := NewXMLElement(xname) + current.AddChild(child) + if err := b.buildValue(value.Index(i), child, ""); err != nil { + return err + } + } + } else { + list := NewXMLElement(xname) + current.AddChild(list) + + for i := 0; i < value.Len(); i++ { + iname := tag.Get("locationNameList") + if iname == "" { + iname = "member" + } + + child := NewXMLElement(xml.Name{Local: iname}) + list.AddChild(child) + if err := b.buildValue(value.Index(i), child, ""); err != nil { + return err + } + } + } + + return nil +} + +// buildMap adds the value's key/value pairs to the current XMLNode as children nodes. All +// nested values in the map are converted to XMLNodes also. +// +// Error will be returned if it is unable to build the map's values into XMLNodes +func (b *xmlBuilder) buildMap(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { + if value.IsNil() { // don't build omitted maps + return nil + } + + maproot := NewXMLElement(xml.Name{Local: tag.Get("locationName")}) + current.AddChild(maproot) + current = maproot + + kname, vname := "key", "value" + if n := tag.Get("locationNameKey"); n != "" { + kname = n + } + if n := tag.Get("locationNameValue"); n != "" { + vname = n + } + + // sorting is not required for compliance, but it makes testing easier + keys := make([]string, value.Len()) + for i, k := range value.MapKeys() { + keys[i] = k.String() + } + sort.Strings(keys) + + for _, k := range keys { + v := value.MapIndex(reflect.ValueOf(k)) + + mapcur := current + if tag.Get("flattened") == "" { // add "entry" tag to non-flat maps + child := NewXMLElement(xml.Name{Local: "entry"}) + mapcur.AddChild(child) + mapcur = child + } + + kchild := NewXMLElement(xml.Name{Local: kname}) + kchild.Text = k + vchild := NewXMLElement(xml.Name{Local: vname}) + mapcur.AddChild(kchild) + mapcur.AddChild(vchild) + + if err := b.buildValue(v, vchild, ""); err != nil { + return err + } + } + + return nil +} + +// buildScalar will convert the value into a string and append it as a attribute or child +// of the current XMLNode. +// +// The value will be added as an attribute if tag contains a "xmlAttribute" attribute value. +// +// Error will be returned if the value type is unsupported. +func (b *xmlBuilder) buildScalar(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { + var str string + switch converted := value.Interface().(type) { + case string: + str = converted + case []byte: + if !value.IsNil() { + str = base64.StdEncoding.EncodeToString(converted) + } + case bool: + str = strconv.FormatBool(converted) + case int64: + str = strconv.FormatInt(converted, 10) + case int: + str = strconv.Itoa(converted) + case float64: + str = strconv.FormatFloat(converted, 'f', -1, 64) + case float32: + str = strconv.FormatFloat(float64(converted), 'f', -1, 32) + case time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + str = protocol.FormatTime(format, converted) + default: + return fmt.Errorf("unsupported value for param %s: %v (%s)", + tag.Get("locationName"), value.Interface(), value.Type().Name()) + } + + xname := xml.Name{Local: tag.Get("locationName")} + if tag.Get("xmlAttribute") != "" { // put into current node's attribute list + attr := xml.Attr{Name: xname, Value: str} + current.Attr = append(current.Attr, attr) + } else { // regular text node + current.AddChild(&XMLNode{Name: xname, Text: str}) + } + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go new file mode 100644 index 000000000..7108d3800 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go @@ -0,0 +1,291 @@ +package xmlutil + +import ( + "bytes" + "encoding/base64" + "encoding/xml" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "time" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/private/protocol" +) + +// UnmarshalXMLError unmarshals the XML error from the stream into the value +// type specified. The value must be a pointer. If the message fails to +// unmarshal, the message content will be included in the returned error as a +// awserr.UnmarshalError. +func UnmarshalXMLError(v interface{}, stream io.Reader) error { + var errBuf bytes.Buffer + body := io.TeeReader(stream, &errBuf) + + err := xml.NewDecoder(body).Decode(v) + if err != nil && err != io.EOF { + return awserr.NewUnmarshalError(err, + "failed to unmarshal error message", errBuf.Bytes()) + } + + return nil +} + +// UnmarshalXML deserializes an xml.Decoder into the container v. V +// needs to match the shape of the XML expected to be decoded. +// If the shape doesn't match unmarshaling will fail. +func UnmarshalXML(v interface{}, d *xml.Decoder, wrapper string) error { + n, err := XMLToStruct(d, nil) + if err != nil { + return err + } + if n.Children != nil { + for _, root := range n.Children { + for _, c := range root { + if wrappedChild, ok := c.Children[wrapper]; ok { + c = wrappedChild[0] // pull out wrapped element + } + + err = parse(reflect.ValueOf(v), c, "") + if err != nil { + if err == io.EOF { + return nil + } + return err + } + } + } + return nil + } + return nil +} + +// parse deserializes any value from the XMLNode. The type tag is used to infer the type, or reflect +// will be used to determine the type from r. +func parse(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { + rtype := r.Type() + if rtype.Kind() == reflect.Ptr { + rtype = rtype.Elem() // check kind of actual element type + } + + t := tag.Get("type") + if t == "" { + switch rtype.Kind() { + case reflect.Struct: + // also it can't be a time object + if _, ok := r.Interface().(*time.Time); !ok { + t = "structure" + } + case reflect.Slice: + // also it can't be a byte slice + if _, ok := r.Interface().([]byte); !ok { + t = "list" + } + case reflect.Map: + t = "map" + } + } + + switch t { + case "structure": + if field, ok := rtype.FieldByName("_"); ok { + tag = field.Tag + } + return parseStruct(r, node, tag) + case "list": + return parseList(r, node, tag) + case "map": + return parseMap(r, node, tag) + default: + return parseScalar(r, node, tag) + } +} + +// parseStruct deserializes a structure and its fields from an XMLNode. Any nested +// types in the structure will also be deserialized. +func parseStruct(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { + t := r.Type() + if r.Kind() == reflect.Ptr { + if r.IsNil() { // create the structure if it's nil + s := reflect.New(r.Type().Elem()) + r.Set(s) + r = s + } + + r = r.Elem() + t = t.Elem() + } + + // unwrap any payloads + if payload := tag.Get("payload"); payload != "" { + field, _ := t.FieldByName(payload) + return parseStruct(r.FieldByName(payload), node, field.Tag) + } + + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + if c := field.Name[0:1]; strings.ToLower(c) == c { + continue // ignore unexported fields + } + + // figure out what this field is called + name := field.Name + if field.Tag.Get("flattened") != "" && field.Tag.Get("locationNameList") != "" { + name = field.Tag.Get("locationNameList") + } else if locName := field.Tag.Get("locationName"); locName != "" { + name = locName + } + + // try to find the field by name in elements + elems := node.Children[name] + + if elems == nil { // try to find the field in attributes + if val, ok := node.findElem(name); ok { + elems = []*XMLNode{{Text: val}} + } + } + + member := r.FieldByName(field.Name) + for _, elem := range elems { + err := parse(member, elem, field.Tag) + if err != nil { + return err + } + } + } + return nil +} + +// parseList deserializes a list of values from an XML node. Each list entry +// will also be deserialized. +func parseList(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { + t := r.Type() + + if tag.Get("flattened") == "" { // look at all item entries + mname := "member" + if name := tag.Get("locationNameList"); name != "" { + mname = name + } + + if Children, ok := node.Children[mname]; ok { + if r.IsNil() { + r.Set(reflect.MakeSlice(t, len(Children), len(Children))) + } + + for i, c := range Children { + err := parse(r.Index(i), c, "") + if err != nil { + return err + } + } + } + } else { // flattened list means this is a single element + if r.IsNil() { + r.Set(reflect.MakeSlice(t, 0, 0)) + } + + childR := reflect.Zero(t.Elem()) + r.Set(reflect.Append(r, childR)) + err := parse(r.Index(r.Len()-1), node, "") + if err != nil { + return err + } + } + + return nil +} + +// parseMap deserializes a map from an XMLNode. The direct children of the XMLNode +// will also be deserialized as map entries. +func parseMap(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { + if r.IsNil() { + r.Set(reflect.MakeMap(r.Type())) + } + + if tag.Get("flattened") == "" { // look at all child entries + for _, entry := range node.Children["entry"] { + parseMapEntry(r, entry, tag) + } + } else { // this element is itself an entry + parseMapEntry(r, node, tag) + } + + return nil +} + +// parseMapEntry deserializes a map entry from a XML node. +func parseMapEntry(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { + kname, vname := "key", "value" + if n := tag.Get("locationNameKey"); n != "" { + kname = n + } + if n := tag.Get("locationNameValue"); n != "" { + vname = n + } + + keys, ok := node.Children[kname] + values := node.Children[vname] + if ok { + for i, key := range keys { + keyR := reflect.ValueOf(key.Text) + value := values[i] + valueR := reflect.New(r.Type().Elem()).Elem() + + parse(valueR, value, "") + r.SetMapIndex(keyR, valueR) + } + } + return nil +} + +// parseScaller deserializes an XMLNode value into a concrete type based on the +// interface type of r. +// +// Error is returned if the deserialization fails due to invalid type conversion, +// or unsupported interface type. +func parseScalar(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { + switch r.Interface().(type) { + case *string: + r.Set(reflect.ValueOf(&node.Text)) + return nil + case []byte: + b, err := base64.StdEncoding.DecodeString(node.Text) + if err != nil { + return err + } + r.Set(reflect.ValueOf(b)) + case *bool: + v, err := strconv.ParseBool(node.Text) + if err != nil { + return err + } + r.Set(reflect.ValueOf(&v)) + case *int64: + v, err := strconv.ParseInt(node.Text, 10, 64) + if err != nil { + return err + } + r.Set(reflect.ValueOf(&v)) + case *float64: + v, err := strconv.ParseFloat(node.Text, 64) + if err != nil { + return err + } + r.Set(reflect.ValueOf(&v)) + case *time.Time: + format := tag.Get("timestampFormat") + if len(format) == 0 { + format = protocol.ISO8601TimeFormatName + } + + t, err := protocol.ParseTime(format, node.Text) + if err != nil { + return err + } + r.Set(reflect.ValueOf(&t)) + default: + return fmt.Errorf("unsupported value: %v (%s)", r.Interface(), r.Type()) + } + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go new file mode 100644 index 000000000..515ce1521 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go @@ -0,0 +1,148 @@ +package xmlutil + +import ( + "encoding/xml" + "fmt" + "io" + "sort" +) + +// A XMLNode contains the values to be encoded or decoded. +type XMLNode struct { + Name xml.Name `json:",omitempty"` + Children map[string][]*XMLNode `json:",omitempty"` + Text string `json:",omitempty"` + Attr []xml.Attr `json:",omitempty"` + + namespaces map[string]string + parent *XMLNode +} + +// NewXMLElement returns a pointer to a new XMLNode initialized to default values. +func NewXMLElement(name xml.Name) *XMLNode { + return &XMLNode{ + Name: name, + Children: map[string][]*XMLNode{}, + Attr: []xml.Attr{}, + } +} + +// AddChild adds child to the XMLNode. +func (n *XMLNode) AddChild(child *XMLNode) { + child.parent = n + if _, ok := n.Children[child.Name.Local]; !ok { + n.Children[child.Name.Local] = []*XMLNode{} + } + n.Children[child.Name.Local] = append(n.Children[child.Name.Local], child) +} + +// XMLToStruct converts a xml.Decoder stream to XMLNode with nested values. +func XMLToStruct(d *xml.Decoder, s *xml.StartElement) (*XMLNode, error) { + out := &XMLNode{} + for { + tok, err := d.Token() + if err != nil { + if err == io.EOF { + break + } else { + return out, err + } + } + + if tok == nil { + break + } + + switch typed := tok.(type) { + case xml.CharData: + out.Text = string(typed.Copy()) + case xml.StartElement: + el := typed.Copy() + out.Attr = el.Attr + if out.Children == nil { + out.Children = map[string][]*XMLNode{} + } + + name := typed.Name.Local + slice := out.Children[name] + if slice == nil { + slice = []*XMLNode{} + } + node, e := XMLToStruct(d, &el) + out.findNamespaces() + if e != nil { + return out, e + } + node.Name = typed.Name + node.findNamespaces() + tempOut := *out + // Save into a temp variable, simply because out gets squashed during + // loop iterations + node.parent = &tempOut + slice = append(slice, node) + out.Children[name] = slice + case xml.EndElement: + if s != nil && s.Name.Local == typed.Name.Local { // matching end token + return out, nil + } + out = &XMLNode{} + } + } + return out, nil +} + +func (n *XMLNode) findNamespaces() { + ns := map[string]string{} + for _, a := range n.Attr { + if a.Name.Space == "xmlns" { + ns[a.Value] = a.Name.Local + } + } + + n.namespaces = ns +} + +func (n *XMLNode) findElem(name string) (string, bool) { + for node := n; node != nil; node = node.parent { + for _, a := range node.Attr { + namespace := a.Name.Space + if v, ok := node.namespaces[namespace]; ok { + namespace = v + } + if name == fmt.Sprintf("%s:%s", namespace, a.Name.Local) { + return a.Value, true + } + } + } + return "", false +} + +// StructToXML writes an XMLNode to a xml.Encoder as tokens. +func StructToXML(e *xml.Encoder, node *XMLNode, sorted bool) error { + e.EncodeToken(xml.StartElement{Name: node.Name, Attr: node.Attr}) + + if node.Text != "" { + e.EncodeToken(xml.CharData([]byte(node.Text))) + } else if sorted { + sortedNames := []string{} + for k := range node.Children { + sortedNames = append(sortedNames, k) + } + sort.Strings(sortedNames) + + for _, k := range sortedNames { + for _, v := range node.Children[k] { + StructToXML(e, v, sorted) + } + } + } else { + for _, c := range node.Children { + for _, v := range c { + StructToXML(e, v, sorted) + } + } + } + + e.EncodeToken(xml.EndElement{Name: node.Name}) + return e.Flush() +} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go new file mode 100644 index 000000000..306c7b2c1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go @@ -0,0 +1,2580 @@ +// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. + +package sts + +import ( + "fmt" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awsutil" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/request" +) + +const opAssumeRole = "AssumeRole" + +// AssumeRoleRequest generates a "aws/request.Request" representing the +// client's request for the AssumeRole operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See AssumeRole for more information on using the AssumeRole +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the AssumeRoleRequest method. +// req, resp := client.AssumeRoleRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole +func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, output *AssumeRoleOutput) { + op := &request.Operation{ + Name: opAssumeRole, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &AssumeRoleInput{} + } + + output = &AssumeRoleOutput{} + req = c.newRequest(op, input, output) + return +} + +// AssumeRole API operation for AWS Security Token Service. +// +// Returns a set of temporary security credentials that you can use to access +// AWS resources that you might not normally have access to. These temporary +// credentials consist of an access key ID, a secret access key, and a security +// token. Typically, you use AssumeRole within your account or for cross-account +// access. For a comparison of AssumeRole with other API operations that produce +// temporary credentials, see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// in the IAM User Guide. +// +// You cannot use AWS account root user credentials to call AssumeRole. You +// must use credentials for an IAM user or an IAM role to call AssumeRole. +// +// For cross-account access, imagine that you own multiple accounts and need +// to access resources in each account. You could create long-term credentials +// in each account to access those resources. However, managing all those credentials +// and remembering which one can access which account can be time consuming. +// Instead, you can create one set of long-term credentials in one account. +// Then use temporary security credentials to access all the other accounts +// by assuming roles in those accounts. For more information about roles, see +// IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) +// in the IAM User Guide. +// +// By default, the temporary security credentials created by AssumeRole last +// for one hour. However, you can use the optional DurationSeconds parameter +// to specify the duration of your session. You can provide a value from 900 +// seconds (15 minutes) up to the maximum session duration setting for the role. +// This setting can have a value from 1 hour to 12 hours. To learn how to view +// the maximum value for your role, see View the Maximum Session Duration Setting +// for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// in the IAM User Guide. The maximum session duration limit applies when you +// use the AssumeRole* API operations or the assume-role* CLI commands. However +// the limit does not apply when you use those operations to create a console +// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// in the IAM User Guide. +// +// The temporary security credentials created by AssumeRole can be used to make +// API calls to any AWS service with the following exception: You cannot call +// the AWS STS GetFederationToken or GetSessionToken API operations. +// +// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies shouldn't exceed 2048 characters. Passing policies +// to this operation returns new temporary credentials. The resulting session's +// permissions are the intersection of the role's identity-based policy and +// the session policies. You can use the role's temporary credentials in subsequent +// AWS API calls to access resources in the account that owns the role. You +// cannot use session policies to grant more permissions than those allowed +// by the identity-based policy of the role that is being assumed. For more +// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) +// in the IAM User Guide. +// +// To assume a role from a different account, your AWS account must be trusted +// by the role. The trust relationship is defined in the role's trust policy +// when the role is created. That trust policy states which accounts are allowed +// to delegate that access to users in the account. +// +// A user who wants to access a role in a different account must also have permissions +// that are delegated from the user account administrator. The administrator +// must attach a policy that allows the user to call AssumeRole for the ARN +// of the role in the other account. If the user is in the same account as the +// role, then you can do either of the following: +// +// * Attach a policy to the user (identical to the previous user in a different +// account). +// +// * Add the user as a principal directly in the role's trust policy. +// +// In this case, the trust policy acts as an IAM resource-based policy. Users +// in the same account as the role do not need explicit permission to assume +// the role. For more information about trust policies and resource-based policies, +// see IAM Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) +// in the IAM User Guide. +// +// Using MFA with AssumeRole +// +// (Optional) You can include multi-factor authentication (MFA) information +// when you call AssumeRole. This is useful for cross-account scenarios to ensure +// that the user that assumes the role has been authenticated with an AWS MFA +// device. In that scenario, the trust policy of the role being assumed includes +// a condition that tests for MFA authentication. If the caller does not include +// valid MFA information, the request to assume the role is denied. The condition +// in a trust policy that tests for MFA authentication might look like the following +// example. +// +// "Condition": {"Bool": {"aws:MultiFactorAuthPresent": true}} +// +// For more information, see Configuring MFA-Protected API Access (https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html) +// in the IAM User Guide guide. +// +// To use MFA with AssumeRole, you pass values for the SerialNumber and TokenCode +// parameters. The SerialNumber value identifies the user's hardware or virtual +// MFA device. The TokenCode is the time-based one-time password (TOTP) that +// the MFA device produces. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation AssumeRole for usage and error information. +// +// Returned Error Codes: +// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" +// The request was rejected because the policy document was malformed. The error +// message describes the specific error. +// +// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" +// The request was rejected because the policy document was too large. The error +// message describes how big the policy document is, in packed form, as a percentage +// of what the API allows. +// +// * ErrCodeRegionDisabledException "RegionDisabledException" +// STS is not activated in the requested region for the account that is being +// asked to generate credentials. The account administrator must use the IAM +// console to activate STS in that region. For more information, see Activating +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole +func (c *STS) AssumeRole(input *AssumeRoleInput) (*AssumeRoleOutput, error) { + req, out := c.AssumeRoleRequest(input) + return out, req.Send() +} + +// AssumeRoleWithContext is the same as AssumeRole with the addition of +// the ability to pass a context and additional request options. +// +// See AssumeRole for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) AssumeRoleWithContext(ctx aws.Context, input *AssumeRoleInput, opts ...request.Option) (*AssumeRoleOutput, error) { + req, out := c.AssumeRoleRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opAssumeRoleWithSAML = "AssumeRoleWithSAML" + +// AssumeRoleWithSAMLRequest generates a "aws/request.Request" representing the +// client's request for the AssumeRoleWithSAML operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See AssumeRoleWithSAML for more information on using the AssumeRoleWithSAML +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the AssumeRoleWithSAMLRequest method. +// req, resp := client.AssumeRoleWithSAMLRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML +func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *request.Request, output *AssumeRoleWithSAMLOutput) { + op := &request.Operation{ + Name: opAssumeRoleWithSAML, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &AssumeRoleWithSAMLInput{} + } + + output = &AssumeRoleWithSAMLOutput{} + req = c.newRequest(op, input, output) + req.Config.Credentials = credentials.AnonymousCredentials + return +} + +// AssumeRoleWithSAML API operation for AWS Security Token Service. +// +// Returns a set of temporary security credentials for users who have been authenticated +// via a SAML authentication response. This operation provides a mechanism for +// tying an enterprise identity store or directory to role-based AWS access +// without user-specific credentials or configuration. For a comparison of AssumeRoleWithSAML +// with the other API operations that produce temporary credentials, see Requesting +// Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// in the IAM User Guide. +// +// The temporary security credentials returned by this operation consist of +// an access key ID, a secret access key, and a security token. Applications +// can use these temporary security credentials to sign calls to AWS services. +// +// By default, the temporary security credentials created by AssumeRoleWithSAML +// last for one hour. However, you can use the optional DurationSeconds parameter +// to specify the duration of your session. Your role session lasts for the +// duration that you specify, or until the time specified in the SAML authentication +// response's SessionNotOnOrAfter value, whichever is shorter. You can provide +// a DurationSeconds value from 900 seconds (15 minutes) up to the maximum session +// duration setting for the role. This setting can have a value from 1 hour +// to 12 hours. To learn how to view the maximum value for your role, see View +// the Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// in the IAM User Guide. The maximum session duration limit applies when you +// use the AssumeRole* API operations or the assume-role* CLI commands. However +// the limit does not apply when you use those operations to create a console +// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// in the IAM User Guide. +// +// The temporary security credentials created by AssumeRoleWithSAML can be used +// to make API calls to any AWS service with the following exception: you cannot +// call the STS GetFederationToken or GetSessionToken API operations. +// +// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies shouldn't exceed 2048 characters. Passing policies +// to this operation returns new temporary credentials. The resulting session's +// permissions are the intersection of the role's identity-based policy and +// the session policies. You can use the role's temporary credentials in subsequent +// AWS API calls to access resources in the account that owns the role. You +// cannot use session policies to grant more permissions than those allowed +// by the identity-based policy of the role that is being assumed. For more +// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) +// in the IAM User Guide. +// +// Before your application can call AssumeRoleWithSAML, you must configure your +// SAML identity provider (IdP) to issue the claims required by AWS. Additionally, +// you must use AWS Identity and Access Management (IAM) to create a SAML provider +// entity in your AWS account that represents your identity provider. You must +// also create an IAM role that specifies this SAML provider in its trust policy. +// +// Calling AssumeRoleWithSAML does not require the use of AWS security credentials. +// The identity of the caller is validated by using keys in the metadata document +// that is uploaded for the SAML provider entity for your identity provider. +// +// Calling AssumeRoleWithSAML can result in an entry in your AWS CloudTrail +// logs. The entry includes the value in the NameID element of the SAML assertion. +// We recommend that you use a NameIDType that is not associated with any personally +// identifiable information (PII). For example, you could instead use the Persistent +// Identifier (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent). +// +// For more information, see the following resources: +// +// * About SAML 2.0-based Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) +// in the IAM User Guide. +// +// * Creating SAML Identity Providers (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html) +// in the IAM User Guide. +// +// * Configuring a Relying Party and Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html) +// in the IAM User Guide. +// +// * Creating a Role for SAML 2.0 Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html) +// in the IAM User Guide. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation AssumeRoleWithSAML for usage and error information. +// +// Returned Error Codes: +// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" +// The request was rejected because the policy document was malformed. The error +// message describes the specific error. +// +// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" +// The request was rejected because the policy document was too large. The error +// message describes how big the policy document is, in packed form, as a percentage +// of what the API allows. +// +// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim" +// The identity provider (IdP) reported that authentication failed. This might +// be because the claim is invalid. +// +// If this error is returned for the AssumeRoleWithWebIdentity operation, it +// can also mean that the claim has expired or has been explicitly revoked. +// +// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken" +// The web identity token that was passed could not be validated by AWS. Get +// a new identity token from the identity provider and then retry the request. +// +// * ErrCodeExpiredTokenException "ExpiredTokenException" +// The web identity token that was passed is expired or is not valid. Get a +// new identity token from the identity provider and then retry the request. +// +// * ErrCodeRegionDisabledException "RegionDisabledException" +// STS is not activated in the requested region for the account that is being +// asked to generate credentials. The account administrator must use the IAM +// console to activate STS in that region. For more information, see Activating +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML +func (c *STS) AssumeRoleWithSAML(input *AssumeRoleWithSAMLInput) (*AssumeRoleWithSAMLOutput, error) { + req, out := c.AssumeRoleWithSAMLRequest(input) + return out, req.Send() +} + +// AssumeRoleWithSAMLWithContext is the same as AssumeRoleWithSAML with the addition of +// the ability to pass a context and additional request options. +// +// See AssumeRoleWithSAML for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) AssumeRoleWithSAMLWithContext(ctx aws.Context, input *AssumeRoleWithSAMLInput, opts ...request.Option) (*AssumeRoleWithSAMLOutput, error) { + req, out := c.AssumeRoleWithSAMLRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opAssumeRoleWithWebIdentity = "AssumeRoleWithWebIdentity" + +// AssumeRoleWithWebIdentityRequest generates a "aws/request.Request" representing the +// client's request for the AssumeRoleWithWebIdentity operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See AssumeRoleWithWebIdentity for more information on using the AssumeRoleWithWebIdentity +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the AssumeRoleWithWebIdentityRequest method. +// req, resp := client.AssumeRoleWithWebIdentityRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity +func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityInput) (req *request.Request, output *AssumeRoleWithWebIdentityOutput) { + op := &request.Operation{ + Name: opAssumeRoleWithWebIdentity, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &AssumeRoleWithWebIdentityInput{} + } + + output = &AssumeRoleWithWebIdentityOutput{} + req = c.newRequest(op, input, output) + req.Config.Credentials = credentials.AnonymousCredentials + return +} + +// AssumeRoleWithWebIdentity API operation for AWS Security Token Service. +// +// Returns a set of temporary security credentials for users who have been authenticated +// in a mobile or web application with a web identity provider. Example providers +// include Amazon Cognito, Login with Amazon, Facebook, Google, or any OpenID +// Connect-compatible identity provider. +// +// For mobile applications, we recommend that you use Amazon Cognito. You can +// use Amazon Cognito with the AWS SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) +// and the AWS SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/) +// to uniquely identify a user. You can also supply the user with a consistent +// identity throughout the lifetime of an application. +// +// To learn more about Amazon Cognito, see Amazon Cognito Overview (https://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-auth.html#d0e840) +// in AWS SDK for Android Developer Guide and Amazon Cognito Overview (https://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html#d0e664) +// in the AWS SDK for iOS Developer Guide. +// +// Calling AssumeRoleWithWebIdentity does not require the use of AWS security +// credentials. Therefore, you can distribute an application (for example, on +// mobile devices) that requests temporary security credentials without including +// long-term AWS credentials in the application. You also don't need to deploy +// server-based proxy services that use long-term AWS credentials. Instead, +// the identity of the caller is validated by using a token from the web identity +// provider. For a comparison of AssumeRoleWithWebIdentity with the other API +// operations that produce temporary credentials, see Requesting Temporary Security +// Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// in the IAM User Guide. +// +// The temporary security credentials returned by this API consist of an access +// key ID, a secret access key, and a security token. Applications can use these +// temporary security credentials to sign calls to AWS service API operations. +// +// By default, the temporary security credentials created by AssumeRoleWithWebIdentity +// last for one hour. However, you can use the optional DurationSeconds parameter +// to specify the duration of your session. You can provide a value from 900 +// seconds (15 minutes) up to the maximum session duration setting for the role. +// This setting can have a value from 1 hour to 12 hours. To learn how to view +// the maximum value for your role, see View the Maximum Session Duration Setting +// for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) +// in the IAM User Guide. The maximum session duration limit applies when you +// use the AssumeRole* API operations or the assume-role* CLI commands. However +// the limit does not apply when you use those operations to create a console +// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) +// in the IAM User Guide. +// +// The temporary security credentials created by AssumeRoleWithWebIdentity can +// be used to make API calls to any AWS service with the following exception: +// you cannot call the STS GetFederationToken or GetSessionToken API operations. +// +// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies shouldn't exceed 2048 characters. Passing policies +// to this operation returns new temporary credentials. The resulting session's +// permissions are the intersection of the role's identity-based policy and +// the session policies. You can use the role's temporary credentials in subsequent +// AWS API calls to access resources in the account that owns the role. You +// cannot use session policies to grant more permissions than those allowed +// by the identity-based policy of the role that is being assumed. For more +// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) +// in the IAM User Guide. +// +// Before your application can call AssumeRoleWithWebIdentity, you must have +// an identity token from a supported identity provider and create a role that +// the application can assume. The role that your application assumes must trust +// the identity provider that is associated with the identity token. In other +// words, the identity provider must be specified in the role's trust policy. +// +// Calling AssumeRoleWithWebIdentity can result in an entry in your AWS CloudTrail +// logs. The entry includes the Subject (http://openid.net/specs/openid-connect-core-1_0.html#Claims) +// of the provided Web Identity Token. We recommend that you avoid using any +// personally identifiable information (PII) in this field. For example, you +// could instead use a GUID or a pairwise identifier, as suggested in the OIDC +// specification (http://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes). +// +// For more information about how to use web identity federation and the AssumeRoleWithWebIdentity +// API, see the following resources: +// +// * Using Web Identity Federation API Operations for Mobile Apps (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html) +// and Federation Through a Web-based Identity Provider (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). +// +// * Web Identity Federation Playground (https://web-identity-federation-playground.s3.amazonaws.com/index.html). +// Walk through the process of authenticating through Login with Amazon, +// Facebook, or Google, getting temporary security credentials, and then +// using those credentials to make a request to AWS. +// +// * AWS SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) and +// AWS SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/). +// These toolkits contain sample apps that show how to invoke the identity +// providers, and then how to use the information from these providers to +// get and use temporary security credentials. +// +// * Web Identity Federation with Mobile Applications (http://aws.amazon.com/articles/web-identity-federation-with-mobile-applications). +// This article discusses web identity federation and shows an example of +// how to use web identity federation to get access to content in Amazon +// S3. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation AssumeRoleWithWebIdentity for usage and error information. +// +// Returned Error Codes: +// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" +// The request was rejected because the policy document was malformed. The error +// message describes the specific error. +// +// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" +// The request was rejected because the policy document was too large. The error +// message describes how big the policy document is, in packed form, as a percentage +// of what the API allows. +// +// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim" +// The identity provider (IdP) reported that authentication failed. This might +// be because the claim is invalid. +// +// If this error is returned for the AssumeRoleWithWebIdentity operation, it +// can also mean that the claim has expired or has been explicitly revoked. +// +// * ErrCodeIDPCommunicationErrorException "IDPCommunicationError" +// The request could not be fulfilled because the non-AWS identity provider +// (IDP) that was asked to verify the incoming identity token could not be reached. +// This is often a transient error caused by network conditions. Retry the request +// a limited number of times so that you don't exceed the request rate. If the +// error persists, the non-AWS identity provider might be down or not responding. +// +// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken" +// The web identity token that was passed could not be validated by AWS. Get +// a new identity token from the identity provider and then retry the request. +// +// * ErrCodeExpiredTokenException "ExpiredTokenException" +// The web identity token that was passed is expired or is not valid. Get a +// new identity token from the identity provider and then retry the request. +// +// * ErrCodeRegionDisabledException "RegionDisabledException" +// STS is not activated in the requested region for the account that is being +// asked to generate credentials. The account administrator must use the IAM +// console to activate STS in that region. For more information, see Activating +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity +func (c *STS) AssumeRoleWithWebIdentity(input *AssumeRoleWithWebIdentityInput) (*AssumeRoleWithWebIdentityOutput, error) { + req, out := c.AssumeRoleWithWebIdentityRequest(input) + return out, req.Send() +} + +// AssumeRoleWithWebIdentityWithContext is the same as AssumeRoleWithWebIdentity with the addition of +// the ability to pass a context and additional request options. +// +// See AssumeRoleWithWebIdentity for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) AssumeRoleWithWebIdentityWithContext(ctx aws.Context, input *AssumeRoleWithWebIdentityInput, opts ...request.Option) (*AssumeRoleWithWebIdentityOutput, error) { + req, out := c.AssumeRoleWithWebIdentityRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opDecodeAuthorizationMessage = "DecodeAuthorizationMessage" + +// DecodeAuthorizationMessageRequest generates a "aws/request.Request" representing the +// client's request for the DecodeAuthorizationMessage operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See DecodeAuthorizationMessage for more information on using the DecodeAuthorizationMessage +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the DecodeAuthorizationMessageRequest method. +// req, resp := client.DecodeAuthorizationMessageRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage +func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessageInput) (req *request.Request, output *DecodeAuthorizationMessageOutput) { + op := &request.Operation{ + Name: opDecodeAuthorizationMessage, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &DecodeAuthorizationMessageInput{} + } + + output = &DecodeAuthorizationMessageOutput{} + req = c.newRequest(op, input, output) + return +} + +// DecodeAuthorizationMessage API operation for AWS Security Token Service. +// +// Decodes additional information about the authorization status of a request +// from an encoded message returned in response to an AWS request. +// +// For example, if a user is not authorized to perform an operation that he +// or she has requested, the request returns a Client.UnauthorizedOperation +// response (an HTTP 403 response). Some AWS operations additionally return +// an encoded message that can provide details about this authorization failure. +// +// Only certain AWS operations return an encoded authorization message. The +// documentation for an individual operation indicates whether that operation +// returns an encoded message in addition to returning an HTTP code. +// +// The message is encoded because the details of the authorization status can +// constitute privileged information that the user who requested the operation +// should not see. To decode an authorization status message, a user must be +// granted permissions via an IAM policy to request the DecodeAuthorizationMessage +// (sts:DecodeAuthorizationMessage) action. +// +// The decoded message includes the following type of information: +// +// * Whether the request was denied due to an explicit deny or due to the +// absence of an explicit allow. For more information, see Determining Whether +// a Request is Allowed or Denied (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) +// in the IAM User Guide. +// +// * The principal who made the request. +// +// * The requested action. +// +// * The requested resource. +// +// * The values of condition keys in the context of the user's request. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation DecodeAuthorizationMessage for usage and error information. +// +// Returned Error Codes: +// * ErrCodeInvalidAuthorizationMessageException "InvalidAuthorizationMessageException" +// The error returned if the message passed to DecodeAuthorizationMessage was +// invalid. This can happen if the token contains invalid characters, such as +// linebreaks. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage +func (c *STS) DecodeAuthorizationMessage(input *DecodeAuthorizationMessageInput) (*DecodeAuthorizationMessageOutput, error) { + req, out := c.DecodeAuthorizationMessageRequest(input) + return out, req.Send() +} + +// DecodeAuthorizationMessageWithContext is the same as DecodeAuthorizationMessage with the addition of +// the ability to pass a context and additional request options. +// +// See DecodeAuthorizationMessage for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) DecodeAuthorizationMessageWithContext(ctx aws.Context, input *DecodeAuthorizationMessageInput, opts ...request.Option) (*DecodeAuthorizationMessageOutput, error) { + req, out := c.DecodeAuthorizationMessageRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opGetCallerIdentity = "GetCallerIdentity" + +// GetCallerIdentityRequest generates a "aws/request.Request" representing the +// client's request for the GetCallerIdentity operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See GetCallerIdentity for more information on using the GetCallerIdentity +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the GetCallerIdentityRequest method. +// req, resp := client.GetCallerIdentityRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity +func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *request.Request, output *GetCallerIdentityOutput) { + op := &request.Operation{ + Name: opGetCallerIdentity, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &GetCallerIdentityInput{} + } + + output = &GetCallerIdentityOutput{} + req = c.newRequest(op, input, output) + return +} + +// GetCallerIdentity API operation for AWS Security Token Service. +// +// Returns details about the IAM identity whose credentials are used to call +// the API. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation GetCallerIdentity for usage and error information. +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity +func (c *STS) GetCallerIdentity(input *GetCallerIdentityInput) (*GetCallerIdentityOutput, error) { + req, out := c.GetCallerIdentityRequest(input) + return out, req.Send() +} + +// GetCallerIdentityWithContext is the same as GetCallerIdentity with the addition of +// the ability to pass a context and additional request options. +// +// See GetCallerIdentity for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) GetCallerIdentityWithContext(ctx aws.Context, input *GetCallerIdentityInput, opts ...request.Option) (*GetCallerIdentityOutput, error) { + req, out := c.GetCallerIdentityRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opGetFederationToken = "GetFederationToken" + +// GetFederationTokenRequest generates a "aws/request.Request" representing the +// client's request for the GetFederationToken operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See GetFederationToken for more information on using the GetFederationToken +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the GetFederationTokenRequest method. +// req, resp := client.GetFederationTokenRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken +func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *request.Request, output *GetFederationTokenOutput) { + op := &request.Operation{ + Name: opGetFederationToken, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &GetFederationTokenInput{} + } + + output = &GetFederationTokenOutput{} + req = c.newRequest(op, input, output) + return +} + +// GetFederationToken API operation for AWS Security Token Service. +// +// Returns a set of temporary security credentials (consisting of an access +// key ID, a secret access key, and a security token) for a federated user. +// A typical use is in a proxy application that gets temporary security credentials +// on behalf of distributed applications inside a corporate network. You must +// call the GetFederationToken operation using the long-term security credentials +// of an IAM user. As a result, this call is appropriate in contexts where those +// credentials can be safely stored, usually in a server-based application. +// For a comparison of GetFederationToken with the other API operations that +// produce temporary credentials, see Requesting Temporary Security Credentials +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// in the IAM User Guide. +// +// You can create a mobile-based or browser-based app that can authenticate +// users using a web identity provider like Login with Amazon, Facebook, Google, +// or an OpenID Connect-compatible identity provider. In this case, we recommend +// that you use Amazon Cognito (http://aws.amazon.com/cognito/) or AssumeRoleWithWebIdentity. +// For more information, see Federation Through a Web-based Identity Provider +// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). +// +// You can also call GetFederationToken using the security credentials of an +// AWS account root user, but we do not recommend it. Instead, we recommend +// that you create an IAM user for the purpose of the proxy application. Then +// attach a policy to the IAM user that limits federated users to only the actions +// and resources that they need to access. For more information, see IAM Best +// Practices (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) +// in the IAM User Guide. +// +// The temporary credentials are valid for the specified duration, from 900 +// seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours). The default +// is 43,200 seconds (12 hours). Temporary credentials that are obtained by +// using AWS account root user credentials have a maximum duration of 3,600 +// seconds (1 hour). +// +// The temporary security credentials created by GetFederationToken can be used +// to make API calls to any AWS service with the following exceptions: +// +// * You cannot use these credentials to call any IAM API operations. +// +// * You cannot call any STS API operations except GetCallerIdentity. +// +// Permissions +// +// You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) +// to this operation. You can pass a single JSON policy document to use as an +// inline session policy. You can also specify up to 10 managed policies to +// use as managed session policies. The plain text that you use for both inline +// and managed session policies shouldn't exceed 2048 characters. +// +// Though the session policy parameters are optional, if you do not pass a policy, +// then the resulting federated user session has no permissions. The only exception +// is when the credentials are used to access a resource that has a resource-based +// policy that specifically references the federated user session in the Principal +// element of the policy. When you pass session policies, the session permissions +// are the intersection of the IAM user policies and the session policies that +// you pass. This gives you a way to further restrict the permissions for a +// federated user. You cannot use session policies to grant more permissions +// than those that are defined in the permissions policy of the IAM user. For +// more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) +// in the IAM User Guide. For information about using GetFederationToken to +// create temporary security credentials, see GetFederationToken—Federation +// Through a Custom Identity Broker (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken). +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation GetFederationToken for usage and error information. +// +// Returned Error Codes: +// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" +// The request was rejected because the policy document was malformed. The error +// message describes the specific error. +// +// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" +// The request was rejected because the policy document was too large. The error +// message describes how big the policy document is, in packed form, as a percentage +// of what the API allows. +// +// * ErrCodeRegionDisabledException "RegionDisabledException" +// STS is not activated in the requested region for the account that is being +// asked to generate credentials. The account administrator must use the IAM +// console to activate STS in that region. For more information, see Activating +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken +func (c *STS) GetFederationToken(input *GetFederationTokenInput) (*GetFederationTokenOutput, error) { + req, out := c.GetFederationTokenRequest(input) + return out, req.Send() +} + +// GetFederationTokenWithContext is the same as GetFederationToken with the addition of +// the ability to pass a context and additional request options. +// +// See GetFederationToken for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) GetFederationTokenWithContext(ctx aws.Context, input *GetFederationTokenInput, opts ...request.Option) (*GetFederationTokenOutput, error) { + req, out := c.GetFederationTokenRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +const opGetSessionToken = "GetSessionToken" + +// GetSessionTokenRequest generates a "aws/request.Request" representing the +// client's request for the GetSessionToken operation. The "output" return +// value will be populated with the request's response once the request completes +// successfully. +// +// Use "Send" method on the returned Request to send the API call to the service. +// the "output" return value is not valid until after Send returns without error. +// +// See GetSessionToken for more information on using the GetSessionToken +// API call, and error handling. +// +// This method is useful when you want to inject custom logic or configuration +// into the SDK's request lifecycle. Such as custom headers, or retry logic. +// +// +// // Example sending a request using the GetSessionTokenRequest method. +// req, resp := client.GetSessionTokenRequest(params) +// +// err := req.Send() +// if err == nil { // resp is now filled +// fmt.Println(resp) +// } +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken +func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.Request, output *GetSessionTokenOutput) { + op := &request.Operation{ + Name: opGetSessionToken, + HTTPMethod: "POST", + HTTPPath: "/", + } + + if input == nil { + input = &GetSessionTokenInput{} + } + + output = &GetSessionTokenOutput{} + req = c.newRequest(op, input, output) + return +} + +// GetSessionToken API operation for AWS Security Token Service. +// +// Returns a set of temporary credentials for an AWS account or IAM user. The +// credentials consist of an access key ID, a secret access key, and a security +// token. Typically, you use GetSessionToken if you want to use MFA to protect +// programmatic calls to specific AWS API operations like Amazon EC2 StopInstances. +// MFA-enabled IAM users would need to call GetSessionToken and submit an MFA +// code that is associated with their MFA device. Using the temporary security +// credentials that are returned from the call, IAM users can then make programmatic +// calls to API operations that require MFA authentication. If you do not supply +// a correct MFA code, then the API returns an access denied error. For a comparison +// of GetSessionToken with the other API operations that produce temporary credentials, +// see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) +// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) +// in the IAM User Guide. +// +// The GetSessionToken operation must be called by using the long-term AWS security +// credentials of the AWS account root user or an IAM user. Credentials that +// are created by IAM users are valid for the duration that you specify. This +// duration can range from 900 seconds (15 minutes) up to a maximum of 129,600 +// seconds (36 hours), with a default of 43,200 seconds (12 hours). Credentials +// based on account credentials can range from 900 seconds (15 minutes) up to +// 3,600 seconds (1 hour), with a default of 1 hour. +// +// The temporary security credentials created by GetSessionToken can be used +// to make API calls to any AWS service with the following exceptions: +// +// * You cannot call any IAM API operations unless MFA authentication information +// is included in the request. +// +// * You cannot call any STS API except AssumeRole or GetCallerIdentity. +// +// We recommend that you do not call GetSessionToken with AWS account root user +// credentials. Instead, follow our best practices (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#create-iam-users) +// by creating one or more IAM users, giving them the necessary permissions, +// and using IAM users for everyday interaction with AWS. +// +// The credentials that are returned by GetSessionToken are based on permissions +// associated with the user whose credentials were used to call the operation. +// If GetSessionToken is called using AWS account root user credentials, the +// temporary credentials have root user permissions. Similarly, if GetSessionToken +// is called using the credentials of an IAM user, the temporary credentials +// have the same permissions as the IAM user. +// +// For more information about using GetSessionToken to create temporary credentials, +// go to Temporary Credentials for Users in Untrusted Environments (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken) +// in the IAM User Guide. +// +// Returns awserr.Error for service API and SDK errors. Use runtime type assertions +// with awserr.Error's Code and Message methods to get detailed information about +// the error. +// +// See the AWS API reference guide for AWS Security Token Service's +// API operation GetSessionToken for usage and error information. +// +// Returned Error Codes: +// * ErrCodeRegionDisabledException "RegionDisabledException" +// STS is not activated in the requested region for the account that is being +// asked to generate credentials. The account administrator must use the IAM +// console to activate STS in that region. For more information, see Activating +// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken +func (c *STS) GetSessionToken(input *GetSessionTokenInput) (*GetSessionTokenOutput, error) { + req, out := c.GetSessionTokenRequest(input) + return out, req.Send() +} + +// GetSessionTokenWithContext is the same as GetSessionToken with the addition of +// the ability to pass a context and additional request options. +// +// See GetSessionToken for details on how to use this API operation. +// +// The context must be non-nil and will be used for request cancellation. If +// the context is nil a panic will occur. In the future the SDK may create +// sub-contexts for http.Requests. See https://golang.org/pkg/context/ +// for more information on using Contexts. +func (c *STS) GetSessionTokenWithContext(ctx aws.Context, input *GetSessionTokenInput, opts ...request.Option) (*GetSessionTokenOutput, error) { + req, out := c.GetSessionTokenRequest(input) + req.SetContext(ctx) + req.ApplyOptions(opts...) + return out, req.Send() +} + +type AssumeRoleInput struct { + _ struct{} `type:"structure"` + + // The duration, in seconds, of the role session. The value can range from 900 + // seconds (15 minutes) up to the maximum session duration setting for the role. + // This setting can have a value from 1 hour to 12 hours. If you specify a value + // higher than this setting, the operation fails. For example, if you specify + // a session duration of 12 hours, but your administrator set the maximum session + // duration to 6 hours, your operation fails. To learn how to view the maximum + // value for your role, see View the Maximum Session Duration Setting for a + // Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // in the IAM User Guide. + // + // By default, the value is set to 3600 seconds. + // + // The DurationSeconds parameter is separate from the duration of a console + // session that you might request using the returned credentials. The request + // to the federation endpoint for a console sign-in token takes a SessionDuration + // parameter that specifies the maximum length of the console session. For more + // information, see Creating a URL that Enables Federated Users to Access the + // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // in the IAM User Guide. + DurationSeconds *int64 `min:"900" type:"integer"` + + // A unique identifier that might be required when you assume a role in another + // account. If the administrator of the account to which the role belongs provided + // you with an external ID, then provide that value in the ExternalId parameter. + // This value can be any string, such as a passphrase or account number. A cross-account + // role is usually set up to trust everyone in an account. Therefore, the administrator + // of the trusting account might send an external ID to the administrator of + // the trusted account. That way, only someone with the ID can assume the role, + // rather than everyone in the account. For more information about the external + // ID, see How to Use an External ID When Granting Access to Your AWS Resources + // to a Third Party (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) + // in the IAM User Guide. + // + // The regex used to validate this parameter is a string of characters consisting + // of upper- and lower-case alphanumeric characters with no spaces. You can + // also include underscores or any of the following characters: =,.@:/- + ExternalId *string `min:"2" type:"string"` + + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // This parameter is optional. Passing policies to this operation returns new + // temporary credentials. The resulting session's permissions are the intersection + // of the role's identity-based policy and the session policies. You can use + // the role's temporary credentials in subsequent AWS API calls to access resources + // in the account that owns the role. You cannot use session policies to grant + // more permissions than those allowed by the identity-based policy of the role + // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The plain text that you use for both inline and managed session policies + // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // and carriage return (\u000D) characters. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + Policy *string `min:"1" type:"string"` + + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as managed session policies. The policies must exist in the same account + // as the role. + // + // This parameter is optional. You can provide up to 10 managed policy ARNs. + // However, the plain text that you use for both inline and managed session + // policies shouldn't exceed 2048 characters. For more information about ARNs, + // see Amazon Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + // + // Passing policies to this operation returns new temporary credentials. The + // resulting session's permissions are the intersection of the role's identity-based + // policy and the session policies. You can use the role's temporary credentials + // in subsequent AWS API calls to access resources in the account that owns + // the role. You cannot use session policies to grant more permissions than + // those allowed by the identity-based policy of the role that is being assumed. + // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + PolicyArns []*PolicyDescriptorType `type:"list"` + + // The Amazon Resource Name (ARN) of the role to assume. + // + // RoleArn is a required field + RoleArn *string `min:"20" type:"string" required:"true"` + + // An identifier for the assumed role session. + // + // Use the role session name to uniquely identify a session when the same role + // is assumed by different principals or for different reasons. In cross-account + // scenarios, the role session name is visible to, and can be logged by the + // account that owns the role. The role session name is also used in the ARN + // of the assumed role principal. This means that subsequent cross-account API + // requests that use the temporary security credentials will expose the role + // session name to the external account in their AWS CloudTrail logs. + // + // The regex used to validate this parameter is a string of characters consisting + // of upper- and lower-case alphanumeric characters with no spaces. You can + // also include underscores or any of the following characters: =,.@- + // + // RoleSessionName is a required field + RoleSessionName *string `min:"2" type:"string" required:"true"` + + // The identification number of the MFA device that is associated with the user + // who is making the AssumeRole call. Specify this value if the trust policy + // of the role being assumed includes a condition that requires MFA authentication. + // The value is either the serial number for a hardware device (such as GAHT12345678) + // or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). + // + // The regex used to validate this parameter is a string of characters consisting + // of upper- and lower-case alphanumeric characters with no spaces. You can + // also include underscores or any of the following characters: =,.@- + SerialNumber *string `min:"9" type:"string"` + + // The value provided by the MFA device, if the trust policy of the role being + // assumed requires MFA (that is, if the policy includes a condition that tests + // for MFA). If the role being assumed requires MFA and if the TokenCode value + // is missing or expired, the AssumeRole call returns an "access denied" error. + // + // The format for this parameter, as described by its regex pattern, is a sequence + // of six numeric digits. + TokenCode *string `min:"6" type:"string"` +} + +// String returns the string representation +func (s AssumeRoleInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumeRoleInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *AssumeRoleInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "AssumeRoleInput"} + if s.DurationSeconds != nil && *s.DurationSeconds < 900 { + invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) + } + if s.ExternalId != nil && len(*s.ExternalId) < 2 { + invalidParams.Add(request.NewErrParamMinLen("ExternalId", 2)) + } + if s.Policy != nil && len(*s.Policy) < 1 { + invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) + } + if s.RoleArn == nil { + invalidParams.Add(request.NewErrParamRequired("RoleArn")) + } + if s.RoleArn != nil && len(*s.RoleArn) < 20 { + invalidParams.Add(request.NewErrParamMinLen("RoleArn", 20)) + } + if s.RoleSessionName == nil { + invalidParams.Add(request.NewErrParamRequired("RoleSessionName")) + } + if s.RoleSessionName != nil && len(*s.RoleSessionName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RoleSessionName", 2)) + } + if s.SerialNumber != nil && len(*s.SerialNumber) < 9 { + invalidParams.Add(request.NewErrParamMinLen("SerialNumber", 9)) + } + if s.TokenCode != nil && len(*s.TokenCode) < 6 { + invalidParams.Add(request.NewErrParamMinLen("TokenCode", 6)) + } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDurationSeconds sets the DurationSeconds field's value. +func (s *AssumeRoleInput) SetDurationSeconds(v int64) *AssumeRoleInput { + s.DurationSeconds = &v + return s +} + +// SetExternalId sets the ExternalId field's value. +func (s *AssumeRoleInput) SetExternalId(v string) *AssumeRoleInput { + s.ExternalId = &v + return s +} + +// SetPolicy sets the Policy field's value. +func (s *AssumeRoleInput) SetPolicy(v string) *AssumeRoleInput { + s.Policy = &v + return s +} + +// SetPolicyArns sets the PolicyArns field's value. +func (s *AssumeRoleInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleInput { + s.PolicyArns = v + return s +} + +// SetRoleArn sets the RoleArn field's value. +func (s *AssumeRoleInput) SetRoleArn(v string) *AssumeRoleInput { + s.RoleArn = &v + return s +} + +// SetRoleSessionName sets the RoleSessionName field's value. +func (s *AssumeRoleInput) SetRoleSessionName(v string) *AssumeRoleInput { + s.RoleSessionName = &v + return s +} + +// SetSerialNumber sets the SerialNumber field's value. +func (s *AssumeRoleInput) SetSerialNumber(v string) *AssumeRoleInput { + s.SerialNumber = &v + return s +} + +// SetTokenCode sets the TokenCode field's value. +func (s *AssumeRoleInput) SetTokenCode(v string) *AssumeRoleInput { + s.TokenCode = &v + return s +} + +// Contains the response to a successful AssumeRole request, including temporary +// AWS credentials that can be used to make AWS requests. +type AssumeRoleOutput struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) and the assumed role ID, which are identifiers + // that you can use to refer to the resulting temporary security credentials. + // For example, you can reference these credentials as a principal in a resource-based + // policy by using the ARN or assumed role ID. The ARN and ID include the RoleSessionName + // that you specified when you called AssumeRole. + AssumedRoleUser *AssumedRoleUser `type:"structure"` + + // The temporary security credentials, which include an access key ID, a secret + // access key, and a security (or session) token. + // + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. + Credentials *Credentials `type:"structure"` + + // A percentage value that indicates the size of the policy in packed form. + // The service rejects any policy with a packed size greater than 100 percent, + // which means the policy exceeded the allowed space. + PackedPolicySize *int64 `type:"integer"` +} + +// String returns the string representation +func (s AssumeRoleOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumeRoleOutput) GoString() string { + return s.String() +} + +// SetAssumedRoleUser sets the AssumedRoleUser field's value. +func (s *AssumeRoleOutput) SetAssumedRoleUser(v *AssumedRoleUser) *AssumeRoleOutput { + s.AssumedRoleUser = v + return s +} + +// SetCredentials sets the Credentials field's value. +func (s *AssumeRoleOutput) SetCredentials(v *Credentials) *AssumeRoleOutput { + s.Credentials = v + return s +} + +// SetPackedPolicySize sets the PackedPolicySize field's value. +func (s *AssumeRoleOutput) SetPackedPolicySize(v int64) *AssumeRoleOutput { + s.PackedPolicySize = &v + return s +} + +type AssumeRoleWithSAMLInput struct { + _ struct{} `type:"structure"` + + // The duration, in seconds, of the role session. Your role session lasts for + // the duration that you specify for the DurationSeconds parameter, or until + // the time specified in the SAML authentication response's SessionNotOnOrAfter + // value, whichever is shorter. You can provide a DurationSeconds value from + // 900 seconds (15 minutes) up to the maximum session duration setting for the + // role. This setting can have a value from 1 hour to 12 hours. If you specify + // a value higher than this setting, the operation fails. For example, if you + // specify a session duration of 12 hours, but your administrator set the maximum + // session duration to 6 hours, your operation fails. To learn how to view the + // maximum value for your role, see View the Maximum Session Duration Setting + // for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // in the IAM User Guide. + // + // By default, the value is set to 3600 seconds. + // + // The DurationSeconds parameter is separate from the duration of a console + // session that you might request using the returned credentials. The request + // to the federation endpoint for a console sign-in token takes a SessionDuration + // parameter that specifies the maximum length of the console session. For more + // information, see Creating a URL that Enables Federated Users to Access the + // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // in the IAM User Guide. + DurationSeconds *int64 `min:"900" type:"integer"` + + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // This parameter is optional. Passing policies to this operation returns new + // temporary credentials. The resulting session's permissions are the intersection + // of the role's identity-based policy and the session policies. You can use + // the role's temporary credentials in subsequent AWS API calls to access resources + // in the account that owns the role. You cannot use session policies to grant + // more permissions than those allowed by the identity-based policy of the role + // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The plain text that you use for both inline and managed session policies + // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // and carriage return (\u000D) characters. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + Policy *string `min:"1" type:"string"` + + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as managed session policies. The policies must exist in the same account + // as the role. + // + // This parameter is optional. You can provide up to 10 managed policy ARNs. + // However, the plain text that you use for both inline and managed session + // policies shouldn't exceed 2048 characters. For more information about ARNs, + // see Amazon Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + // + // Passing policies to this operation returns new temporary credentials. The + // resulting session's permissions are the intersection of the role's identity-based + // policy and the session policies. You can use the role's temporary credentials + // in subsequent AWS API calls to access resources in the account that owns + // the role. You cannot use session policies to grant more permissions than + // those allowed by the identity-based policy of the role that is being assumed. + // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + PolicyArns []*PolicyDescriptorType `type:"list"` + + // The Amazon Resource Name (ARN) of the SAML provider in IAM that describes + // the IdP. + // + // PrincipalArn is a required field + PrincipalArn *string `min:"20" type:"string" required:"true"` + + // The Amazon Resource Name (ARN) of the role that the caller is assuming. + // + // RoleArn is a required field + RoleArn *string `min:"20" type:"string" required:"true"` + + // The base-64 encoded SAML authentication response provided by the IdP. + // + // For more information, see Configuring a Relying Party and Adding Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html) + // in the IAM User Guide. + // + // SAMLAssertion is a required field + SAMLAssertion *string `min:"4" type:"string" required:"true"` +} + +// String returns the string representation +func (s AssumeRoleWithSAMLInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumeRoleWithSAMLInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *AssumeRoleWithSAMLInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "AssumeRoleWithSAMLInput"} + if s.DurationSeconds != nil && *s.DurationSeconds < 900 { + invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) + } + if s.Policy != nil && len(*s.Policy) < 1 { + invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) + } + if s.PrincipalArn == nil { + invalidParams.Add(request.NewErrParamRequired("PrincipalArn")) + } + if s.PrincipalArn != nil && len(*s.PrincipalArn) < 20 { + invalidParams.Add(request.NewErrParamMinLen("PrincipalArn", 20)) + } + if s.RoleArn == nil { + invalidParams.Add(request.NewErrParamRequired("RoleArn")) + } + if s.RoleArn != nil && len(*s.RoleArn) < 20 { + invalidParams.Add(request.NewErrParamMinLen("RoleArn", 20)) + } + if s.SAMLAssertion == nil { + invalidParams.Add(request.NewErrParamRequired("SAMLAssertion")) + } + if s.SAMLAssertion != nil && len(*s.SAMLAssertion) < 4 { + invalidParams.Add(request.NewErrParamMinLen("SAMLAssertion", 4)) + } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDurationSeconds sets the DurationSeconds field's value. +func (s *AssumeRoleWithSAMLInput) SetDurationSeconds(v int64) *AssumeRoleWithSAMLInput { + s.DurationSeconds = &v + return s +} + +// SetPolicy sets the Policy field's value. +func (s *AssumeRoleWithSAMLInput) SetPolicy(v string) *AssumeRoleWithSAMLInput { + s.Policy = &v + return s +} + +// SetPolicyArns sets the PolicyArns field's value. +func (s *AssumeRoleWithSAMLInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleWithSAMLInput { + s.PolicyArns = v + return s +} + +// SetPrincipalArn sets the PrincipalArn field's value. +func (s *AssumeRoleWithSAMLInput) SetPrincipalArn(v string) *AssumeRoleWithSAMLInput { + s.PrincipalArn = &v + return s +} + +// SetRoleArn sets the RoleArn field's value. +func (s *AssumeRoleWithSAMLInput) SetRoleArn(v string) *AssumeRoleWithSAMLInput { + s.RoleArn = &v + return s +} + +// SetSAMLAssertion sets the SAMLAssertion field's value. +func (s *AssumeRoleWithSAMLInput) SetSAMLAssertion(v string) *AssumeRoleWithSAMLInput { + s.SAMLAssertion = &v + return s +} + +// Contains the response to a successful AssumeRoleWithSAML request, including +// temporary AWS credentials that can be used to make AWS requests. +type AssumeRoleWithSAMLOutput struct { + _ struct{} `type:"structure"` + + // The identifiers for the temporary security credentials that the operation + // returns. + AssumedRoleUser *AssumedRoleUser `type:"structure"` + + // The value of the Recipient attribute of the SubjectConfirmationData element + // of the SAML assertion. + Audience *string `type:"string"` + + // The temporary security credentials, which include an access key ID, a secret + // access key, and a security (or session) token. + // + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. + Credentials *Credentials `type:"structure"` + + // The value of the Issuer element of the SAML assertion. + Issuer *string `type:"string"` + + // A hash value based on the concatenation of the Issuer response value, the + // AWS account ID, and the friendly name (the last part of the ARN) of the SAML + // provider in IAM. The combination of NameQualifier and Subject can be used + // to uniquely identify a federated user. + // + // The following pseudocode shows how the hash value is calculated: + // + // BASE64 ( SHA1 ( "https://example.com/saml" + "123456789012" + "/MySAMLIdP" + // ) ) + NameQualifier *string `type:"string"` + + // A percentage value that indicates the size of the policy in packed form. + // The service rejects any policy with a packed size greater than 100 percent, + // which means the policy exceeded the allowed space. + PackedPolicySize *int64 `type:"integer"` + + // The value of the NameID element in the Subject element of the SAML assertion. + Subject *string `type:"string"` + + // The format of the name ID, as defined by the Format attribute in the NameID + // element of the SAML assertion. Typical examples of the format are transient + // or persistent. + // + // If the format includes the prefix urn:oasis:names:tc:SAML:2.0:nameid-format, + // that prefix is removed. For example, urn:oasis:names:tc:SAML:2.0:nameid-format:transient + // is returned as transient. If the format includes any other prefix, the format + // is returned with no modifications. + SubjectType *string `type:"string"` +} + +// String returns the string representation +func (s AssumeRoleWithSAMLOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumeRoleWithSAMLOutput) GoString() string { + return s.String() +} + +// SetAssumedRoleUser sets the AssumedRoleUser field's value. +func (s *AssumeRoleWithSAMLOutput) SetAssumedRoleUser(v *AssumedRoleUser) *AssumeRoleWithSAMLOutput { + s.AssumedRoleUser = v + return s +} + +// SetAudience sets the Audience field's value. +func (s *AssumeRoleWithSAMLOutput) SetAudience(v string) *AssumeRoleWithSAMLOutput { + s.Audience = &v + return s +} + +// SetCredentials sets the Credentials field's value. +func (s *AssumeRoleWithSAMLOutput) SetCredentials(v *Credentials) *AssumeRoleWithSAMLOutput { + s.Credentials = v + return s +} + +// SetIssuer sets the Issuer field's value. +func (s *AssumeRoleWithSAMLOutput) SetIssuer(v string) *AssumeRoleWithSAMLOutput { + s.Issuer = &v + return s +} + +// SetNameQualifier sets the NameQualifier field's value. +func (s *AssumeRoleWithSAMLOutput) SetNameQualifier(v string) *AssumeRoleWithSAMLOutput { + s.NameQualifier = &v + return s +} + +// SetPackedPolicySize sets the PackedPolicySize field's value. +func (s *AssumeRoleWithSAMLOutput) SetPackedPolicySize(v int64) *AssumeRoleWithSAMLOutput { + s.PackedPolicySize = &v + return s +} + +// SetSubject sets the Subject field's value. +func (s *AssumeRoleWithSAMLOutput) SetSubject(v string) *AssumeRoleWithSAMLOutput { + s.Subject = &v + return s +} + +// SetSubjectType sets the SubjectType field's value. +func (s *AssumeRoleWithSAMLOutput) SetSubjectType(v string) *AssumeRoleWithSAMLOutput { + s.SubjectType = &v + return s +} + +type AssumeRoleWithWebIdentityInput struct { + _ struct{} `type:"structure"` + + // The duration, in seconds, of the role session. The value can range from 900 + // seconds (15 minutes) up to the maximum session duration setting for the role. + // This setting can have a value from 1 hour to 12 hours. If you specify a value + // higher than this setting, the operation fails. For example, if you specify + // a session duration of 12 hours, but your administrator set the maximum session + // duration to 6 hours, your operation fails. To learn how to view the maximum + // value for your role, see View the Maximum Session Duration Setting for a + // Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) + // in the IAM User Guide. + // + // By default, the value is set to 3600 seconds. + // + // The DurationSeconds parameter is separate from the duration of a console + // session that you might request using the returned credentials. The request + // to the federation endpoint for a console sign-in token takes a SessionDuration + // parameter that specifies the maximum length of the console session. For more + // information, see Creating a URL that Enables Federated Users to Access the + // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) + // in the IAM User Guide. + DurationSeconds *int64 `min:"900" type:"integer"` + + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // This parameter is optional. Passing policies to this operation returns new + // temporary credentials. The resulting session's permissions are the intersection + // of the role's identity-based policy and the session policies. You can use + // the role's temporary credentials in subsequent AWS API calls to access resources + // in the account that owns the role. You cannot use session policies to grant + // more permissions than those allowed by the identity-based policy of the role + // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The plain text that you use for both inline and managed session policies + // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // and carriage return (\u000D) characters. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + Policy *string `min:"1" type:"string"` + + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as managed session policies. The policies must exist in the same account + // as the role. + // + // This parameter is optional. You can provide up to 10 managed policy ARNs. + // However, the plain text that you use for both inline and managed session + // policies shouldn't exceed 2048 characters. For more information about ARNs, + // see Amazon Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + // + // Passing policies to this operation returns new temporary credentials. The + // resulting session's permissions are the intersection of the role's identity-based + // policy and the session policies. You can use the role's temporary credentials + // in subsequent AWS API calls to access resources in the account that owns + // the role. You cannot use session policies to grant more permissions than + // those allowed by the identity-based policy of the role that is being assumed. + // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + PolicyArns []*PolicyDescriptorType `type:"list"` + + // The fully qualified host component of the domain name of the identity provider. + // + // Specify this value only for OAuth 2.0 access tokens. Currently www.amazon.com + // and graph.facebook.com are the only supported identity providers for OAuth + // 2.0 access tokens. Do not include URL schemes and port numbers. + // + // Do not specify this value for OpenID Connect ID tokens. + ProviderId *string `min:"4" type:"string"` + + // The Amazon Resource Name (ARN) of the role that the caller is assuming. + // + // RoleArn is a required field + RoleArn *string `min:"20" type:"string" required:"true"` + + // An identifier for the assumed role session. Typically, you pass the name + // or identifier that is associated with the user who is using your application. + // That way, the temporary security credentials that your application will use + // are associated with that user. This session name is included as part of the + // ARN and assumed role ID in the AssumedRoleUser response element. + // + // The regex used to validate this parameter is a string of characters consisting + // of upper- and lower-case alphanumeric characters with no spaces. You can + // also include underscores or any of the following characters: =,.@- + // + // RoleSessionName is a required field + RoleSessionName *string `min:"2" type:"string" required:"true"` + + // The OAuth 2.0 access token or OpenID Connect ID token that is provided by + // the identity provider. Your application must get this token by authenticating + // the user who is using your application with a web identity provider before + // the application makes an AssumeRoleWithWebIdentity call. + // + // WebIdentityToken is a required field + WebIdentityToken *string `min:"4" type:"string" required:"true"` +} + +// String returns the string representation +func (s AssumeRoleWithWebIdentityInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumeRoleWithWebIdentityInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *AssumeRoleWithWebIdentityInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "AssumeRoleWithWebIdentityInput"} + if s.DurationSeconds != nil && *s.DurationSeconds < 900 { + invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) + } + if s.Policy != nil && len(*s.Policy) < 1 { + invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) + } + if s.ProviderId != nil && len(*s.ProviderId) < 4 { + invalidParams.Add(request.NewErrParamMinLen("ProviderId", 4)) + } + if s.RoleArn == nil { + invalidParams.Add(request.NewErrParamRequired("RoleArn")) + } + if s.RoleArn != nil && len(*s.RoleArn) < 20 { + invalidParams.Add(request.NewErrParamMinLen("RoleArn", 20)) + } + if s.RoleSessionName == nil { + invalidParams.Add(request.NewErrParamRequired("RoleSessionName")) + } + if s.RoleSessionName != nil && len(*s.RoleSessionName) < 2 { + invalidParams.Add(request.NewErrParamMinLen("RoleSessionName", 2)) + } + if s.WebIdentityToken == nil { + invalidParams.Add(request.NewErrParamRequired("WebIdentityToken")) + } + if s.WebIdentityToken != nil && len(*s.WebIdentityToken) < 4 { + invalidParams.Add(request.NewErrParamMinLen("WebIdentityToken", 4)) + } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDurationSeconds sets the DurationSeconds field's value. +func (s *AssumeRoleWithWebIdentityInput) SetDurationSeconds(v int64) *AssumeRoleWithWebIdentityInput { + s.DurationSeconds = &v + return s +} + +// SetPolicy sets the Policy field's value. +func (s *AssumeRoleWithWebIdentityInput) SetPolicy(v string) *AssumeRoleWithWebIdentityInput { + s.Policy = &v + return s +} + +// SetPolicyArns sets the PolicyArns field's value. +func (s *AssumeRoleWithWebIdentityInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleWithWebIdentityInput { + s.PolicyArns = v + return s +} + +// SetProviderId sets the ProviderId field's value. +func (s *AssumeRoleWithWebIdentityInput) SetProviderId(v string) *AssumeRoleWithWebIdentityInput { + s.ProviderId = &v + return s +} + +// SetRoleArn sets the RoleArn field's value. +func (s *AssumeRoleWithWebIdentityInput) SetRoleArn(v string) *AssumeRoleWithWebIdentityInput { + s.RoleArn = &v + return s +} + +// SetRoleSessionName sets the RoleSessionName field's value. +func (s *AssumeRoleWithWebIdentityInput) SetRoleSessionName(v string) *AssumeRoleWithWebIdentityInput { + s.RoleSessionName = &v + return s +} + +// SetWebIdentityToken sets the WebIdentityToken field's value. +func (s *AssumeRoleWithWebIdentityInput) SetWebIdentityToken(v string) *AssumeRoleWithWebIdentityInput { + s.WebIdentityToken = &v + return s +} + +// Contains the response to a successful AssumeRoleWithWebIdentity request, +// including temporary AWS credentials that can be used to make AWS requests. +type AssumeRoleWithWebIdentityOutput struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) and the assumed role ID, which are identifiers + // that you can use to refer to the resulting temporary security credentials. + // For example, you can reference these credentials as a principal in a resource-based + // policy by using the ARN or assumed role ID. The ARN and ID include the RoleSessionName + // that you specified when you called AssumeRole. + AssumedRoleUser *AssumedRoleUser `type:"structure"` + + // The intended audience (also known as client ID) of the web identity token. + // This is traditionally the client identifier issued to the application that + // requested the web identity token. + Audience *string `type:"string"` + + // The temporary security credentials, which include an access key ID, a secret + // access key, and a security token. + // + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. + Credentials *Credentials `type:"structure"` + + // A percentage value that indicates the size of the policy in packed form. + // The service rejects any policy with a packed size greater than 100 percent, + // which means the policy exceeded the allowed space. + PackedPolicySize *int64 `type:"integer"` + + // The issuing authority of the web identity token presented. For OpenID Connect + // ID tokens, this contains the value of the iss field. For OAuth 2.0 access + // tokens, this contains the value of the ProviderId parameter that was passed + // in the AssumeRoleWithWebIdentity request. + Provider *string `type:"string"` + + // The unique user identifier that is returned by the identity provider. This + // identifier is associated with the WebIdentityToken that was submitted with + // the AssumeRoleWithWebIdentity call. The identifier is typically unique to + // the user and the application that acquired the WebIdentityToken (pairwise + // identifier). For OpenID Connect ID tokens, this field contains the value + // returned by the identity provider as the token's sub (Subject) claim. + SubjectFromWebIdentityToken *string `min:"6" type:"string"` +} + +// String returns the string representation +func (s AssumeRoleWithWebIdentityOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumeRoleWithWebIdentityOutput) GoString() string { + return s.String() +} + +// SetAssumedRoleUser sets the AssumedRoleUser field's value. +func (s *AssumeRoleWithWebIdentityOutput) SetAssumedRoleUser(v *AssumedRoleUser) *AssumeRoleWithWebIdentityOutput { + s.AssumedRoleUser = v + return s +} + +// SetAudience sets the Audience field's value. +func (s *AssumeRoleWithWebIdentityOutput) SetAudience(v string) *AssumeRoleWithWebIdentityOutput { + s.Audience = &v + return s +} + +// SetCredentials sets the Credentials field's value. +func (s *AssumeRoleWithWebIdentityOutput) SetCredentials(v *Credentials) *AssumeRoleWithWebIdentityOutput { + s.Credentials = v + return s +} + +// SetPackedPolicySize sets the PackedPolicySize field's value. +func (s *AssumeRoleWithWebIdentityOutput) SetPackedPolicySize(v int64) *AssumeRoleWithWebIdentityOutput { + s.PackedPolicySize = &v + return s +} + +// SetProvider sets the Provider field's value. +func (s *AssumeRoleWithWebIdentityOutput) SetProvider(v string) *AssumeRoleWithWebIdentityOutput { + s.Provider = &v + return s +} + +// SetSubjectFromWebIdentityToken sets the SubjectFromWebIdentityToken field's value. +func (s *AssumeRoleWithWebIdentityOutput) SetSubjectFromWebIdentityToken(v string) *AssumeRoleWithWebIdentityOutput { + s.SubjectFromWebIdentityToken = &v + return s +} + +// The identifiers for the temporary security credentials that the operation +// returns. +type AssumedRoleUser struct { + _ struct{} `type:"structure"` + + // The ARN of the temporary security credentials that are returned from the + // AssumeRole action. For more information about ARNs and how to use them in + // policies, see IAM Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) + // in Using IAM. + // + // Arn is a required field + Arn *string `min:"20" type:"string" required:"true"` + + // A unique identifier that contains the role ID and the role session name of + // the role that is being assumed. The role ID is generated by AWS when the + // role is created. + // + // AssumedRoleId is a required field + AssumedRoleId *string `min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s AssumedRoleUser) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s AssumedRoleUser) GoString() string { + return s.String() +} + +// SetArn sets the Arn field's value. +func (s *AssumedRoleUser) SetArn(v string) *AssumedRoleUser { + s.Arn = &v + return s +} + +// SetAssumedRoleId sets the AssumedRoleId field's value. +func (s *AssumedRoleUser) SetAssumedRoleId(v string) *AssumedRoleUser { + s.AssumedRoleId = &v + return s +} + +// AWS credentials for API authentication. +type Credentials struct { + _ struct{} `type:"structure"` + + // The access key ID that identifies the temporary security credentials. + // + // AccessKeyId is a required field + AccessKeyId *string `min:"16" type:"string" required:"true"` + + // The date on which the current credentials expire. + // + // Expiration is a required field + Expiration *time.Time `type:"timestamp" required:"true"` + + // The secret access key that can be used to sign requests. + // + // SecretAccessKey is a required field + SecretAccessKey *string `type:"string" required:"true"` + + // The token that users must pass to the service API to use the temporary credentials. + // + // SessionToken is a required field + SessionToken *string `type:"string" required:"true"` +} + +// String returns the string representation +func (s Credentials) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s Credentials) GoString() string { + return s.String() +} + +// SetAccessKeyId sets the AccessKeyId field's value. +func (s *Credentials) SetAccessKeyId(v string) *Credentials { + s.AccessKeyId = &v + return s +} + +// SetExpiration sets the Expiration field's value. +func (s *Credentials) SetExpiration(v time.Time) *Credentials { + s.Expiration = &v + return s +} + +// SetSecretAccessKey sets the SecretAccessKey field's value. +func (s *Credentials) SetSecretAccessKey(v string) *Credentials { + s.SecretAccessKey = &v + return s +} + +// SetSessionToken sets the SessionToken field's value. +func (s *Credentials) SetSessionToken(v string) *Credentials { + s.SessionToken = &v + return s +} + +type DecodeAuthorizationMessageInput struct { + _ struct{} `type:"structure"` + + // The encoded message that was returned with the response. + // + // EncodedMessage is a required field + EncodedMessage *string `min:"1" type:"string" required:"true"` +} + +// String returns the string representation +func (s DecodeAuthorizationMessageInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s DecodeAuthorizationMessageInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *DecodeAuthorizationMessageInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "DecodeAuthorizationMessageInput"} + if s.EncodedMessage == nil { + invalidParams.Add(request.NewErrParamRequired("EncodedMessage")) + } + if s.EncodedMessage != nil && len(*s.EncodedMessage) < 1 { + invalidParams.Add(request.NewErrParamMinLen("EncodedMessage", 1)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetEncodedMessage sets the EncodedMessage field's value. +func (s *DecodeAuthorizationMessageInput) SetEncodedMessage(v string) *DecodeAuthorizationMessageInput { + s.EncodedMessage = &v + return s +} + +// A document that contains additional information about the authorization status +// of a request from an encoded message that is returned in response to an AWS +// request. +type DecodeAuthorizationMessageOutput struct { + _ struct{} `type:"structure"` + + // An XML document that contains the decoded message. + DecodedMessage *string `type:"string"` +} + +// String returns the string representation +func (s DecodeAuthorizationMessageOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s DecodeAuthorizationMessageOutput) GoString() string { + return s.String() +} + +// SetDecodedMessage sets the DecodedMessage field's value. +func (s *DecodeAuthorizationMessageOutput) SetDecodedMessage(v string) *DecodeAuthorizationMessageOutput { + s.DecodedMessage = &v + return s +} + +// Identifiers for the federated user that is associated with the credentials. +type FederatedUser struct { + _ struct{} `type:"structure"` + + // The ARN that specifies the federated user that is associated with the credentials. + // For more information about ARNs and how to use them in policies, see IAM + // Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) + // in Using IAM. + // + // Arn is a required field + Arn *string `min:"20" type:"string" required:"true"` + + // The string that identifies the federated user associated with the credentials, + // similar to the unique ID of an IAM user. + // + // FederatedUserId is a required field + FederatedUserId *string `min:"2" type:"string" required:"true"` +} + +// String returns the string representation +func (s FederatedUser) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s FederatedUser) GoString() string { + return s.String() +} + +// SetArn sets the Arn field's value. +func (s *FederatedUser) SetArn(v string) *FederatedUser { + s.Arn = &v + return s +} + +// SetFederatedUserId sets the FederatedUserId field's value. +func (s *FederatedUser) SetFederatedUserId(v string) *FederatedUser { + s.FederatedUserId = &v + return s +} + +type GetCallerIdentityInput struct { + _ struct{} `type:"structure"` +} + +// String returns the string representation +func (s GetCallerIdentityInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetCallerIdentityInput) GoString() string { + return s.String() +} + +// Contains the response to a successful GetCallerIdentity request, including +// information about the entity making the request. +type GetCallerIdentityOutput struct { + _ struct{} `type:"structure"` + + // The AWS account ID number of the account that owns or contains the calling + // entity. + Account *string `type:"string"` + + // The AWS ARN associated with the calling entity. + Arn *string `min:"20" type:"string"` + + // The unique identifier of the calling entity. The exact value depends on the + // type of entity that is making the call. The values returned are those listed + // in the aws:userid column in the Principal table (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable) + // found on the Policy Variables reference page in the IAM User Guide. + UserId *string `type:"string"` +} + +// String returns the string representation +func (s GetCallerIdentityOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetCallerIdentityOutput) GoString() string { + return s.String() +} + +// SetAccount sets the Account field's value. +func (s *GetCallerIdentityOutput) SetAccount(v string) *GetCallerIdentityOutput { + s.Account = &v + return s +} + +// SetArn sets the Arn field's value. +func (s *GetCallerIdentityOutput) SetArn(v string) *GetCallerIdentityOutput { + s.Arn = &v + return s +} + +// SetUserId sets the UserId field's value. +func (s *GetCallerIdentityOutput) SetUserId(v string) *GetCallerIdentityOutput { + s.UserId = &v + return s +} + +type GetFederationTokenInput struct { + _ struct{} `type:"structure"` + + // The duration, in seconds, that the session should last. Acceptable durations + // for federation sessions range from 900 seconds (15 minutes) to 129,600 seconds + // (36 hours), with 43,200 seconds (12 hours) as the default. Sessions obtained + // using AWS account root user credentials are restricted to a maximum of 3,600 + // seconds (one hour). If the specified duration is longer than one hour, the + // session obtained by using root user credentials defaults to one hour. + DurationSeconds *int64 `min:"900" type:"integer"` + + // The name of the federated user. The name is used as an identifier for the + // temporary security credentials (such as Bob). For example, you can reference + // the federated user name in a resource-based policy, such as in an Amazon + // S3 bucket policy. + // + // The regex used to validate this parameter is a string of characters consisting + // of upper- and lower-case alphanumeric characters with no spaces. You can + // also include underscores or any of the following characters: =,.@- + // + // Name is a required field + Name *string `min:"2" type:"string" required:"true"` + + // An IAM policy in JSON format that you want to use as an inline session policy. + // + // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // to this operation. You can pass a single JSON policy document to use as an + // inline session policy. You can also specify up to 10 managed policies to + // use as managed session policies. + // + // This parameter is optional. However, if you do not pass any session policies, + // then the resulting federated user session has no permissions. The only exception + // is when the credentials are used to access a resource that has a resource-based + // policy that specifically references the federated user session in the Principal + // element of the policy. + // + // When you pass session policies, the session permissions are the intersection + // of the IAM user policies and the session policies that you pass. This gives + // you a way to further restrict the permissions for a federated user. You cannot + // use session policies to grant more permissions than those that are defined + // in the permissions policy of the IAM user. For more information, see Session + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The plain text that you use for both inline and managed session policies + // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII + // character from the space character to the end of the valid character list + // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), + // and carriage return (\u000D) characters. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + Policy *string `min:"1" type:"string"` + + // The Amazon Resource Names (ARNs) of the IAM managed policies that you want + // to use as a managed session policy. The policies must exist in the same account + // as the IAM user that is requesting federated access. + // + // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) + // to this operation. You can pass a single JSON policy document to use as an + // inline session policy. You can also specify up to 10 managed policies to + // use as managed session policies. The plain text that you use for both inline + // and managed session policies shouldn't exceed 2048 characters. You can provide + // up to 10 managed policy ARNs. For more information about ARNs, see Amazon + // Resource Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + // + // This parameter is optional. However, if you do not pass any session policies, + // then the resulting federated user session has no permissions. The only exception + // is when the credentials are used to access a resource that has a resource-based + // policy that specifically references the federated user session in the Principal + // element of the policy. + // + // When you pass session policies, the session permissions are the intersection + // of the IAM user policies and the session policies that you pass. This gives + // you a way to further restrict the permissions for a federated user. You cannot + // use session policies to grant more permissions than those that are defined + // in the permissions policy of the IAM user. For more information, see Session + // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM/latest/UserGuide/access_policies.html#policies_session) + // in the IAM User Guide. + // + // The characters in this parameter count towards the 2048 character session + // policy guideline. However, an AWS conversion compresses the session policies + // into a packed binary format that has a separate limit. This is the enforced + // limit. The PackedPolicySize response element indicates by percentage how + // close the policy is to the upper size limit. + PolicyArns []*PolicyDescriptorType `type:"list"` +} + +// String returns the string representation +func (s GetFederationTokenInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetFederationTokenInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *GetFederationTokenInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "GetFederationTokenInput"} + if s.DurationSeconds != nil && *s.DurationSeconds < 900 { + invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) + } + if s.Name == nil { + invalidParams.Add(request.NewErrParamRequired("Name")) + } + if s.Name != nil && len(*s.Name) < 2 { + invalidParams.Add(request.NewErrParamMinLen("Name", 2)) + } + if s.Policy != nil && len(*s.Policy) < 1 { + invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) + } + if s.PolicyArns != nil { + for i, v := range s.PolicyArns { + if v == nil { + continue + } + if err := v.Validate(); err != nil { + invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) + } + } + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDurationSeconds sets the DurationSeconds field's value. +func (s *GetFederationTokenInput) SetDurationSeconds(v int64) *GetFederationTokenInput { + s.DurationSeconds = &v + return s +} + +// SetName sets the Name field's value. +func (s *GetFederationTokenInput) SetName(v string) *GetFederationTokenInput { + s.Name = &v + return s +} + +// SetPolicy sets the Policy field's value. +func (s *GetFederationTokenInput) SetPolicy(v string) *GetFederationTokenInput { + s.Policy = &v + return s +} + +// SetPolicyArns sets the PolicyArns field's value. +func (s *GetFederationTokenInput) SetPolicyArns(v []*PolicyDescriptorType) *GetFederationTokenInput { + s.PolicyArns = v + return s +} + +// Contains the response to a successful GetFederationToken request, including +// temporary AWS credentials that can be used to make AWS requests. +type GetFederationTokenOutput struct { + _ struct{} `type:"structure"` + + // The temporary security credentials, which include an access key ID, a secret + // access key, and a security (or session) token. + // + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. + Credentials *Credentials `type:"structure"` + + // Identifiers for the federated user associated with the credentials (such + // as arn:aws:sts::123456789012:federated-user/Bob or 123456789012:Bob). You + // can use the federated user's ARN in your resource-based policies, such as + // an Amazon S3 bucket policy. + FederatedUser *FederatedUser `type:"structure"` + + // A percentage value indicating the size of the policy in packed form. The + // service rejects policies for which the packed size is greater than 100 percent + // of the allowed value. + PackedPolicySize *int64 `type:"integer"` +} + +// String returns the string representation +func (s GetFederationTokenOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetFederationTokenOutput) GoString() string { + return s.String() +} + +// SetCredentials sets the Credentials field's value. +func (s *GetFederationTokenOutput) SetCredentials(v *Credentials) *GetFederationTokenOutput { + s.Credentials = v + return s +} + +// SetFederatedUser sets the FederatedUser field's value. +func (s *GetFederationTokenOutput) SetFederatedUser(v *FederatedUser) *GetFederationTokenOutput { + s.FederatedUser = v + return s +} + +// SetPackedPolicySize sets the PackedPolicySize field's value. +func (s *GetFederationTokenOutput) SetPackedPolicySize(v int64) *GetFederationTokenOutput { + s.PackedPolicySize = &v + return s +} + +type GetSessionTokenInput struct { + _ struct{} `type:"structure"` + + // The duration, in seconds, that the credentials should remain valid. Acceptable + // durations for IAM user sessions range from 900 seconds (15 minutes) to 129,600 + // seconds (36 hours), with 43,200 seconds (12 hours) as the default. Sessions + // for AWS account owners are restricted to a maximum of 3,600 seconds (one + // hour). If the duration is longer than one hour, the session for AWS account + // owners defaults to one hour. + DurationSeconds *int64 `min:"900" type:"integer"` + + // The identification number of the MFA device that is associated with the IAM + // user who is making the GetSessionToken call. Specify this value if the IAM + // user has a policy that requires MFA authentication. The value is either the + // serial number for a hardware device (such as GAHT12345678) or an Amazon Resource + // Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). + // You can find the device for an IAM user by going to the AWS Management Console + // and viewing the user's security credentials. + // + // The regex used to validate this parameter is a string of characters consisting + // of upper- and lower-case alphanumeric characters with no spaces. You can + // also include underscores or any of the following characters: =,.@:/- + SerialNumber *string `min:"9" type:"string"` + + // The value provided by the MFA device, if MFA is required. If any policy requires + // the IAM user to submit an MFA code, specify this value. If MFA authentication + // is required, the user must provide a code when requesting a set of temporary + // security credentials. A user who fails to provide the code receives an "access + // denied" response when requesting resources that require MFA authentication. + // + // The format for this parameter, as described by its regex pattern, is a sequence + // of six numeric digits. + TokenCode *string `min:"6" type:"string"` +} + +// String returns the string representation +func (s GetSessionTokenInput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetSessionTokenInput) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *GetSessionTokenInput) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "GetSessionTokenInput"} + if s.DurationSeconds != nil && *s.DurationSeconds < 900 { + invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) + } + if s.SerialNumber != nil && len(*s.SerialNumber) < 9 { + invalidParams.Add(request.NewErrParamMinLen("SerialNumber", 9)) + } + if s.TokenCode != nil && len(*s.TokenCode) < 6 { + invalidParams.Add(request.NewErrParamMinLen("TokenCode", 6)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetDurationSeconds sets the DurationSeconds field's value. +func (s *GetSessionTokenInput) SetDurationSeconds(v int64) *GetSessionTokenInput { + s.DurationSeconds = &v + return s +} + +// SetSerialNumber sets the SerialNumber field's value. +func (s *GetSessionTokenInput) SetSerialNumber(v string) *GetSessionTokenInput { + s.SerialNumber = &v + return s +} + +// SetTokenCode sets the TokenCode field's value. +func (s *GetSessionTokenInput) SetTokenCode(v string) *GetSessionTokenInput { + s.TokenCode = &v + return s +} + +// Contains the response to a successful GetSessionToken request, including +// temporary AWS credentials that can be used to make AWS requests. +type GetSessionTokenOutput struct { + _ struct{} `type:"structure"` + + // The temporary security credentials, which include an access key ID, a secret + // access key, and a security (or session) token. + // + // The size of the security token that STS API operations return is not fixed. + // We strongly recommend that you make no assumptions about the maximum size. + Credentials *Credentials `type:"structure"` +} + +// String returns the string representation +func (s GetSessionTokenOutput) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s GetSessionTokenOutput) GoString() string { + return s.String() +} + +// SetCredentials sets the Credentials field's value. +func (s *GetSessionTokenOutput) SetCredentials(v *Credentials) *GetSessionTokenOutput { + s.Credentials = v + return s +} + +// A reference to the IAM managed policy that is passed as a session policy +// for a role session or a federated user session. +type PolicyDescriptorType struct { + _ struct{} `type:"structure"` + + // The Amazon Resource Name (ARN) of the IAM managed policy to use as a session + // policy for the role. For more information about ARNs, see Amazon Resource + // Names (ARNs) and AWS Service Namespaces (general/latest/gr/aws-arns-and-namespaces.html) + // in the AWS General Reference. + Arn *string `locationName:"arn" min:"20" type:"string"` +} + +// String returns the string representation +func (s PolicyDescriptorType) String() string { + return awsutil.Prettify(s) +} + +// GoString returns the string representation +func (s PolicyDescriptorType) GoString() string { + return s.String() +} + +// Validate inspects the fields of the type to determine if they are valid. +func (s *PolicyDescriptorType) Validate() error { + invalidParams := request.ErrInvalidParams{Context: "PolicyDescriptorType"} + if s.Arn != nil && len(*s.Arn) < 20 { + invalidParams.Add(request.NewErrParamMinLen("Arn", 20)) + } + + if invalidParams.Len() > 0 { + return invalidParams + } + return nil +} + +// SetArn sets the Arn field's value. +func (s *PolicyDescriptorType) SetArn(v string) *PolicyDescriptorType { + s.Arn = &v + return s +} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go b/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go new file mode 100644 index 000000000..fa7a4c667 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go @@ -0,0 +1,116 @@ +// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. + +// Package sts provides the client and types for making API +// requests to AWS Security Token Service. +// +// The AWS Security Token Service (STS) is a web service that enables you to +// request temporary, limited-privilege credentials for AWS Identity and Access +// Management (IAM) users or for users that you authenticate (federated users). +// This guide provides descriptions of the STS API. For more detailed information +// about using this service, go to Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html). +// +// As an alternative to using the API, you can use one of the AWS SDKs, which +// consist of libraries and sample code for various programming languages and +// platforms (Java, Ruby, .NET, iOS, Android, etc.). The SDKs provide a convenient +// way to create programmatic access to STS. For example, the SDKs take care +// of cryptographically signing requests, managing errors, and retrying requests +// automatically. For information about the AWS SDKs, including how to download +// and install them, see the Tools for Amazon Web Services page (http://aws.amazon.com/tools/). +// +// For information about setting up signatures and authorization through the +// API, go to Signing AWS API Requests (https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) +// in the AWS General Reference. For general information about the Query API, +// go to Making Query Requests (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html) +// in Using IAM. For information about using security tokens with other AWS +// products, go to AWS Services That Work with IAM (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) +// in the IAM User Guide. +// +// If you're new to AWS and need additional technical information about a specific +// AWS product, you can find the product's technical documentation at http://aws.amazon.com/documentation/ +// (http://aws.amazon.com/documentation/). +// +// Endpoints +// +// By default, AWS Security Token Service (STS) is available as a global service, +// and all AWS STS requests go to a single endpoint at https://sts.amazonaws.com. +// Global requests map to the US East (N. Virginia) region. AWS recommends using +// Regional AWS STS endpoints instead of the global endpoint to reduce latency, +// build in redundancy, and increase session token validity. For more information, +// see Managing AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) +// in the IAM User Guide. +// +// Most AWS Regions are enabled for operations in all AWS services by default. +// Those Regions are automatically activated for use with AWS STS. Some Regions, +// such as Asia Pacific (Hong Kong), must be manually enabled. To learn more +// about enabling and disabling AWS Regions, see Managing AWS Regions (https://docs.aws.amazon.com/general/latest/gr/rande-manage.html) +// in the AWS General Reference. When you enable these AWS Regions, they are +// automatically activated for use with AWS STS. You cannot activate the STS +// endpoint for a Region that is disabled. Tokens that are valid in all AWS +// Regions are longer than tokens that are valid in Regions that are enabled +// by default. Changing this setting might affect existing systems where you +// temporarily store tokens. For more information, see Managing Global Endpoint +// Session Tokens (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-manage-tokens) +// in the IAM User Guide. +// +// After you activate a Region for use with AWS STS, you can direct AWS STS +// API calls to that Region. AWS STS recommends that you use both the setRegion +// and setEndpoint methods to make calls to a Regional endpoint. You can use +// the setRegion method alone for manually enabled Regions, such as Asia Pacific +// (Hong Kong). In this case, the calls are directed to the STS Regional endpoint. +// However, if you use the setRegion method alone for Regions enabled by default, +// the calls are directed to the global endpoint of https://sts.amazonaws.com. +// +// To view the list of AWS STS endpoints and whether they are active by default, +// see Writing Code to Use AWS STS Regions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#id_credentials_temp_enable-regions_writing_code) +// in the IAM User Guide. +// +// Recording API requests +// +// STS supports AWS CloudTrail, which is a service that records AWS calls for +// your AWS account and delivers log files to an Amazon S3 bucket. By using +// information collected by CloudTrail, you can determine what requests were +// successfully made to STS, who made the request, when it was made, and so +// on. +// +// If you activate AWS STS endpoints in Regions other than the default global +// endpoint, then you must also turn on CloudTrail logging in those Regions. +// This is necessary to record any AWS STS API calls that are made in those +// Regions. For more information, see Turning On CloudTrail in Additional Regions +// (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/aggregating_logs_regions_turn_on_ct.html) +// in the AWS CloudTrail User Guide. +// +// AWS Security Token Service (STS) is a global service with a single endpoint +// at https://sts.amazonaws.com. Calls to this endpoint are logged as calls +// to a global service. However, because this endpoint is physically located +// in the US East (N. Virginia) Region, your logs list us-east-1 as the event +// Region. CloudTrail does not write these logs to the US East (Ohio) Region +// unless you choose to include global service logs in that Region. CloudTrail +// writes calls to all Regional endpoints to their respective Regions. For example, +// calls to sts.us-east-2.amazonaws.com are published to the US East (Ohio) +// Region and calls to sts.eu-central-1.amazonaws.com are published to the EU +// (Frankfurt) Region. +// +// To learn more about CloudTrail, including how to turn it on and find your +// log files, see the AWS CloudTrail User Guide (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html). +// +// See https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15 for more information on this service. +// +// See sts package documentation for more information. +// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/ +// +// Using the Client +// +// To contact AWS Security Token Service with the SDK use the New function to create +// a new service client. With that client you can make API requests to the service. +// These clients are safe to use concurrently. +// +// See the SDK's documentation for more information on how to use the SDK. +// https://docs.aws.amazon.com/sdk-for-go/api/ +// +// See aws.Config documentation for more information on configuring SDK clients. +// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config +// +// See the AWS Security Token Service client STS for more +// information on creating client for this service. +// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/#New +package sts diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go b/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go new file mode 100644 index 000000000..41ea09c35 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go @@ -0,0 +1,73 @@ +// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. + +package sts + +const ( + + // ErrCodeExpiredTokenException for service response error code + // "ExpiredTokenException". + // + // The web identity token that was passed is expired or is not valid. Get a + // new identity token from the identity provider and then retry the request. + ErrCodeExpiredTokenException = "ExpiredTokenException" + + // ErrCodeIDPCommunicationErrorException for service response error code + // "IDPCommunicationError". + // + // The request could not be fulfilled because the non-AWS identity provider + // (IDP) that was asked to verify the incoming identity token could not be reached. + // This is often a transient error caused by network conditions. Retry the request + // a limited number of times so that you don't exceed the request rate. If the + // error persists, the non-AWS identity provider might be down or not responding. + ErrCodeIDPCommunicationErrorException = "IDPCommunicationError" + + // ErrCodeIDPRejectedClaimException for service response error code + // "IDPRejectedClaim". + // + // The identity provider (IdP) reported that authentication failed. This might + // be because the claim is invalid. + // + // If this error is returned for the AssumeRoleWithWebIdentity operation, it + // can also mean that the claim has expired or has been explicitly revoked. + ErrCodeIDPRejectedClaimException = "IDPRejectedClaim" + + // ErrCodeInvalidAuthorizationMessageException for service response error code + // "InvalidAuthorizationMessageException". + // + // The error returned if the message passed to DecodeAuthorizationMessage was + // invalid. This can happen if the token contains invalid characters, such as + // linebreaks. + ErrCodeInvalidAuthorizationMessageException = "InvalidAuthorizationMessageException" + + // ErrCodeInvalidIdentityTokenException for service response error code + // "InvalidIdentityToken". + // + // The web identity token that was passed could not be validated by AWS. Get + // a new identity token from the identity provider and then retry the request. + ErrCodeInvalidIdentityTokenException = "InvalidIdentityToken" + + // ErrCodeMalformedPolicyDocumentException for service response error code + // "MalformedPolicyDocument". + // + // The request was rejected because the policy document was malformed. The error + // message describes the specific error. + ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocument" + + // ErrCodePackedPolicyTooLargeException for service response error code + // "PackedPolicyTooLarge". + // + // The request was rejected because the policy document was too large. The error + // message describes how big the policy document is, in packed form, as a percentage + // of what the API allows. + ErrCodePackedPolicyTooLargeException = "PackedPolicyTooLarge" + + // ErrCodeRegionDisabledException for service response error code + // "RegionDisabledException". + // + // STS is not activated in the requested region for the account that is being + // asked to generate credentials. The account administrator must use the IAM + // console to activate STS in that region. For more information, see Activating + // and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) + // in the IAM User Guide. + ErrCodeRegionDisabledException = "RegionDisabledException" +) diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/service.go b/vendor/github.com/aws/aws-sdk-go/service/sts/service.go new file mode 100644 index 000000000..185c914d1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go/service/sts/service.go @@ -0,0 +1,95 @@ +// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. + +package sts + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/client" + "github.com/aws/aws-sdk-go/aws/client/metadata" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/aws/signer/v4" + "github.com/aws/aws-sdk-go/private/protocol/query" +) + +// STS provides the API operation methods for making requests to +// AWS Security Token Service. See this package's package overview docs +// for details on the service. +// +// STS methods are safe to use concurrently. It is not safe to +// modify mutate any of the struct's properties though. +type STS struct { + *client.Client +} + +// Used for custom client initialization logic +var initClient func(*client.Client) + +// Used for custom request initialization logic +var initRequest func(*request.Request) + +// Service information constants +const ( + ServiceName = "sts" // Name of service. + EndpointsID = ServiceName // ID to lookup a service endpoint with. + ServiceID = "STS" // ServiceID is a unique identifer of a specific service. +) + +// New creates a new instance of the STS client with a session. +// If additional configuration is needed for the client instance use the optional +// aws.Config parameter to add your extra config. +// +// Example: +// // Create a STS client from just a session. +// svc := sts.New(mySession) +// +// // Create a STS client with additional configuration +// svc := sts.New(mySession, aws.NewConfig().WithRegion("us-west-2")) +func New(p client.ConfigProvider, cfgs ...*aws.Config) *STS { + c := p.ClientConfig(EndpointsID, cfgs...) + return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion, c.SigningName) +} + +// newClient creates, initializes and returns a new service client instance. +func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion, signingName string) *STS { + svc := &STS{ + Client: client.New( + cfg, + metadata.ClientInfo{ + ServiceName: ServiceName, + ServiceID: ServiceID, + SigningName: signingName, + SigningRegion: signingRegion, + Endpoint: endpoint, + APIVersion: "2011-06-15", + }, + handlers, + ), + } + + // Handlers + svc.Handlers.Sign.PushBackNamed(v4.SignRequestHandler) + svc.Handlers.Build.PushBackNamed(query.BuildHandler) + svc.Handlers.Unmarshal.PushBackNamed(query.UnmarshalHandler) + svc.Handlers.UnmarshalMeta.PushBackNamed(query.UnmarshalMetaHandler) + svc.Handlers.UnmarshalError.PushBackNamed(query.UnmarshalErrorHandler) + + // Run custom client initialization if present + if initClient != nil { + initClient(svc.Client) + } + + return svc +} + +// newRequest creates a new request for a STS operation and runs any +// custom request initialization. +func (c *STS) newRequest(op *request.Operation, params, data interface{}) *request.Request { + req := c.NewRequest(op, params, data) + + // Run custom request initialization if present + if initRequest != nil { + initRequest(req) + } + + return req +} diff --git a/vendor/github.com/beorn7/perks/LICENSE b/vendor/github.com/beorn7/perks/LICENSE new file mode 100644 index 000000000..339177be6 --- /dev/null +++ b/vendor/github.com/beorn7/perks/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013 Blake Mizerany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/beorn7/perks/quantile/stream.go b/vendor/github.com/beorn7/perks/quantile/stream.go new file mode 100644 index 000000000..d7d14f8eb --- /dev/null +++ b/vendor/github.com/beorn7/perks/quantile/stream.go @@ -0,0 +1,316 @@ +// Package quantile computes approximate quantiles over an unbounded data +// stream within low memory and CPU bounds. +// +// A small amount of accuracy is traded to achieve the above properties. +// +// Multiple streams can be merged before calling Query to generate a single set +// of results. This is meaningful when the streams represent the same type of +// data. See Merge and Samples. +// +// For more detailed information about the algorithm used, see: +// +// Effective Computation of Biased Quantiles over Data Streams +// +// http://www.cs.rutgers.edu/~muthu/bquant.pdf +package quantile + +import ( + "math" + "sort" +) + +// Sample holds an observed value and meta information for compression. JSON +// tags have been added for convenience. +type Sample struct { + Value float64 `json:",string"` + Width float64 `json:",string"` + Delta float64 `json:",string"` +} + +// Samples represents a slice of samples. It implements sort.Interface. +type Samples []Sample + +func (a Samples) Len() int { return len(a) } +func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } +func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type invariant func(s *stream, r float64) float64 + +// NewLowBiased returns an initialized Stream for low-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the lower ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewLowBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * r + } + return newStream(ƒ) +} + +// NewHighBiased returns an initialized Stream for high-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the higher ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewHighBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * (s.n - r) + } + return newStream(ƒ) +} + +// NewTargeted returns an initialized Stream concerned with a particular set of +// quantile values that are supplied a priori. Knowing these a priori reduces +// space and computation time. The targets map maps the desired quantiles to +// their absolute errors, i.e. the true quantile of a value returned by a query +// is guaranteed to be within (Quantile±Epsilon). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. +func NewTargeted(targetMap map[float64]float64) *Stream { + // Convert map to slice to avoid slow iterations on a map. + // ƒ is called on the hot path, so converting the map to a slice + // beforehand results in significant CPU savings. + targets := targetMapToSlice(targetMap) + + ƒ := func(s *stream, r float64) float64 { + var m = math.MaxFloat64 + var f float64 + for _, t := range targets { + if t.quantile*s.n <= r { + f = (2 * t.epsilon * r) / t.quantile + } else { + f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) + } + if f < m { + m = f + } + } + return m + } + return newStream(ƒ) +} + +type target struct { + quantile float64 + epsilon float64 +} + +func targetMapToSlice(targetMap map[float64]float64) []target { + targets := make([]target, 0, len(targetMap)) + + for quantile, epsilon := range targetMap { + t := target{ + quantile: quantile, + epsilon: epsilon, + } + targets = append(targets, t) + } + + return targets +} + +// Stream computes quantiles for a stream of float64s. It is not thread-safe by +// design. Take care when using across multiple goroutines. +type Stream struct { + *stream + b Samples + sorted bool +} + +func newStream(ƒ invariant) *Stream { + x := &stream{ƒ: ƒ} + return &Stream{x, make(Samples, 0, 500), true} +} + +// Insert inserts v into the stream. +func (s *Stream) Insert(v float64) { + s.insert(Sample{Value: v, Width: 1}) +} + +func (s *Stream) insert(sample Sample) { + s.b = append(s.b, sample) + s.sorted = false + if len(s.b) == cap(s.b) { + s.flush() + } +} + +// Query returns the computed qth percentiles value. If s was created with +// NewTargeted, and q is not in the set of quantiles provided a priori, Query +// will return an unspecified result. +func (s *Stream) Query(q float64) float64 { + if !s.flushed() { + // Fast path when there hasn't been enough data for a flush; + // this also yields better accuracy for small sets of data. + l := len(s.b) + if l == 0 { + return 0 + } + i := int(math.Ceil(float64(l) * q)) + if i > 0 { + i -= 1 + } + s.maybeSort() + return s.b[i].Value + } + s.flush() + return s.stream.query(q) +} + +// Merge merges samples into the underlying streams samples. This is handy when +// merging multiple streams from separate threads, database shards, etc. +// +// ATTENTION: This method is broken and does not yield correct results. The +// underlying algorithm is not capable of merging streams correctly. +func (s *Stream) Merge(samples Samples) { + sort.Sort(samples) + s.stream.merge(samples) +} + +// Reset reinitializes and clears the list reusing the samples buffer memory. +func (s *Stream) Reset() { + s.stream.reset() + s.b = s.b[:0] +} + +// Samples returns stream samples held by s. +func (s *Stream) Samples() Samples { + if !s.flushed() { + return s.b + } + s.flush() + return s.stream.samples() +} + +// Count returns the total number of samples observed in the stream +// since initialization. +func (s *Stream) Count() int { + return len(s.b) + s.stream.count() +} + +func (s *Stream) flush() { + s.maybeSort() + s.stream.merge(s.b) + s.b = s.b[:0] +} + +func (s *Stream) maybeSort() { + if !s.sorted { + s.sorted = true + sort.Sort(s.b) + } +} + +func (s *Stream) flushed() bool { + return len(s.stream.l) > 0 +} + +type stream struct { + n float64 + l []Sample + ƒ invariant +} + +func (s *stream) reset() { + s.l = s.l[:0] + s.n = 0 +} + +func (s *stream) insert(v float64) { + s.merge(Samples{{v, 1, 0}}) +} + +func (s *stream) merge(samples Samples) { + // TODO(beorn7): This tries to merge not only individual samples, but + // whole summaries. The paper doesn't mention merging summaries at + // all. Unittests show that the merging is inaccurate. Find out how to + // do merges properly. + var r float64 + i := 0 + for _, sample := range samples { + for ; i < len(s.l); i++ { + c := s.l[i] + if c.Value > sample.Value { + // Insert at position i. + s.l = append(s.l, Sample{}) + copy(s.l[i+1:], s.l[i:]) + s.l[i] = Sample{ + sample.Value, + sample.Width, + math.Max(sample.Delta, math.Floor(s.ƒ(s, r))-1), + // TODO(beorn7): How to calculate delta correctly? + } + i++ + goto inserted + } + r += c.Width + } + s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) + i++ + inserted: + s.n += sample.Width + r += sample.Width + } + s.compress() +} + +func (s *stream) count() int { + return int(s.n) +} + +func (s *stream) query(q float64) float64 { + t := math.Ceil(q * s.n) + t += math.Ceil(s.ƒ(s, t) / 2) + p := s.l[0] + var r float64 + for _, c := range s.l[1:] { + r += p.Width + if r+c.Width+c.Delta > t { + return p.Value + } + p = c + } + return p.Value +} + +func (s *stream) compress() { + if len(s.l) < 2 { + return + } + x := s.l[len(s.l)-1] + xi := len(s.l) - 1 + r := s.n - 1 - x.Width + + for i := len(s.l) - 2; i >= 0; i-- { + c := s.l[i] + if c.Width+x.Width+x.Delta <= s.ƒ(s, r) { + x.Width += c.Width + s.l[xi] = x + // Remove element at i. + copy(s.l[i:], s.l[i+1:]) + s.l = s.l[:len(s.l)-1] + xi -= 1 + } else { + x = c + xi = i + } + r -= c.Width + } +} + +func (s *stream) samples() Samples { + samples := make(Samples, len(s.l)) + copy(samples, s.l) + return samples +} diff --git a/vendor/github.com/blang/semver/LICENSE b/vendor/github.com/blang/semver/LICENSE new file mode 100644 index 000000000..5ba5c86fc --- /dev/null +++ b/vendor/github.com/blang/semver/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Benedikt Lang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/github.com/blang/semver/json.go b/vendor/github.com/blang/semver/json.go new file mode 100644 index 000000000..a74bf7c44 --- /dev/null +++ b/vendor/github.com/blang/semver/json.go @@ -0,0 +1,23 @@ +package semver + +import ( + "encoding/json" +) + +// MarshalJSON implements the encoding/json.Marshaler interface. +func (v Version) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements the encoding/json.Unmarshaler interface. +func (v *Version) UnmarshalJSON(data []byte) (err error) { + var versionString string + + if err = json.Unmarshal(data, &versionString); err != nil { + return + } + + *v, err = Parse(versionString) + + return +} diff --git a/vendor/github.com/blang/semver/range.go b/vendor/github.com/blang/semver/range.go new file mode 100644 index 000000000..95f7139b9 --- /dev/null +++ b/vendor/github.com/blang/semver/range.go @@ -0,0 +1,416 @@ +package semver + +import ( + "fmt" + "strconv" + "strings" + "unicode" +) + +type wildcardType int + +const ( + noneWildcard wildcardType = iota + majorWildcard wildcardType = 1 + minorWildcard wildcardType = 2 + patchWildcard wildcardType = 3 +) + +func wildcardTypefromInt(i int) wildcardType { + switch i { + case 1: + return majorWildcard + case 2: + return minorWildcard + case 3: + return patchWildcard + default: + return noneWildcard + } +} + +type comparator func(Version, Version) bool + +var ( + compEQ comparator = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 0 + } + compNE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) != 0 + } + compGT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 1 + } + compGE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) >= 0 + } + compLT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == -1 + } + compLE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) <= 0 + } +) + +type versionRange struct { + v Version + c comparator +} + +// rangeFunc creates a Range from the given versionRange. +func (vr *versionRange) rangeFunc() Range { + return Range(func(v Version) bool { + return vr.c(v, vr.v) + }) +} + +// Range represents a range of versions. +// A Range can be used to check if a Version satisfies it: +// +// range, err := semver.ParseRange(">1.0.0 <2.0.0") +// range(semver.MustParse("1.1.1") // returns true +type Range func(Version) bool + +// OR combines the existing Range with another Range using logical OR. +func (rf Range) OR(f Range) Range { + return Range(func(v Version) bool { + return rf(v) || f(v) + }) +} + +// AND combines the existing Range with another Range using logical AND. +func (rf Range) AND(f Range) Range { + return Range(func(v Version) bool { + return rf(v) && f(v) + }) +} + +// ParseRange parses a range and returns a Range. +// If the range could not be parsed an error is returned. +// +// Valid ranges are: +// - "<1.0.0" +// - "<=1.0.0" +// - ">1.0.0" +// - ">=1.0.0" +// - "1.0.0", "=1.0.0", "==1.0.0" +// - "!1.0.0", "!=1.0.0" +// +// A Range can consist of multiple ranges separated by space: +// Ranges can be linked by logical AND: +// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0" +// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2 +// +// Ranges can also be linked by logical OR: +// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x" +// +// AND has a higher precedence than OR. It's not possible to use brackets. +// +// Ranges can be combined by both AND and OR +// +// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` +func ParseRange(s string) (Range, error) { + parts := splitAndTrim(s) + orParts, err := splitORParts(parts) + if err != nil { + return nil, err + } + expandedParts, err := expandWildcardVersion(orParts) + if err != nil { + return nil, err + } + var orFn Range + for _, p := range expandedParts { + var andFn Range + for _, ap := range p { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + vr, err := buildVersionRange(opStr, vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err) + } + rf := vr.rangeFunc() + + // Set function + if andFn == nil { + andFn = rf + } else { // Combine with existing function + andFn = andFn.AND(rf) + } + } + if orFn == nil { + orFn = andFn + } else { + orFn = orFn.OR(andFn) + } + + } + return orFn, nil +} + +// splitORParts splits the already cleaned parts by '||'. +// Checks for invalid positions of the operator and returns an +// error if found. +func splitORParts(parts []string) ([][]string, error) { + var ORparts [][]string + last := 0 + for i, p := range parts { + if p == "||" { + if i == 0 { + return nil, fmt.Errorf("First element in range is '||'") + } + ORparts = append(ORparts, parts[last:i]) + last = i + 1 + } + } + if last == len(parts) { + return nil, fmt.Errorf("Last element in range is '||'") + } + ORparts = append(ORparts, parts[last:]) + return ORparts, nil +} + +// buildVersionRange takes a slice of 2: operator and version +// and builds a versionRange, otherwise an error. +func buildVersionRange(opStr, vStr string) (*versionRange, error) { + c := parseComparator(opStr) + if c == nil { + return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, "")) + } + v, err := Parse(vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err) + } + + return &versionRange{ + v: v, + c: c, + }, nil + +} + +// inArray checks if a byte is contained in an array of bytes +func inArray(s byte, list []byte) bool { + for _, el := range list { + if el == s { + return true + } + } + return false +} + +// splitAndTrim splits a range string by spaces and cleans whitespaces +func splitAndTrim(s string) (result []string) { + last := 0 + var lastChar byte + excludeFromSplit := []byte{'>', '<', '='} + for i := 0; i < len(s); i++ { + if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) { + if last < i-1 { + result = append(result, s[last:i]) + } + last = i + 1 + } else if s[i] != ' ' { + lastChar = s[i] + } + } + if last < len(s)-1 { + result = append(result, s[last:]) + } + + for i, v := range result { + result[i] = strings.Replace(v, " ", "", -1) + } + + // parts := strings.Split(s, " ") + // for _, x := range parts { + // if s := strings.TrimSpace(x); len(s) != 0 { + // result = append(result, s) + // } + // } + return +} + +// splitComparatorVersion splits the comparator from the version. +// Input must be free of leading or trailing spaces. +func splitComparatorVersion(s string) (string, string, error) { + i := strings.IndexFunc(s, unicode.IsDigit) + if i == -1 { + return "", "", fmt.Errorf("Could not get version from string: %q", s) + } + return strings.TrimSpace(s[0:i]), s[i:], nil +} + +// getWildcardType will return the type of wildcard that the +// passed version contains +func getWildcardType(vStr string) wildcardType { + parts := strings.Split(vStr, ".") + nparts := len(parts) + wildcard := parts[nparts-1] + + possibleWildcardType := wildcardTypefromInt(nparts) + if wildcard == "x" { + return possibleWildcardType + } + + return noneWildcard +} + +// createVersionFromWildcard will convert a wildcard version +// into a regular version, replacing 'x's with '0's, handling +// special cases like '1.x.x' and '1.x' +func createVersionFromWildcard(vStr string) string { + // handle 1.x.x + vStr2 := strings.Replace(vStr, ".x.x", ".x", 1) + vStr2 = strings.Replace(vStr2, ".x", ".0", 1) + parts := strings.Split(vStr2, ".") + + // handle 1.x + if len(parts) == 2 { + return vStr2 + ".0" + } + + return vStr2 +} + +// incrementMajorVersion will increment the major version +// of the passed version +func incrementMajorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[0]) + if err != nil { + return "", err + } + parts[0] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// incrementMajorVersion will increment the minor version +// of the passed version +func incrementMinorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[1]) + if err != nil { + return "", err + } + parts[1] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// expandWildcardVersion will expand wildcards inside versions +// following these rules: +// +// * when dealing with patch wildcards: +// >= 1.2.x will become >= 1.2.0 +// <= 1.2.x will become < 1.3.0 +// > 1.2.x will become >= 1.3.0 +// < 1.2.x will become < 1.2.0 +// != 1.2.x will become < 1.2.0 >= 1.3.0 +// +// * when dealing with minor wildcards: +// >= 1.x will become >= 1.0.0 +// <= 1.x will become < 2.0.0 +// > 1.x will become >= 2.0.0 +// < 1.0 will become < 1.0.0 +// != 1.x will become < 1.0.0 >= 2.0.0 +// +// * when dealing with wildcards without +// version operator: +// 1.2.x will become >= 1.2.0 < 1.3.0 +// 1.x will become >= 1.0.0 < 2.0.0 +func expandWildcardVersion(parts [][]string) ([][]string, error) { + var expandedParts [][]string + for _, p := range parts { + var newParts []string + for _, ap := range p { + if strings.Contains(ap, "x") { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + + versionWildcardType := getWildcardType(vStr) + flatVersion := createVersionFromWildcard(vStr) + + var resultOperator string + var shouldIncrementVersion bool + switch opStr { + case ">": + resultOperator = ">=" + shouldIncrementVersion = true + case ">=": + resultOperator = ">=" + case "<": + resultOperator = "<" + case "<=": + resultOperator = "<" + shouldIncrementVersion = true + case "", "=", "==": + newParts = append(newParts, ">="+flatVersion) + resultOperator = "<" + shouldIncrementVersion = true + case "!=", "!": + newParts = append(newParts, "<"+flatVersion) + resultOperator = ">=" + shouldIncrementVersion = true + } + + var resultVersion string + if shouldIncrementVersion { + switch versionWildcardType { + case patchWildcard: + resultVersion, _ = incrementMinorVersion(flatVersion) + case minorWildcard: + resultVersion, _ = incrementMajorVersion(flatVersion) + } + } else { + resultVersion = flatVersion + } + + ap = resultOperator + resultVersion + } + newParts = append(newParts, ap) + } + expandedParts = append(expandedParts, newParts) + } + + return expandedParts, nil +} + +func parseComparator(s string) comparator { + switch s { + case "==": + fallthrough + case "": + fallthrough + case "=": + return compEQ + case ">": + return compGT + case ">=": + return compGE + case "<": + return compLT + case "<=": + return compLE + case "!": + fallthrough + case "!=": + return compNE + } + + return nil +} + +// MustParseRange is like ParseRange but panics if the range cannot be parsed. +func MustParseRange(s string) Range { + r, err := ParseRange(s) + if err != nil { + panic(`semver: ParseRange(` + s + `): ` + err.Error()) + } + return r +} diff --git a/vendor/github.com/blang/semver/semver.go b/vendor/github.com/blang/semver/semver.go new file mode 100644 index 000000000..4165bc791 --- /dev/null +++ b/vendor/github.com/blang/semver/semver.go @@ -0,0 +1,455 @@ +package semver + +import ( + "errors" + "fmt" + "strconv" + "strings" +) + +const ( + numbers string = "0123456789" + alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + alphanum = alphas + numbers +) + +// SpecVersion is the latest fully supported spec version of semver +var SpecVersion = Version{ + Major: 2, + Minor: 0, + Patch: 0, +} + +// Version represents a semver compatible version +type Version struct { + Major uint64 + Minor uint64 + Patch uint64 + Pre []PRVersion + Build []string //No Precedence +} + +// Version to string +func (v Version) String() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + + if len(v.Pre) > 0 { + b = append(b, '-') + b = append(b, v.Pre[0].String()...) + + for _, pre := range v.Pre[1:] { + b = append(b, '.') + b = append(b, pre.String()...) + } + } + + if len(v.Build) > 0 { + b = append(b, '+') + b = append(b, v.Build[0]...) + + for _, build := range v.Build[1:] { + b = append(b, '.') + b = append(b, build...) + } + } + + return string(b) +} + +// Equals checks if v is equal to o. +func (v Version) Equals(o Version) bool { + return (v.Compare(o) == 0) +} + +// EQ checks if v is equal to o. +func (v Version) EQ(o Version) bool { + return (v.Compare(o) == 0) +} + +// NE checks if v is not equal to o. +func (v Version) NE(o Version) bool { + return (v.Compare(o) != 0) +} + +// GT checks if v is greater than o. +func (v Version) GT(o Version) bool { + return (v.Compare(o) == 1) +} + +// GTE checks if v is greater than or equal to o. +func (v Version) GTE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// GE checks if v is greater than or equal to o. +func (v Version) GE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// LT checks if v is less than o. +func (v Version) LT(o Version) bool { + return (v.Compare(o) == -1) +} + +// LTE checks if v is less than or equal to o. +func (v Version) LTE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// LE checks if v is less than or equal to o. +func (v Version) LE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// Compare compares Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v Version) Compare(o Version) int { + if v.Major != o.Major { + if v.Major > o.Major { + return 1 + } + return -1 + } + if v.Minor != o.Minor { + if v.Minor > o.Minor { + return 1 + } + return -1 + } + if v.Patch != o.Patch { + if v.Patch > o.Patch { + return 1 + } + return -1 + } + + // Quick comparison if a version has no prerelease versions + if len(v.Pre) == 0 && len(o.Pre) == 0 { + return 0 + } else if len(v.Pre) == 0 && len(o.Pre) > 0 { + return 1 + } else if len(v.Pre) > 0 && len(o.Pre) == 0 { + return -1 + } + + i := 0 + for ; i < len(v.Pre) && i < len(o.Pre); i++ { + if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 { + continue + } else if comp == 1 { + return 1 + } else { + return -1 + } + } + + // If all pr versions are the equal but one has further prversion, this one greater + if i == len(v.Pre) && i == len(o.Pre) { + return 0 + } else if i == len(v.Pre) && i < len(o.Pre) { + return -1 + } else { + return 1 + } + +} + +// IncrementPatch increments the patch version +func (v *Version) IncrementPatch() error { + if v.Major == 0 { + return fmt.Errorf("Patch version can not be incremented for %q", v.String()) + } + v.Patch += 1 + return nil +} + +// IncrementMinor increments the minor version +func (v *Version) IncrementMinor() error { + if v.Major == 0 { + return fmt.Errorf("Minor version can not be incremented for %q", v.String()) + } + v.Minor += 1 + v.Patch = 0 + return nil +} + +// IncrementMajor increments the major version +func (v *Version) IncrementMajor() error { + if v.Major == 0 { + return fmt.Errorf("Major version can not be incremented for %q", v.String()) + } + v.Major += 1 + v.Minor = 0 + v.Patch = 0 + return nil +} + +// Validate validates v and returns error in case +func (v Version) Validate() error { + // Major, Minor, Patch already validated using uint64 + + for _, pre := range v.Pre { + if !pre.IsNum { //Numeric prerelease versions already uint64 + if len(pre.VersionStr) == 0 { + return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr) + } + if !containsOnly(pre.VersionStr, alphanum) { + return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr) + } + } + } + + for _, build := range v.Build { + if len(build) == 0 { + return fmt.Errorf("Build meta data can not be empty %q", build) + } + if !containsOnly(build, alphanum) { + return fmt.Errorf("Invalid character(s) found in build meta data %q", build) + } + } + + return nil +} + +// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error +func New(s string) (vp *Version, err error) { + v, err := Parse(s) + vp = &v + return +} + +// Make is an alias for Parse, parses version string and returns a validated Version or error +func Make(s string) (Version, error) { + return Parse(s) +} + +// ParseTolerant allows for certain version specifications that do not strictly adhere to semver +// specs to be parsed by this library. It does so by normalizing versions before passing them to +// Parse(). It currently trims spaces, removes a "v" prefix, adds a 0 patch number to versions +// with only major and minor components specified, and removes leading 0s. +func ParseTolerant(s string) (Version, error) { + s = strings.TrimSpace(s) + s = strings.TrimPrefix(s, "v") + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + // Remove leading zeros. + for i, p := range parts { + if len(p) > 1 { + parts[i] = strings.TrimPrefix(p, "0") + } + } + // Fill up shortened versions. + if len(parts) < 3 { + if strings.ContainsAny(parts[len(parts)-1], "+-") { + return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data") + } + for len(parts) < 3 { + parts = append(parts, "0") + } + } + s = strings.Join(parts, ".") + + return Parse(s) +} + +// Parse parses version string and returns a validated Version or error +func Parse(s string) (Version, error) { + if len(s) == 0 { + return Version{}, errors.New("Version string empty") + } + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) != 3 { + return Version{}, errors.New("No Major.Minor.Patch elements found") + } + + // Major + if !containsOnly(parts[0], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) + } + if hasLeadingZeroes(parts[0]) { + return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } + major, err := strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return Version{}, err + } + + // Minor + if !containsOnly(parts[1], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) + } + if hasLeadingZeroes(parts[1]) { + return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } + minor, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return Version{}, err + } + + v := Version{} + v.Major = major + v.Minor = minor + + var build, prerelease []string + patchStr := parts[2] + + if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 { + build = strings.Split(patchStr[buildIndex+1:], ".") + patchStr = patchStr[:buildIndex] + } + + if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 { + prerelease = strings.Split(patchStr[preIndex+1:], ".") + patchStr = patchStr[:preIndex] + } + + if !containsOnly(patchStr, numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr) + } + if hasLeadingZeroes(patchStr) { + return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr) + } + patch, err := strconv.ParseUint(patchStr, 10, 64) + if err != nil { + return Version{}, err + } + + v.Patch = patch + + // Prerelease + for _, prstr := range prerelease { + parsedPR, err := NewPRVersion(prstr) + if err != nil { + return Version{}, err + } + v.Pre = append(v.Pre, parsedPR) + } + + // Build meta data + for _, str := range build { + if len(str) == 0 { + return Version{}, errors.New("Build meta data is empty") + } + if !containsOnly(str, alphanum) { + return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str) + } + v.Build = append(v.Build, str) + } + + return v, nil +} + +// MustParse is like Parse but panics if the version cannot be parsed. +func MustParse(s string) Version { + v, err := Parse(s) + if err != nil { + panic(`semver: Parse(` + s + `): ` + err.Error()) + } + return v +} + +// PRVersion represents a PreRelease Version +type PRVersion struct { + VersionStr string + VersionNum uint64 + IsNum bool +} + +// NewPRVersion creates a new valid prerelease version +func NewPRVersion(s string) (PRVersion, error) { + if len(s) == 0 { + return PRVersion{}, errors.New("Prerelease is empty") + } + v := PRVersion{} + if containsOnly(s, numbers) { + if hasLeadingZeroes(s) { + return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } + num, err := strconv.ParseUint(s, 10, 64) + + // Might never be hit, but just in case + if err != nil { + return PRVersion{}, err + } + v.VersionNum = num + v.IsNum = true + } else if containsOnly(s, alphanum) { + v.VersionStr = s + v.IsNum = false + } else { + return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s) + } + return v, nil +} + +// IsNumeric checks if prerelease-version is numeric +func (v PRVersion) IsNumeric() bool { + return v.IsNum +} + +// Compare compares two PreRelease Versions v and o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v PRVersion) Compare(o PRVersion) int { + if v.IsNum && !o.IsNum { + return -1 + } else if !v.IsNum && o.IsNum { + return 1 + } else if v.IsNum && o.IsNum { + if v.VersionNum == o.VersionNum { + return 0 + } else if v.VersionNum > o.VersionNum { + return 1 + } else { + return -1 + } + } else { // both are Alphas + if v.VersionStr == o.VersionStr { + return 0 + } else if v.VersionStr > o.VersionStr { + return 1 + } else { + return -1 + } + } +} + +// PreRelease version to string +func (v PRVersion) String() string { + if v.IsNum { + return strconv.FormatUint(v.VersionNum, 10) + } + return v.VersionStr +} + +func containsOnly(s string, set string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(set, r) + }) == -1 +} + +func hasLeadingZeroes(s string) bool { + return len(s) > 1 && s[0] == '0' +} + +// NewBuildVersion creates a new valid build version +func NewBuildVersion(s string) (string, error) { + if len(s) == 0 { + return "", errors.New("Buildversion is empty") + } + if !containsOnly(s, alphanum) { + return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s) + } + return s, nil +} diff --git a/vendor/github.com/blang/semver/sort.go b/vendor/github.com/blang/semver/sort.go new file mode 100644 index 000000000..e18f88082 --- /dev/null +++ b/vendor/github.com/blang/semver/sort.go @@ -0,0 +1,28 @@ +package semver + +import ( + "sort" +) + +// Versions represents multiple versions. +type Versions []Version + +// Len returns length of version collection +func (s Versions) Len() int { + return len(s) +} + +// Swap swaps two versions inside the collection by its indices +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Less checks if version at index i is less than version at index j +func (s Versions) Less(i, j int) bool { + return s[i].LT(s[j]) +} + +// Sort sorts a slice of versions +func Sort(versions []Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/blang/semver/sql.go b/vendor/github.com/blang/semver/sql.go new file mode 100644 index 000000000..db958134f --- /dev/null +++ b/vendor/github.com/blang/semver/sql.go @@ -0,0 +1,30 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var str string + switch src := src.(type) { + case string: + str = src + case []byte: + str = string(src) + default: + return fmt.Errorf("version.Scan: cannot convert %T to string", src) + } + + if t, err := Parse(str); err == nil { + *v = t + } + + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (v Version) Value() (driver.Value, error) { + return v.String(), nil +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS b/vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS new file mode 100644 index 000000000..e068e731e --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS @@ -0,0 +1 @@ +Google Inc. \ No newline at end of file diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/LICENSE b/vendor/github.com/census-instrumentation/opencensus-proto/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go new file mode 100644 index 000000000..a6f0febe2 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go @@ -0,0 +1,361 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/agent/common/v1/common.proto + +package v1 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type LibraryInfo_Language int32 + +const ( + LibraryInfo_LANGUAGE_UNSPECIFIED LibraryInfo_Language = 0 + LibraryInfo_CPP LibraryInfo_Language = 1 + LibraryInfo_C_SHARP LibraryInfo_Language = 2 + LibraryInfo_ERLANG LibraryInfo_Language = 3 + LibraryInfo_GO_LANG LibraryInfo_Language = 4 + LibraryInfo_JAVA LibraryInfo_Language = 5 + LibraryInfo_NODE_JS LibraryInfo_Language = 6 + LibraryInfo_PHP LibraryInfo_Language = 7 + LibraryInfo_PYTHON LibraryInfo_Language = 8 + LibraryInfo_RUBY LibraryInfo_Language = 9 + LibraryInfo_WEB_JS LibraryInfo_Language = 10 +) + +var LibraryInfo_Language_name = map[int32]string{ + 0: "LANGUAGE_UNSPECIFIED", + 1: "CPP", + 2: "C_SHARP", + 3: "ERLANG", + 4: "GO_LANG", + 5: "JAVA", + 6: "NODE_JS", + 7: "PHP", + 8: "PYTHON", + 9: "RUBY", + 10: "WEB_JS", +} + +var LibraryInfo_Language_value = map[string]int32{ + "LANGUAGE_UNSPECIFIED": 0, + "CPP": 1, + "C_SHARP": 2, + "ERLANG": 3, + "GO_LANG": 4, + "JAVA": 5, + "NODE_JS": 6, + "PHP": 7, + "PYTHON": 8, + "RUBY": 9, + "WEB_JS": 10, +} + +func (x LibraryInfo_Language) String() string { + return proto.EnumName(LibraryInfo_Language_name, int32(x)) +} + +func (LibraryInfo_Language) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_126c72ed8a252c84, []int{2, 0} +} + +// Identifier metadata of the Node that produces the span or tracing data. +// Note, this is not the metadata about the Node or service that is described by associated spans. +// In the future we plan to extend the identifier proto definition to support +// additional information (e.g cloud id, etc.) +type Node struct { + // Identifier that uniquely identifies a process within a VM/container. + Identifier *ProcessIdentifier `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` + // Information on the OpenCensus Library that initiates the stream. + LibraryInfo *LibraryInfo `protobuf:"bytes,2,opt,name=library_info,json=libraryInfo,proto3" json:"library_info,omitempty"` + // Additional information on service. + ServiceInfo *ServiceInfo `protobuf:"bytes,3,opt,name=service_info,json=serviceInfo,proto3" json:"service_info,omitempty"` + // Additional attributes. + Attributes map[string]string `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Node) Reset() { *m = Node{} } +func (m *Node) String() string { return proto.CompactTextString(m) } +func (*Node) ProtoMessage() {} +func (*Node) Descriptor() ([]byte, []int) { + return fileDescriptor_126c72ed8a252c84, []int{0} +} + +func (m *Node) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Node.Unmarshal(m, b) +} +func (m *Node) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Node.Marshal(b, m, deterministic) +} +func (m *Node) XXX_Merge(src proto.Message) { + xxx_messageInfo_Node.Merge(m, src) +} +func (m *Node) XXX_Size() int { + return xxx_messageInfo_Node.Size(m) +} +func (m *Node) XXX_DiscardUnknown() { + xxx_messageInfo_Node.DiscardUnknown(m) +} + +var xxx_messageInfo_Node proto.InternalMessageInfo + +func (m *Node) GetIdentifier() *ProcessIdentifier { + if m != nil { + return m.Identifier + } + return nil +} + +func (m *Node) GetLibraryInfo() *LibraryInfo { + if m != nil { + return m.LibraryInfo + } + return nil +} + +func (m *Node) GetServiceInfo() *ServiceInfo { + if m != nil { + return m.ServiceInfo + } + return nil +} + +func (m *Node) GetAttributes() map[string]string { + if m != nil { + return m.Attributes + } + return nil +} + +// Identifier that uniquely identifies a process within a VM/container. +type ProcessIdentifier struct { + // The host name. Usually refers to the machine/container name. + // For example: os.Hostname() in Go, socket.gethostname() in Python. + HostName string `protobuf:"bytes,1,opt,name=host_name,json=hostName,proto3" json:"host_name,omitempty"` + // Process id. + Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` + // Start time of this ProcessIdentifier. Represented in epoch time. + StartTimestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ProcessIdentifier) Reset() { *m = ProcessIdentifier{} } +func (m *ProcessIdentifier) String() string { return proto.CompactTextString(m) } +func (*ProcessIdentifier) ProtoMessage() {} +func (*ProcessIdentifier) Descriptor() ([]byte, []int) { + return fileDescriptor_126c72ed8a252c84, []int{1} +} + +func (m *ProcessIdentifier) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ProcessIdentifier.Unmarshal(m, b) +} +func (m *ProcessIdentifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ProcessIdentifier.Marshal(b, m, deterministic) +} +func (m *ProcessIdentifier) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProcessIdentifier.Merge(m, src) +} +func (m *ProcessIdentifier) XXX_Size() int { + return xxx_messageInfo_ProcessIdentifier.Size(m) +} +func (m *ProcessIdentifier) XXX_DiscardUnknown() { + xxx_messageInfo_ProcessIdentifier.DiscardUnknown(m) +} + +var xxx_messageInfo_ProcessIdentifier proto.InternalMessageInfo + +func (m *ProcessIdentifier) GetHostName() string { + if m != nil { + return m.HostName + } + return "" +} + +func (m *ProcessIdentifier) GetPid() uint32 { + if m != nil { + return m.Pid + } + return 0 +} + +func (m *ProcessIdentifier) GetStartTimestamp() *timestamp.Timestamp { + if m != nil { + return m.StartTimestamp + } + return nil +} + +// Information on OpenCensus Library. +type LibraryInfo struct { + // Language of OpenCensus Library. + Language LibraryInfo_Language `protobuf:"varint,1,opt,name=language,proto3,enum=opencensus.proto.agent.common.v1.LibraryInfo_Language" json:"language,omitempty"` + // Version of Agent exporter of Library. + ExporterVersion string `protobuf:"bytes,2,opt,name=exporter_version,json=exporterVersion,proto3" json:"exporter_version,omitempty"` + // Version of OpenCensus Library. + CoreLibraryVersion string `protobuf:"bytes,3,opt,name=core_library_version,json=coreLibraryVersion,proto3" json:"core_library_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LibraryInfo) Reset() { *m = LibraryInfo{} } +func (m *LibraryInfo) String() string { return proto.CompactTextString(m) } +func (*LibraryInfo) ProtoMessage() {} +func (*LibraryInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_126c72ed8a252c84, []int{2} +} + +func (m *LibraryInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LibraryInfo.Unmarshal(m, b) +} +func (m *LibraryInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LibraryInfo.Marshal(b, m, deterministic) +} +func (m *LibraryInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_LibraryInfo.Merge(m, src) +} +func (m *LibraryInfo) XXX_Size() int { + return xxx_messageInfo_LibraryInfo.Size(m) +} +func (m *LibraryInfo) XXX_DiscardUnknown() { + xxx_messageInfo_LibraryInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_LibraryInfo proto.InternalMessageInfo + +func (m *LibraryInfo) GetLanguage() LibraryInfo_Language { + if m != nil { + return m.Language + } + return LibraryInfo_LANGUAGE_UNSPECIFIED +} + +func (m *LibraryInfo) GetExporterVersion() string { + if m != nil { + return m.ExporterVersion + } + return "" +} + +func (m *LibraryInfo) GetCoreLibraryVersion() string { + if m != nil { + return m.CoreLibraryVersion + } + return "" +} + +// Additional service information. +type ServiceInfo struct { + // Name of the service. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceInfo) Reset() { *m = ServiceInfo{} } +func (m *ServiceInfo) String() string { return proto.CompactTextString(m) } +func (*ServiceInfo) ProtoMessage() {} +func (*ServiceInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_126c72ed8a252c84, []int{3} +} + +func (m *ServiceInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceInfo.Unmarshal(m, b) +} +func (m *ServiceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceInfo.Marshal(b, m, deterministic) +} +func (m *ServiceInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceInfo.Merge(m, src) +} +func (m *ServiceInfo) XXX_Size() int { + return xxx_messageInfo_ServiceInfo.Size(m) +} +func (m *ServiceInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceInfo proto.InternalMessageInfo + +func (m *ServiceInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func init() { + proto.RegisterEnum("opencensus.proto.agent.common.v1.LibraryInfo_Language", LibraryInfo_Language_name, LibraryInfo_Language_value) + proto.RegisterType((*Node)(nil), "opencensus.proto.agent.common.v1.Node") + proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.agent.common.v1.Node.AttributesEntry") + proto.RegisterType((*ProcessIdentifier)(nil), "opencensus.proto.agent.common.v1.ProcessIdentifier") + proto.RegisterType((*LibraryInfo)(nil), "opencensus.proto.agent.common.v1.LibraryInfo") + proto.RegisterType((*ServiceInfo)(nil), "opencensus.proto.agent.common.v1.ServiceInfo") +} + +func init() { + proto.RegisterFile("opencensus/proto/agent/common/v1/common.proto", fileDescriptor_126c72ed8a252c84) +} + +var fileDescriptor_126c72ed8a252c84 = []byte{ + // 618 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0x4f, 0x6e, 0xda, 0x4e, + 0x14, 0xc7, 0x7f, 0xc6, 0x24, 0x81, 0xe7, 0x5f, 0x13, 0x77, 0x94, 0x05, 0x4a, 0x17, 0xa5, 0x74, + 0x93, 0x2e, 0xb0, 0x9b, 0x44, 0xaa, 0xaa, 0x4a, 0x5d, 0x18, 0xe2, 0x26, 0x44, 0x11, 0x58, 0x26, + 0xa1, 0x4a, 0x37, 0x96, 0x21, 0x83, 0x33, 0x2a, 0x9e, 0x41, 0xe3, 0x31, 0x2a, 0x27, 0xe8, 0x09, + 0xda, 0x03, 0xf4, 0x50, 0x3d, 0x44, 0x4f, 0x51, 0xcd, 0x8c, 0x01, 0xab, 0x59, 0x90, 0xdd, 0xfb, + 0xf3, 0xfd, 0x7e, 0x9e, 0xf5, 0xe6, 0xc9, 0xd0, 0x66, 0x73, 0x4c, 0x27, 0x98, 0x66, 0x79, 0xe6, + 0xce, 0x39, 0x13, 0xcc, 0x8d, 0x13, 0x4c, 0x85, 0x3b, 0x61, 0x69, 0xca, 0xa8, 0xbb, 0x38, 0x29, + 0x22, 0x47, 0x35, 0x51, 0x73, 0x23, 0xd7, 0x15, 0x47, 0xc9, 0x9d, 0x42, 0xb4, 0x38, 0x39, 0x7a, + 0x99, 0x30, 0x96, 0xcc, 0xb0, 0x86, 0x8d, 0xf3, 0xa9, 0x2b, 0x48, 0x8a, 0x33, 0x11, 0xa7, 0x73, + 0x6d, 0x68, 0xfd, 0x34, 0xa1, 0xda, 0x67, 0xf7, 0x18, 0x0d, 0x01, 0xc8, 0x3d, 0xa6, 0x82, 0x4c, + 0x09, 0xe6, 0x0d, 0xa3, 0x69, 0x1c, 0x5b, 0xa7, 0x67, 0xce, 0xb6, 0x01, 0x4e, 0xc0, 0xd9, 0x04, + 0x67, 0x59, 0x6f, 0x6d, 0x0d, 0x4b, 0x18, 0x14, 0xc0, 0xff, 0x33, 0x32, 0xe6, 0x31, 0x5f, 0x46, + 0x84, 0x4e, 0x59, 0xa3, 0xa2, 0xb0, 0xed, 0xed, 0xd8, 0x6b, 0xed, 0xea, 0xd1, 0x29, 0x0b, 0xad, + 0xd9, 0x26, 0x91, 0xc4, 0x0c, 0xf3, 0x05, 0x99, 0x60, 0x4d, 0x34, 0x9f, 0x4a, 0x1c, 0x6a, 0x97, + 0x26, 0x66, 0x9b, 0x04, 0x8d, 0x00, 0x62, 0x21, 0x38, 0x19, 0xe7, 0x02, 0x67, 0x8d, 0x6a, 0xd3, + 0x3c, 0xb6, 0x4e, 0xdf, 0x6d, 0xe7, 0xc9, 0xa5, 0x39, 0xde, 0xda, 0xe8, 0x53, 0xc1, 0x97, 0x61, + 0x89, 0x74, 0xf4, 0x11, 0x0e, 0xfe, 0x69, 0x23, 0x1b, 0xcc, 0xaf, 0x78, 0xa9, 0x96, 0x5b, 0x0f, + 0x65, 0x88, 0x0e, 0x61, 0x67, 0x11, 0xcf, 0x72, 0xac, 0x36, 0x53, 0x0f, 0x75, 0xf2, 0xa1, 0xf2, + 0xde, 0x68, 0x7d, 0x37, 0xe0, 0xf9, 0xa3, 0xe5, 0xa2, 0x17, 0x50, 0x7f, 0x60, 0x99, 0x88, 0x68, + 0x9c, 0xe2, 0x82, 0x53, 0x93, 0x85, 0x7e, 0x9c, 0x62, 0x89, 0x9f, 0x93, 0x7b, 0x85, 0x7a, 0x16, + 0xca, 0x10, 0x75, 0xe1, 0x20, 0x13, 0x31, 0x17, 0xd1, 0xfa, 0xd9, 0x8b, 0x85, 0x1d, 0x39, 0xfa, + 0x30, 0x9c, 0xd5, 0x61, 0x38, 0x37, 0x2b, 0x45, 0xb8, 0xaf, 0x2c, 0xeb, 0xbc, 0xf5, 0xbb, 0x02, + 0x56, 0xe9, 0x3d, 0x50, 0x08, 0xb5, 0x59, 0x4c, 0x93, 0x3c, 0x4e, 0xf4, 0x27, 0xec, 0x3f, 0x65, + 0x5d, 0x25, 0x80, 0x73, 0x5d, 0xb8, 0xc3, 0x35, 0x07, 0xbd, 0x01, 0x1b, 0x7f, 0x9b, 0x33, 0x2e, + 0x30, 0x8f, 0x16, 0x98, 0x67, 0x84, 0xd1, 0x62, 0x25, 0x07, 0xab, 0xfa, 0x48, 0x97, 0xd1, 0x5b, + 0x38, 0x9c, 0x30, 0x8e, 0xa3, 0xd5, 0x61, 0xad, 0xe4, 0xa6, 0x92, 0x23, 0xd9, 0x2b, 0x86, 0x15, + 0x8e, 0xd6, 0x0f, 0x03, 0x6a, 0xab, 0x99, 0xa8, 0x01, 0x87, 0xd7, 0x5e, 0xff, 0xe2, 0xd6, 0xbb, + 0xf0, 0xa3, 0xdb, 0xfe, 0x30, 0xf0, 0xbb, 0xbd, 0x4f, 0x3d, 0xff, 0xdc, 0xfe, 0x0f, 0xed, 0x81, + 0xd9, 0x0d, 0x02, 0xdb, 0x40, 0x16, 0xec, 0x75, 0xa3, 0xe1, 0xa5, 0x17, 0x06, 0x76, 0x05, 0x01, + 0xec, 0xfa, 0xa1, 0x74, 0xd8, 0xa6, 0x6c, 0x5c, 0x0c, 0x22, 0x95, 0x54, 0x51, 0x0d, 0xaa, 0x57, + 0xde, 0xc8, 0xb3, 0x77, 0x64, 0xb9, 0x3f, 0x38, 0xf7, 0xa3, 0xab, 0xa1, 0xbd, 0x2b, 0x29, 0xc1, + 0x65, 0x60, 0xef, 0x49, 0x63, 0x70, 0x77, 0x73, 0x39, 0xe8, 0xdb, 0x35, 0xa9, 0x0d, 0x6f, 0x3b, + 0x77, 0x76, 0x5d, 0x56, 0x3f, 0xfb, 0x1d, 0x29, 0x85, 0xd6, 0x2b, 0xb0, 0x4a, 0x57, 0x89, 0x10, + 0x54, 0x4b, 0xcf, 0xaa, 0xe2, 0xce, 0x2f, 0x03, 0x5e, 0x13, 0xb6, 0x75, 0xbd, 0x1d, 0xab, 0xab, + 0xc2, 0x40, 0x36, 0x03, 0xe3, 0x4b, 0x2f, 0x21, 0xe2, 0x21, 0x1f, 0x4b, 0x81, 0xab, 0x7d, 0x6d, + 0x42, 0x33, 0xc1, 0xf3, 0x14, 0x53, 0x11, 0x0b, 0xc2, 0xa8, 0xbb, 0x41, 0xb6, 0xf5, 0x9f, 0x26, + 0xc1, 0xb4, 0x9d, 0x3c, 0xfa, 0xe1, 0xfc, 0xa9, 0x34, 0x07, 0x73, 0x4c, 0xbb, 0x7a, 0xb8, 0xe2, + 0x3b, 0x9e, 0x1a, 0xae, 0x27, 0x3a, 0xa3, 0x93, 0xf1, 0xae, 0x02, 0x9c, 0xfd, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0xe3, 0x53, 0x74, 0x5e, 0xbe, 0x04, 0x00, 0x00, +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go new file mode 100644 index 000000000..5f222b473 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go @@ -0,0 +1,275 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/agent/metrics/v1/metrics_service.proto + +package v1 + +import ( + context "context" + fmt "fmt" + v1 "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1" + v11 "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + v12 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type ExportMetricsServiceRequest struct { + // This is required only in the first message on the stream or if the + // previous sent ExportMetricsServiceRequest message has a different Node (e.g. + // when the same RPC is used to send Metrics from multiple Applications). + Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // A list of metrics that belong to the last received Node. + Metrics []*v11.Metric `protobuf:"bytes,2,rep,name=metrics,proto3" json:"metrics,omitempty"` + // The resource for the metrics in this message that do not have an explicit + // resource set. + // If unset, the most recently set resource in the RPC stream applies. It is + // valid to never be set within a stream, e.g. when no resource info is known + // at all or when all sent metrics have an explicit resource set. + Resource *v12.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExportMetricsServiceRequest) Reset() { *m = ExportMetricsServiceRequest{} } +func (m *ExportMetricsServiceRequest) String() string { return proto.CompactTextString(m) } +func (*ExportMetricsServiceRequest) ProtoMessage() {} +func (*ExportMetricsServiceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_47e253a956287d04, []int{0} +} + +func (m *ExportMetricsServiceRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExportMetricsServiceRequest.Unmarshal(m, b) +} +func (m *ExportMetricsServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExportMetricsServiceRequest.Marshal(b, m, deterministic) +} +func (m *ExportMetricsServiceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExportMetricsServiceRequest.Merge(m, src) +} +func (m *ExportMetricsServiceRequest) XXX_Size() int { + return xxx_messageInfo_ExportMetricsServiceRequest.Size(m) +} +func (m *ExportMetricsServiceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ExportMetricsServiceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ExportMetricsServiceRequest proto.InternalMessageInfo + +func (m *ExportMetricsServiceRequest) GetNode() *v1.Node { + if m != nil { + return m.Node + } + return nil +} + +func (m *ExportMetricsServiceRequest) GetMetrics() []*v11.Metric { + if m != nil { + return m.Metrics + } + return nil +} + +func (m *ExportMetricsServiceRequest) GetResource() *v12.Resource { + if m != nil { + return m.Resource + } + return nil +} + +type ExportMetricsServiceResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExportMetricsServiceResponse) Reset() { *m = ExportMetricsServiceResponse{} } +func (m *ExportMetricsServiceResponse) String() string { return proto.CompactTextString(m) } +func (*ExportMetricsServiceResponse) ProtoMessage() {} +func (*ExportMetricsServiceResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_47e253a956287d04, []int{1} +} + +func (m *ExportMetricsServiceResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExportMetricsServiceResponse.Unmarshal(m, b) +} +func (m *ExportMetricsServiceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExportMetricsServiceResponse.Marshal(b, m, deterministic) +} +func (m *ExportMetricsServiceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExportMetricsServiceResponse.Merge(m, src) +} +func (m *ExportMetricsServiceResponse) XXX_Size() int { + return xxx_messageInfo_ExportMetricsServiceResponse.Size(m) +} +func (m *ExportMetricsServiceResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ExportMetricsServiceResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ExportMetricsServiceResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*ExportMetricsServiceRequest)(nil), "opencensus.proto.agent.metrics.v1.ExportMetricsServiceRequest") + proto.RegisterType((*ExportMetricsServiceResponse)(nil), "opencensus.proto.agent.metrics.v1.ExportMetricsServiceResponse") +} + +func init() { + proto.RegisterFile("opencensus/proto/agent/metrics/v1/metrics_service.proto", fileDescriptor_47e253a956287d04) +} + +var fileDescriptor_47e253a956287d04 = []byte{ + // 361 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0x41, 0x4a, 0xc3, 0x40, + 0x14, 0x86, 0x9d, 0x56, 0xaa, 0x4c, 0xc1, 0x45, 0xdc, 0x94, 0x2a, 0xd2, 0x56, 0x91, 0x8a, 0x64, + 0x62, 0xea, 0x42, 0x10, 0x54, 0xac, 0xb8, 0x11, 0xd4, 0x12, 0xc1, 0x85, 0x1b, 0x69, 0xd3, 0x47, + 0xcc, 0x22, 0x33, 0x71, 0x66, 0x12, 0xbc, 0x85, 0x77, 0x70, 0xef, 0x8d, 0x3c, 0x81, 0xa7, 0x90, + 0xe4, 0x4d, 0x5a, 0x4a, 0x8c, 0x05, 0x77, 0x8f, 0xe4, 0xff, 0xfe, 0xf7, 0xff, 0x33, 0x43, 0x4f, + 0x44, 0x0c, 0xdc, 0x07, 0xae, 0x12, 0xe5, 0xc4, 0x52, 0x68, 0xe1, 0x8c, 0x03, 0xe0, 0xda, 0x89, + 0x40, 0xcb, 0xd0, 0x57, 0x4e, 0xea, 0x16, 0xe3, 0xb3, 0x02, 0x99, 0x86, 0x3e, 0xb0, 0x5c, 0x66, + 0x75, 0xe7, 0x20, 0x7e, 0x61, 0x39, 0xc8, 0x8c, 0x9a, 0xa5, 0x6e, 0xdb, 0xae, 0xf0, 0xf6, 0x45, + 0x14, 0x09, 0x9e, 0x59, 0xe3, 0x84, 0x7c, 0xfb, 0xa0, 0x24, 0x2f, 0x87, 0x30, 0xd2, 0xc3, 0x92, + 0x54, 0x82, 0x12, 0x89, 0xf4, 0x21, 0xd3, 0x16, 0x33, 0x8a, 0x7b, 0x5f, 0x84, 0x6e, 0x5d, 0xbf, + 0xc5, 0x42, 0xea, 0x5b, 0x34, 0x79, 0xc0, 0x22, 0x1e, 0xbc, 0x26, 0xa0, 0xb4, 0x75, 0x4a, 0x57, + 0xb9, 0x98, 0x42, 0x8b, 0x74, 0x48, 0xbf, 0x39, 0xd8, 0x67, 0x15, 0xc5, 0x4c, 0xd6, 0xd4, 0x65, + 0x77, 0x62, 0x0a, 0x5e, 0xce, 0x58, 0x67, 0x74, 0xcd, 0x24, 0x6b, 0xd5, 0x3a, 0xf5, 0x7e, 0x73, + 0xb0, 0x5b, 0xc6, 0xe7, 0x27, 0xc2, 0x30, 0x80, 0x57, 0x30, 0xd6, 0x90, 0xae, 0x17, 0x61, 0x5b, + 0xf5, 0xaa, 0xf5, 0xb3, 0x3a, 0xa9, 0xcb, 0x3c, 0x33, 0x7b, 0x33, 0xae, 0xb7, 0x43, 0xb7, 0x7f, + 0x6f, 0xa7, 0x62, 0xc1, 0x15, 0x0c, 0x3e, 0x08, 0xdd, 0x58, 0xfc, 0x65, 0xbd, 0x13, 0xda, 0x40, + 0xc6, 0x3a, 0x67, 0x4b, 0xef, 0x91, 0xfd, 0x71, 0x78, 0xed, 0x8b, 0x7f, 0xf3, 0x18, 0xaf, 0xb7, + 0xd2, 0x27, 0x47, 0x64, 0xf8, 0x49, 0xe8, 0x5e, 0x28, 0x96, 0x7b, 0x0d, 0x37, 0x17, 0x6d, 0x46, + 0x99, 0x6a, 0x44, 0x9e, 0x6e, 0x82, 0x50, 0xbf, 0x24, 0x93, 0xec, 0x92, 0x1c, 0x34, 0xb0, 0x43, + 0xae, 0xb4, 0x4c, 0x22, 0xe0, 0x7a, 0xac, 0x43, 0xc1, 0x9d, 0xb9, 0xb7, 0x8d, 0x4f, 0x26, 0x00, + 0x6e, 0x07, 0xe5, 0xf7, 0xfe, 0x5d, 0xeb, 0xde, 0xc7, 0xc0, 0xaf, 0x30, 0x46, 0xbe, 0x80, 0x5d, + 0xe6, 0x31, 0xcc, 0x6a, 0xf6, 0xe8, 0x4e, 0x1a, 0xb9, 0xc5, 0xf1, 0x4f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x19, 0x28, 0xa4, 0x50, 0x3f, 0x03, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MetricsServiceClient is the client API for MetricsService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MetricsServiceClient interface { + // For performance reasons, it is recommended to keep this RPC + // alive for the entire life of the application. + Export(ctx context.Context, opts ...grpc.CallOption) (MetricsService_ExportClient, error) +} + +type metricsServiceClient struct { + cc *grpc.ClientConn +} + +func NewMetricsServiceClient(cc *grpc.ClientConn) MetricsServiceClient { + return &metricsServiceClient{cc} +} + +func (c *metricsServiceClient) Export(ctx context.Context, opts ...grpc.CallOption) (MetricsService_ExportClient, error) { + stream, err := c.cc.NewStream(ctx, &_MetricsService_serviceDesc.Streams[0], "/opencensus.proto.agent.metrics.v1.MetricsService/Export", opts...) + if err != nil { + return nil, err + } + x := &metricsServiceExportClient{stream} + return x, nil +} + +type MetricsService_ExportClient interface { + Send(*ExportMetricsServiceRequest) error + Recv() (*ExportMetricsServiceResponse, error) + grpc.ClientStream +} + +type metricsServiceExportClient struct { + grpc.ClientStream +} + +func (x *metricsServiceExportClient) Send(m *ExportMetricsServiceRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *metricsServiceExportClient) Recv() (*ExportMetricsServiceResponse, error) { + m := new(ExportMetricsServiceResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// MetricsServiceServer is the server API for MetricsService service. +type MetricsServiceServer interface { + // For performance reasons, it is recommended to keep this RPC + // alive for the entire life of the application. + Export(MetricsService_ExportServer) error +} + +// UnimplementedMetricsServiceServer can be embedded to have forward compatible implementations. +type UnimplementedMetricsServiceServer struct { +} + +func (*UnimplementedMetricsServiceServer) Export(srv MetricsService_ExportServer) error { + return status.Errorf(codes.Unimplemented, "method Export not implemented") +} + +func RegisterMetricsServiceServer(s *grpc.Server, srv MetricsServiceServer) { + s.RegisterService(&_MetricsService_serviceDesc, srv) +} + +func _MetricsService_Export_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(MetricsServiceServer).Export(&metricsServiceExportServer{stream}) +} + +type MetricsService_ExportServer interface { + Send(*ExportMetricsServiceResponse) error + Recv() (*ExportMetricsServiceRequest, error) + grpc.ServerStream +} + +type metricsServiceExportServer struct { + grpc.ServerStream +} + +func (x *metricsServiceExportServer) Send(m *ExportMetricsServiceResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *metricsServiceExportServer) Recv() (*ExportMetricsServiceRequest, error) { + m := new(ExportMetricsServiceRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _MetricsService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "opencensus.proto.agent.metrics.v1.MetricsService", + HandlerType: (*MetricsServiceServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Export", + Handler: _MetricsService_Export_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "opencensus/proto/agent/metrics/v1/metrics_service.proto", +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go new file mode 100644 index 000000000..158c16089 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go @@ -0,0 +1,150 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: opencensus/proto/agent/metrics/v1/metrics_service.proto + +/* +Package v1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package v1 + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray + +func request_MetricsService_Export_0(ctx context.Context, marshaler runtime.Marshaler, client MetricsServiceClient, req *http.Request, pathParams map[string]string) (MetricsService_ExportClient, runtime.ServerMetadata, error) { + var metadata runtime.ServerMetadata + stream, err := client.Export(ctx) + if err != nil { + grpclog.Infof("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + handleSend := func() error { + var protoReq ExportMetricsServiceRequest + err := dec.Decode(&protoReq) + if err == io.EOF { + return err + } + if err != nil { + grpclog.Infof("Failed to decode request: %v", err) + return err + } + if err := stream.Send(&protoReq); err != nil { + grpclog.Infof("Failed to send request: %v", err) + return err + } + return nil + } + if err := handleSend(); err != nil { + if cerr := stream.CloseSend(); cerr != nil { + grpclog.Infof("Failed to terminate client stream: %v", cerr) + } + if err == io.EOF { + return stream, metadata, nil + } + return nil, metadata, err + } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Infof("Failed to terminate client stream: %v", err) + } + }() + header, err := stream.Header() + if err != nil { + grpclog.Infof("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil +} + +// RegisterMetricsServiceHandlerFromEndpoint is same as RegisterMetricsServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterMetricsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterMetricsServiceHandler(ctx, mux, conn) +} + +// RegisterMetricsServiceHandler registers the http handlers for service MetricsService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterMetricsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterMetricsServiceHandlerClient(ctx, mux, NewMetricsServiceClient(conn)) +} + +// RegisterMetricsServiceHandlerClient registers the http handlers for service MetricsService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MetricsServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MetricsServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "MetricsServiceClient" to call the correct interceptors. +func RegisterMetricsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MetricsServiceClient) error { + + mux.Handle("POST", pattern_MetricsService_Export_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MetricsService_Export_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_MetricsService_Export_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_MetricsService_Export_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "metrics"}, "")) +) + +var ( + forward_MetricsService_Export_0 = runtime.ForwardResponseStream +) diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go new file mode 100644 index 000000000..a0a3504dd --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go @@ -0,0 +1,457 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/agent/trace/v1/trace_service.proto + +package v1 + +import ( + context "context" + fmt "fmt" + v1 "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1" + v12 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + v11 "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type CurrentLibraryConfig struct { + // This is required only in the first message on the stream or if the + // previous sent CurrentLibraryConfig message has a different Node (e.g. + // when the same RPC is used to configure multiple Applications). + Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // Current configuration. + Config *v11.TraceConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CurrentLibraryConfig) Reset() { *m = CurrentLibraryConfig{} } +func (m *CurrentLibraryConfig) String() string { return proto.CompactTextString(m) } +func (*CurrentLibraryConfig) ProtoMessage() {} +func (*CurrentLibraryConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_7027f99caf7ac6a5, []int{0} +} + +func (m *CurrentLibraryConfig) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CurrentLibraryConfig.Unmarshal(m, b) +} +func (m *CurrentLibraryConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CurrentLibraryConfig.Marshal(b, m, deterministic) +} +func (m *CurrentLibraryConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_CurrentLibraryConfig.Merge(m, src) +} +func (m *CurrentLibraryConfig) XXX_Size() int { + return xxx_messageInfo_CurrentLibraryConfig.Size(m) +} +func (m *CurrentLibraryConfig) XXX_DiscardUnknown() { + xxx_messageInfo_CurrentLibraryConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_CurrentLibraryConfig proto.InternalMessageInfo + +func (m *CurrentLibraryConfig) GetNode() *v1.Node { + if m != nil { + return m.Node + } + return nil +} + +func (m *CurrentLibraryConfig) GetConfig() *v11.TraceConfig { + if m != nil { + return m.Config + } + return nil +} + +type UpdatedLibraryConfig struct { + // This field is ignored when the RPC is used to configure only one Application. + // This is required only in the first message on the stream or if the + // previous sent UpdatedLibraryConfig message has a different Node. + Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // Requested updated configuration. + Config *v11.TraceConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UpdatedLibraryConfig) Reset() { *m = UpdatedLibraryConfig{} } +func (m *UpdatedLibraryConfig) String() string { return proto.CompactTextString(m) } +func (*UpdatedLibraryConfig) ProtoMessage() {} +func (*UpdatedLibraryConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_7027f99caf7ac6a5, []int{1} +} + +func (m *UpdatedLibraryConfig) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UpdatedLibraryConfig.Unmarshal(m, b) +} +func (m *UpdatedLibraryConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UpdatedLibraryConfig.Marshal(b, m, deterministic) +} +func (m *UpdatedLibraryConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdatedLibraryConfig.Merge(m, src) +} +func (m *UpdatedLibraryConfig) XXX_Size() int { + return xxx_messageInfo_UpdatedLibraryConfig.Size(m) +} +func (m *UpdatedLibraryConfig) XXX_DiscardUnknown() { + xxx_messageInfo_UpdatedLibraryConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_UpdatedLibraryConfig proto.InternalMessageInfo + +func (m *UpdatedLibraryConfig) GetNode() *v1.Node { + if m != nil { + return m.Node + } + return nil +} + +func (m *UpdatedLibraryConfig) GetConfig() *v11.TraceConfig { + if m != nil { + return m.Config + } + return nil +} + +type ExportTraceServiceRequest struct { + // This is required only in the first message on the stream or if the + // previous sent ExportTraceServiceRequest message has a different Node (e.g. + // when the same RPC is used to send Spans from multiple Applications). + Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // A list of Spans that belong to the last received Node. + Spans []*v11.Span `protobuf:"bytes,2,rep,name=spans,proto3" json:"spans,omitempty"` + // The resource for the spans in this message that do not have an explicit + // resource set. + // If unset, the most recently set resource in the RPC stream applies. It is + // valid to never be set within a stream, e.g. when no resource info is known. + Resource *v12.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExportTraceServiceRequest) Reset() { *m = ExportTraceServiceRequest{} } +func (m *ExportTraceServiceRequest) String() string { return proto.CompactTextString(m) } +func (*ExportTraceServiceRequest) ProtoMessage() {} +func (*ExportTraceServiceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_7027f99caf7ac6a5, []int{2} +} + +func (m *ExportTraceServiceRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExportTraceServiceRequest.Unmarshal(m, b) +} +func (m *ExportTraceServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExportTraceServiceRequest.Marshal(b, m, deterministic) +} +func (m *ExportTraceServiceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExportTraceServiceRequest.Merge(m, src) +} +func (m *ExportTraceServiceRequest) XXX_Size() int { + return xxx_messageInfo_ExportTraceServiceRequest.Size(m) +} +func (m *ExportTraceServiceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ExportTraceServiceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ExportTraceServiceRequest proto.InternalMessageInfo + +func (m *ExportTraceServiceRequest) GetNode() *v1.Node { + if m != nil { + return m.Node + } + return nil +} + +func (m *ExportTraceServiceRequest) GetSpans() []*v11.Span { + if m != nil { + return m.Spans + } + return nil +} + +func (m *ExportTraceServiceRequest) GetResource() *v12.Resource { + if m != nil { + return m.Resource + } + return nil +} + +type ExportTraceServiceResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExportTraceServiceResponse) Reset() { *m = ExportTraceServiceResponse{} } +func (m *ExportTraceServiceResponse) String() string { return proto.CompactTextString(m) } +func (*ExportTraceServiceResponse) ProtoMessage() {} +func (*ExportTraceServiceResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_7027f99caf7ac6a5, []int{3} +} + +func (m *ExportTraceServiceResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExportTraceServiceResponse.Unmarshal(m, b) +} +func (m *ExportTraceServiceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExportTraceServiceResponse.Marshal(b, m, deterministic) +} +func (m *ExportTraceServiceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExportTraceServiceResponse.Merge(m, src) +} +func (m *ExportTraceServiceResponse) XXX_Size() int { + return xxx_messageInfo_ExportTraceServiceResponse.Size(m) +} +func (m *ExportTraceServiceResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ExportTraceServiceResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ExportTraceServiceResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*CurrentLibraryConfig)(nil), "opencensus.proto.agent.trace.v1.CurrentLibraryConfig") + proto.RegisterType((*UpdatedLibraryConfig)(nil), "opencensus.proto.agent.trace.v1.UpdatedLibraryConfig") + proto.RegisterType((*ExportTraceServiceRequest)(nil), "opencensus.proto.agent.trace.v1.ExportTraceServiceRequest") + proto.RegisterType((*ExportTraceServiceResponse)(nil), "opencensus.proto.agent.trace.v1.ExportTraceServiceResponse") +} + +func init() { + proto.RegisterFile("opencensus/proto/agent/trace/v1/trace_service.proto", fileDescriptor_7027f99caf7ac6a5) +} + +var fileDescriptor_7027f99caf7ac6a5 = []byte{ + // 442 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0xcf, 0xaa, 0xd4, 0x30, + 0x14, 0xc6, 0x4d, 0xaf, 0x16, 0xc9, 0x75, 0x63, 0x71, 0x51, 0x8b, 0x30, 0x97, 0x82, 0x32, 0xa0, + 0x4d, 0xed, 0x5c, 0xee, 0xe6, 0x0a, 0x82, 0x33, 0x08, 0x2e, 0x44, 0x2f, 0x1d, 0x75, 0xe1, 0x66, + 0xe8, 0xb4, 0xc7, 0xda, 0xc5, 0x24, 0x31, 0x49, 0x8b, 0x82, 0x7b, 0xf7, 0x2e, 0x7c, 0x03, 0x5f, + 0xc8, 0xc7, 0xf0, 0x29, 0xa4, 0x39, 0x9d, 0x3f, 0x3a, 0x53, 0x0b, 0xba, 0xb9, 0xbb, 0x43, 0xf3, + 0xfd, 0xbe, 0xf3, 0x25, 0x39, 0x29, 0x3d, 0x15, 0x12, 0x78, 0x0e, 0x5c, 0xd7, 0x3a, 0x96, 0x4a, + 0x18, 0x11, 0x67, 0x25, 0x70, 0x13, 0x1b, 0x95, 0xe5, 0x10, 0x37, 0x09, 0x16, 0x0b, 0x0d, 0xaa, + 0xa9, 0x72, 0x60, 0x56, 0xe2, 0x8d, 0xb6, 0x10, 0x7e, 0x61, 0x16, 0x62, 0x56, 0xcb, 0x9a, 0x24, + 0x88, 0x7a, 0x5c, 0x73, 0xb1, 0x5a, 0x09, 0xde, 0xda, 0x62, 0x85, 0x74, 0x70, 0x7f, 0x4f, 0xae, + 0x40, 0x8b, 0x5a, 0x61, 0x82, 0x75, 0xdd, 0x89, 0xef, 0xee, 0x89, 0x7f, 0xcf, 0xda, 0xc9, 0x1e, + 0x0c, 0xc8, 0x16, 0xb9, 0xe0, 0xef, 0xaa, 0x12, 0xd5, 0xe1, 0x57, 0x42, 0x6f, 0xcd, 0x6a, 0xa5, + 0x80, 0x9b, 0xe7, 0xd5, 0x52, 0x65, 0xea, 0xd3, 0xcc, 0x2e, 0x7b, 0xe7, 0xf4, 0x2a, 0x17, 0x05, + 0xf8, 0xe4, 0x84, 0x8c, 0x8f, 0x27, 0xf7, 0x58, 0xcf, 0xce, 0xbb, 0xed, 0x34, 0x09, 0x7b, 0x21, + 0x0a, 0x48, 0x2d, 0xe3, 0x3d, 0xa6, 0x2e, 0x36, 0xf1, 0x9d, 0x3e, 0x7a, 0x7d, 0x62, 0xec, 0x55, + 0x5b, 0x60, 0xcf, 0xb4, 0xa3, 0x6c, 0xa8, 0xd7, 0xb2, 0xc8, 0x0c, 0x14, 0x97, 0x27, 0xd4, 0x0f, + 0x42, 0x6f, 0x3f, 0xfd, 0x28, 0x85, 0x32, 0x76, 0x75, 0x8e, 0x83, 0x91, 0xc2, 0x87, 0x1a, 0xb4, + 0xf9, 0xaf, 0x64, 0x67, 0xf4, 0x9a, 0x96, 0x19, 0xd7, 0xbe, 0x73, 0x72, 0x34, 0x3e, 0x9e, 0x8c, + 0xfe, 0x12, 0x6c, 0x2e, 0x33, 0x9e, 0xa2, 0xda, 0x9b, 0xd2, 0xeb, 0xeb, 0x09, 0xf1, 0x8f, 0xfa, + 0xda, 0x6e, 0x66, 0xa8, 0x49, 0x58, 0xda, 0xd5, 0xe9, 0x86, 0x0b, 0xef, 0xd0, 0xe0, 0xd0, 0x9e, + 0xb4, 0x14, 0x5c, 0xc3, 0xe4, 0x9b, 0x43, 0x6f, 0xec, 0x2e, 0x78, 0x9f, 0xa9, 0xdb, 0xdd, 0xc4, + 0x19, 0x1b, 0x78, 0x0a, 0xec, 0xd0, 0x54, 0x05, 0xc3, 0xd8, 0xa1, 0x7b, 0x0f, 0xaf, 0x8c, 0xc9, + 0x43, 0xe2, 0x7d, 0x21, 0xd4, 0xc5, 0xb4, 0xde, 0xf9, 0xa0, 0x4f, 0xef, 0x55, 0x05, 0x8f, 0xfe, + 0x89, 0xc5, 0x23, 0xc1, 0x24, 0xd3, 0xef, 0x84, 0x86, 0x95, 0x18, 0xf2, 0x99, 0xde, 0xdc, 0xb5, + 0xb8, 0x68, 0x15, 0x17, 0xe4, 0xed, 0xb3, 0xb2, 0x32, 0xef, 0xeb, 0x65, 0x3b, 0x0a, 0x31, 0xc2, + 0x51, 0xc5, 0xb5, 0x51, 0xf5, 0x0a, 0xb8, 0xc9, 0x4c, 0x25, 0x78, 0xbc, 0xf5, 0x8d, 0xf0, 0x05, + 0x97, 0xc0, 0xa3, 0xf2, 0xcf, 0x3f, 0xd4, 0x4f, 0x67, 0xf4, 0x52, 0x02, 0x9f, 0x61, 0x00, 0x6b, + 0xcf, 0x9e, 0xd8, 0x00, 0xb6, 0x2d, 0x7b, 0x93, 0x2c, 0x5d, 0x8b, 0x9f, 0xfe, 0x0a, 0x00, 0x00, + 0xff, 0xff, 0x65, 0x76, 0xd7, 0xb9, 0xed, 0x04, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// TraceServiceClient is the client API for TraceService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type TraceServiceClient interface { + // After initialization, this RPC must be kept alive for the entire life of + // the application. The agent pushes configs down to applications via a + // stream. + Config(ctx context.Context, opts ...grpc.CallOption) (TraceService_ConfigClient, error) + // For performance reasons, it is recommended to keep this RPC + // alive for the entire life of the application. + Export(ctx context.Context, opts ...grpc.CallOption) (TraceService_ExportClient, error) +} + +type traceServiceClient struct { + cc *grpc.ClientConn +} + +func NewTraceServiceClient(cc *grpc.ClientConn) TraceServiceClient { + return &traceServiceClient{cc} +} + +func (c *traceServiceClient) Config(ctx context.Context, opts ...grpc.CallOption) (TraceService_ConfigClient, error) { + stream, err := c.cc.NewStream(ctx, &_TraceService_serviceDesc.Streams[0], "/opencensus.proto.agent.trace.v1.TraceService/Config", opts...) + if err != nil { + return nil, err + } + x := &traceServiceConfigClient{stream} + return x, nil +} + +type TraceService_ConfigClient interface { + Send(*CurrentLibraryConfig) error + Recv() (*UpdatedLibraryConfig, error) + grpc.ClientStream +} + +type traceServiceConfigClient struct { + grpc.ClientStream +} + +func (x *traceServiceConfigClient) Send(m *CurrentLibraryConfig) error { + return x.ClientStream.SendMsg(m) +} + +func (x *traceServiceConfigClient) Recv() (*UpdatedLibraryConfig, error) { + m := new(UpdatedLibraryConfig) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *traceServiceClient) Export(ctx context.Context, opts ...grpc.CallOption) (TraceService_ExportClient, error) { + stream, err := c.cc.NewStream(ctx, &_TraceService_serviceDesc.Streams[1], "/opencensus.proto.agent.trace.v1.TraceService/Export", opts...) + if err != nil { + return nil, err + } + x := &traceServiceExportClient{stream} + return x, nil +} + +type TraceService_ExportClient interface { + Send(*ExportTraceServiceRequest) error + Recv() (*ExportTraceServiceResponse, error) + grpc.ClientStream +} + +type traceServiceExportClient struct { + grpc.ClientStream +} + +func (x *traceServiceExportClient) Send(m *ExportTraceServiceRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *traceServiceExportClient) Recv() (*ExportTraceServiceResponse, error) { + m := new(ExportTraceServiceResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// TraceServiceServer is the server API for TraceService service. +type TraceServiceServer interface { + // After initialization, this RPC must be kept alive for the entire life of + // the application. The agent pushes configs down to applications via a + // stream. + Config(TraceService_ConfigServer) error + // For performance reasons, it is recommended to keep this RPC + // alive for the entire life of the application. + Export(TraceService_ExportServer) error +} + +// UnimplementedTraceServiceServer can be embedded to have forward compatible implementations. +type UnimplementedTraceServiceServer struct { +} + +func (*UnimplementedTraceServiceServer) Config(srv TraceService_ConfigServer) error { + return status.Errorf(codes.Unimplemented, "method Config not implemented") +} +func (*UnimplementedTraceServiceServer) Export(srv TraceService_ExportServer) error { + return status.Errorf(codes.Unimplemented, "method Export not implemented") +} + +func RegisterTraceServiceServer(s *grpc.Server, srv TraceServiceServer) { + s.RegisterService(&_TraceService_serviceDesc, srv) +} + +func _TraceService_Config_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(TraceServiceServer).Config(&traceServiceConfigServer{stream}) +} + +type TraceService_ConfigServer interface { + Send(*UpdatedLibraryConfig) error + Recv() (*CurrentLibraryConfig, error) + grpc.ServerStream +} + +type traceServiceConfigServer struct { + grpc.ServerStream +} + +func (x *traceServiceConfigServer) Send(m *UpdatedLibraryConfig) error { + return x.ServerStream.SendMsg(m) +} + +func (x *traceServiceConfigServer) Recv() (*CurrentLibraryConfig, error) { + m := new(CurrentLibraryConfig) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _TraceService_Export_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(TraceServiceServer).Export(&traceServiceExportServer{stream}) +} + +type TraceService_ExportServer interface { + Send(*ExportTraceServiceResponse) error + Recv() (*ExportTraceServiceRequest, error) + grpc.ServerStream +} + +type traceServiceExportServer struct { + grpc.ServerStream +} + +func (x *traceServiceExportServer) Send(m *ExportTraceServiceResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *traceServiceExportServer) Recv() (*ExportTraceServiceRequest, error) { + m := new(ExportTraceServiceRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _TraceService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "opencensus.proto.agent.trace.v1.TraceService", + HandlerType: (*TraceServiceServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Config", + Handler: _TraceService_Config_Handler, + ServerStreams: true, + ClientStreams: true, + }, + { + StreamName: "Export", + Handler: _TraceService_Export_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "opencensus/proto/agent/trace/v1/trace_service.proto", +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go new file mode 100644 index 000000000..334331b0d --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go @@ -0,0 +1,150 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: opencensus/proto/agent/trace/v1/trace_service.proto + +/* +Package v1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package v1 + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray + +func request_TraceService_Export_0(ctx context.Context, marshaler runtime.Marshaler, client TraceServiceClient, req *http.Request, pathParams map[string]string) (TraceService_ExportClient, runtime.ServerMetadata, error) { + var metadata runtime.ServerMetadata + stream, err := client.Export(ctx) + if err != nil { + grpclog.Infof("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + handleSend := func() error { + var protoReq ExportTraceServiceRequest + err := dec.Decode(&protoReq) + if err == io.EOF { + return err + } + if err != nil { + grpclog.Infof("Failed to decode request: %v", err) + return err + } + if err := stream.Send(&protoReq); err != nil { + grpclog.Infof("Failed to send request: %v", err) + return err + } + return nil + } + if err := handleSend(); err != nil { + if cerr := stream.CloseSend(); cerr != nil { + grpclog.Infof("Failed to terminate client stream: %v", cerr) + } + if err == io.EOF { + return stream, metadata, nil + } + return nil, metadata, err + } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Infof("Failed to terminate client stream: %v", err) + } + }() + header, err := stream.Header() + if err != nil { + grpclog.Infof("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil +} + +// RegisterTraceServiceHandlerFromEndpoint is same as RegisterTraceServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterTraceServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterTraceServiceHandler(ctx, mux, conn) +} + +// RegisterTraceServiceHandler registers the http handlers for service TraceService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterTraceServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterTraceServiceHandlerClient(ctx, mux, NewTraceServiceClient(conn)) +} + +// RegisterTraceServiceHandlerClient registers the http handlers for service TraceService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "TraceServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "TraceServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "TraceServiceClient" to call the correct interceptors. +func RegisterTraceServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client TraceServiceClient) error { + + mux.Handle("POST", pattern_TraceService_Export_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TraceService_Export_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TraceService_Export_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_TraceService_Export_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "trace"}, "")) +) + +var ( + forward_TraceService_Export_0 = runtime.ForwardResponseStream +) diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go new file mode 100644 index 000000000..466b23428 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go @@ -0,0 +1,1127 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/metrics/v1/metrics.proto + +package v1 + +import ( + fmt "fmt" + v1 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + wrappers "github.com/golang/protobuf/ptypes/wrappers" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// The kind of metric. It describes how the data is reported. +// +// A gauge is an instantaneous measurement of a value. +// +// A cumulative measurement is a value accumulated over a time interval. In +// a time series, cumulative measurements should have the same start time, +// increasing values and increasing end times, until an event resets the +// cumulative value to zero and sets a new start time for the following +// points. +type MetricDescriptor_Type int32 + +const ( + // Do not use this default value. + MetricDescriptor_UNSPECIFIED MetricDescriptor_Type = 0 + // Integer gauge. The value can go both up and down. + MetricDescriptor_GAUGE_INT64 MetricDescriptor_Type = 1 + // Floating point gauge. The value can go both up and down. + MetricDescriptor_GAUGE_DOUBLE MetricDescriptor_Type = 2 + // Distribution gauge measurement. The count and sum can go both up and + // down. Recorded values are always >= 0. + // Used in scenarios like a snapshot of time the current items in a queue + // have spent there. + MetricDescriptor_GAUGE_DISTRIBUTION MetricDescriptor_Type = 3 + // Integer cumulative measurement. The value cannot decrease, if resets + // then the start_time should also be reset. + MetricDescriptor_CUMULATIVE_INT64 MetricDescriptor_Type = 4 + // Floating point cumulative measurement. The value cannot decrease, if + // resets then the start_time should also be reset. Recorded values are + // always >= 0. + MetricDescriptor_CUMULATIVE_DOUBLE MetricDescriptor_Type = 5 + // Distribution cumulative measurement. The count and sum cannot decrease, + // if resets then the start_time should also be reset. + MetricDescriptor_CUMULATIVE_DISTRIBUTION MetricDescriptor_Type = 6 + // Some frameworks implemented Histograms as a summary of observations + // (usually things like request durations and response sizes). While it + // also provides a total count of observations and a sum of all observed + // values, it calculates configurable percentiles over a sliding time + // window. This is not recommended, since it cannot be aggregated. + MetricDescriptor_SUMMARY MetricDescriptor_Type = 7 +) + +var MetricDescriptor_Type_name = map[int32]string{ + 0: "UNSPECIFIED", + 1: "GAUGE_INT64", + 2: "GAUGE_DOUBLE", + 3: "GAUGE_DISTRIBUTION", + 4: "CUMULATIVE_INT64", + 5: "CUMULATIVE_DOUBLE", + 6: "CUMULATIVE_DISTRIBUTION", + 7: "SUMMARY", +} + +var MetricDescriptor_Type_value = map[string]int32{ + "UNSPECIFIED": 0, + "GAUGE_INT64": 1, + "GAUGE_DOUBLE": 2, + "GAUGE_DISTRIBUTION": 3, + "CUMULATIVE_INT64": 4, + "CUMULATIVE_DOUBLE": 5, + "CUMULATIVE_DISTRIBUTION": 6, + "SUMMARY": 7, +} + +func (x MetricDescriptor_Type) String() string { + return proto.EnumName(MetricDescriptor_Type_name, int32(x)) +} + +func (MetricDescriptor_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{1, 0} +} + +// Defines a Metric which has one or more timeseries. +type Metric struct { + // The descriptor of the Metric. + // TODO(issue #152): consider only sending the name of descriptor for + // optimization. + MetricDescriptor *MetricDescriptor `protobuf:"bytes,1,opt,name=metric_descriptor,json=metricDescriptor,proto3" json:"metric_descriptor,omitempty"` + // One or more timeseries for a single metric, where each timeseries has + // one or more points. + Timeseries []*TimeSeries `protobuf:"bytes,2,rep,name=timeseries,proto3" json:"timeseries,omitempty"` + // The resource for the metric. If unset, it may be set to a default value + // provided for a sequence of messages in an RPC stream. + Resource *v1.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} +func (*Metric) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{0} +} + +func (m *Metric) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metric.Unmarshal(m, b) +} +func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metric.Marshal(b, m, deterministic) +} +func (m *Metric) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metric.Merge(m, src) +} +func (m *Metric) XXX_Size() int { + return xxx_messageInfo_Metric.Size(m) +} +func (m *Metric) XXX_DiscardUnknown() { + xxx_messageInfo_Metric.DiscardUnknown(m) +} + +var xxx_messageInfo_Metric proto.InternalMessageInfo + +func (m *Metric) GetMetricDescriptor() *MetricDescriptor { + if m != nil { + return m.MetricDescriptor + } + return nil +} + +func (m *Metric) GetTimeseries() []*TimeSeries { + if m != nil { + return m.Timeseries + } + return nil +} + +func (m *Metric) GetResource() *v1.Resource { + if m != nil { + return m.Resource + } + return nil +} + +// Defines a metric type and its schema. +type MetricDescriptor struct { + // The metric type, including its DNS name prefix. It must be unique. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A detailed description of the metric, which can be used in documentation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // The unit in which the metric value is reported. Follows the format + // described by http://unitsofmeasure.org/ucum.html. + Unit string `protobuf:"bytes,3,opt,name=unit,proto3" json:"unit,omitempty"` + Type MetricDescriptor_Type `protobuf:"varint,4,opt,name=type,proto3,enum=opencensus.proto.metrics.v1.MetricDescriptor_Type" json:"type,omitempty"` + // The label keys associated with the metric descriptor. + LabelKeys []*LabelKey `protobuf:"bytes,5,rep,name=label_keys,json=labelKeys,proto3" json:"label_keys,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MetricDescriptor) Reset() { *m = MetricDescriptor{} } +func (m *MetricDescriptor) String() string { return proto.CompactTextString(m) } +func (*MetricDescriptor) ProtoMessage() {} +func (*MetricDescriptor) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{1} +} + +func (m *MetricDescriptor) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MetricDescriptor.Unmarshal(m, b) +} +func (m *MetricDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MetricDescriptor.Marshal(b, m, deterministic) +} +func (m *MetricDescriptor) XXX_Merge(src proto.Message) { + xxx_messageInfo_MetricDescriptor.Merge(m, src) +} +func (m *MetricDescriptor) XXX_Size() int { + return xxx_messageInfo_MetricDescriptor.Size(m) +} +func (m *MetricDescriptor) XXX_DiscardUnknown() { + xxx_messageInfo_MetricDescriptor.DiscardUnknown(m) +} + +var xxx_messageInfo_MetricDescriptor proto.InternalMessageInfo + +func (m *MetricDescriptor) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *MetricDescriptor) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *MetricDescriptor) GetUnit() string { + if m != nil { + return m.Unit + } + return "" +} + +func (m *MetricDescriptor) GetType() MetricDescriptor_Type { + if m != nil { + return m.Type + } + return MetricDescriptor_UNSPECIFIED +} + +func (m *MetricDescriptor) GetLabelKeys() []*LabelKey { + if m != nil { + return m.LabelKeys + } + return nil +} + +// Defines a label key associated with a metric descriptor. +type LabelKey struct { + // The key for the label. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // A human-readable description of what this label key represents. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LabelKey) Reset() { *m = LabelKey{} } +func (m *LabelKey) String() string { return proto.CompactTextString(m) } +func (*LabelKey) ProtoMessage() {} +func (*LabelKey) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{2} +} + +func (m *LabelKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LabelKey.Unmarshal(m, b) +} +func (m *LabelKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LabelKey.Marshal(b, m, deterministic) +} +func (m *LabelKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_LabelKey.Merge(m, src) +} +func (m *LabelKey) XXX_Size() int { + return xxx_messageInfo_LabelKey.Size(m) +} +func (m *LabelKey) XXX_DiscardUnknown() { + xxx_messageInfo_LabelKey.DiscardUnknown(m) +} + +var xxx_messageInfo_LabelKey proto.InternalMessageInfo + +func (m *LabelKey) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *LabelKey) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +// A collection of data points that describes the time-varying values +// of a metric. +type TimeSeries struct { + // Must be present for cumulative metrics. The time when the cumulative value + // was reset to zero. Exclusive. The cumulative value is over the time interval + // (start_timestamp, timestamp]. If not specified, the backend can use the + // previous recorded value. + StartTimestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"` + // The set of label values that uniquely identify this timeseries. Applies to + // all points. The order of label values must match that of label keys in the + // metric descriptor. + LabelValues []*LabelValue `protobuf:"bytes,2,rep,name=label_values,json=labelValues,proto3" json:"label_values,omitempty"` + // The data points of this timeseries. Point.value type MUST match the + // MetricDescriptor.type. + Points []*Point `protobuf:"bytes,3,rep,name=points,proto3" json:"points,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TimeSeries) Reset() { *m = TimeSeries{} } +func (m *TimeSeries) String() string { return proto.CompactTextString(m) } +func (*TimeSeries) ProtoMessage() {} +func (*TimeSeries) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{3} +} + +func (m *TimeSeries) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TimeSeries.Unmarshal(m, b) +} +func (m *TimeSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TimeSeries.Marshal(b, m, deterministic) +} +func (m *TimeSeries) XXX_Merge(src proto.Message) { + xxx_messageInfo_TimeSeries.Merge(m, src) +} +func (m *TimeSeries) XXX_Size() int { + return xxx_messageInfo_TimeSeries.Size(m) +} +func (m *TimeSeries) XXX_DiscardUnknown() { + xxx_messageInfo_TimeSeries.DiscardUnknown(m) +} + +var xxx_messageInfo_TimeSeries proto.InternalMessageInfo + +func (m *TimeSeries) GetStartTimestamp() *timestamp.Timestamp { + if m != nil { + return m.StartTimestamp + } + return nil +} + +func (m *TimeSeries) GetLabelValues() []*LabelValue { + if m != nil { + return m.LabelValues + } + return nil +} + +func (m *TimeSeries) GetPoints() []*Point { + if m != nil { + return m.Points + } + return nil +} + +type LabelValue struct { + // The value for the label. + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + // If false the value field is ignored and considered not set. + // This is used to differentiate a missing label from an empty string. + HasValue bool `protobuf:"varint,2,opt,name=has_value,json=hasValue,proto3" json:"has_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LabelValue) Reset() { *m = LabelValue{} } +func (m *LabelValue) String() string { return proto.CompactTextString(m) } +func (*LabelValue) ProtoMessage() {} +func (*LabelValue) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{4} +} + +func (m *LabelValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LabelValue.Unmarshal(m, b) +} +func (m *LabelValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LabelValue.Marshal(b, m, deterministic) +} +func (m *LabelValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_LabelValue.Merge(m, src) +} +func (m *LabelValue) XXX_Size() int { + return xxx_messageInfo_LabelValue.Size(m) +} +func (m *LabelValue) XXX_DiscardUnknown() { + xxx_messageInfo_LabelValue.DiscardUnknown(m) +} + +var xxx_messageInfo_LabelValue proto.InternalMessageInfo + +func (m *LabelValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *LabelValue) GetHasValue() bool { + if m != nil { + return m.HasValue + } + return false +} + +// A timestamped measurement. +type Point struct { + // The moment when this point was recorded. Inclusive. + // If not specified, the timestamp will be decided by the backend. + Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // The actual point value. + // + // Types that are valid to be assigned to Value: + // *Point_Int64Value + // *Point_DoubleValue + // *Point_DistributionValue + // *Point_SummaryValue + Value isPoint_Value `protobuf_oneof:"value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Point) Reset() { *m = Point{} } +func (m *Point) String() string { return proto.CompactTextString(m) } +func (*Point) ProtoMessage() {} +func (*Point) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{5} +} + +func (m *Point) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Point.Unmarshal(m, b) +} +func (m *Point) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Point.Marshal(b, m, deterministic) +} +func (m *Point) XXX_Merge(src proto.Message) { + xxx_messageInfo_Point.Merge(m, src) +} +func (m *Point) XXX_Size() int { + return xxx_messageInfo_Point.Size(m) +} +func (m *Point) XXX_DiscardUnknown() { + xxx_messageInfo_Point.DiscardUnknown(m) +} + +var xxx_messageInfo_Point proto.InternalMessageInfo + +func (m *Point) GetTimestamp() *timestamp.Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + +type isPoint_Value interface { + isPoint_Value() +} + +type Point_Int64Value struct { + Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"` +} + +type Point_DoubleValue struct { + DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"` +} + +type Point_DistributionValue struct { + DistributionValue *DistributionValue `protobuf:"bytes,4,opt,name=distribution_value,json=distributionValue,proto3,oneof"` +} + +type Point_SummaryValue struct { + SummaryValue *SummaryValue `protobuf:"bytes,5,opt,name=summary_value,json=summaryValue,proto3,oneof"` +} + +func (*Point_Int64Value) isPoint_Value() {} + +func (*Point_DoubleValue) isPoint_Value() {} + +func (*Point_DistributionValue) isPoint_Value() {} + +func (*Point_SummaryValue) isPoint_Value() {} + +func (m *Point) GetValue() isPoint_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *Point) GetInt64Value() int64 { + if x, ok := m.GetValue().(*Point_Int64Value); ok { + return x.Int64Value + } + return 0 +} + +func (m *Point) GetDoubleValue() float64 { + if x, ok := m.GetValue().(*Point_DoubleValue); ok { + return x.DoubleValue + } + return 0 +} + +func (m *Point) GetDistributionValue() *DistributionValue { + if x, ok := m.GetValue().(*Point_DistributionValue); ok { + return x.DistributionValue + } + return nil +} + +func (m *Point) GetSummaryValue() *SummaryValue { + if x, ok := m.GetValue().(*Point_SummaryValue); ok { + return x.SummaryValue + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Point) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Point_Int64Value)(nil), + (*Point_DoubleValue)(nil), + (*Point_DistributionValue)(nil), + (*Point_SummaryValue)(nil), + } +} + +// Distribution contains summary statistics for a population of values. It +// optionally contains a histogram representing the distribution of those +// values across a set of buckets. +type DistributionValue struct { + // The number of values in the population. Must be non-negative. This value + // must equal the sum of the values in bucket_counts if a histogram is + // provided. + Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` + // The sum of the values in the population. If count is zero then this field + // must be zero. + Sum float64 `protobuf:"fixed64,2,opt,name=sum,proto3" json:"sum,omitempty"` + // The sum of squared deviations from the mean of the values in the + // population. For values x_i this is: + // + // Sum[i=1..n]((x_i - mean)^2) + // + // Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition + // describes Welford's method for accumulating this sum in one pass. + // + // If count is zero then this field must be zero. + SumOfSquaredDeviation float64 `protobuf:"fixed64,3,opt,name=sum_of_squared_deviation,json=sumOfSquaredDeviation,proto3" json:"sum_of_squared_deviation,omitempty"` + // Don't change bucket boundaries within a TimeSeries if your backend doesn't + // support this. + // TODO(issue #152): consider not required to send bucket options for + // optimization. + BucketOptions *DistributionValue_BucketOptions `protobuf:"bytes,4,opt,name=bucket_options,json=bucketOptions,proto3" json:"bucket_options,omitempty"` + // If the distribution does not have a histogram, then omit this field. + // If there is a histogram, then the sum of the values in the Bucket counts + // must equal the value in the count field of the distribution. + Buckets []*DistributionValue_Bucket `protobuf:"bytes,5,rep,name=buckets,proto3" json:"buckets,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DistributionValue) Reset() { *m = DistributionValue{} } +func (m *DistributionValue) String() string { return proto.CompactTextString(m) } +func (*DistributionValue) ProtoMessage() {} +func (*DistributionValue) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{6} +} + +func (m *DistributionValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DistributionValue.Unmarshal(m, b) +} +func (m *DistributionValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DistributionValue.Marshal(b, m, deterministic) +} +func (m *DistributionValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_DistributionValue.Merge(m, src) +} +func (m *DistributionValue) XXX_Size() int { + return xxx_messageInfo_DistributionValue.Size(m) +} +func (m *DistributionValue) XXX_DiscardUnknown() { + xxx_messageInfo_DistributionValue.DiscardUnknown(m) +} + +var xxx_messageInfo_DistributionValue proto.InternalMessageInfo + +func (m *DistributionValue) GetCount() int64 { + if m != nil { + return m.Count + } + return 0 +} + +func (m *DistributionValue) GetSum() float64 { + if m != nil { + return m.Sum + } + return 0 +} + +func (m *DistributionValue) GetSumOfSquaredDeviation() float64 { + if m != nil { + return m.SumOfSquaredDeviation + } + return 0 +} + +func (m *DistributionValue) GetBucketOptions() *DistributionValue_BucketOptions { + if m != nil { + return m.BucketOptions + } + return nil +} + +func (m *DistributionValue) GetBuckets() []*DistributionValue_Bucket { + if m != nil { + return m.Buckets + } + return nil +} + +// A Distribution may optionally contain a histogram of the values in the +// population. The bucket boundaries for that histogram are described by +// BucketOptions. +// +// If bucket_options has no type, then there is no histogram associated with +// the Distribution. +type DistributionValue_BucketOptions struct { + // Types that are valid to be assigned to Type: + // *DistributionValue_BucketOptions_Explicit_ + Type isDistributionValue_BucketOptions_Type `protobuf_oneof:"type"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DistributionValue_BucketOptions) Reset() { *m = DistributionValue_BucketOptions{} } +func (m *DistributionValue_BucketOptions) String() string { return proto.CompactTextString(m) } +func (*DistributionValue_BucketOptions) ProtoMessage() {} +func (*DistributionValue_BucketOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{6, 0} +} + +func (m *DistributionValue_BucketOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DistributionValue_BucketOptions.Unmarshal(m, b) +} +func (m *DistributionValue_BucketOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DistributionValue_BucketOptions.Marshal(b, m, deterministic) +} +func (m *DistributionValue_BucketOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_DistributionValue_BucketOptions.Merge(m, src) +} +func (m *DistributionValue_BucketOptions) XXX_Size() int { + return xxx_messageInfo_DistributionValue_BucketOptions.Size(m) +} +func (m *DistributionValue_BucketOptions) XXX_DiscardUnknown() { + xxx_messageInfo_DistributionValue_BucketOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_DistributionValue_BucketOptions proto.InternalMessageInfo + +type isDistributionValue_BucketOptions_Type interface { + isDistributionValue_BucketOptions_Type() +} + +type DistributionValue_BucketOptions_Explicit_ struct { + Explicit *DistributionValue_BucketOptions_Explicit `protobuf:"bytes,1,opt,name=explicit,proto3,oneof"` +} + +func (*DistributionValue_BucketOptions_Explicit_) isDistributionValue_BucketOptions_Type() {} + +func (m *DistributionValue_BucketOptions) GetType() isDistributionValue_BucketOptions_Type { + if m != nil { + return m.Type + } + return nil +} + +func (m *DistributionValue_BucketOptions) GetExplicit() *DistributionValue_BucketOptions_Explicit { + if x, ok := m.GetType().(*DistributionValue_BucketOptions_Explicit_); ok { + return x.Explicit + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*DistributionValue_BucketOptions) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*DistributionValue_BucketOptions_Explicit_)(nil), + } +} + +// Specifies a set of buckets with arbitrary upper-bounds. +// This defines size(bounds) + 1 (= N) buckets. The boundaries for bucket +// index i are: +// +// [0, bucket_bounds[i]) for i == 0 +// [bucket_bounds[i-1], bucket_bounds[i]) for 0 < i < N-1 +// [bucket_bounds[i], +infinity) for i == N-1 +type DistributionValue_BucketOptions_Explicit struct { + // The values must be strictly increasing and > 0. + Bounds []float64 `protobuf:"fixed64,1,rep,packed,name=bounds,proto3" json:"bounds,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DistributionValue_BucketOptions_Explicit) Reset() { + *m = DistributionValue_BucketOptions_Explicit{} +} +func (m *DistributionValue_BucketOptions_Explicit) String() string { return proto.CompactTextString(m) } +func (*DistributionValue_BucketOptions_Explicit) ProtoMessage() {} +func (*DistributionValue_BucketOptions_Explicit) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{6, 0, 0} +} + +func (m *DistributionValue_BucketOptions_Explicit) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Unmarshal(m, b) +} +func (m *DistributionValue_BucketOptions_Explicit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Marshal(b, m, deterministic) +} +func (m *DistributionValue_BucketOptions_Explicit) XXX_Merge(src proto.Message) { + xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Merge(m, src) +} +func (m *DistributionValue_BucketOptions_Explicit) XXX_Size() int { + return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Size(m) +} +func (m *DistributionValue_BucketOptions_Explicit) XXX_DiscardUnknown() { + xxx_messageInfo_DistributionValue_BucketOptions_Explicit.DiscardUnknown(m) +} + +var xxx_messageInfo_DistributionValue_BucketOptions_Explicit proto.InternalMessageInfo + +func (m *DistributionValue_BucketOptions_Explicit) GetBounds() []float64 { + if m != nil { + return m.Bounds + } + return nil +} + +type DistributionValue_Bucket struct { + // The number of values in each bucket of the histogram, as described in + // bucket_bounds. + Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` + // If the distribution does not have a histogram, then omit this field. + Exemplar *DistributionValue_Exemplar `protobuf:"bytes,2,opt,name=exemplar,proto3" json:"exemplar,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DistributionValue_Bucket) Reset() { *m = DistributionValue_Bucket{} } +func (m *DistributionValue_Bucket) String() string { return proto.CompactTextString(m) } +func (*DistributionValue_Bucket) ProtoMessage() {} +func (*DistributionValue_Bucket) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{6, 1} +} + +func (m *DistributionValue_Bucket) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DistributionValue_Bucket.Unmarshal(m, b) +} +func (m *DistributionValue_Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DistributionValue_Bucket.Marshal(b, m, deterministic) +} +func (m *DistributionValue_Bucket) XXX_Merge(src proto.Message) { + xxx_messageInfo_DistributionValue_Bucket.Merge(m, src) +} +func (m *DistributionValue_Bucket) XXX_Size() int { + return xxx_messageInfo_DistributionValue_Bucket.Size(m) +} +func (m *DistributionValue_Bucket) XXX_DiscardUnknown() { + xxx_messageInfo_DistributionValue_Bucket.DiscardUnknown(m) +} + +var xxx_messageInfo_DistributionValue_Bucket proto.InternalMessageInfo + +func (m *DistributionValue_Bucket) GetCount() int64 { + if m != nil { + return m.Count + } + return 0 +} + +func (m *DistributionValue_Bucket) GetExemplar() *DistributionValue_Exemplar { + if m != nil { + return m.Exemplar + } + return nil +} + +// Exemplars are example points that may be used to annotate aggregated +// Distribution values. They are metadata that gives information about a +// particular value added to a Distribution bucket. +type DistributionValue_Exemplar struct { + // Value of the exemplar point. It determines which bucket the exemplar + // belongs to. + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + // The observation (sampling) time of the above value. + Timestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Contextual information about the example value. + Attachments map[string]string `protobuf:"bytes,3,rep,name=attachments,proto3" json:"attachments,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DistributionValue_Exemplar) Reset() { *m = DistributionValue_Exemplar{} } +func (m *DistributionValue_Exemplar) String() string { return proto.CompactTextString(m) } +func (*DistributionValue_Exemplar) ProtoMessage() {} +func (*DistributionValue_Exemplar) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{6, 2} +} + +func (m *DistributionValue_Exemplar) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DistributionValue_Exemplar.Unmarshal(m, b) +} +func (m *DistributionValue_Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DistributionValue_Exemplar.Marshal(b, m, deterministic) +} +func (m *DistributionValue_Exemplar) XXX_Merge(src proto.Message) { + xxx_messageInfo_DistributionValue_Exemplar.Merge(m, src) +} +func (m *DistributionValue_Exemplar) XXX_Size() int { + return xxx_messageInfo_DistributionValue_Exemplar.Size(m) +} +func (m *DistributionValue_Exemplar) XXX_DiscardUnknown() { + xxx_messageInfo_DistributionValue_Exemplar.DiscardUnknown(m) +} + +var xxx_messageInfo_DistributionValue_Exemplar proto.InternalMessageInfo + +func (m *DistributionValue_Exemplar) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +func (m *DistributionValue_Exemplar) GetTimestamp() *timestamp.Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + +func (m *DistributionValue_Exemplar) GetAttachments() map[string]string { + if m != nil { + return m.Attachments + } + return nil +} + +// The start_timestamp only applies to the count and sum in the SummaryValue. +type SummaryValue struct { + // The total number of recorded values since start_time. Optional since + // some systems don't expose this. + Count *wrappers.Int64Value `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"` + // The total sum of recorded values since start_time. Optional since some + // systems don't expose this. If count is zero then this field must be zero. + // This field must be unset if the sum is not available. + Sum *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=sum,proto3" json:"sum,omitempty"` + // Values calculated over an arbitrary time window. + Snapshot *SummaryValue_Snapshot `protobuf:"bytes,3,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SummaryValue) Reset() { *m = SummaryValue{} } +func (m *SummaryValue) String() string { return proto.CompactTextString(m) } +func (*SummaryValue) ProtoMessage() {} +func (*SummaryValue) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{7} +} + +func (m *SummaryValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SummaryValue.Unmarshal(m, b) +} +func (m *SummaryValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SummaryValue.Marshal(b, m, deterministic) +} +func (m *SummaryValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_SummaryValue.Merge(m, src) +} +func (m *SummaryValue) XXX_Size() int { + return xxx_messageInfo_SummaryValue.Size(m) +} +func (m *SummaryValue) XXX_DiscardUnknown() { + xxx_messageInfo_SummaryValue.DiscardUnknown(m) +} + +var xxx_messageInfo_SummaryValue proto.InternalMessageInfo + +func (m *SummaryValue) GetCount() *wrappers.Int64Value { + if m != nil { + return m.Count + } + return nil +} + +func (m *SummaryValue) GetSum() *wrappers.DoubleValue { + if m != nil { + return m.Sum + } + return nil +} + +func (m *SummaryValue) GetSnapshot() *SummaryValue_Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +// The values in this message can be reset at arbitrary unknown times, with +// the requirement that all of them are reset at the same time. +type SummaryValue_Snapshot struct { + // The number of values in the snapshot. Optional since some systems don't + // expose this. + Count *wrappers.Int64Value `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"` + // The sum of values in the snapshot. Optional since some systems don't + // expose this. If count is zero then this field must be zero or not set + // (if not supported). + Sum *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=sum,proto3" json:"sum,omitempty"` + // A list of values at different percentiles of the distribution calculated + // from the current snapshot. The percentiles must be strictly increasing. + PercentileValues []*SummaryValue_Snapshot_ValueAtPercentile `protobuf:"bytes,3,rep,name=percentile_values,json=percentileValues,proto3" json:"percentile_values,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SummaryValue_Snapshot) Reset() { *m = SummaryValue_Snapshot{} } +func (m *SummaryValue_Snapshot) String() string { return proto.CompactTextString(m) } +func (*SummaryValue_Snapshot) ProtoMessage() {} +func (*SummaryValue_Snapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{7, 0} +} + +func (m *SummaryValue_Snapshot) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SummaryValue_Snapshot.Unmarshal(m, b) +} +func (m *SummaryValue_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SummaryValue_Snapshot.Marshal(b, m, deterministic) +} +func (m *SummaryValue_Snapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_SummaryValue_Snapshot.Merge(m, src) +} +func (m *SummaryValue_Snapshot) XXX_Size() int { + return xxx_messageInfo_SummaryValue_Snapshot.Size(m) +} +func (m *SummaryValue_Snapshot) XXX_DiscardUnknown() { + xxx_messageInfo_SummaryValue_Snapshot.DiscardUnknown(m) +} + +var xxx_messageInfo_SummaryValue_Snapshot proto.InternalMessageInfo + +func (m *SummaryValue_Snapshot) GetCount() *wrappers.Int64Value { + if m != nil { + return m.Count + } + return nil +} + +func (m *SummaryValue_Snapshot) GetSum() *wrappers.DoubleValue { + if m != nil { + return m.Sum + } + return nil +} + +func (m *SummaryValue_Snapshot) GetPercentileValues() []*SummaryValue_Snapshot_ValueAtPercentile { + if m != nil { + return m.PercentileValues + } + return nil +} + +// Represents the value at a given percentile of a distribution. +type SummaryValue_Snapshot_ValueAtPercentile struct { + // The percentile of a distribution. Must be in the interval + // (0.0, 100.0]. + Percentile float64 `protobuf:"fixed64,1,opt,name=percentile,proto3" json:"percentile,omitempty"` + // The value at the given percentile of a distribution. + Value float64 `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SummaryValue_Snapshot_ValueAtPercentile) Reset() { + *m = SummaryValue_Snapshot_ValueAtPercentile{} +} +func (m *SummaryValue_Snapshot_ValueAtPercentile) String() string { return proto.CompactTextString(m) } +func (*SummaryValue_Snapshot_ValueAtPercentile) ProtoMessage() {} +func (*SummaryValue_Snapshot_ValueAtPercentile) Descriptor() ([]byte, []int) { + return fileDescriptor_0ee3deb72053811a, []int{7, 0, 0} +} + +func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Unmarshal(m, b) +} +func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Marshal(b, m, deterministic) +} +func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Merge(src proto.Message) { + xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Merge(m, src) +} +func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Size() int { + return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Size(m) +} +func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_DiscardUnknown() { + xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.DiscardUnknown(m) +} + +var xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile proto.InternalMessageInfo + +func (m *SummaryValue_Snapshot_ValueAtPercentile) GetPercentile() float64 { + if m != nil { + return m.Percentile + } + return 0 +} + +func (m *SummaryValue_Snapshot_ValueAtPercentile) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +func init() { + proto.RegisterEnum("opencensus.proto.metrics.v1.MetricDescriptor_Type", MetricDescriptor_Type_name, MetricDescriptor_Type_value) + proto.RegisterType((*Metric)(nil), "opencensus.proto.metrics.v1.Metric") + proto.RegisterType((*MetricDescriptor)(nil), "opencensus.proto.metrics.v1.MetricDescriptor") + proto.RegisterType((*LabelKey)(nil), "opencensus.proto.metrics.v1.LabelKey") + proto.RegisterType((*TimeSeries)(nil), "opencensus.proto.metrics.v1.TimeSeries") + proto.RegisterType((*LabelValue)(nil), "opencensus.proto.metrics.v1.LabelValue") + proto.RegisterType((*Point)(nil), "opencensus.proto.metrics.v1.Point") + proto.RegisterType((*DistributionValue)(nil), "opencensus.proto.metrics.v1.DistributionValue") + proto.RegisterType((*DistributionValue_BucketOptions)(nil), "opencensus.proto.metrics.v1.DistributionValue.BucketOptions") + proto.RegisterType((*DistributionValue_BucketOptions_Explicit)(nil), "opencensus.proto.metrics.v1.DistributionValue.BucketOptions.Explicit") + proto.RegisterType((*DistributionValue_Bucket)(nil), "opencensus.proto.metrics.v1.DistributionValue.Bucket") + proto.RegisterType((*DistributionValue_Exemplar)(nil), "opencensus.proto.metrics.v1.DistributionValue.Exemplar") + proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.metrics.v1.DistributionValue.Exemplar.AttachmentsEntry") + proto.RegisterType((*SummaryValue)(nil), "opencensus.proto.metrics.v1.SummaryValue") + proto.RegisterType((*SummaryValue_Snapshot)(nil), "opencensus.proto.metrics.v1.SummaryValue.Snapshot") + proto.RegisterType((*SummaryValue_Snapshot_ValueAtPercentile)(nil), "opencensus.proto.metrics.v1.SummaryValue.Snapshot.ValueAtPercentile") +} + +func init() { + proto.RegisterFile("opencensus/proto/metrics/v1/metrics.proto", fileDescriptor_0ee3deb72053811a) +} + +var fileDescriptor_0ee3deb72053811a = []byte{ + // 1118 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xdd, 0x6e, 0x1b, 0xc5, + 0x17, 0xcf, 0xda, 0x8e, 0xe3, 0x9c, 0x75, 0xd2, 0xf5, 0xa8, 0xed, 0xdf, 0x72, 0xfe, 0x0a, 0x61, + 0x11, 0x90, 0x0a, 0x65, 0xad, 0x98, 0xd2, 0x56, 0x15, 0x2a, 0x8a, 0x63, 0x37, 0x31, 0x24, 0xb1, + 0x35, 0xb6, 0x23, 0xd1, 0x1b, 0x6b, 0xbd, 0x9e, 0x24, 0x4b, 0xbc, 0x1f, 0xdd, 0x99, 0x0d, 0xf8, + 0x05, 0x78, 0x02, 0xc4, 0x35, 0xb7, 0x88, 0xe7, 0xe0, 0x8a, 0x27, 0xe0, 0x15, 0xb8, 0x41, 0xbc, + 0x01, 0xda, 0x99, 0xd9, 0x8f, 0xc4, 0x60, 0xea, 0x22, 0x71, 0x77, 0xe6, 0xcc, 0x39, 0xbf, 0xfd, + 0x9d, 0xcf, 0x1d, 0x78, 0xe4, 0xf9, 0xc4, 0xb5, 0x88, 0x4b, 0x43, 0x5a, 0xf7, 0x03, 0x8f, 0x79, + 0x75, 0x87, 0xb0, 0xc0, 0xb6, 0x68, 0xfd, 0x66, 0x3f, 0x16, 0x0d, 0x7e, 0x81, 0xb6, 0x52, 0x53, + 0xa1, 0x31, 0xe2, 0xfb, 0x9b, 0xfd, 0xda, 0x3b, 0x97, 0x9e, 0x77, 0x39, 0x25, 0x02, 0x63, 0x1c, + 0x5e, 0xd4, 0x99, 0xed, 0x10, 0xca, 0x4c, 0xc7, 0x17, 0xb6, 0xb5, 0xed, 0xbb, 0x06, 0x5f, 0x07, + 0xa6, 0xef, 0x93, 0x40, 0x62, 0xd5, 0x3e, 0x9a, 0x23, 0x12, 0x10, 0xea, 0x85, 0x81, 0x45, 0x22, + 0x26, 0xb1, 0x2c, 0x8c, 0xf5, 0x3f, 0x14, 0x28, 0x9e, 0xf2, 0x8f, 0xa3, 0x57, 0x50, 0x11, 0x34, + 0x46, 0x13, 0x42, 0xad, 0xc0, 0xf6, 0x99, 0x17, 0x54, 0x95, 0x1d, 0x65, 0x57, 0x6d, 0xec, 0x19, + 0x0b, 0x18, 0x1b, 0xc2, 0xbf, 0x95, 0x38, 0x61, 0xcd, 0xb9, 0xa3, 0x41, 0x47, 0x00, 0x3c, 0x0c, + 0x12, 0xd8, 0x84, 0x56, 0x73, 0x3b, 0xf9, 0x5d, 0xb5, 0xf1, 0xe1, 0x42, 0xd0, 0x81, 0xed, 0x90, + 0x3e, 0x37, 0xc7, 0x19, 0x57, 0xd4, 0x84, 0x52, 0x1c, 0x41, 0x35, 0xcf, 0xb9, 0x7d, 0x30, 0x0f, + 0x93, 0xc4, 0x78, 0xb3, 0x6f, 0x60, 0x29, 0xe3, 0xc4, 0x4f, 0xff, 0x3e, 0x0f, 0xda, 0x5d, 0xce, + 0x08, 0x41, 0xc1, 0x35, 0x1d, 0xc2, 0x03, 0x5e, 0xc7, 0x5c, 0x46, 0x3b, 0xa0, 0xc6, 0xa9, 0xb0, + 0x3d, 0xb7, 0x9a, 0xe3, 0x57, 0x59, 0x55, 0xe4, 0x15, 0xba, 0x36, 0xe3, 0x54, 0xd6, 0x31, 0x97, + 0xd1, 0x4b, 0x28, 0xb0, 0x99, 0x4f, 0xaa, 0x85, 0x1d, 0x65, 0x77, 0xb3, 0xd1, 0x58, 0x2a, 0x75, + 0xc6, 0x60, 0xe6, 0x13, 0xcc, 0xfd, 0x51, 0x0b, 0x60, 0x6a, 0x8e, 0xc9, 0x74, 0x74, 0x4d, 0x66, + 0xb4, 0xba, 0xca, 0x73, 0xf6, 0xfe, 0x42, 0xb4, 0x93, 0xc8, 0xfc, 0x0b, 0x32, 0xc3, 0xeb, 0x53, + 0x29, 0x51, 0xfd, 0x47, 0x05, 0x0a, 0x11, 0x28, 0xba, 0x07, 0xea, 0xf0, 0xac, 0xdf, 0x6b, 0x1f, + 0x76, 0x5e, 0x76, 0xda, 0x2d, 0x6d, 0x25, 0x52, 0x1c, 0x1d, 0x0c, 0x8f, 0xda, 0xa3, 0xce, 0xd9, + 0xe0, 0xc9, 0x63, 0x4d, 0x41, 0x1a, 0x94, 0x85, 0xa2, 0xd5, 0x1d, 0x36, 0x4f, 0xda, 0x5a, 0x0e, + 0x3d, 0x04, 0x24, 0x35, 0x9d, 0xfe, 0x00, 0x77, 0x9a, 0xc3, 0x41, 0xa7, 0x7b, 0xa6, 0xe5, 0xd1, + 0x7d, 0xd0, 0x0e, 0x87, 0xa7, 0xc3, 0x93, 0x83, 0x41, 0xe7, 0x3c, 0xf6, 0x2f, 0xa0, 0x07, 0x50, + 0xc9, 0x68, 0x25, 0xc8, 0x2a, 0xda, 0x82, 0xff, 0x65, 0xd5, 0x59, 0xa4, 0x22, 0x52, 0x61, 0xad, + 0x3f, 0x3c, 0x3d, 0x3d, 0xc0, 0x5f, 0x6a, 0x6b, 0xfa, 0x0b, 0x28, 0xc5, 0x21, 0x20, 0x0d, 0xf2, + 0xd7, 0x64, 0x26, 0xcb, 0x11, 0x89, 0xff, 0x5c, 0x0d, 0xfd, 0x57, 0x05, 0x20, 0xed, 0x1b, 0x74, + 0x08, 0xf7, 0x28, 0x33, 0x03, 0x36, 0x4a, 0x26, 0x48, 0xb6, 0x73, 0xcd, 0x10, 0x23, 0x64, 0xc4, + 0x23, 0xc4, 0xbb, 0x8d, 0x5b, 0xe0, 0x4d, 0xee, 0x92, 0x9c, 0xd1, 0xe7, 0x50, 0x16, 0x55, 0xb8, + 0x31, 0xa7, 0xe1, 0x1b, 0xf6, 0x2e, 0x0f, 0xe2, 0x3c, 0xb2, 0xc7, 0xea, 0x34, 0x91, 0x29, 0x7a, + 0x0e, 0x45, 0xdf, 0xb3, 0x5d, 0x46, 0xab, 0x79, 0x8e, 0xa2, 0x2f, 0x44, 0xe9, 0x45, 0xa6, 0x58, + 0x7a, 0xe8, 0x9f, 0x01, 0xa4, 0xb0, 0xe8, 0x3e, 0xac, 0x72, 0x3e, 0x32, 0x3f, 0xe2, 0x80, 0xb6, + 0x60, 0xfd, 0xca, 0xa4, 0x82, 0x29, 0xcf, 0x4f, 0x09, 0x97, 0xae, 0x4c, 0xca, 0x5d, 0xf4, 0x9f, + 0x73, 0xb0, 0xca, 0x21, 0xd1, 0x33, 0x58, 0x5f, 0x26, 0x23, 0xa9, 0x31, 0x7a, 0x17, 0x54, 0xdb, + 0x65, 0x4f, 0x1e, 0x67, 0x3e, 0x91, 0x3f, 0x5e, 0xc1, 0xc0, 0x95, 0x82, 0xd9, 0x7b, 0x50, 0x9e, + 0x78, 0xe1, 0x78, 0x4a, 0xa4, 0x4d, 0x34, 0x19, 0xca, 0xf1, 0x0a, 0x56, 0x85, 0x56, 0x18, 0x8d, + 0x00, 0x4d, 0x6c, 0xca, 0x02, 0x7b, 0x1c, 0x46, 0x85, 0x93, 0xa6, 0x05, 0x4e, 0xc5, 0x58, 0x98, + 0x94, 0x56, 0xc6, 0x8d, 0x63, 0x1d, 0xaf, 0xe0, 0xca, 0xe4, 0xae, 0x12, 0xf5, 0x60, 0x83, 0x86, + 0x8e, 0x63, 0x06, 0x33, 0x89, 0xbd, 0xca, 0xb1, 0x1f, 0x2d, 0xc4, 0xee, 0x0b, 0x8f, 0x18, 0xb6, + 0x4c, 0x33, 0xe7, 0xe6, 0x9a, 0xcc, 0xb8, 0xfe, 0x4b, 0x11, 0x2a, 0x73, 0x2c, 0xa2, 0x82, 0x58, + 0x5e, 0xe8, 0x32, 0x9e, 0xcf, 0x3c, 0x16, 0x87, 0xa8, 0x89, 0x69, 0xe8, 0xf0, 0x3c, 0x29, 0x38, + 0x12, 0xd1, 0x53, 0xa8, 0xd2, 0xd0, 0x19, 0x79, 0x17, 0x23, 0xfa, 0x3a, 0x34, 0x03, 0x32, 0x19, + 0x4d, 0xc8, 0x8d, 0x6d, 0xf2, 0x8e, 0xe6, 0xa9, 0xc2, 0x0f, 0x68, 0xe8, 0x74, 0x2f, 0xfa, 0xe2, + 0xb6, 0x15, 0x5f, 0x22, 0x0b, 0x36, 0xc7, 0xa1, 0x75, 0x4d, 0xd8, 0xc8, 0xe3, 0xcd, 0x4e, 0x65, + 0xba, 0x3e, 0x5d, 0x2e, 0x5d, 0x46, 0x93, 0x83, 0x74, 0x05, 0x06, 0xde, 0x18, 0x67, 0x8f, 0xa8, + 0x0b, 0x6b, 0x42, 0x11, 0xef, 0x9b, 0x4f, 0xde, 0x0a, 0x1d, 0xc7, 0x28, 0xb5, 0x1f, 0x14, 0xd8, + 0xb8, 0xf5, 0x45, 0x64, 0x41, 0x89, 0x7c, 0xe3, 0x4f, 0x6d, 0xcb, 0x66, 0xb2, 0xf7, 0xda, 0xff, + 0x26, 0x02, 0xa3, 0x2d, 0xc1, 0x8e, 0x57, 0x70, 0x02, 0x5c, 0xd3, 0xa1, 0x14, 0xeb, 0xd1, 0x43, + 0x28, 0x8e, 0xbd, 0xd0, 0x9d, 0xd0, 0xaa, 0xb2, 0x93, 0xdf, 0x55, 0xb0, 0x3c, 0x35, 0x8b, 0x62, + 0x4d, 0xd7, 0x28, 0x14, 0x05, 0xe2, 0xdf, 0xd4, 0xb0, 0x1f, 0x11, 0x26, 0x8e, 0x3f, 0x35, 0x03, + 0x5e, 0x48, 0xb5, 0xf1, 0x74, 0x49, 0xc2, 0x6d, 0xe9, 0x8e, 0x13, 0xa0, 0xda, 0xb7, 0xb9, 0x88, + 0xa1, 0x38, 0xdc, 0x1e, 0x66, 0x25, 0x1e, 0xe6, 0x5b, 0x53, 0x9a, 0x5b, 0x66, 0x4a, 0xbf, 0x02, + 0xd5, 0x64, 0xcc, 0xb4, 0xae, 0x1c, 0x92, 0xee, 0x9a, 0xe3, 0xb7, 0x24, 0x6d, 0x1c, 0xa4, 0x50, + 0x6d, 0x97, 0x05, 0x33, 0x9c, 0x05, 0xaf, 0xbd, 0x00, 0xed, 0xae, 0xc1, 0x5f, 0xac, 0xee, 0x24, + 0xc2, 0x5c, 0x66, 0x5d, 0x3d, 0xcf, 0x3d, 0x53, 0xf4, 0xdf, 0xf3, 0x50, 0xce, 0xce, 0x1d, 0xda, + 0xcf, 0x16, 0x41, 0x6d, 0x6c, 0xcd, 0x85, 0xdc, 0x49, 0x76, 0x4d, 0x5c, 0x21, 0x23, 0x9d, 0x32, + 0xb5, 0xf1, 0xff, 0x39, 0x87, 0x56, 0xba, 0x78, 0xc4, 0x0c, 0x9e, 0x41, 0x89, 0xba, 0xa6, 0x4f, + 0xaf, 0x3c, 0x26, 0xdf, 0x10, 0x8d, 0x37, 0xde, 0x0b, 0x46, 0x5f, 0x7a, 0xe2, 0x04, 0xa3, 0xf6, + 0x53, 0x0e, 0x4a, 0xb1, 0xfa, 0xbf, 0xe0, 0xff, 0x1a, 0x2a, 0x3e, 0x09, 0x2c, 0xe2, 0x32, 0x3b, + 0x5e, 0xb3, 0x71, 0x95, 0x5b, 0xcb, 0x07, 0x62, 0xf0, 0xe3, 0x01, 0xeb, 0x25, 0x90, 0x58, 0x4b, + 0xe1, 0xc5, 0x9f, 0xab, 0xd6, 0x81, 0xca, 0x9c, 0x19, 0xda, 0x06, 0x48, 0x0d, 0x65, 0xf3, 0x66, + 0x34, 0xb7, 0xab, 0x1e, 0xf7, 0x75, 0xf3, 0x3b, 0x05, 0xb6, 0x6d, 0x6f, 0x11, 0xcf, 0x66, 0x59, + 0x3c, 0x8b, 0x68, 0x2f, 0xba, 0xe8, 0x29, 0xaf, 0x5a, 0x97, 0x36, 0xbb, 0x0a, 0xc7, 0x86, 0xe5, + 0x39, 0x75, 0xe1, 0xb3, 0x67, 0xbb, 0x94, 0x05, 0x61, 0xd4, 0x74, 0x7c, 0x3d, 0xd6, 0x53, 0xb8, + 0x3d, 0xf1, 0xe6, 0xbd, 0x24, 0xee, 0xde, 0x65, 0xf6, 0x0d, 0xfe, 0x5b, 0x6e, 0xab, 0xeb, 0x13, + 0xf7, 0x50, 0x7c, 0x93, 0x43, 0xcb, 0xe7, 0x17, 0x35, 0xce, 0xf7, 0xc7, 0x45, 0xee, 0xf6, 0xf1, + 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xd0, 0xb4, 0x8d, 0xc7, 0x0b, 0x00, 0x00, +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go new file mode 100644 index 000000000..5dba6a2a0 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go @@ -0,0 +1,100 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/resource/v1/resource.proto + +package v1 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// Resource information. +type Resource struct { + // Type identifier for the resource. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // Set of labels that describe the resource. + Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Resource) Reset() { *m = Resource{} } +func (m *Resource) String() string { return proto.CompactTextString(m) } +func (*Resource) ProtoMessage() {} +func (*Resource) Descriptor() ([]byte, []int) { + return fileDescriptor_584700775a2fc762, []int{0} +} + +func (m *Resource) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Resource.Unmarshal(m, b) +} +func (m *Resource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Resource.Marshal(b, m, deterministic) +} +func (m *Resource) XXX_Merge(src proto.Message) { + xxx_messageInfo_Resource.Merge(m, src) +} +func (m *Resource) XXX_Size() int { + return xxx_messageInfo_Resource.Size(m) +} +func (m *Resource) XXX_DiscardUnknown() { + xxx_messageInfo_Resource.DiscardUnknown(m) +} + +var xxx_messageInfo_Resource proto.InternalMessageInfo + +func (m *Resource) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Resource) GetLabels() map[string]string { + if m != nil { + return m.Labels + } + return nil +} + +func init() { + proto.RegisterType((*Resource)(nil), "opencensus.proto.resource.v1.Resource") + proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.resource.v1.Resource.LabelsEntry") +} + +func init() { + proto.RegisterFile("opencensus/proto/resource/v1/resource.proto", fileDescriptor_584700775a2fc762) +} + +var fileDescriptor_584700775a2fc762 = []byte{ + // 251 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xce, 0x2f, 0x48, 0xcd, + 0x4b, 0x4e, 0xcd, 0x2b, 0x2e, 0x2d, 0xd6, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x2f, 0x4a, 0x2d, + 0xce, 0x2f, 0x2d, 0x4a, 0x4e, 0xd5, 0x2f, 0x33, 0x84, 0xb3, 0xf5, 0xc0, 0x52, 0x42, 0x32, 0x08, + 0xc5, 0x10, 0x11, 0x3d, 0xb8, 0x82, 0x32, 0x43, 0xa5, 0xa5, 0x8c, 0x5c, 0x1c, 0x41, 0x50, 0xbe, + 0x90, 0x10, 0x17, 0x4b, 0x49, 0x65, 0x41, 0xaa, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x98, + 0x2d, 0xe4, 0xc5, 0xc5, 0x96, 0x93, 0x98, 0x94, 0x9a, 0x53, 0x2c, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, + 0x6d, 0x64, 0xa4, 0x87, 0xcf, 0x3c, 0x3d, 0x98, 0x59, 0x7a, 0x3e, 0x60, 0x4d, 0xae, 0x79, 0x25, + 0x45, 0x95, 0x41, 0x50, 0x13, 0xa4, 0x2c, 0xb9, 0xb8, 0x91, 0x84, 0x85, 0x04, 0xb8, 0x98, 0xb3, + 0x53, 0x2b, 0xa1, 0xb6, 0x81, 0x98, 0x42, 0x22, 0x5c, 0xac, 0x65, 0x89, 0x39, 0xa5, 0xa9, 0x12, + 0x4c, 0x60, 0x31, 0x08, 0xc7, 0x8a, 0xc9, 0x82, 0xd1, 0x69, 0x06, 0x23, 0x97, 0x7c, 0x66, 0x3e, + 0x5e, 0xbb, 0x9d, 0x78, 0x61, 0x96, 0x07, 0x80, 0xa4, 0x02, 0x18, 0xa3, 0x5c, 0xd3, 0x33, 0x4b, + 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0x21, 0xba, 0x74, 0x33, 0xf3, 0x8a, 0x4b, 0x8a, + 0x4a, 0x73, 0x53, 0xf3, 0x4a, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0xf4, 0x11, 0x06, 0xea, 0x42, 0x42, + 0x32, 0x3d, 0x35, 0x4f, 0x37, 0x1d, 0x25, 0x40, 0x5f, 0x31, 0xc9, 0xf8, 0x17, 0xa4, 0xe6, 0x39, + 0x43, 0xac, 0x05, 0x9b, 0x8d, 0xf0, 0x66, 0x98, 0x61, 0x12, 0x1b, 0x58, 0xa3, 0x31, 0x20, 0x00, + 0x00, 0xff, 0xff, 0xcf, 0x32, 0xff, 0x46, 0x96, 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace.pb.go new file mode 100644 index 000000000..2f4ab19b5 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace.pb.go @@ -0,0 +1,1553 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/trace/v1/trace.proto + +package v1 + +import ( + fmt "fmt" + v1 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + wrappers "github.com/golang/protobuf/ptypes/wrappers" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// Type of span. Can be used to specify additional relationships between spans +// in addition to a parent/child relationship. +type Span_SpanKind int32 + +const ( + // Unspecified. + Span_SPAN_KIND_UNSPECIFIED Span_SpanKind = 0 + // Indicates that the span covers server-side handling of an RPC or other + // remote network request. + Span_SERVER Span_SpanKind = 1 + // Indicates that the span covers the client-side wrapper around an RPC or + // other remote request. + Span_CLIENT Span_SpanKind = 2 +) + +var Span_SpanKind_name = map[int32]string{ + 0: "SPAN_KIND_UNSPECIFIED", + 1: "SERVER", + 2: "CLIENT", +} + +var Span_SpanKind_value = map[string]int32{ + "SPAN_KIND_UNSPECIFIED": 0, + "SERVER": 1, + "CLIENT": 2, +} + +func (x Span_SpanKind) String() string { + return proto.EnumName(Span_SpanKind_name, int32(x)) +} + +func (Span_SpanKind) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 0} +} + +// Indicates whether the message was sent or received. +type Span_TimeEvent_MessageEvent_Type int32 + +const ( + // Unknown event type. + Span_TimeEvent_MessageEvent_TYPE_UNSPECIFIED Span_TimeEvent_MessageEvent_Type = 0 + // Indicates a sent message. + Span_TimeEvent_MessageEvent_SENT Span_TimeEvent_MessageEvent_Type = 1 + // Indicates a received message. + Span_TimeEvent_MessageEvent_RECEIVED Span_TimeEvent_MessageEvent_Type = 2 +) + +var Span_TimeEvent_MessageEvent_Type_name = map[int32]string{ + 0: "TYPE_UNSPECIFIED", + 1: "SENT", + 2: "RECEIVED", +} + +var Span_TimeEvent_MessageEvent_Type_value = map[string]int32{ + "TYPE_UNSPECIFIED": 0, + "SENT": 1, + "RECEIVED": 2, +} + +func (x Span_TimeEvent_MessageEvent_Type) String() string { + return proto.EnumName(Span_TimeEvent_MessageEvent_Type_name, int32(x)) +} + +func (Span_TimeEvent_MessageEvent_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 2, 1, 0} +} + +// The relationship of the current span relative to the linked span: child, +// parent, or unspecified. +type Span_Link_Type int32 + +const ( + // The relationship of the two spans is unknown, or known but other + // than parent-child. + Span_Link_TYPE_UNSPECIFIED Span_Link_Type = 0 + // The linked span is a child of the current span. + Span_Link_CHILD_LINKED_SPAN Span_Link_Type = 1 + // The linked span is a parent of the current span. + Span_Link_PARENT_LINKED_SPAN Span_Link_Type = 2 +) + +var Span_Link_Type_name = map[int32]string{ + 0: "TYPE_UNSPECIFIED", + 1: "CHILD_LINKED_SPAN", + 2: "PARENT_LINKED_SPAN", +} + +var Span_Link_Type_value = map[string]int32{ + "TYPE_UNSPECIFIED": 0, + "CHILD_LINKED_SPAN": 1, + "PARENT_LINKED_SPAN": 2, +} + +func (x Span_Link_Type) String() string { + return proto.EnumName(Span_Link_Type_name, int32(x)) +} + +func (Span_Link_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 4, 0} +} + +// A span represents a single operation within a trace. Spans can be +// nested to form a trace tree. Spans may also be linked to other spans +// from the same or different trace. And form graphs. Often, a trace +// contains a root span that describes the end-to-end latency, and one +// or more subspans for its sub-operations. A trace can also contain +// multiple root spans, or none at all. Spans do not need to be +// contiguous - there may be gaps or overlaps between spans in a trace. +// +// The next id is 17. +// TODO(bdrutu): Add an example. +type Span struct { + // A unique identifier for a trace. All spans from the same trace share + // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes + // is considered invalid. + // + // This field is semantically required. Receiver should generate new + // random trace_id if empty or invalid trace_id was received. + // + // This field is required. + TraceId []byte `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + // A unique identifier for a span within a trace, assigned when the span + // is created. The ID is an 8-byte array. An ID with all zeroes is considered + // invalid. + // + // This field is semantically required. Receiver should generate new + // random span_id if empty or invalid span_id was received. + // + // This field is required. + SpanId []byte `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` + // The Tracestate on the span. + Tracestate *Span_Tracestate `protobuf:"bytes,15,opt,name=tracestate,proto3" json:"tracestate,omitempty"` + // The `span_id` of this span's parent span. If this is a root span, then this + // field must be empty. The ID is an 8-byte array. + ParentSpanId []byte `protobuf:"bytes,3,opt,name=parent_span_id,json=parentSpanId,proto3" json:"parent_span_id,omitempty"` + // A description of the span's operation. + // + // For example, the name can be a qualified method name or a file name + // and a line number where the operation is called. A best practice is to use + // the same display name at the same call point in an application. + // This makes it easier to correlate spans in different traces. + // + // This field is semantically required to be set to non-empty string. + // When null or empty string received - receiver may use string "name" + // as a replacement. There might be smarted algorithms implemented by + // receiver to fix the empty span name. + // + // This field is required. + Name *TruncatableString `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // Distinguishes between spans generated in a particular context. For example, + // two spans with the same name may be distinguished using `CLIENT` (caller) + // and `SERVER` (callee) to identify queueing latency associated with the span. + Kind Span_SpanKind `protobuf:"varint,14,opt,name=kind,proto3,enum=opencensus.proto.trace.v1.Span_SpanKind" json:"kind,omitempty"` + // The start time of the span. On the client side, this is the time kept by + // the local machine where the span execution starts. On the server side, this + // is the time when the server's application handler starts running. + // + // This field is semantically required. When not set on receive - + // receiver should set it to the value of end_time field if it was + // set. Or to the current time if neither was set. It is important to + // keep end_time > start_time for consistency. + // + // This field is required. + StartTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + // The end time of the span. On the client side, this is the time kept by + // the local machine where the span execution ends. On the server side, this + // is the time when the server application handler stops running. + // + // This field is semantically required. When not set on receive - + // receiver should set it to start_time value. It is important to + // keep end_time > start_time for consistency. + // + // This field is required. + EndTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + // A set of attributes on the span. + Attributes *Span_Attributes `protobuf:"bytes,7,opt,name=attributes,proto3" json:"attributes,omitempty"` + // A stack trace captured at the start of the span. + StackTrace *StackTrace `protobuf:"bytes,8,opt,name=stack_trace,json=stackTrace,proto3" json:"stack_trace,omitempty"` + // The included time events. + TimeEvents *Span_TimeEvents `protobuf:"bytes,9,opt,name=time_events,json=timeEvents,proto3" json:"time_events,omitempty"` + // The included links. + Links *Span_Links `protobuf:"bytes,10,opt,name=links,proto3" json:"links,omitempty"` + // An optional final status for this span. Semantically when Status + // wasn't set it is means span ended without errors and assume + // Status.Ok (code = 0). + Status *Status `protobuf:"bytes,11,opt,name=status,proto3" json:"status,omitempty"` + // An optional resource that is associated with this span. If not set, this span + // should be part of a batch that does include the resource information, unless resource + // information is unknown. + Resource *v1.Resource `protobuf:"bytes,16,opt,name=resource,proto3" json:"resource,omitempty"` + // A highly recommended but not required flag that identifies when a + // trace crosses a process boundary. True when the parent_span belongs + // to the same process as the current span. This flag is most commonly + // used to indicate the need to adjust time as clocks in different + // processes may not be synchronized. + SameProcessAsParentSpan *wrappers.BoolValue `protobuf:"bytes,12,opt,name=same_process_as_parent_span,json=sameProcessAsParentSpan,proto3" json:"same_process_as_parent_span,omitempty"` + // An optional number of child spans that were generated while this span + // was active. If set, allows an implementation to detect missing child spans. + ChildSpanCount *wrappers.UInt32Value `protobuf:"bytes,13,opt,name=child_span_count,json=childSpanCount,proto3" json:"child_span_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span) Reset() { *m = Span{} } +func (m *Span) String() string { return proto.CompactTextString(m) } +func (*Span) ProtoMessage() {} +func (*Span) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0} +} + +func (m *Span) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span.Unmarshal(m, b) +} +func (m *Span) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span.Marshal(b, m, deterministic) +} +func (m *Span) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span.Merge(m, src) +} +func (m *Span) XXX_Size() int { + return xxx_messageInfo_Span.Size(m) +} +func (m *Span) XXX_DiscardUnknown() { + xxx_messageInfo_Span.DiscardUnknown(m) +} + +var xxx_messageInfo_Span proto.InternalMessageInfo + +func (m *Span) GetTraceId() []byte { + if m != nil { + return m.TraceId + } + return nil +} + +func (m *Span) GetSpanId() []byte { + if m != nil { + return m.SpanId + } + return nil +} + +func (m *Span) GetTracestate() *Span_Tracestate { + if m != nil { + return m.Tracestate + } + return nil +} + +func (m *Span) GetParentSpanId() []byte { + if m != nil { + return m.ParentSpanId + } + return nil +} + +func (m *Span) GetName() *TruncatableString { + if m != nil { + return m.Name + } + return nil +} + +func (m *Span) GetKind() Span_SpanKind { + if m != nil { + return m.Kind + } + return Span_SPAN_KIND_UNSPECIFIED +} + +func (m *Span) GetStartTime() *timestamp.Timestamp { + if m != nil { + return m.StartTime + } + return nil +} + +func (m *Span) GetEndTime() *timestamp.Timestamp { + if m != nil { + return m.EndTime + } + return nil +} + +func (m *Span) GetAttributes() *Span_Attributes { + if m != nil { + return m.Attributes + } + return nil +} + +func (m *Span) GetStackTrace() *StackTrace { + if m != nil { + return m.StackTrace + } + return nil +} + +func (m *Span) GetTimeEvents() *Span_TimeEvents { + if m != nil { + return m.TimeEvents + } + return nil +} + +func (m *Span) GetLinks() *Span_Links { + if m != nil { + return m.Links + } + return nil +} + +func (m *Span) GetStatus() *Status { + if m != nil { + return m.Status + } + return nil +} + +func (m *Span) GetResource() *v1.Resource { + if m != nil { + return m.Resource + } + return nil +} + +func (m *Span) GetSameProcessAsParentSpan() *wrappers.BoolValue { + if m != nil { + return m.SameProcessAsParentSpan + } + return nil +} + +func (m *Span) GetChildSpanCount() *wrappers.UInt32Value { + if m != nil { + return m.ChildSpanCount + } + return nil +} + +// This field conveys information about request position in multiple distributed tracing graphs. +// It is a list of Tracestate.Entry with a maximum of 32 members in the list. +// +// See the https://github.com/w3c/distributed-tracing for more details about this field. +type Span_Tracestate struct { + // A list of entries that represent the Tracestate. + Entries []*Span_Tracestate_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_Tracestate) Reset() { *m = Span_Tracestate{} } +func (m *Span_Tracestate) String() string { return proto.CompactTextString(m) } +func (*Span_Tracestate) ProtoMessage() {} +func (*Span_Tracestate) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 0} +} + +func (m *Span_Tracestate) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_Tracestate.Unmarshal(m, b) +} +func (m *Span_Tracestate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_Tracestate.Marshal(b, m, deterministic) +} +func (m *Span_Tracestate) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_Tracestate.Merge(m, src) +} +func (m *Span_Tracestate) XXX_Size() int { + return xxx_messageInfo_Span_Tracestate.Size(m) +} +func (m *Span_Tracestate) XXX_DiscardUnknown() { + xxx_messageInfo_Span_Tracestate.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_Tracestate proto.InternalMessageInfo + +func (m *Span_Tracestate) GetEntries() []*Span_Tracestate_Entry { + if m != nil { + return m.Entries + } + return nil +} + +type Span_Tracestate_Entry struct { + // The key must begin with a lowercase letter, and can only contain + // lowercase letters 'a'-'z', digits '0'-'9', underscores '_', dashes + // '-', asterisks '*', and forward slashes '/'. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // The value is opaque string up to 256 characters printable ASCII + // RFC0020 characters (i.e., the range 0x20 to 0x7E) except ',' and '='. + // Note that this also excludes tabs, newlines, carriage returns, etc. + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_Tracestate_Entry) Reset() { *m = Span_Tracestate_Entry{} } +func (m *Span_Tracestate_Entry) String() string { return proto.CompactTextString(m) } +func (*Span_Tracestate_Entry) ProtoMessage() {} +func (*Span_Tracestate_Entry) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 0, 0} +} + +func (m *Span_Tracestate_Entry) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_Tracestate_Entry.Unmarshal(m, b) +} +func (m *Span_Tracestate_Entry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_Tracestate_Entry.Marshal(b, m, deterministic) +} +func (m *Span_Tracestate_Entry) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_Tracestate_Entry.Merge(m, src) +} +func (m *Span_Tracestate_Entry) XXX_Size() int { + return xxx_messageInfo_Span_Tracestate_Entry.Size(m) +} +func (m *Span_Tracestate_Entry) XXX_DiscardUnknown() { + xxx_messageInfo_Span_Tracestate_Entry.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_Tracestate_Entry proto.InternalMessageInfo + +func (m *Span_Tracestate_Entry) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *Span_Tracestate_Entry) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// A set of attributes, each with a key and a value. +type Span_Attributes struct { + // The set of attributes. The value can be a string, an integer, a double + // or the Boolean values `true` or `false`. Note, global attributes like + // server name can be set as tags using resource API. Examples of attributes: + // + // "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" + // "/http/server_latency": 300 + // "abc.com/myattribute": true + // "abc.com/score": 10.239 + AttributeMap map[string]*AttributeValue `protobuf:"bytes,1,rep,name=attribute_map,json=attributeMap,proto3" json:"attribute_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The number of attributes that were discarded. Attributes can be discarded + // because their keys are too long or because there are too many attributes. + // If this value is 0, then no attributes were dropped. + DroppedAttributesCount int32 `protobuf:"varint,2,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_Attributes) Reset() { *m = Span_Attributes{} } +func (m *Span_Attributes) String() string { return proto.CompactTextString(m) } +func (*Span_Attributes) ProtoMessage() {} +func (*Span_Attributes) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 1} +} + +func (m *Span_Attributes) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_Attributes.Unmarshal(m, b) +} +func (m *Span_Attributes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_Attributes.Marshal(b, m, deterministic) +} +func (m *Span_Attributes) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_Attributes.Merge(m, src) +} +func (m *Span_Attributes) XXX_Size() int { + return xxx_messageInfo_Span_Attributes.Size(m) +} +func (m *Span_Attributes) XXX_DiscardUnknown() { + xxx_messageInfo_Span_Attributes.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_Attributes proto.InternalMessageInfo + +func (m *Span_Attributes) GetAttributeMap() map[string]*AttributeValue { + if m != nil { + return m.AttributeMap + } + return nil +} + +func (m *Span_Attributes) GetDroppedAttributesCount() int32 { + if m != nil { + return m.DroppedAttributesCount + } + return 0 +} + +// A time-stamped annotation or message event in the Span. +type Span_TimeEvent struct { + // The time the event occurred. + Time *timestamp.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` + // A `TimeEvent` can contain either an `Annotation` object or a + // `MessageEvent` object, but not both. + // + // Types that are valid to be assigned to Value: + // *Span_TimeEvent_Annotation_ + // *Span_TimeEvent_MessageEvent_ + Value isSpan_TimeEvent_Value `protobuf_oneof:"value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_TimeEvent) Reset() { *m = Span_TimeEvent{} } +func (m *Span_TimeEvent) String() string { return proto.CompactTextString(m) } +func (*Span_TimeEvent) ProtoMessage() {} +func (*Span_TimeEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 2} +} + +func (m *Span_TimeEvent) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_TimeEvent.Unmarshal(m, b) +} +func (m *Span_TimeEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_TimeEvent.Marshal(b, m, deterministic) +} +func (m *Span_TimeEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_TimeEvent.Merge(m, src) +} +func (m *Span_TimeEvent) XXX_Size() int { + return xxx_messageInfo_Span_TimeEvent.Size(m) +} +func (m *Span_TimeEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Span_TimeEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_TimeEvent proto.InternalMessageInfo + +func (m *Span_TimeEvent) GetTime() *timestamp.Timestamp { + if m != nil { + return m.Time + } + return nil +} + +type isSpan_TimeEvent_Value interface { + isSpan_TimeEvent_Value() +} + +type Span_TimeEvent_Annotation_ struct { + Annotation *Span_TimeEvent_Annotation `protobuf:"bytes,2,opt,name=annotation,proto3,oneof"` +} + +type Span_TimeEvent_MessageEvent_ struct { + MessageEvent *Span_TimeEvent_MessageEvent `protobuf:"bytes,3,opt,name=message_event,json=messageEvent,proto3,oneof"` +} + +func (*Span_TimeEvent_Annotation_) isSpan_TimeEvent_Value() {} + +func (*Span_TimeEvent_MessageEvent_) isSpan_TimeEvent_Value() {} + +func (m *Span_TimeEvent) GetValue() isSpan_TimeEvent_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *Span_TimeEvent) GetAnnotation() *Span_TimeEvent_Annotation { + if x, ok := m.GetValue().(*Span_TimeEvent_Annotation_); ok { + return x.Annotation + } + return nil +} + +func (m *Span_TimeEvent) GetMessageEvent() *Span_TimeEvent_MessageEvent { + if x, ok := m.GetValue().(*Span_TimeEvent_MessageEvent_); ok { + return x.MessageEvent + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Span_TimeEvent) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Span_TimeEvent_Annotation_)(nil), + (*Span_TimeEvent_MessageEvent_)(nil), + } +} + +// A text annotation with a set of attributes. +type Span_TimeEvent_Annotation struct { + // A user-supplied message describing the event. + Description *TruncatableString `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // A set of attributes on the annotation. + Attributes *Span_Attributes `protobuf:"bytes,2,opt,name=attributes,proto3" json:"attributes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_TimeEvent_Annotation) Reset() { *m = Span_TimeEvent_Annotation{} } +func (m *Span_TimeEvent_Annotation) String() string { return proto.CompactTextString(m) } +func (*Span_TimeEvent_Annotation) ProtoMessage() {} +func (*Span_TimeEvent_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 2, 0} +} + +func (m *Span_TimeEvent_Annotation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_TimeEvent_Annotation.Unmarshal(m, b) +} +func (m *Span_TimeEvent_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_TimeEvent_Annotation.Marshal(b, m, deterministic) +} +func (m *Span_TimeEvent_Annotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_TimeEvent_Annotation.Merge(m, src) +} +func (m *Span_TimeEvent_Annotation) XXX_Size() int { + return xxx_messageInfo_Span_TimeEvent_Annotation.Size(m) +} +func (m *Span_TimeEvent_Annotation) XXX_DiscardUnknown() { + xxx_messageInfo_Span_TimeEvent_Annotation.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_TimeEvent_Annotation proto.InternalMessageInfo + +func (m *Span_TimeEvent_Annotation) GetDescription() *TruncatableString { + if m != nil { + return m.Description + } + return nil +} + +func (m *Span_TimeEvent_Annotation) GetAttributes() *Span_Attributes { + if m != nil { + return m.Attributes + } + return nil +} + +// An event describing a message sent/received between Spans. +type Span_TimeEvent_MessageEvent struct { + // The type of MessageEvent. Indicates whether the message was sent or + // received. + Type Span_TimeEvent_MessageEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=opencensus.proto.trace.v1.Span_TimeEvent_MessageEvent_Type" json:"type,omitempty"` + // An identifier for the MessageEvent's message that can be used to match + // SENT and RECEIVED MessageEvents. For example, this field could + // represent a sequence ID for a streaming RPC. It is recommended to be + // unique within a Span. + Id uint64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + // The number of uncompressed bytes sent or received. + UncompressedSize uint64 `protobuf:"varint,3,opt,name=uncompressed_size,json=uncompressedSize,proto3" json:"uncompressed_size,omitempty"` + // The number of compressed bytes sent or received. If zero, assumed to + // be the same size as uncompressed. + CompressedSize uint64 `protobuf:"varint,4,opt,name=compressed_size,json=compressedSize,proto3" json:"compressed_size,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_TimeEvent_MessageEvent) Reset() { *m = Span_TimeEvent_MessageEvent{} } +func (m *Span_TimeEvent_MessageEvent) String() string { return proto.CompactTextString(m) } +func (*Span_TimeEvent_MessageEvent) ProtoMessage() {} +func (*Span_TimeEvent_MessageEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 2, 1} +} + +func (m *Span_TimeEvent_MessageEvent) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_TimeEvent_MessageEvent.Unmarshal(m, b) +} +func (m *Span_TimeEvent_MessageEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_TimeEvent_MessageEvent.Marshal(b, m, deterministic) +} +func (m *Span_TimeEvent_MessageEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_TimeEvent_MessageEvent.Merge(m, src) +} +func (m *Span_TimeEvent_MessageEvent) XXX_Size() int { + return xxx_messageInfo_Span_TimeEvent_MessageEvent.Size(m) +} +func (m *Span_TimeEvent_MessageEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Span_TimeEvent_MessageEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_TimeEvent_MessageEvent proto.InternalMessageInfo + +func (m *Span_TimeEvent_MessageEvent) GetType() Span_TimeEvent_MessageEvent_Type { + if m != nil { + return m.Type + } + return Span_TimeEvent_MessageEvent_TYPE_UNSPECIFIED +} + +func (m *Span_TimeEvent_MessageEvent) GetId() uint64 { + if m != nil { + return m.Id + } + return 0 +} + +func (m *Span_TimeEvent_MessageEvent) GetUncompressedSize() uint64 { + if m != nil { + return m.UncompressedSize + } + return 0 +} + +func (m *Span_TimeEvent_MessageEvent) GetCompressedSize() uint64 { + if m != nil { + return m.CompressedSize + } + return 0 +} + +// A collection of `TimeEvent`s. A `TimeEvent` is a time-stamped annotation +// on the span, consisting of either user-supplied key-value pairs, or +// details of a message sent/received between Spans. +type Span_TimeEvents struct { + // A collection of `TimeEvent`s. + TimeEvent []*Span_TimeEvent `protobuf:"bytes,1,rep,name=time_event,json=timeEvent,proto3" json:"time_event,omitempty"` + // The number of dropped annotations in all the included time events. + // If the value is 0, then no annotations were dropped. + DroppedAnnotationsCount int32 `protobuf:"varint,2,opt,name=dropped_annotations_count,json=droppedAnnotationsCount,proto3" json:"dropped_annotations_count,omitempty"` + // The number of dropped message events in all the included time events. + // If the value is 0, then no message events were dropped. + DroppedMessageEventsCount int32 `protobuf:"varint,3,opt,name=dropped_message_events_count,json=droppedMessageEventsCount,proto3" json:"dropped_message_events_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_TimeEvents) Reset() { *m = Span_TimeEvents{} } +func (m *Span_TimeEvents) String() string { return proto.CompactTextString(m) } +func (*Span_TimeEvents) ProtoMessage() {} +func (*Span_TimeEvents) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 3} +} + +func (m *Span_TimeEvents) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_TimeEvents.Unmarshal(m, b) +} +func (m *Span_TimeEvents) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_TimeEvents.Marshal(b, m, deterministic) +} +func (m *Span_TimeEvents) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_TimeEvents.Merge(m, src) +} +func (m *Span_TimeEvents) XXX_Size() int { + return xxx_messageInfo_Span_TimeEvents.Size(m) +} +func (m *Span_TimeEvents) XXX_DiscardUnknown() { + xxx_messageInfo_Span_TimeEvents.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_TimeEvents proto.InternalMessageInfo + +func (m *Span_TimeEvents) GetTimeEvent() []*Span_TimeEvent { + if m != nil { + return m.TimeEvent + } + return nil +} + +func (m *Span_TimeEvents) GetDroppedAnnotationsCount() int32 { + if m != nil { + return m.DroppedAnnotationsCount + } + return 0 +} + +func (m *Span_TimeEvents) GetDroppedMessageEventsCount() int32 { + if m != nil { + return m.DroppedMessageEventsCount + } + return 0 +} + +// A pointer from the current span to another span in the same trace or in a +// different trace. For example, this can be used in batching operations, +// where a single batch handler processes multiple requests from different +// traces or when the handler receives a request from a different project. +type Span_Link struct { + // A unique identifier of a trace that this linked span is part of. The ID is a + // 16-byte array. + TraceId []byte `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + // A unique identifier for the linked span. The ID is an 8-byte array. + SpanId []byte `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` + // The relationship of the current span relative to the linked span. + Type Span_Link_Type `protobuf:"varint,3,opt,name=type,proto3,enum=opencensus.proto.trace.v1.Span_Link_Type" json:"type,omitempty"` + // A set of attributes on the link. + Attributes *Span_Attributes `protobuf:"bytes,4,opt,name=attributes,proto3" json:"attributes,omitempty"` + // The Tracestate associated with the link. + Tracestate *Span_Tracestate `protobuf:"bytes,5,opt,name=tracestate,proto3" json:"tracestate,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_Link) Reset() { *m = Span_Link{} } +func (m *Span_Link) String() string { return proto.CompactTextString(m) } +func (*Span_Link) ProtoMessage() {} +func (*Span_Link) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 4} +} + +func (m *Span_Link) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_Link.Unmarshal(m, b) +} +func (m *Span_Link) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_Link.Marshal(b, m, deterministic) +} +func (m *Span_Link) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_Link.Merge(m, src) +} +func (m *Span_Link) XXX_Size() int { + return xxx_messageInfo_Span_Link.Size(m) +} +func (m *Span_Link) XXX_DiscardUnknown() { + xxx_messageInfo_Span_Link.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_Link proto.InternalMessageInfo + +func (m *Span_Link) GetTraceId() []byte { + if m != nil { + return m.TraceId + } + return nil +} + +func (m *Span_Link) GetSpanId() []byte { + if m != nil { + return m.SpanId + } + return nil +} + +func (m *Span_Link) GetType() Span_Link_Type { + if m != nil { + return m.Type + } + return Span_Link_TYPE_UNSPECIFIED +} + +func (m *Span_Link) GetAttributes() *Span_Attributes { + if m != nil { + return m.Attributes + } + return nil +} + +func (m *Span_Link) GetTracestate() *Span_Tracestate { + if m != nil { + return m.Tracestate + } + return nil +} + +// A collection of links, which are references from this span to a span +// in the same or different trace. +type Span_Links struct { + // A collection of links. + Link []*Span_Link `protobuf:"bytes,1,rep,name=link,proto3" json:"link,omitempty"` + // The number of dropped links after the maximum size was enforced. If + // this value is 0, then no links were dropped. + DroppedLinksCount int32 `protobuf:"varint,2,opt,name=dropped_links_count,json=droppedLinksCount,proto3" json:"dropped_links_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Span_Links) Reset() { *m = Span_Links{} } +func (m *Span_Links) String() string { return proto.CompactTextString(m) } +func (*Span_Links) ProtoMessage() {} +func (*Span_Links) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{0, 5} +} + +func (m *Span_Links) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Span_Links.Unmarshal(m, b) +} +func (m *Span_Links) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Span_Links.Marshal(b, m, deterministic) +} +func (m *Span_Links) XXX_Merge(src proto.Message) { + xxx_messageInfo_Span_Links.Merge(m, src) +} +func (m *Span_Links) XXX_Size() int { + return xxx_messageInfo_Span_Links.Size(m) +} +func (m *Span_Links) XXX_DiscardUnknown() { + xxx_messageInfo_Span_Links.DiscardUnknown(m) +} + +var xxx_messageInfo_Span_Links proto.InternalMessageInfo + +func (m *Span_Links) GetLink() []*Span_Link { + if m != nil { + return m.Link + } + return nil +} + +func (m *Span_Links) GetDroppedLinksCount() int32 { + if m != nil { + return m.DroppedLinksCount + } + return 0 +} + +// The `Status` type defines a logical error model that is suitable for different +// programming environments, including REST APIs and RPC APIs. This proto's fields +// are a subset of those of +// [google.rpc.Status](https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto), +// which is used by [gRPC](https://github.com/grpc). +type Status struct { + // The status code. This is optional field. It is safe to assume 0 (OK) + // when not set. + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + // A developer-facing error message, which should be in English. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{1} +} + +func (m *Status) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Status.Unmarshal(m, b) +} +func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Status.Marshal(b, m, deterministic) +} +func (m *Status) XXX_Merge(src proto.Message) { + xxx_messageInfo_Status.Merge(m, src) +} +func (m *Status) XXX_Size() int { + return xxx_messageInfo_Status.Size(m) +} +func (m *Status) XXX_DiscardUnknown() { + xxx_messageInfo_Status.DiscardUnknown(m) +} + +var xxx_messageInfo_Status proto.InternalMessageInfo + +func (m *Status) GetCode() int32 { + if m != nil { + return m.Code + } + return 0 +} + +func (m *Status) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +// The value of an Attribute. +type AttributeValue struct { + // The type of the value. + // + // Types that are valid to be assigned to Value: + // *AttributeValue_StringValue + // *AttributeValue_IntValue + // *AttributeValue_BoolValue + // *AttributeValue_DoubleValue + Value isAttributeValue_Value `protobuf_oneof:"value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AttributeValue) Reset() { *m = AttributeValue{} } +func (m *AttributeValue) String() string { return proto.CompactTextString(m) } +func (*AttributeValue) ProtoMessage() {} +func (*AttributeValue) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{2} +} + +func (m *AttributeValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_AttributeValue.Unmarshal(m, b) +} +func (m *AttributeValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_AttributeValue.Marshal(b, m, deterministic) +} +func (m *AttributeValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_AttributeValue.Merge(m, src) +} +func (m *AttributeValue) XXX_Size() int { + return xxx_messageInfo_AttributeValue.Size(m) +} +func (m *AttributeValue) XXX_DiscardUnknown() { + xxx_messageInfo_AttributeValue.DiscardUnknown(m) +} + +var xxx_messageInfo_AttributeValue proto.InternalMessageInfo + +type isAttributeValue_Value interface { + isAttributeValue_Value() +} + +type AttributeValue_StringValue struct { + StringValue *TruncatableString `protobuf:"bytes,1,opt,name=string_value,json=stringValue,proto3,oneof"` +} + +type AttributeValue_IntValue struct { + IntValue int64 `protobuf:"varint,2,opt,name=int_value,json=intValue,proto3,oneof"` +} + +type AttributeValue_BoolValue struct { + BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"` +} + +type AttributeValue_DoubleValue struct { + DoubleValue float64 `protobuf:"fixed64,4,opt,name=double_value,json=doubleValue,proto3,oneof"` +} + +func (*AttributeValue_StringValue) isAttributeValue_Value() {} + +func (*AttributeValue_IntValue) isAttributeValue_Value() {} + +func (*AttributeValue_BoolValue) isAttributeValue_Value() {} + +func (*AttributeValue_DoubleValue) isAttributeValue_Value() {} + +func (m *AttributeValue) GetValue() isAttributeValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *AttributeValue) GetStringValue() *TruncatableString { + if x, ok := m.GetValue().(*AttributeValue_StringValue); ok { + return x.StringValue + } + return nil +} + +func (m *AttributeValue) GetIntValue() int64 { + if x, ok := m.GetValue().(*AttributeValue_IntValue); ok { + return x.IntValue + } + return 0 +} + +func (m *AttributeValue) GetBoolValue() bool { + if x, ok := m.GetValue().(*AttributeValue_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *AttributeValue) GetDoubleValue() float64 { + if x, ok := m.GetValue().(*AttributeValue_DoubleValue); ok { + return x.DoubleValue + } + return 0 +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*AttributeValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*AttributeValue_StringValue)(nil), + (*AttributeValue_IntValue)(nil), + (*AttributeValue_BoolValue)(nil), + (*AttributeValue_DoubleValue)(nil), + } +} + +// The call stack which originated this span. +type StackTrace struct { + // Stack frames in this stack trace. + StackFrames *StackTrace_StackFrames `protobuf:"bytes,1,opt,name=stack_frames,json=stackFrames,proto3" json:"stack_frames,omitempty"` + // The hash ID is used to conserve network bandwidth for duplicate + // stack traces within a single trace. + // + // Often multiple spans will have identical stack traces. + // The first occurrence of a stack trace should contain both + // `stack_frames` and a value in `stack_trace_hash_id`. + // + // Subsequent spans within the same request can refer + // to that stack trace by setting only `stack_trace_hash_id`. + // + // TODO: describe how to deal with the case where stack_trace_hash_id is + // zero because it was not set. + StackTraceHashId uint64 `protobuf:"varint,2,opt,name=stack_trace_hash_id,json=stackTraceHashId,proto3" json:"stack_trace_hash_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StackTrace) Reset() { *m = StackTrace{} } +func (m *StackTrace) String() string { return proto.CompactTextString(m) } +func (*StackTrace) ProtoMessage() {} +func (*StackTrace) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{3} +} + +func (m *StackTrace) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StackTrace.Unmarshal(m, b) +} +func (m *StackTrace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StackTrace.Marshal(b, m, deterministic) +} +func (m *StackTrace) XXX_Merge(src proto.Message) { + xxx_messageInfo_StackTrace.Merge(m, src) +} +func (m *StackTrace) XXX_Size() int { + return xxx_messageInfo_StackTrace.Size(m) +} +func (m *StackTrace) XXX_DiscardUnknown() { + xxx_messageInfo_StackTrace.DiscardUnknown(m) +} + +var xxx_messageInfo_StackTrace proto.InternalMessageInfo + +func (m *StackTrace) GetStackFrames() *StackTrace_StackFrames { + if m != nil { + return m.StackFrames + } + return nil +} + +func (m *StackTrace) GetStackTraceHashId() uint64 { + if m != nil { + return m.StackTraceHashId + } + return 0 +} + +// A single stack frame in a stack trace. +type StackTrace_StackFrame struct { + // The fully-qualified name that uniquely identifies the function or + // method that is active in this frame. + FunctionName *TruncatableString `protobuf:"bytes,1,opt,name=function_name,json=functionName,proto3" json:"function_name,omitempty"` + // An un-mangled function name, if `function_name` is + // [mangled](http://www.avabodh.com/cxxin/namemangling.html). The name can + // be fully qualified. + OriginalFunctionName *TruncatableString `protobuf:"bytes,2,opt,name=original_function_name,json=originalFunctionName,proto3" json:"original_function_name,omitempty"` + // The name of the source file where the function call appears. + FileName *TruncatableString `protobuf:"bytes,3,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` + // The line number in `file_name` where the function call appears. + LineNumber int64 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number,omitempty"` + // The column number where the function call appears, if available. + // This is important in JavaScript because of its anonymous functions. + ColumnNumber int64 `protobuf:"varint,5,opt,name=column_number,json=columnNumber,proto3" json:"column_number,omitempty"` + // The binary module from where the code was loaded. + LoadModule *Module `protobuf:"bytes,6,opt,name=load_module,json=loadModule,proto3" json:"load_module,omitempty"` + // The version of the deployed source code. + SourceVersion *TruncatableString `protobuf:"bytes,7,opt,name=source_version,json=sourceVersion,proto3" json:"source_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StackTrace_StackFrame) Reset() { *m = StackTrace_StackFrame{} } +func (m *StackTrace_StackFrame) String() string { return proto.CompactTextString(m) } +func (*StackTrace_StackFrame) ProtoMessage() {} +func (*StackTrace_StackFrame) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{3, 0} +} + +func (m *StackTrace_StackFrame) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StackTrace_StackFrame.Unmarshal(m, b) +} +func (m *StackTrace_StackFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StackTrace_StackFrame.Marshal(b, m, deterministic) +} +func (m *StackTrace_StackFrame) XXX_Merge(src proto.Message) { + xxx_messageInfo_StackTrace_StackFrame.Merge(m, src) +} +func (m *StackTrace_StackFrame) XXX_Size() int { + return xxx_messageInfo_StackTrace_StackFrame.Size(m) +} +func (m *StackTrace_StackFrame) XXX_DiscardUnknown() { + xxx_messageInfo_StackTrace_StackFrame.DiscardUnknown(m) +} + +var xxx_messageInfo_StackTrace_StackFrame proto.InternalMessageInfo + +func (m *StackTrace_StackFrame) GetFunctionName() *TruncatableString { + if m != nil { + return m.FunctionName + } + return nil +} + +func (m *StackTrace_StackFrame) GetOriginalFunctionName() *TruncatableString { + if m != nil { + return m.OriginalFunctionName + } + return nil +} + +func (m *StackTrace_StackFrame) GetFileName() *TruncatableString { + if m != nil { + return m.FileName + } + return nil +} + +func (m *StackTrace_StackFrame) GetLineNumber() int64 { + if m != nil { + return m.LineNumber + } + return 0 +} + +func (m *StackTrace_StackFrame) GetColumnNumber() int64 { + if m != nil { + return m.ColumnNumber + } + return 0 +} + +func (m *StackTrace_StackFrame) GetLoadModule() *Module { + if m != nil { + return m.LoadModule + } + return nil +} + +func (m *StackTrace_StackFrame) GetSourceVersion() *TruncatableString { + if m != nil { + return m.SourceVersion + } + return nil +} + +// A collection of stack frames, which can be truncated. +type StackTrace_StackFrames struct { + // Stack frames in this call stack. + Frame []*StackTrace_StackFrame `protobuf:"bytes,1,rep,name=frame,proto3" json:"frame,omitempty"` + // The number of stack frames that were dropped because there + // were too many stack frames. + // If this value is 0, then no stack frames were dropped. + DroppedFramesCount int32 `protobuf:"varint,2,opt,name=dropped_frames_count,json=droppedFramesCount,proto3" json:"dropped_frames_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StackTrace_StackFrames) Reset() { *m = StackTrace_StackFrames{} } +func (m *StackTrace_StackFrames) String() string { return proto.CompactTextString(m) } +func (*StackTrace_StackFrames) ProtoMessage() {} +func (*StackTrace_StackFrames) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{3, 1} +} + +func (m *StackTrace_StackFrames) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StackTrace_StackFrames.Unmarshal(m, b) +} +func (m *StackTrace_StackFrames) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StackTrace_StackFrames.Marshal(b, m, deterministic) +} +func (m *StackTrace_StackFrames) XXX_Merge(src proto.Message) { + xxx_messageInfo_StackTrace_StackFrames.Merge(m, src) +} +func (m *StackTrace_StackFrames) XXX_Size() int { + return xxx_messageInfo_StackTrace_StackFrames.Size(m) +} +func (m *StackTrace_StackFrames) XXX_DiscardUnknown() { + xxx_messageInfo_StackTrace_StackFrames.DiscardUnknown(m) +} + +var xxx_messageInfo_StackTrace_StackFrames proto.InternalMessageInfo + +func (m *StackTrace_StackFrames) GetFrame() []*StackTrace_StackFrame { + if m != nil { + return m.Frame + } + return nil +} + +func (m *StackTrace_StackFrames) GetDroppedFramesCount() int32 { + if m != nil { + return m.DroppedFramesCount + } + return 0 +} + +// A description of a binary module. +type Module struct { + // TODO: document the meaning of this field. + // For example: main binary, kernel modules, and dynamic libraries + // such as libc.so, sharedlib.so. + Module *TruncatableString `protobuf:"bytes,1,opt,name=module,proto3" json:"module,omitempty"` + // A unique identifier for the module, usually a hash of its + // contents. + BuildId *TruncatableString `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Module) Reset() { *m = Module{} } +func (m *Module) String() string { return proto.CompactTextString(m) } +func (*Module) ProtoMessage() {} +func (*Module) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{4} +} + +func (m *Module) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Module.Unmarshal(m, b) +} +func (m *Module) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Module.Marshal(b, m, deterministic) +} +func (m *Module) XXX_Merge(src proto.Message) { + xxx_messageInfo_Module.Merge(m, src) +} +func (m *Module) XXX_Size() int { + return xxx_messageInfo_Module.Size(m) +} +func (m *Module) XXX_DiscardUnknown() { + xxx_messageInfo_Module.DiscardUnknown(m) +} + +var xxx_messageInfo_Module proto.InternalMessageInfo + +func (m *Module) GetModule() *TruncatableString { + if m != nil { + return m.Module + } + return nil +} + +func (m *Module) GetBuildId() *TruncatableString { + if m != nil { + return m.BuildId + } + return nil +} + +// A string that might be shortened to a specified length. +type TruncatableString struct { + // The shortened string. For example, if the original string was 500 bytes long and + // the limit of the string was 128 bytes, then this value contains the first 128 + // bytes of the 500-byte string. Note that truncation always happens on a + // character boundary, to ensure that a truncated string is still valid UTF-8. + // Because it may contain multi-byte characters, the size of the truncated string + // may be less than the truncation limit. + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + // The number of bytes removed from the original string. If this + // value is 0, then the string was not shortened. + TruncatedByteCount int32 `protobuf:"varint,2,opt,name=truncated_byte_count,json=truncatedByteCount,proto3" json:"truncated_byte_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TruncatableString) Reset() { *m = TruncatableString{} } +func (m *TruncatableString) String() string { return proto.CompactTextString(m) } +func (*TruncatableString) ProtoMessage() {} +func (*TruncatableString) Descriptor() ([]byte, []int) { + return fileDescriptor_8ea38bbb821bf584, []int{5} +} + +func (m *TruncatableString) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TruncatableString.Unmarshal(m, b) +} +func (m *TruncatableString) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TruncatableString.Marshal(b, m, deterministic) +} +func (m *TruncatableString) XXX_Merge(src proto.Message) { + xxx_messageInfo_TruncatableString.Merge(m, src) +} +func (m *TruncatableString) XXX_Size() int { + return xxx_messageInfo_TruncatableString.Size(m) +} +func (m *TruncatableString) XXX_DiscardUnknown() { + xxx_messageInfo_TruncatableString.DiscardUnknown(m) +} + +var xxx_messageInfo_TruncatableString proto.InternalMessageInfo + +func (m *TruncatableString) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *TruncatableString) GetTruncatedByteCount() int32 { + if m != nil { + return m.TruncatedByteCount + } + return 0 +} + +func init() { + proto.RegisterEnum("opencensus.proto.trace.v1.Span_SpanKind", Span_SpanKind_name, Span_SpanKind_value) + proto.RegisterEnum("opencensus.proto.trace.v1.Span_TimeEvent_MessageEvent_Type", Span_TimeEvent_MessageEvent_Type_name, Span_TimeEvent_MessageEvent_Type_value) + proto.RegisterEnum("opencensus.proto.trace.v1.Span_Link_Type", Span_Link_Type_name, Span_Link_Type_value) + proto.RegisterType((*Span)(nil), "opencensus.proto.trace.v1.Span") + proto.RegisterType((*Span_Tracestate)(nil), "opencensus.proto.trace.v1.Span.Tracestate") + proto.RegisterType((*Span_Tracestate_Entry)(nil), "opencensus.proto.trace.v1.Span.Tracestate.Entry") + proto.RegisterType((*Span_Attributes)(nil), "opencensus.proto.trace.v1.Span.Attributes") + proto.RegisterMapType((map[string]*AttributeValue)(nil), "opencensus.proto.trace.v1.Span.Attributes.AttributeMapEntry") + proto.RegisterType((*Span_TimeEvent)(nil), "opencensus.proto.trace.v1.Span.TimeEvent") + proto.RegisterType((*Span_TimeEvent_Annotation)(nil), "opencensus.proto.trace.v1.Span.TimeEvent.Annotation") + proto.RegisterType((*Span_TimeEvent_MessageEvent)(nil), "opencensus.proto.trace.v1.Span.TimeEvent.MessageEvent") + proto.RegisterType((*Span_TimeEvents)(nil), "opencensus.proto.trace.v1.Span.TimeEvents") + proto.RegisterType((*Span_Link)(nil), "opencensus.proto.trace.v1.Span.Link") + proto.RegisterType((*Span_Links)(nil), "opencensus.proto.trace.v1.Span.Links") + proto.RegisterType((*Status)(nil), "opencensus.proto.trace.v1.Status") + proto.RegisterType((*AttributeValue)(nil), "opencensus.proto.trace.v1.AttributeValue") + proto.RegisterType((*StackTrace)(nil), "opencensus.proto.trace.v1.StackTrace") + proto.RegisterType((*StackTrace_StackFrame)(nil), "opencensus.proto.trace.v1.StackTrace.StackFrame") + proto.RegisterType((*StackTrace_StackFrames)(nil), "opencensus.proto.trace.v1.StackTrace.StackFrames") + proto.RegisterType((*Module)(nil), "opencensus.proto.trace.v1.Module") + proto.RegisterType((*TruncatableString)(nil), "opencensus.proto.trace.v1.TruncatableString") +} + +func init() { + proto.RegisterFile("opencensus/proto/trace/v1/trace.proto", fileDescriptor_8ea38bbb821bf584) +} + +var fileDescriptor_8ea38bbb821bf584 = []byte{ + // 1581 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdb, 0x6e, 0x1b, 0x41, + 0x19, 0xce, 0xfa, 0xec, 0xdf, 0x8e, 0xeb, 0x4c, 0xd3, 0x74, 0x63, 0x0a, 0x0d, 0x6e, 0x0b, 0x29, + 0x25, 0x9b, 0x26, 0x2d, 0x55, 0x8f, 0x2a, 0x71, 0xe2, 0x60, 0x37, 0xa9, 0xeb, 0x8e, 0xdd, 0x88, + 0x83, 0xd0, 0x6a, 0xed, 0x9d, 0x38, 0x4b, 0xec, 0xd9, 0x65, 0x77, 0x36, 0x28, 0x7d, 0x01, 0x84, + 0xe0, 0x86, 0x0b, 0xc4, 0x0b, 0x70, 0xc1, 0xeb, 0x20, 0xee, 0x79, 0x00, 0x24, 0x9e, 0x80, 0x1b, + 0x34, 0x33, 0x7b, 0x72, 0xd2, 0x26, 0xc6, 0xbd, 0xb1, 0xe6, 0xf0, 0x7f, 0xdf, 0x3f, 0xff, 0xcc, + 0x7f, 0x5a, 0xc3, 0x03, 0xdb, 0x21, 0x74, 0x48, 0xa8, 0xe7, 0x7b, 0x9b, 0x8e, 0x6b, 0x33, 0x7b, + 0x93, 0xb9, 0xc6, 0x90, 0x6c, 0x9e, 0x6d, 0xc9, 0x81, 0x26, 0x16, 0xd1, 0x6a, 0x2c, 0x26, 0x57, + 0x34, 0xb9, 0x7b, 0xb6, 0x55, 0x7b, 0x74, 0x89, 0xc1, 0x25, 0x9e, 0xed, 0xbb, 0x92, 0x24, 0x1c, + 0x4b, 0x54, 0xed, 0xee, 0xc8, 0xb6, 0x47, 0x63, 0x22, 0x05, 0x07, 0xfe, 0xf1, 0x26, 0xb3, 0x26, + 0xc4, 0x63, 0xc6, 0xc4, 0x09, 0x04, 0xbe, 0x77, 0x51, 0xe0, 0x77, 0xae, 0xe1, 0x38, 0xc4, 0x0d, + 0xd4, 0xd6, 0xff, 0xbc, 0x02, 0x99, 0x9e, 0x63, 0x50, 0xb4, 0x0a, 0x05, 0x71, 0x04, 0xdd, 0x32, + 0x55, 0x65, 0x4d, 0x59, 0x2f, 0xe3, 0xbc, 0x98, 0xb7, 0x4d, 0x74, 0x1b, 0xf2, 0x9e, 0x63, 0x50, + 0xbe, 0x93, 0x12, 0x3b, 0x39, 0x3e, 0x6d, 0x9b, 0xe8, 0x1d, 0x80, 0x90, 0xf1, 0x98, 0xc1, 0x88, + 0x7a, 0x63, 0x4d, 0x59, 0x2f, 0x6d, 0xff, 0x48, 0xfb, 0xaa, 0x69, 0x1a, 0x57, 0xa4, 0xf5, 0x23, + 0x04, 0x4e, 0xa0, 0xd1, 0x7d, 0xa8, 0x38, 0x86, 0x4b, 0x28, 0xd3, 0x43, 0x5d, 0x69, 0xa1, 0xab, + 0x2c, 0x57, 0x7b, 0x52, 0xe3, 0x4f, 0x21, 0x43, 0x8d, 0x09, 0x51, 0x33, 0x42, 0xd7, 0x8f, 0xaf, + 0xd0, 0xd5, 0x77, 0x7d, 0x3a, 0x34, 0x98, 0x31, 0x18, 0x93, 0x1e, 0x73, 0x2d, 0x3a, 0xc2, 0x02, + 0x89, 0x5e, 0x43, 0xe6, 0xd4, 0xa2, 0xa6, 0x5a, 0x59, 0x53, 0xd6, 0x2b, 0xdb, 0xeb, 0xd7, 0x9d, + 0x96, 0xff, 0x1c, 0x58, 0xd4, 0xc4, 0x02, 0x85, 0x5e, 0x00, 0x78, 0xcc, 0x70, 0x99, 0xce, 0xef, + 0x59, 0xcd, 0x8a, 0x53, 0xd4, 0x34, 0x79, 0xc7, 0x5a, 0x78, 0xc7, 0x5a, 0x3f, 0x7c, 0x04, 0x5c, + 0x14, 0xd2, 0x7c, 0x8e, 0x7e, 0x02, 0x05, 0x42, 0x4d, 0x09, 0xcc, 0x5d, 0x0b, 0xcc, 0x13, 0x6a, + 0x0a, 0xd8, 0x3b, 0x00, 0x83, 0x31, 0xd7, 0x1a, 0xf8, 0x8c, 0x78, 0x6a, 0x7e, 0xb6, 0x3b, 0xde, + 0x89, 0x10, 0x38, 0x81, 0x46, 0xfb, 0x50, 0xf2, 0x98, 0x31, 0x3c, 0xd5, 0x85, 0xb4, 0x5a, 0x10, + 0x64, 0x0f, 0xae, 0x22, 0xe3, 0xd2, 0xe2, 0xc1, 0x30, 0x78, 0xd1, 0x18, 0x1d, 0x40, 0x89, 0x9b, + 0xa1, 0x93, 0x33, 0x42, 0x99, 0xa7, 0x16, 0x67, 0x7c, 0x78, 0x6b, 0x42, 0x9a, 0x02, 0x81, 0x81, + 0x45, 0x63, 0xf4, 0x0a, 0xb2, 0x63, 0x8b, 0x9e, 0x7a, 0x2a, 0x5c, 0x7f, 0x1c, 0x4e, 0x73, 0xc8, + 0x85, 0xb1, 0xc4, 0xa0, 0x17, 0x90, 0xe3, 0xee, 0xe3, 0x7b, 0x6a, 0x49, 0xa0, 0xbf, 0x7f, 0xb5, + 0x31, 0xcc, 0xf7, 0x70, 0x00, 0x40, 0x0d, 0x28, 0x84, 0xc1, 0xa4, 0x56, 0x05, 0xf8, 0x07, 0x97, + 0xc1, 0x51, 0xb8, 0x9d, 0x6d, 0x69, 0x38, 0x18, 0xe3, 0x08, 0x87, 0x7e, 0x0e, 0xdf, 0xf1, 0x8c, + 0x09, 0xd1, 0x1d, 0xd7, 0x1e, 0x12, 0xcf, 0xd3, 0x0d, 0x4f, 0x4f, 0x38, 0xb1, 0x5a, 0xfe, 0xca, + 0x33, 0x37, 0x6c, 0x7b, 0x7c, 0x64, 0x8c, 0x7d, 0x82, 0x6f, 0x73, 0x78, 0x57, 0xa2, 0x77, 0xbc, + 0x6e, 0xe4, 0xea, 0x68, 0x1f, 0xaa, 0xc3, 0x13, 0x6b, 0x6c, 0xca, 0x68, 0x18, 0xda, 0x3e, 0x65, + 0xea, 0xa2, 0xa0, 0xbb, 0x73, 0x89, 0xee, 0x53, 0x9b, 0xb2, 0x27, 0xdb, 0x92, 0xb0, 0x22, 0x50, + 0x9c, 0x62, 0x97, 0x63, 0x6a, 0x7f, 0x50, 0x00, 0xe2, 0x88, 0x43, 0xef, 0x20, 0x4f, 0x28, 0x73, + 0x2d, 0xe2, 0xa9, 0xca, 0x5a, 0x7a, 0xbd, 0xb4, 0xfd, 0x78, 0xf6, 0x70, 0xd5, 0x9a, 0x94, 0xb9, + 0xe7, 0x38, 0x24, 0xa8, 0x6d, 0x42, 0x56, 0xac, 0xa0, 0x2a, 0xa4, 0x4f, 0xc9, 0xb9, 0xc8, 0x1a, + 0x45, 0xcc, 0x87, 0x68, 0x19, 0xb2, 0x67, 0xfc, 0x38, 0x22, 0x5f, 0x14, 0xb1, 0x9c, 0xd4, 0xfe, + 0x92, 0x02, 0x88, 0x3d, 0x13, 0x19, 0xb0, 0x18, 0xf9, 0xa6, 0x3e, 0x31, 0x9c, 0xe0, 0x44, 0xaf, + 0x67, 0x77, 0xee, 0x78, 0xf8, 0xde, 0x70, 0xe4, 0xe9, 0xca, 0x46, 0x62, 0x09, 0x3d, 0x07, 0xd5, + 0x74, 0x6d, 0xc7, 0x21, 0xa6, 0x1e, 0x87, 0x41, 0x70, 0x9b, 0xfc, 0x68, 0x59, 0xbc, 0x12, 0xec, + 0xc7, 0xa4, 0xf2, 0xde, 0x7e, 0x03, 0x4b, 0x97, 0xc8, 0xbf, 0x60, 0xe8, 0xdb, 0xa4, 0xa1, 0xa5, + 0xed, 0x87, 0x57, 0x9c, 0x3d, 0xa2, 0x93, 0x0f, 0x25, 0x71, 0x2f, 0x53, 0xcf, 0x95, 0xda, 0xdf, + 0xb2, 0x50, 0x8c, 0x82, 0x03, 0x69, 0x90, 0x11, 0x39, 0x42, 0xb9, 0x36, 0x47, 0x08, 0x39, 0x74, + 0x04, 0x60, 0x50, 0x6a, 0x33, 0x83, 0x59, 0x36, 0x0d, 0xce, 0xf1, 0x74, 0xe6, 0x58, 0xd4, 0x76, + 0x22, 0x6c, 0x6b, 0x01, 0x27, 0x98, 0xd0, 0xaf, 0x61, 0x71, 0x42, 0x3c, 0xcf, 0x18, 0x05, 0x71, + 0x2e, 0xf2, 0x71, 0x69, 0xfb, 0xd9, 0xec, 0xd4, 0xef, 0x25, 0x5c, 0x4c, 0x5a, 0x0b, 0xb8, 0x3c, + 0x49, 0xcc, 0x6b, 0x7f, 0x57, 0x00, 0x62, 0xdd, 0xa8, 0x03, 0x25, 0x93, 0x78, 0x43, 0xd7, 0x72, + 0x84, 0x19, 0xca, 0x1c, 0xf9, 0x3d, 0x49, 0x70, 0x21, 0x6d, 0xa6, 0xbe, 0x25, 0x6d, 0xd6, 0xfe, + 0xab, 0x40, 0x39, 0x69, 0x0b, 0xfa, 0x00, 0x19, 0x76, 0xee, 0xc8, 0x27, 0xaa, 0x6c, 0xbf, 0x9a, + 0xef, 0x46, 0xb4, 0xfe, 0xb9, 0x43, 0xb0, 0x20, 0x42, 0x15, 0x48, 0x05, 0xc5, 0x35, 0x83, 0x53, + 0x96, 0x89, 0x1e, 0xc1, 0x92, 0x4f, 0x87, 0xf6, 0xc4, 0x71, 0x89, 0xe7, 0x11, 0x53, 0xf7, 0xac, + 0xcf, 0x44, 0xdc, 0x7f, 0x06, 0x57, 0x93, 0x1b, 0x3d, 0xeb, 0x33, 0x41, 0x3f, 0x84, 0x1b, 0x17, + 0x45, 0x33, 0x42, 0xb4, 0x32, 0x2d, 0x58, 0x7f, 0x0a, 0x19, 0xae, 0x13, 0x2d, 0x43, 0xb5, 0xff, + 0x8b, 0x6e, 0x53, 0xff, 0xd4, 0xe9, 0x75, 0x9b, 0xbb, 0xed, 0xfd, 0x76, 0x73, 0xaf, 0xba, 0x80, + 0x0a, 0x90, 0xe9, 0x35, 0x3b, 0xfd, 0xaa, 0x82, 0xca, 0x50, 0xc0, 0xcd, 0xdd, 0x66, 0xfb, 0xa8, + 0xb9, 0x57, 0x4d, 0x35, 0xf2, 0x81, 0x8b, 0xd7, 0xfe, 0xc9, 0x53, 0x49, 0x9c, 0xb7, 0x5b, 0x00, + 0x71, 0x11, 0x08, 0x62, 0xf7, 0xe1, 0xcc, 0x57, 0x81, 0x8b, 0x51, 0x09, 0x40, 0x2f, 0x61, 0x35, + 0x8a, 0xd2, 0xc8, 0x23, 0xa6, 0xc3, 0xf4, 0x76, 0x18, 0xa6, 0xf1, 0xbe, 0x88, 0x53, 0xf4, 0x16, + 0xee, 0x84, 0xd8, 0x29, 0x6f, 0x0d, 0xe1, 0x69, 0x01, 0x0f, 0xf9, 0x93, 0xf7, 0x1f, 0x04, 0xfa, + 0xbf, 0x52, 0x90, 0xe1, 0x25, 0x65, 0xae, 0x06, 0xe8, 0x4d, 0xe0, 0x08, 0x69, 0xe1, 0x08, 0x0f, + 0x67, 0x29, 0x5d, 0xc9, 0x67, 0x9f, 0x76, 0xd2, 0xcc, 0x37, 0xd5, 0xf6, 0xe9, 0x5e, 0x2c, 0xfb, + 0x2d, 0xbd, 0x58, 0xfd, 0xe0, 0x4a, 0x47, 0xb9, 0x05, 0x4b, 0xbb, 0xad, 0xf6, 0xe1, 0x9e, 0x7e, + 0xd8, 0xee, 0x1c, 0x34, 0xf7, 0xf4, 0x5e, 0x77, 0xa7, 0x53, 0x55, 0xd0, 0x0a, 0xa0, 0xee, 0x0e, + 0x6e, 0x76, 0xfa, 0x53, 0xeb, 0xa9, 0xda, 0x6f, 0x21, 0x2b, 0x4a, 0x36, 0x7a, 0x0e, 0x19, 0x5e, + 0xb4, 0x03, 0x57, 0xb9, 0x3f, 0xcb, 0x65, 0x61, 0x81, 0x40, 0x1a, 0xdc, 0x0c, 0x1f, 0x59, 0x94, + 0xfd, 0x29, 0xd7, 0x58, 0x0a, 0xb6, 0x84, 0x12, 0xf1, 0xa6, 0xf5, 0x37, 0x50, 0x08, 0xfb, 0x36, + 0xb4, 0x0a, 0xb7, 0xf8, 0x41, 0xf4, 0x83, 0x76, 0x67, 0xef, 0x82, 0x21, 0x00, 0xb9, 0x5e, 0x13, + 0x1f, 0x35, 0x71, 0x55, 0xe1, 0xe3, 0xdd, 0xc3, 0x36, 0xf7, 0xff, 0x54, 0xfd, 0x19, 0xe4, 0x64, + 0xaf, 0x80, 0x10, 0x64, 0x86, 0xb6, 0x29, 0x03, 0x3d, 0x8b, 0xc5, 0x18, 0xa9, 0x90, 0x0f, 0x3c, + 0x2d, 0xa8, 0x6e, 0xe1, 0xb4, 0xfe, 0x0f, 0x05, 0x2a, 0xd3, 0x59, 0x1e, 0x7d, 0x84, 0xb2, 0x27, + 0xb2, 0x93, 0x2e, 0xcb, 0xc4, 0x1c, 0x79, 0xad, 0xb5, 0x80, 0x4b, 0x92, 0x43, 0x52, 0x7e, 0x17, + 0x8a, 0x16, 0x65, 0x7a, 0x5c, 0x76, 0xd2, 0xad, 0x05, 0x5c, 0xb0, 0x28, 0x93, 0xdb, 0x77, 0x01, + 0x06, 0xb6, 0x3d, 0x0e, 0xf6, 0xb9, 0x63, 0x16, 0x5a, 0x0b, 0xb8, 0x38, 0x08, 0x5b, 0x0e, 0x74, + 0x0f, 0xca, 0xa6, 0xed, 0x0f, 0xc6, 0x24, 0x10, 0xe1, 0x6e, 0xa7, 0x70, 0x25, 0x72, 0x55, 0x08, + 0x45, 0x41, 0x5f, 0xff, 0x63, 0x0e, 0x20, 0xee, 0x02, 0x51, 0x9f, 0xdb, 0xc3, 0x3b, 0xc8, 0x63, + 0xd7, 0x98, 0x88, 0x26, 0x82, 0xdb, 0xb3, 0x35, 0x53, 0x0b, 0x29, 0x87, 0xfb, 0x02, 0x88, 0x65, + 0x23, 0x2a, 0x27, 0x68, 0x03, 0x6e, 0x26, 0xfa, 0x52, 0xfd, 0xc4, 0xf0, 0x4e, 0xf4, 0x28, 0x1f, + 0x56, 0xe3, 0xc6, 0xb3, 0x65, 0x78, 0x27, 0x6d, 0xb3, 0xf6, 0x9f, 0x74, 0x70, 0x26, 0x01, 0x47, + 0x1f, 0x61, 0xf1, 0xd8, 0xa7, 0x43, 0x9e, 0x14, 0x74, 0xf1, 0x71, 0x30, 0x4f, 0xf1, 0x28, 0x87, + 0x14, 0x1d, 0x4e, 0x39, 0x80, 0x15, 0xdb, 0xb5, 0x46, 0x16, 0x35, 0xc6, 0xfa, 0x34, 0x77, 0x6a, + 0x0e, 0xee, 0xe5, 0x90, 0x6b, 0x3f, 0xa9, 0xa3, 0x0d, 0xc5, 0x63, 0x6b, 0x4c, 0x24, 0x6d, 0x7a, + 0x0e, 0xda, 0x02, 0x87, 0x0b, 0xaa, 0xbb, 0x50, 0x1a, 0x5b, 0x94, 0xe8, 0xd4, 0x9f, 0x0c, 0x88, + 0x2b, 0x5e, 0x34, 0x8d, 0x81, 0x2f, 0x75, 0xc4, 0x0a, 0xba, 0x07, 0x8b, 0x43, 0x7b, 0xec, 0x4f, + 0x68, 0x28, 0x92, 0x15, 0x22, 0x65, 0xb9, 0x18, 0x08, 0x35, 0xa0, 0x34, 0xb6, 0x0d, 0x53, 0x9f, + 0xd8, 0xa6, 0x3f, 0x0e, 0xbf, 0x51, 0xae, 0x6a, 0xa8, 0xdf, 0x0b, 0x41, 0x0c, 0x1c, 0x25, 0xc7, + 0xa8, 0x07, 0x15, 0xd9, 0x1a, 0xeb, 0x67, 0xc4, 0xf5, 0x78, 0x25, 0xcf, 0xcf, 0x61, 0xd9, 0xa2, + 0xe4, 0x38, 0x92, 0x14, 0xb5, 0xdf, 0x2b, 0x50, 0x4a, 0xf8, 0x0e, 0xda, 0x87, 0xac, 0x70, 0xbf, + 0x59, 0x5a, 0xd8, 0x2f, 0x79, 0x1f, 0x96, 0x70, 0xf4, 0x18, 0x96, 0xc3, 0xb4, 0x22, 0xdd, 0x79, + 0x2a, 0xaf, 0xa0, 0x60, 0x4f, 0x2a, 0x95, 0x89, 0xe5, 0xaf, 0x0a, 0xe4, 0x02, 0x4b, 0xf7, 0x20, + 0x17, 0x5c, 0xd4, 0x3c, 0xee, 0x16, 0x60, 0xd1, 0xcf, 0xa0, 0x30, 0xf0, 0x79, 0x9b, 0x1f, 0xb8, + 0xfb, 0xff, 0xcb, 0x93, 0x17, 0xe8, 0xb6, 0x59, 0xff, 0x15, 0x2c, 0x5d, 0xda, 0x8d, 0xdb, 0x70, + 0x25, 0xd1, 0x86, 0x73, 0xb3, 0x99, 0x14, 0x25, 0xa6, 0x3e, 0x38, 0x67, 0x64, 0xda, 0xec, 0x68, + 0xaf, 0x71, 0xce, 0x88, 0x30, 0xbb, 0xf1, 0x27, 0x05, 0xee, 0x58, 0xf6, 0xd7, 0x0f, 0xd6, 0x90, + 0x9f, 0x18, 0x5d, 0xbe, 0xd8, 0x55, 0x7e, 0xd9, 0x18, 0x59, 0xec, 0xc4, 0x1f, 0x68, 0x43, 0x7b, + 0xb2, 0x29, 0xe5, 0x37, 0x2c, 0xea, 0x31, 0xd7, 0x9f, 0x10, 0x2a, 0x8b, 0xf7, 0x66, 0x4c, 0xb5, + 0x21, 0xff, 0xe3, 0x18, 0x11, 0xba, 0x31, 0x8a, 0xff, 0x2c, 0xf9, 0x77, 0x6a, 0xf5, 0x83, 0x43, + 0xe8, 0xae, 0xd4, 0x26, 0x88, 0x65, 0xb1, 0xd2, 0x8e, 0xb6, 0x06, 0x39, 0x01, 0x79, 0xf2, 0xbf, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x56, 0xb6, 0xfd, 0x6c, 0x11, 0x00, 0x00, +} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace_config.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace_config.pb.go new file mode 100644 index 000000000..025387784 --- /dev/null +++ b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1/trace_config.pb.go @@ -0,0 +1,359 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: opencensus/proto/trace/v1/trace_config.proto + +package v1 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// How spans should be sampled: +// - Always off +// - Always on +// - Always follow the parent Span's decision (off if no parent). +type ConstantSampler_ConstantDecision int32 + +const ( + ConstantSampler_ALWAYS_OFF ConstantSampler_ConstantDecision = 0 + ConstantSampler_ALWAYS_ON ConstantSampler_ConstantDecision = 1 + ConstantSampler_ALWAYS_PARENT ConstantSampler_ConstantDecision = 2 +) + +var ConstantSampler_ConstantDecision_name = map[int32]string{ + 0: "ALWAYS_OFF", + 1: "ALWAYS_ON", + 2: "ALWAYS_PARENT", +} + +var ConstantSampler_ConstantDecision_value = map[string]int32{ + "ALWAYS_OFF": 0, + "ALWAYS_ON": 1, + "ALWAYS_PARENT": 2, +} + +func (x ConstantSampler_ConstantDecision) String() string { + return proto.EnumName(ConstantSampler_ConstantDecision_name, int32(x)) +} + +func (ConstantSampler_ConstantDecision) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_5359209b41ff50c5, []int{2, 0} +} + +// Global configuration of the trace service. All fields must be specified, or +// the default (zero) values will be used for each type. +type TraceConfig struct { + // The global default sampler used to make decisions on span sampling. + // + // Types that are valid to be assigned to Sampler: + // *TraceConfig_ProbabilitySampler + // *TraceConfig_ConstantSampler + // *TraceConfig_RateLimitingSampler + Sampler isTraceConfig_Sampler `protobuf_oneof:"sampler"` + // The global default max number of attributes per span. + MaxNumberOfAttributes int64 `protobuf:"varint,4,opt,name=max_number_of_attributes,json=maxNumberOfAttributes,proto3" json:"max_number_of_attributes,omitempty"` + // The global default max number of annotation events per span. + MaxNumberOfAnnotations int64 `protobuf:"varint,5,opt,name=max_number_of_annotations,json=maxNumberOfAnnotations,proto3" json:"max_number_of_annotations,omitempty"` + // The global default max number of message events per span. + MaxNumberOfMessageEvents int64 `protobuf:"varint,6,opt,name=max_number_of_message_events,json=maxNumberOfMessageEvents,proto3" json:"max_number_of_message_events,omitempty"` + // The global default max number of link entries per span. + MaxNumberOfLinks int64 `protobuf:"varint,7,opt,name=max_number_of_links,json=maxNumberOfLinks,proto3" json:"max_number_of_links,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TraceConfig) Reset() { *m = TraceConfig{} } +func (m *TraceConfig) String() string { return proto.CompactTextString(m) } +func (*TraceConfig) ProtoMessage() {} +func (*TraceConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_5359209b41ff50c5, []int{0} +} + +func (m *TraceConfig) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TraceConfig.Unmarshal(m, b) +} +func (m *TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TraceConfig.Marshal(b, m, deterministic) +} +func (m *TraceConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_TraceConfig.Merge(m, src) +} +func (m *TraceConfig) XXX_Size() int { + return xxx_messageInfo_TraceConfig.Size(m) +} +func (m *TraceConfig) XXX_DiscardUnknown() { + xxx_messageInfo_TraceConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_TraceConfig proto.InternalMessageInfo + +type isTraceConfig_Sampler interface { + isTraceConfig_Sampler() +} + +type TraceConfig_ProbabilitySampler struct { + ProbabilitySampler *ProbabilitySampler `protobuf:"bytes,1,opt,name=probability_sampler,json=probabilitySampler,proto3,oneof"` +} + +type TraceConfig_ConstantSampler struct { + ConstantSampler *ConstantSampler `protobuf:"bytes,2,opt,name=constant_sampler,json=constantSampler,proto3,oneof"` +} + +type TraceConfig_RateLimitingSampler struct { + RateLimitingSampler *RateLimitingSampler `protobuf:"bytes,3,opt,name=rate_limiting_sampler,json=rateLimitingSampler,proto3,oneof"` +} + +func (*TraceConfig_ProbabilitySampler) isTraceConfig_Sampler() {} + +func (*TraceConfig_ConstantSampler) isTraceConfig_Sampler() {} + +func (*TraceConfig_RateLimitingSampler) isTraceConfig_Sampler() {} + +func (m *TraceConfig) GetSampler() isTraceConfig_Sampler { + if m != nil { + return m.Sampler + } + return nil +} + +func (m *TraceConfig) GetProbabilitySampler() *ProbabilitySampler { + if x, ok := m.GetSampler().(*TraceConfig_ProbabilitySampler); ok { + return x.ProbabilitySampler + } + return nil +} + +func (m *TraceConfig) GetConstantSampler() *ConstantSampler { + if x, ok := m.GetSampler().(*TraceConfig_ConstantSampler); ok { + return x.ConstantSampler + } + return nil +} + +func (m *TraceConfig) GetRateLimitingSampler() *RateLimitingSampler { + if x, ok := m.GetSampler().(*TraceConfig_RateLimitingSampler); ok { + return x.RateLimitingSampler + } + return nil +} + +func (m *TraceConfig) GetMaxNumberOfAttributes() int64 { + if m != nil { + return m.MaxNumberOfAttributes + } + return 0 +} + +func (m *TraceConfig) GetMaxNumberOfAnnotations() int64 { + if m != nil { + return m.MaxNumberOfAnnotations + } + return 0 +} + +func (m *TraceConfig) GetMaxNumberOfMessageEvents() int64 { + if m != nil { + return m.MaxNumberOfMessageEvents + } + return 0 +} + +func (m *TraceConfig) GetMaxNumberOfLinks() int64 { + if m != nil { + return m.MaxNumberOfLinks + } + return 0 +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*TraceConfig) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*TraceConfig_ProbabilitySampler)(nil), + (*TraceConfig_ConstantSampler)(nil), + (*TraceConfig_RateLimitingSampler)(nil), + } +} + +// Sampler that tries to uniformly sample traces with a given probability. +// The probability of sampling a trace is equal to that of the specified probability. +type ProbabilitySampler struct { + // The desired probability of sampling. Must be within [0.0, 1.0]. + SamplingProbability float64 `protobuf:"fixed64,1,opt,name=samplingProbability,proto3" json:"samplingProbability,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ProbabilitySampler) Reset() { *m = ProbabilitySampler{} } +func (m *ProbabilitySampler) String() string { return proto.CompactTextString(m) } +func (*ProbabilitySampler) ProtoMessage() {} +func (*ProbabilitySampler) Descriptor() ([]byte, []int) { + return fileDescriptor_5359209b41ff50c5, []int{1} +} + +func (m *ProbabilitySampler) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ProbabilitySampler.Unmarshal(m, b) +} +func (m *ProbabilitySampler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ProbabilitySampler.Marshal(b, m, deterministic) +} +func (m *ProbabilitySampler) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProbabilitySampler.Merge(m, src) +} +func (m *ProbabilitySampler) XXX_Size() int { + return xxx_messageInfo_ProbabilitySampler.Size(m) +} +func (m *ProbabilitySampler) XXX_DiscardUnknown() { + xxx_messageInfo_ProbabilitySampler.DiscardUnknown(m) +} + +var xxx_messageInfo_ProbabilitySampler proto.InternalMessageInfo + +func (m *ProbabilitySampler) GetSamplingProbability() float64 { + if m != nil { + return m.SamplingProbability + } + return 0 +} + +// Sampler that always makes a constant decision on span sampling. +type ConstantSampler struct { + Decision ConstantSampler_ConstantDecision `protobuf:"varint,1,opt,name=decision,proto3,enum=opencensus.proto.trace.v1.ConstantSampler_ConstantDecision" json:"decision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConstantSampler) Reset() { *m = ConstantSampler{} } +func (m *ConstantSampler) String() string { return proto.CompactTextString(m) } +func (*ConstantSampler) ProtoMessage() {} +func (*ConstantSampler) Descriptor() ([]byte, []int) { + return fileDescriptor_5359209b41ff50c5, []int{2} +} + +func (m *ConstantSampler) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ConstantSampler.Unmarshal(m, b) +} +func (m *ConstantSampler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ConstantSampler.Marshal(b, m, deterministic) +} +func (m *ConstantSampler) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConstantSampler.Merge(m, src) +} +func (m *ConstantSampler) XXX_Size() int { + return xxx_messageInfo_ConstantSampler.Size(m) +} +func (m *ConstantSampler) XXX_DiscardUnknown() { + xxx_messageInfo_ConstantSampler.DiscardUnknown(m) +} + +var xxx_messageInfo_ConstantSampler proto.InternalMessageInfo + +func (m *ConstantSampler) GetDecision() ConstantSampler_ConstantDecision { + if m != nil { + return m.Decision + } + return ConstantSampler_ALWAYS_OFF +} + +// Sampler that tries to sample with a rate per time window. +type RateLimitingSampler struct { + // Rate per second. + Qps int64 `protobuf:"varint,1,opt,name=qps,proto3" json:"qps,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RateLimitingSampler) Reset() { *m = RateLimitingSampler{} } +func (m *RateLimitingSampler) String() string { return proto.CompactTextString(m) } +func (*RateLimitingSampler) ProtoMessage() {} +func (*RateLimitingSampler) Descriptor() ([]byte, []int) { + return fileDescriptor_5359209b41ff50c5, []int{3} +} + +func (m *RateLimitingSampler) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RateLimitingSampler.Unmarshal(m, b) +} +func (m *RateLimitingSampler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RateLimitingSampler.Marshal(b, m, deterministic) +} +func (m *RateLimitingSampler) XXX_Merge(src proto.Message) { + xxx_messageInfo_RateLimitingSampler.Merge(m, src) +} +func (m *RateLimitingSampler) XXX_Size() int { + return xxx_messageInfo_RateLimitingSampler.Size(m) +} +func (m *RateLimitingSampler) XXX_DiscardUnknown() { + xxx_messageInfo_RateLimitingSampler.DiscardUnknown(m) +} + +var xxx_messageInfo_RateLimitingSampler proto.InternalMessageInfo + +func (m *RateLimitingSampler) GetQps() int64 { + if m != nil { + return m.Qps + } + return 0 +} + +func init() { + proto.RegisterEnum("opencensus.proto.trace.v1.ConstantSampler_ConstantDecision", ConstantSampler_ConstantDecision_name, ConstantSampler_ConstantDecision_value) + proto.RegisterType((*TraceConfig)(nil), "opencensus.proto.trace.v1.TraceConfig") + proto.RegisterType((*ProbabilitySampler)(nil), "opencensus.proto.trace.v1.ProbabilitySampler") + proto.RegisterType((*ConstantSampler)(nil), "opencensus.proto.trace.v1.ConstantSampler") + proto.RegisterType((*RateLimitingSampler)(nil), "opencensus.proto.trace.v1.RateLimitingSampler") +} + +func init() { + proto.RegisterFile("opencensus/proto/trace/v1/trace_config.proto", fileDescriptor_5359209b41ff50c5) +} + +var fileDescriptor_5359209b41ff50c5 = []byte{ + // 506 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6e, 0xd3, 0x30, + 0x18, 0xc7, 0x97, 0x76, 0x6c, 0xec, 0x9b, 0xb6, 0x05, 0x57, 0x43, 0xa9, 0xb4, 0xc3, 0x94, 0x0b, + 0x13, 0x22, 0x09, 0x1d, 0x07, 0x84, 0x90, 0x90, 0xda, 0x6e, 0x15, 0x87, 0xd2, 0x56, 0xd9, 0x44, + 0x05, 0x97, 0xe0, 0x64, 0x6e, 0xb0, 0x68, 0xec, 0x60, 0x3b, 0xd5, 0x78, 0x0d, 0xce, 0x3c, 0x04, + 0xcf, 0xc5, 0x53, 0xa0, 0x3a, 0x21, 0x49, 0xdb, 0x6d, 0xe2, 0x96, 0xef, 0xfb, 0x7f, 0xbf, 0x9f, + 0xad, 0xd8, 0x86, 0x17, 0x3c, 0x25, 0x2c, 0x22, 0x4c, 0x66, 0xd2, 0x4b, 0x05, 0x57, 0xdc, 0x53, + 0x02, 0x47, 0xc4, 0x5b, 0x74, 0xf2, 0x8f, 0x20, 0xe2, 0x6c, 0x46, 0x63, 0x57, 0x67, 0xa8, 0x5d, + 0x4d, 0xe7, 0x1d, 0x57, 0x0f, 0xb9, 0x8b, 0x8e, 0xfd, 0x6b, 0x1b, 0xf6, 0xaf, 0x97, 0x45, 0x5f, + 0x03, 0xe8, 0x0b, 0xb4, 0x52, 0xc1, 0x43, 0x1c, 0xd2, 0x39, 0x55, 0x3f, 0x02, 0x89, 0x93, 0x74, + 0x4e, 0x84, 0x65, 0x9c, 0x1a, 0x67, 0xfb, 0xe7, 0x8e, 0x7b, 0xaf, 0xc8, 0x9d, 0x54, 0xd4, 0x55, + 0x0e, 0xbd, 0xdf, 0xf2, 0x51, 0xba, 0xd1, 0x45, 0x53, 0x30, 0x23, 0xce, 0xa4, 0xc2, 0x4c, 0x95, + 0xfa, 0x86, 0xd6, 0x3f, 0x7f, 0x40, 0xdf, 0x2f, 0x90, 0xca, 0x7d, 0x14, 0xad, 0xb6, 0xd0, 0x0d, + 0x1c, 0x0b, 0xac, 0x48, 0x30, 0xa7, 0x09, 0x55, 0x94, 0xc5, 0xa5, 0xbd, 0xa9, 0xed, 0xee, 0x03, + 0x76, 0x1f, 0x2b, 0x32, 0x2c, 0xb0, 0x6a, 0x85, 0x96, 0xd8, 0x6c, 0xa3, 0xd7, 0x60, 0x25, 0xf8, + 0x36, 0x60, 0x59, 0x12, 0x12, 0x11, 0xf0, 0x59, 0x80, 0x95, 0x12, 0x34, 0xcc, 0x14, 0x91, 0xd6, + 0xf6, 0xa9, 0x71, 0xd6, 0xf4, 0x8f, 0x13, 0x7c, 0x3b, 0xd2, 0xf1, 0x78, 0xd6, 0x2d, 0x43, 0xf4, + 0x06, 0xda, 0x6b, 0x20, 0x63, 0x5c, 0x61, 0x45, 0x39, 0x93, 0xd6, 0x23, 0x4d, 0x3e, 0xad, 0x93, + 0x55, 0x8a, 0xde, 0xc1, 0xc9, 0x2a, 0x9a, 0x10, 0x29, 0x71, 0x4c, 0x02, 0xb2, 0x20, 0x4c, 0x49, + 0x6b, 0x47, 0xd3, 0x56, 0x8d, 0xfe, 0x90, 0x0f, 0x5c, 0xea, 0x1c, 0x39, 0xd0, 0x5a, 0xe5, 0xe7, + 0x94, 0x7d, 0x93, 0xd6, 0xae, 0xc6, 0xcc, 0x1a, 0x36, 0x5c, 0xf6, 0x7b, 0x7b, 0xb0, 0x5b, 0xfc, + 0x3a, 0x7b, 0x00, 0x68, 0xf3, 0x60, 0xd1, 0x4b, 0x68, 0xe9, 0x01, 0xca, 0xe2, 0x5a, 0xaa, 0x2f, + 0x89, 0xe1, 0xdf, 0x15, 0xd9, 0xbf, 0x0d, 0x38, 0x5a, 0x3b, 0x42, 0x34, 0x85, 0xc7, 0x37, 0x24, + 0xa2, 0x92, 0x72, 0xa6, 0xd1, 0xc3, 0xf3, 0xb7, 0xff, 0x7f, 0x01, 0xca, 0xfa, 0xa2, 0x50, 0xf8, + 0xa5, 0xcc, 0xbe, 0x00, 0x73, 0x3d, 0x45, 0x87, 0x00, 0xdd, 0xe1, 0xb4, 0xfb, 0xe9, 0x2a, 0x18, + 0x0f, 0x06, 0xe6, 0x16, 0x3a, 0x80, 0xbd, 0x7f, 0xf5, 0xc8, 0x34, 0xd0, 0x13, 0x38, 0x28, 0xca, + 0x49, 0xd7, 0xbf, 0x1c, 0x5d, 0x9b, 0x0d, 0xfb, 0x19, 0xb4, 0xee, 0xb8, 0x16, 0xc8, 0x84, 0xe6, + 0xf7, 0x54, 0xea, 0x0d, 0x37, 0xfd, 0xe5, 0x67, 0xef, 0xa7, 0x01, 0x27, 0x94, 0xdf, 0xbf, 0xf5, + 0x9e, 0x59, 0x7b, 0x60, 0x93, 0x65, 0x34, 0x31, 0x3e, 0xf7, 0x62, 0xaa, 0xbe, 0x66, 0xa1, 0x1b, + 0xf1, 0xc4, 0xcb, 0x29, 0x87, 0x32, 0xa9, 0x44, 0x96, 0x10, 0x96, 0x1f, 0xbb, 0x57, 0x09, 0x9d, + 0xfc, 0x89, 0xc7, 0x84, 0x39, 0x71, 0xf5, 0xd2, 0xff, 0x34, 0xda, 0xe3, 0x94, 0xb0, 0x7e, 0xbe, + 0xa6, 0x16, 0xbb, 0x7a, 0x25, 0xf7, 0x63, 0x27, 0xdc, 0xd1, 0xc8, 0xab, 0xbf, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x50, 0x0c, 0xfe, 0x32, 0x29, 0x04, 0x00, 0x00, +} diff --git a/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/davecgh/go-spew/LICENSE new file mode 100644 index 000000000..bc52e96f2 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2012-2016 Dave Collins + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go new file mode 100644 index 000000000..792994785 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -0,0 +1,145 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// Go versions prior to 1.4 are disabled because they use a different layout +// for interfaces which make the implementation of unsafeReflectValue more complex. +// +build !js,!appengine,!safe,!disableunsafe,go1.4 + +package spew + +import ( + "reflect" + "unsafe" +) + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = false + + // ptrSize is the size of a pointer on the current arch. + ptrSize = unsafe.Sizeof((*byte)(nil)) +) + +type flag uintptr + +var ( + // flagRO indicates whether the value field of a reflect.Value + // is read-only. + flagRO flag + + // flagAddr indicates whether the address of the reflect.Value's + // value may be taken. + flagAddr flag +) + +// flagKindMask holds the bits that make up the kind +// part of the flags field. In all the supported versions, +// it is in the lower 5 bits. +const flagKindMask = flag(0x1f) + +// Different versions of Go have used different +// bit layouts for the flags type. This table +// records the known combinations. +var okFlags = []struct { + ro, addr flag +}{{ + // From Go 1.4 to 1.5 + ro: 1 << 5, + addr: 1 << 7, +}, { + // Up to Go tip. + ro: 1<<5 | 1<<6, + addr: 1 << 8, +}} + +var flagValOffset = func() uintptr { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + return field.Offset +}() + +// flagField returns a pointer to the flag field of a reflect.Value. +func flagField(v *reflect.Value) *flag { + return (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset)) +} + +// unsafeReflectValue converts the passed reflect.Value into a one that bypasses +// the typical safety restrictions preventing access to unaddressable and +// unexported data. It works by digging the raw pointer to the underlying +// value out of the protected value and generating a new unprotected (unsafe) +// reflect.Value to it. +// +// This allows us to check for implementations of the Stringer and error +// interfaces to be used for pretty printing ordinarily unaddressable and +// inaccessible values such as unexported struct fields. +func unsafeReflectValue(v reflect.Value) reflect.Value { + if !v.IsValid() || (v.CanInterface() && v.CanAddr()) { + return v + } + flagFieldPtr := flagField(&v) + *flagFieldPtr &^= flagRO + *flagFieldPtr |= flagAddr + return v +} + +// Sanity checks against future reflect package changes +// to the type or semantics of the Value.flag field. +func init() { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + if field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() { + panic("reflect.Value flag field has changed kind") + } + type t0 int + var t struct { + A t0 + // t0 will have flagEmbedRO set. + t0 + // a will have flagStickyRO set + a t0 + } + vA := reflect.ValueOf(t).FieldByName("A") + va := reflect.ValueOf(t).FieldByName("a") + vt0 := reflect.ValueOf(t).FieldByName("t0") + + // Infer flagRO from the difference between the flags + // for the (otherwise identical) fields in t. + flagPublic := *flagField(&vA) + flagWithRO := *flagField(&va) | *flagField(&vt0) + flagRO = flagPublic ^ flagWithRO + + // Infer flagAddr from the difference between a value + // taken from a pointer and not. + vPtrA := reflect.ValueOf(&t).Elem().FieldByName("A") + flagNoPtr := *flagField(&vA) + flagPtr := *flagField(&vPtrA) + flagAddr = flagNoPtr ^ flagPtr + + // Check that the inferred flags tally with one of the known versions. + for _, f := range okFlags { + if flagRO == f.ro && flagAddr == f.addr { + return + } + } + panic("reflect.Value read-only flag has changed semantics") +} diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go new file mode 100644 index 000000000..205c28d68 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -0,0 +1,38 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is running on Google App Engine, compiled by GopherJS, or +// "-tags safe" is added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build js appengine safe disableunsafe !go1.4 + +package spew + +import "reflect" + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = true +) + +// unsafeReflectValue typically converts the passed reflect.Value into a one +// that bypasses the typical safety restrictions preventing access to +// unaddressable and unexported data. However, doing this relies on access to +// the unsafe package. This is a stub version which simply returns the passed +// reflect.Value when the unsafe package is not available. +func unsafeReflectValue(v reflect.Value) reflect.Value { + return v +} diff --git a/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/davecgh/go-spew/spew/common.go new file mode 100644 index 000000000..1be8ce945 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/common.go @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "reflect" + "sort" + "strconv" +) + +// Some constants in the form of bytes to avoid string overhead. This mirrors +// the technique used in the fmt package. +var ( + panicBytes = []byte("(PANIC=") + plusBytes = []byte("+") + iBytes = []byte("i") + trueBytes = []byte("true") + falseBytes = []byte("false") + interfaceBytes = []byte("(interface {})") + commaNewlineBytes = []byte(",\n") + newlineBytes = []byte("\n") + openBraceBytes = []byte("{") + openBraceNewlineBytes = []byte("{\n") + closeBraceBytes = []byte("}") + asteriskBytes = []byte("*") + colonBytes = []byte(":") + colonSpaceBytes = []byte(": ") + openParenBytes = []byte("(") + closeParenBytes = []byte(")") + spaceBytes = []byte(" ") + pointerChainBytes = []byte("->") + nilAngleBytes = []byte("") + maxNewlineBytes = []byte("\n") + maxShortBytes = []byte("") + circularBytes = []byte("") + circularShortBytes = []byte("") + invalidAngleBytes = []byte("") + openBracketBytes = []byte("[") + closeBracketBytes = []byte("]") + percentBytes = []byte("%") + precisionBytes = []byte(".") + openAngleBytes = []byte("<") + closeAngleBytes = []byte(">") + openMapBytes = []byte("map[") + closeMapBytes = []byte("]") + lenEqualsBytes = []byte("len=") + capEqualsBytes = []byte("cap=") +) + +// hexDigits is used to map a decimal value to a hex digit. +var hexDigits = "0123456789abcdef" + +// catchPanic handles any panics that might occur during the handleMethods +// calls. +func catchPanic(w io.Writer, v reflect.Value) { + if err := recover(); err != nil { + w.Write(panicBytes) + fmt.Fprintf(w, "%v", err) + w.Write(closeParenBytes) + } +} + +// handleMethods attempts to call the Error and String methods on the underlying +// type the passed reflect.Value represents and outputes the result to Writer w. +// +// It handles panics in any called methods by catching and displaying the error +// as the formatted value. +func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { + // We need an interface to check if the type implements the error or + // Stringer interface. However, the reflect package won't give us an + // interface on certain things like unexported struct fields in order + // to enforce visibility rules. We use unsafe, when it's available, + // to bypass these restrictions since this package does not mutate the + // values. + if !v.CanInterface() { + if UnsafeDisabled { + return false + } + + v = unsafeReflectValue(v) + } + + // Choose whether or not to do error and Stringer interface lookups against + // the base type or a pointer to the base type depending on settings. + // Technically calling one of these methods with a pointer receiver can + // mutate the value, however, types which choose to satisify an error or + // Stringer interface with a pointer receiver should not be mutating their + // state inside these interface methods. + if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { + v = unsafeReflectValue(v) + } + if v.CanAddr() { + v = v.Addr() + } + + // Is it an error or Stringer? + switch iface := v.Interface().(type) { + case error: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.Error())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + + w.Write([]byte(iface.Error())) + return true + + case fmt.Stringer: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.String())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + w.Write([]byte(iface.String())) + return true + } + return false +} + +// printBool outputs a boolean value as true or false to Writer w. +func printBool(w io.Writer, val bool) { + if val { + w.Write(trueBytes) + } else { + w.Write(falseBytes) + } +} + +// printInt outputs a signed integer value to Writer w. +func printInt(w io.Writer, val int64, base int) { + w.Write([]byte(strconv.FormatInt(val, base))) +} + +// printUint outputs an unsigned integer value to Writer w. +func printUint(w io.Writer, val uint64, base int) { + w.Write([]byte(strconv.FormatUint(val, base))) +} + +// printFloat outputs a floating point value using the specified precision, +// which is expected to be 32 or 64bit, to Writer w. +func printFloat(w io.Writer, val float64, precision int) { + w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) +} + +// printComplex outputs a complex value using the specified float precision +// for the real and imaginary parts to Writer w. +func printComplex(w io.Writer, c complex128, floatPrecision int) { + r := real(c) + w.Write(openParenBytes) + w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) + i := imag(c) + if i >= 0 { + w.Write(plusBytes) + } + w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) + w.Write(iBytes) + w.Write(closeParenBytes) +} + +// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' +// prefix to Writer w. +func printHexPtr(w io.Writer, p uintptr) { + // Null pointer. + num := uint64(p) + if num == 0 { + w.Write(nilAngleBytes) + return + } + + // Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix + buf := make([]byte, 18) + + // It's simpler to construct the hex string right to left. + base := uint64(16) + i := len(buf) - 1 + for num >= base { + buf[i] = hexDigits[num%base] + num /= base + i-- + } + buf[i] = hexDigits[num] + + // Add '0x' prefix. + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + + // Strip unused leading bytes. + buf = buf[i:] + w.Write(buf) +} + +// valuesSorter implements sort.Interface to allow a slice of reflect.Value +// elements to be sorted. +type valuesSorter struct { + values []reflect.Value + strings []string // either nil or same len and values + cs *ConfigState +} + +// newValuesSorter initializes a valuesSorter instance, which holds a set of +// surrogate keys on which the data should be sorted. It uses flags in +// ConfigState to decide if and how to populate those surrogate keys. +func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { + vs := &valuesSorter{values: values, cs: cs} + if canSortSimply(vs.values[0].Kind()) { + return vs + } + if !cs.DisableMethods { + vs.strings = make([]string, len(values)) + for i := range vs.values { + b := bytes.Buffer{} + if !handleMethods(cs, &b, vs.values[i]) { + vs.strings = nil + break + } + vs.strings[i] = b.String() + } + } + if vs.strings == nil && cs.SpewKeys { + vs.strings = make([]string, len(values)) + for i := range vs.values { + vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) + } + } + return vs +} + +// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted +// directly, or whether it should be considered for sorting by surrogate keys +// (if the ConfigState allows it). +func canSortSimply(kind reflect.Kind) bool { + // This switch parallels valueSortLess, except for the default case. + switch kind { + case reflect.Bool: + return true + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return true + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Uintptr: + return true + case reflect.Array: + return true + } + return false +} + +// Len returns the number of values in the slice. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Len() int { + return len(s.values) +} + +// Swap swaps the values at the passed indices. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Swap(i, j int) { + s.values[i], s.values[j] = s.values[j], s.values[i] + if s.strings != nil { + s.strings[i], s.strings[j] = s.strings[j], s.strings[i] + } +} + +// valueSortLess returns whether the first value should sort before the second +// value. It is used by valueSorter.Less as part of the sort.Interface +// implementation. +func valueSortLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Bool: + return !a.Bool() && b.Bool() + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return a.Int() < b.Int() + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return a.Uint() < b.Uint() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.String: + return a.String() < b.String() + case reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Array: + // Compare the contents of both arrays. + l := a.Len() + for i := 0; i < l; i++ { + av := a.Index(i) + bv := b.Index(i) + if av.Interface() == bv.Interface() { + continue + } + return valueSortLess(av, bv) + } + } + return a.String() < b.String() +} + +// Less returns whether the value at index i should sort before the +// value at index j. It is part of the sort.Interface implementation. +func (s *valuesSorter) Less(i, j int) bool { + if s.strings == nil { + return valueSortLess(s.values[i], s.values[j]) + } + return s.strings[i] < s.strings[j] +} + +// sortValues is a sort function that handles both native types and any type that +// can be converted to error or Stringer. Other inputs are sorted according to +// their Value.String() value to ensure display stability. +func sortValues(values []reflect.Value, cs *ConfigState) { + if len(values) == 0 { + return + } + sort.Sort(newValuesSorter(values, cs)) +} diff --git a/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/davecgh/go-spew/spew/config.go new file mode 100644 index 000000000..2e3d22f31 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/config.go @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "os" +) + +// ConfigState houses the configuration options used by spew to format and +// display values. There is a global instance, Config, that is used to control +// all top-level Formatter and Dump functionality. Each ConfigState instance +// provides methods equivalent to the top-level functions. +// +// The zero value for ConfigState provides no indentation. You would typically +// want to set it to a space or a tab. +// +// Alternatively, you can use NewDefaultConfig to get a ConfigState instance +// with default settings. See the documentation of NewDefaultConfig for default +// values. +type ConfigState struct { + // Indent specifies the string to use for each indentation level. The + // global config instance that all top-level functions use set this to a + // single space by default. If you would like more indentation, you might + // set this to a tab with "\t" or perhaps two spaces with " ". + Indent string + + // MaxDepth controls the maximum number of levels to descend into nested + // data structures. The default, 0, means there is no limit. + // + // NOTE: Circular data structures are properly detected, so it is not + // necessary to set this value unless you specifically want to limit deeply + // nested data structures. + MaxDepth int + + // DisableMethods specifies whether or not error and Stringer interfaces are + // invoked for types that implement them. + DisableMethods bool + + // DisablePointerMethods specifies whether or not to check for and invoke + // error and Stringer interfaces on types which only accept a pointer + // receiver when the current type is not a pointer. + // + // NOTE: This might be an unsafe action since calling one of these methods + // with a pointer receiver could technically mutate the value, however, + // in practice, types which choose to satisify an error or Stringer + // interface with a pointer receiver should not be mutating their state + // inside these interface methods. As a result, this option relies on + // access to the unsafe package, so it will not have any effect when + // running in environments without access to the unsafe package such as + // Google App Engine or with the "safe" build tag specified. + DisablePointerMethods bool + + // DisablePointerAddresses specifies whether to disable the printing of + // pointer addresses. This is useful when diffing data structures in tests. + DisablePointerAddresses bool + + // DisableCapacities specifies whether to disable the printing of capacities + // for arrays, slices, maps and channels. This is useful when diffing + // data structures in tests. + DisableCapacities bool + + // ContinueOnMethod specifies whether or not recursion should continue once + // a custom error or Stringer interface is invoked. The default, false, + // means it will print the results of invoking the custom error or Stringer + // interface and return immediately instead of continuing to recurse into + // the internals of the data type. + // + // NOTE: This flag does not have any effect if method invocation is disabled + // via the DisableMethods or DisablePointerMethods options. + ContinueOnMethod bool + + // SortKeys specifies map keys should be sorted before being printed. Use + // this to have a more deterministic, diffable output. Note that only + // native types (bool, int, uint, floats, uintptr and string) and types + // that support the error or Stringer interfaces (if methods are + // enabled) are supported, with other types sorted according to the + // reflect.Value.String() output which guarantees display stability. + SortKeys bool + + // SpewKeys specifies that, as a last resort attempt, map keys should + // be spewed to strings and sorted by those strings. This is only + // considered if SortKeys is true. + SpewKeys bool +} + +// Config is the active configuration of the top-level functions. +// The configuration can be changed by modifying the contents of spew.Config. +var Config = ConfigState{Indent: " "} + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the formatted string as a value that satisfies error. See NewFormatter +// for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, c.convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, c.convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, c.convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a Formatter interface returned by c.NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, c.convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Print(a ...interface{}) (n int, err error) { + return fmt.Print(c.convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, c.convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Println(a ...interface{}) (n int, err error) { + return fmt.Println(c.convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprint(a ...interface{}) string { + return fmt.Sprint(c.convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, c.convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a Formatter interface returned by c.NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintln(a ...interface{}) string { + return fmt.Sprintln(c.convertArgs(a)...) +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +c.Printf, c.Println, or c.Printf. +*/ +func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(c, v) +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { + fdump(c, w, a...) +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by modifying the public members +of c. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func (c *ConfigState) Dump(a ...interface{}) { + fdump(c, os.Stdout, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func (c *ConfigState) Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(c, &buf, a...) + return buf.String() +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a spew Formatter interface using +// the ConfigState associated with s. +func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = newFormatter(c, arg) + } + return formatters +} + +// NewDefaultConfig returns a ConfigState with the following default settings. +// +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false +func NewDefaultConfig() *ConfigState { + return &ConfigState{Indent: " "} +} diff --git a/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/davecgh/go-spew/spew/doc.go new file mode 100644 index 000000000..aacaac6f1 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Package spew implements a deep pretty printer for Go data structures to aid in +debugging. + +A quick overview of the additional features spew provides over the built-in +printing facilities for Go data types are as follows: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) + +There are two different approaches spew allows for dumping Go data structures: + + * Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + * A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt + +Quick Start + +This section demonstrates how to quickly get started with spew. See the +sections below for further details on formatting and configuration options. + +To dump a variable with full newlines, indentation, type, and pointer +information use Dump, Fdump, or Sdump: + spew.Dump(myVar1, myVar2, ...) + spew.Fdump(someWriter, myVar1, myVar2, ...) + str := spew.Sdump(myVar1, myVar2, ...) + +Alternatively, if you would prefer to use format strings with a compacted inline +printing style, use the convenience wrappers Printf, Fprintf, etc with +%v (most compact), %+v (adds pointer addresses), %#v (adds types), or +%#+v (adds types and pointer addresses): + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +Configuration Options + +Configuration of spew is handled by fields in the ConfigState type. For +convenience, all of the top-level functions use a global state available +via the spew.Config global. + +It is also possible to create a ConfigState instance that provides methods +equivalent to the top-level functions. This allows concurrent configuration +options. See the ConfigState documentation for more details. + +The following configuration options are available: + * Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + + * MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + + * DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + + * DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. + + * DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + + * DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. + + * ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + + * SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. + + * SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. + +Dump Usage + +Simply call spew.Dump with a list of variables you want to dump: + + spew.Dump(myVar1, myVar2, ...) + +You may also call spew.Fdump if you would prefer to output to an arbitrary +io.Writer. For example, to dump to standard error: + + spew.Fdump(os.Stderr, myVar1, myVar2, ...) + +A third option is to call spew.Sdump to get the formatted output as a string: + + str := spew.Sdump(myVar1, myVar2, ...) + +Sample Dump Output + +See the Dump example for details on the setup of the types and variables being +shown here. + + (main.Foo) { + unexportedField: (*main.Bar)(0xf84002e210)({ + flag: (main.Flag) flagTwo, + data: (uintptr) + }), + ExportedField: (map[interface {}]interface {}) (len=1) { + (string) (len=3) "one": (bool) true + } + } + +Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C +command as shown. + ([]uint8) (len=32 cap=32) { + 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + 00000020 31 32 |12| + } + +Custom Formatter + +Spew provides a custom formatter that implements the fmt.Formatter interface +so that it integrates cleanly with standard fmt package printing functions. The +formatter is useful for inline printing of smaller data types similar to the +standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Custom Formatter Usage + +The simplest way to make use of the spew custom formatter is to call one of the +convenience functions such as spew.Printf, spew.Println, or spew.Printf. The +functions have syntax you are most likely already familiar with: + + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Println(myVar, myVar2) + spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +See the Index for the full list convenience functions. + +Sample Formatter Output + +Double pointer to a uint8: + %v: <**>5 + %+v: <**>(0xf8400420d0->0xf8400420c8)5 + %#v: (**uint8)5 + %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 + +Pointer to circular struct with a uint8 field and a pointer to itself: + %v: <*>{1 <*>} + %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} + %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} + %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} + +See the Printf example for details on the setup of variables being shown +here. + +Errors + +Since it is possible for custom Stringer/error interfaces to panic, spew +detects them and handles them internally by printing the panic information +inline with the output. Since spew is intended to provide deep pretty printing +capabilities on structures, it intentionally does not return any errors. +*/ +package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go new file mode 100644 index 000000000..f78d89fc1 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "os" + "reflect" + "regexp" + "strconv" + "strings" +) + +var ( + // uint8Type is a reflect.Type representing a uint8. It is used to + // convert cgo types to uint8 slices for hexdumping. + uint8Type = reflect.TypeOf(uint8(0)) + + // cCharRE is a regular expression that matches a cgo char. + // It is used to detect character arrays to hexdump them. + cCharRE = regexp.MustCompile(`^.*\._Ctype_char$`) + + // cUnsignedCharRE is a regular expression that matches a cgo unsigned + // char. It is used to detect unsigned character arrays to hexdump + // them. + cUnsignedCharRE = regexp.MustCompile(`^.*\._Ctype_unsignedchar$`) + + // cUint8tCharRE is a regular expression that matches a cgo uint8_t. + // It is used to detect uint8_t arrays to hexdump them. + cUint8tCharRE = regexp.MustCompile(`^.*\._Ctype_uint8_t$`) +) + +// dumpState contains information about the state of a dump operation. +type dumpState struct { + w io.Writer + depth int + pointers map[uintptr]int + ignoreNextType bool + ignoreNextIndent bool + cs *ConfigState +} + +// indent performs indentation according to the depth level and cs.Indent +// option. +func (d *dumpState) indent() { + if d.ignoreNextIndent { + d.ignoreNextIndent = false + return + } + d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) +} + +// unpackValue returns values inside of non-nil interfaces when possible. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + return v +} + +// dumpPtr handles formatting of pointers by indirecting them as necessary. +func (d *dumpState) dumpPtr(v reflect.Value) { + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range d.pointers { + if depth >= d.depth { + delete(d.pointers, k) + } + } + + // Keep list of all dereferenced pointers to show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by dereferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := d.pointers[addr]; ok && pd < d.depth { + cycleFound = true + indirects-- + break + } + d.pointers[addr] = d.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type information. + d.w.Write(openParenBytes) + d.w.Write(bytes.Repeat(asteriskBytes, indirects)) + d.w.Write([]byte(ve.Type().String())) + d.w.Write(closeParenBytes) + + // Display pointer information. + if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { + d.w.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + d.w.Write(pointerChainBytes) + } + printHexPtr(d.w, addr) + } + d.w.Write(closeParenBytes) + } + + // Display dereferenced value. + d.w.Write(openParenBytes) + switch { + case nilFound: + d.w.Write(nilAngleBytes) + + case cycleFound: + d.w.Write(circularBytes) + + default: + d.ignoreNextType = true + d.dump(ve) + } + d.w.Write(closeParenBytes) +} + +// dumpSlice handles formatting of arrays and slices. Byte (uint8 under +// reflection) arrays and slices are dumped in hexdump -C fashion. +func (d *dumpState) dumpSlice(v reflect.Value) { + // Determine whether this type should be hex dumped or not. Also, + // for types which should be hexdumped, try to use the underlying data + // first, then fall back to trying to convert them to a uint8 slice. + var buf []uint8 + doConvert := false + doHexDump := false + numEntries := v.Len() + if numEntries > 0 { + vt := v.Index(0).Type() + vts := vt.String() + switch { + // C types that need to be converted. + case cCharRE.MatchString(vts): + fallthrough + case cUnsignedCharRE.MatchString(vts): + fallthrough + case cUint8tCharRE.MatchString(vts): + doConvert = true + + // Try to use existing uint8 slices and fall back to converting + // and copying if that fails. + case vt.Kind() == reflect.Uint8: + // We need an addressable interface to convert the type + // to a byte slice. However, the reflect package won't + // give us an interface on certain things like + // unexported struct fields in order to enforce + // visibility rules. We use unsafe, when available, to + // bypass these restrictions since this package does not + // mutate the values. + vs := v + if !vs.CanInterface() || !vs.CanAddr() { + vs = unsafeReflectValue(vs) + } + if !UnsafeDisabled { + vs = vs.Slice(0, numEntries) + + // Use the existing uint8 slice if it can be + // type asserted. + iface := vs.Interface() + if slice, ok := iface.([]uint8); ok { + buf = slice + doHexDump = true + break + } + } + + // The underlying data needs to be converted if it can't + // be type asserted to a uint8 slice. + doConvert = true + } + + // Copy and convert the underlying type if needed. + if doConvert && vt.ConvertibleTo(uint8Type) { + // Convert and copy each element into a uint8 byte + // slice. + buf = make([]uint8, numEntries) + for i := 0; i < numEntries; i++ { + vv := v.Index(i) + buf[i] = uint8(vv.Convert(uint8Type).Uint()) + } + doHexDump = true + } + } + + // Hexdump the entire slice as needed. + if doHexDump { + indent := strings.Repeat(d.cs.Indent, d.depth) + str := indent + hex.Dump(buf) + str = strings.Replace(str, "\n", "\n"+indent, -1) + str = strings.TrimRight(str, d.cs.Indent) + d.w.Write([]byte(str)) + return + } + + // Recursively call dump for each item. + for i := 0; i < numEntries; i++ { + d.dump(d.unpackValue(v.Index(i))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } +} + +// dump is the main workhorse for dumping a value. It uses the passed reflect +// value to figure out what kind of object we are dealing with and formats it +// appropriately. It is a recursive function, however circular data structures +// are detected and handled properly. +func (d *dumpState) dump(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + d.w.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + d.indent() + d.dumpPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !d.ignoreNextType { + d.indent() + d.w.Write(openParenBytes) + d.w.Write([]byte(v.Type().String())) + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + d.ignoreNextType = false + + // Display length and capacity if the built-in len and cap functions + // work with the value's kind and the len/cap itself is non-zero. + valueLen, valueCap := 0, 0 + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.Chan: + valueLen, valueCap = v.Len(), v.Cap() + case reflect.Map, reflect.String: + valueLen = v.Len() + } + if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { + d.w.Write(openParenBytes) + if valueLen != 0 { + d.w.Write(lenEqualsBytes) + printInt(d.w, int64(valueLen), 10) + } + if !d.cs.DisableCapacities && valueCap != 0 { + if valueLen != 0 { + d.w.Write(spaceBytes) + } + d.w.Write(capEqualsBytes) + printInt(d.w, int64(valueCap), 10) + } + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + + // Call Stringer/error interfaces if they exist and the handle methods flag + // is enabled + if !d.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(d.cs, d.w, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(d.w, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(d.w, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(d.w, v.Uint(), 10) + + case reflect.Float32: + printFloat(d.w, v.Float(), 32) + + case reflect.Float64: + printFloat(d.w, v.Float(), 64) + + case reflect.Complex64: + printComplex(d.w, v.Complex(), 32) + + case reflect.Complex128: + printComplex(d.w, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + d.dumpSlice(v) + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.String: + d.w.Write([]byte(strconv.Quote(v.String()))) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + d.w.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + numEntries := v.Len() + keys := v.MapKeys() + if d.cs.SortKeys { + sortValues(keys, d.cs) + } + for i, key := range keys { + d.dump(d.unpackValue(key)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.MapIndex(key))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Struct: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + vt := v.Type() + numFields := v.NumField() + for i := 0; i < numFields; i++ { + d.indent() + vtf := vt.Field(i) + d.w.Write([]byte(vtf.Name)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.Field(i))) + if i < (numFields - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(d.w, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(d.w, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it in case any new + // types are added. + default: + if v.CanInterface() { + fmt.Fprintf(d.w, "%v", v.Interface()) + } else { + fmt.Fprintf(d.w, "%v", v.String()) + } + } +} + +// fdump is a helper function to consolidate the logic from the various public +// methods which take varying writers and config states. +func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { + for _, arg := range a { + if arg == nil { + w.Write(interfaceBytes) + w.Write(spaceBytes) + w.Write(nilAngleBytes) + w.Write(newlineBytes) + continue + } + + d := dumpState{w: w, cs: cs} + d.pointers = make(map[uintptr]int) + d.dump(reflect.ValueOf(arg)) + d.w.Write(newlineBytes) + } +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func Fdump(w io.Writer, a ...interface{}) { + fdump(&Config, w, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(&Config, &buf, a...) + return buf.String() +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by an exported package global, +spew.Config. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func Dump(a ...interface{}) { + fdump(&Config, os.Stdout, a...) +} diff --git a/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/davecgh/go-spew/spew/format.go new file mode 100644 index 000000000..b04edb7d7 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/format.go @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" +) + +// supportedFlags is a list of all the character flags supported by fmt package. +const supportedFlags = "0-+# " + +// formatState implements the fmt.Formatter interface and contains information +// about the state of a formatting operation. The NewFormatter function can +// be used to get a new Formatter which can be used directly as arguments +// in standard fmt package printing calls. +type formatState struct { + value interface{} + fs fmt.State + depth int + pointers map[uintptr]int + ignoreNextType bool + cs *ConfigState +} + +// buildDefaultFormat recreates the original format string without precision +// and width information to pass in to fmt.Sprintf in the case of an +// unrecognized type. Unless new types are added to the language, this +// function won't ever be called. +func (f *formatState) buildDefaultFormat() (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + buf.WriteRune('v') + + format = buf.String() + return format +} + +// constructOrigFormat recreates the original format string including precision +// and width information to pass along to the standard fmt package. This allows +// automatic deferral of all format strings this package doesn't support. +func (f *formatState) constructOrigFormat(verb rune) (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + if width, ok := f.fs.Width(); ok { + buf.WriteString(strconv.Itoa(width)) + } + + if precision, ok := f.fs.Precision(); ok { + buf.Write(precisionBytes) + buf.WriteString(strconv.Itoa(precision)) + } + + buf.WriteRune(verb) + + format = buf.String() + return format +} + +// unpackValue returns values inside of non-nil interfaces when possible and +// ensures that types for values which have been unpacked from an interface +// are displayed when the show types flag is also set. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (f *formatState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface { + f.ignoreNextType = false + if !v.IsNil() { + v = v.Elem() + } + } + return v +} + +// formatPtr handles formatting of pointers by indirecting them as necessary. +func (f *formatState) formatPtr(v reflect.Value) { + // Display nil if top level pointer is nil. + showTypes := f.fs.Flag('#') + if v.IsNil() && (!showTypes || f.ignoreNextType) { + f.fs.Write(nilAngleBytes) + return + } + + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range f.pointers { + if depth >= f.depth { + delete(f.pointers, k) + } + } + + // Keep list of all dereferenced pointers to possibly show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by derferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := f.pointers[addr]; ok && pd < f.depth { + cycleFound = true + indirects-- + break + } + f.pointers[addr] = f.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type or indirection level depending on flags. + if showTypes && !f.ignoreNextType { + f.fs.Write(openParenBytes) + f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) + f.fs.Write([]byte(ve.Type().String())) + f.fs.Write(closeParenBytes) + } else { + if nilFound || cycleFound { + indirects += strings.Count(ve.Type().String(), "*") + } + f.fs.Write(openAngleBytes) + f.fs.Write([]byte(strings.Repeat("*", indirects))) + f.fs.Write(closeAngleBytes) + } + + // Display pointer information depending on flags. + if f.fs.Flag('+') && (len(pointerChain) > 0) { + f.fs.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + f.fs.Write(pointerChainBytes) + } + printHexPtr(f.fs, addr) + } + f.fs.Write(closeParenBytes) + } + + // Display dereferenced value. + switch { + case nilFound: + f.fs.Write(nilAngleBytes) + + case cycleFound: + f.fs.Write(circularShortBytes) + + default: + f.ignoreNextType = true + f.format(ve) + } +} + +// format is the main workhorse for providing the Formatter interface. It +// uses the passed reflect value to figure out what kind of object we are +// dealing with and formats it appropriately. It is a recursive function, +// however circular data structures are detected and handled properly. +func (f *formatState) format(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + f.fs.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + f.formatPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !f.ignoreNextType && f.fs.Flag('#') { + f.fs.Write(openParenBytes) + f.fs.Write([]byte(v.Type().String())) + f.fs.Write(closeParenBytes) + } + f.ignoreNextType = false + + // Call Stringer/error interfaces if they exist and the handle methods + // flag is enabled. + if !f.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(f.cs, f.fs, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(f.fs, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(f.fs, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(f.fs, v.Uint(), 10) + + case reflect.Float32: + printFloat(f.fs, v.Float(), 32) + + case reflect.Float64: + printFloat(f.fs, v.Float(), 64) + + case reflect.Complex64: + printComplex(f.fs, v.Complex(), 32) + + case reflect.Complex128: + printComplex(f.fs, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + f.fs.Write(openBracketBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + numEntries := v.Len() + for i := 0; i < numEntries; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(v.Index(i))) + } + } + f.depth-- + f.fs.Write(closeBracketBytes) + + case reflect.String: + f.fs.Write([]byte(v.String())) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + f.fs.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + + f.fs.Write(openMapBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + keys := v.MapKeys() + if f.cs.SortKeys { + sortValues(keys, f.cs) + } + for i, key := range keys { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(key)) + f.fs.Write(colonBytes) + f.ignoreNextType = true + f.format(f.unpackValue(v.MapIndex(key))) + } + } + f.depth-- + f.fs.Write(closeMapBytes) + + case reflect.Struct: + numFields := v.NumField() + f.fs.Write(openBraceBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + vt := v.Type() + for i := 0; i < numFields; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + vtf := vt.Field(i) + if f.fs.Flag('+') || f.fs.Flag('#') { + f.fs.Write([]byte(vtf.Name)) + f.fs.Write(colonBytes) + } + f.format(f.unpackValue(v.Field(i))) + } + } + f.depth-- + f.fs.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(f.fs, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(f.fs, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it if any get added. + default: + format := f.buildDefaultFormat() + if v.CanInterface() { + fmt.Fprintf(f.fs, format, v.Interface()) + } else { + fmt.Fprintf(f.fs, format, v.String()) + } + } +} + +// Format satisfies the fmt.Formatter interface. See NewFormatter for usage +// details. +func (f *formatState) Format(fs fmt.State, verb rune) { + f.fs = fs + + // Use standard formatting for verbs that are not v. + if verb != 'v' { + format := f.constructOrigFormat(verb) + fmt.Fprintf(fs, format, f.value) + return + } + + if f.value == nil { + if fs.Flag('#') { + fs.Write(interfaceBytes) + } + fs.Write(nilAngleBytes) + return + } + + f.format(reflect.ValueOf(f.value)) +} + +// newFormatter is a helper function to consolidate the logic from the various +// public methods which take varying config states. +func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { + fs := &formatState{value: v, cs: cs} + fs.pointers = make(map[uintptr]int) + return fs +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +Printf, Println, or Fprintf. +*/ +func NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(&Config, v) +} diff --git a/vendor/github.com/davecgh/go-spew/spew/spew.go b/vendor/github.com/davecgh/go-spew/spew/spew.go new file mode 100644 index 000000000..32c0e3388 --- /dev/null +++ b/vendor/github.com/davecgh/go-spew/spew/spew.go @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "fmt" + "io" +) + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the formatted string as a value that satisfies error. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a default Formatter interface returned by NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) +func Print(a ...interface{}) (n int, err error) { + return fmt.Print(convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) +func Println(a ...interface{}) (n int, err error) { + return fmt.Println(convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprint(a ...interface{}) string { + return fmt.Sprint(convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintln(a ...interface{}) string { + return fmt.Sprintln(convertArgs(a)...) +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a default spew Formatter interface. +func convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = NewFormatter(arg) + } + return formatters +} diff --git a/vendor/github.com/evanphx/json-patch/LICENSE b/vendor/github.com/evanphx/json-patch/LICENSE new file mode 100644 index 000000000..0eb9b72d8 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2014, Evan Phoenix +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/evanphx/json-patch/errors.go b/vendor/github.com/evanphx/json-patch/errors.go new file mode 100644 index 000000000..75304b443 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/errors.go @@ -0,0 +1,38 @@ +package jsonpatch + +import "fmt" + +// AccumulatedCopySizeError is an error type returned when the accumulated size +// increase caused by copy operations in a patch operation has exceeded the +// limit. +type AccumulatedCopySizeError struct { + limit int64 + accumulated int64 +} + +// NewAccumulatedCopySizeError returns an AccumulatedCopySizeError. +func NewAccumulatedCopySizeError(l, a int64) *AccumulatedCopySizeError { + return &AccumulatedCopySizeError{limit: l, accumulated: a} +} + +// Error implements the error interface. +func (a *AccumulatedCopySizeError) Error() string { + return fmt.Sprintf("Unable to complete the copy, the accumulated size increase of copy is %d, exceeding the limit %d", a.accumulated, a.limit) +} + +// ArraySizeError is an error type returned when the array size has exceeded +// the limit. +type ArraySizeError struct { + limit int + size int +} + +// NewArraySizeError returns an ArraySizeError. +func NewArraySizeError(l, s int) *ArraySizeError { + return &ArraySizeError{limit: l, size: s} +} + +// Error implements the error interface. +func (a *ArraySizeError) Error() string { + return fmt.Sprintf("Unable to create array of size %d, limit is %d", a.size, a.limit) +} diff --git a/vendor/github.com/evanphx/json-patch/merge.go b/vendor/github.com/evanphx/json-patch/merge.go new file mode 100644 index 000000000..6806c4c20 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/merge.go @@ -0,0 +1,383 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "reflect" +) + +func merge(cur, patch *lazyNode, mergeMerge bool) *lazyNode { + curDoc, err := cur.intoDoc() + + if err != nil { + pruneNulls(patch) + return patch + } + + patchDoc, err := patch.intoDoc() + + if err != nil { + return patch + } + + mergeDocs(curDoc, patchDoc, mergeMerge) + + return cur +} + +func mergeDocs(doc, patch *partialDoc, mergeMerge bool) { + for k, v := range *patch { + if v == nil { + if mergeMerge { + (*doc)[k] = nil + } else { + delete(*doc, k) + } + } else { + cur, ok := (*doc)[k] + + if !ok || cur == nil { + pruneNulls(v) + (*doc)[k] = v + } else { + (*doc)[k] = merge(cur, v, mergeMerge) + } + } + } +} + +func pruneNulls(n *lazyNode) { + sub, err := n.intoDoc() + + if err == nil { + pruneDocNulls(sub) + } else { + ary, err := n.intoAry() + + if err == nil { + pruneAryNulls(ary) + } + } +} + +func pruneDocNulls(doc *partialDoc) *partialDoc { + for k, v := range *doc { + if v == nil { + delete(*doc, k) + } else { + pruneNulls(v) + } + } + + return doc +} + +func pruneAryNulls(ary *partialArray) *partialArray { + newAry := []*lazyNode{} + + for _, v := range *ary { + if v != nil { + pruneNulls(v) + newAry = append(newAry, v) + } + } + + *ary = newAry + + return ary +} + +var errBadJSONDoc = fmt.Errorf("Invalid JSON Document") +var errBadJSONPatch = fmt.Errorf("Invalid JSON Patch") +var errBadMergeTypes = fmt.Errorf("Mismatched JSON Documents") + +// MergeMergePatches merges two merge patches together, such that +// applying this resulting merged merge patch to a document yields the same +// as merging each merge patch to the document in succession. +func MergeMergePatches(patch1Data, patch2Data []byte) ([]byte, error) { + return doMergePatch(patch1Data, patch2Data, true) +} + +// MergePatch merges the patchData into the docData. +func MergePatch(docData, patchData []byte) ([]byte, error) { + return doMergePatch(docData, patchData, false) +} + +func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) { + doc := &partialDoc{} + + docErr := json.Unmarshal(docData, doc) + + patch := &partialDoc{} + + patchErr := json.Unmarshal(patchData, patch) + + if _, ok := docErr.(*json.SyntaxError); ok { + return nil, errBadJSONDoc + } + + if _, ok := patchErr.(*json.SyntaxError); ok { + return nil, errBadJSONPatch + } + + if docErr == nil && *doc == nil { + return nil, errBadJSONDoc + } + + if patchErr == nil && *patch == nil { + return nil, errBadJSONPatch + } + + if docErr != nil || patchErr != nil { + // Not an error, just not a doc, so we turn straight into the patch + if patchErr == nil { + if mergeMerge { + doc = patch + } else { + doc = pruneDocNulls(patch) + } + } else { + patchAry := &partialArray{} + patchErr = json.Unmarshal(patchData, patchAry) + + if patchErr != nil { + return nil, errBadJSONPatch + } + + pruneAryNulls(patchAry) + + out, patchErr := json.Marshal(patchAry) + + if patchErr != nil { + return nil, errBadJSONPatch + } + + return out, nil + } + } else { + mergeDocs(doc, patch, mergeMerge) + } + + return json.Marshal(doc) +} + +// resemblesJSONArray indicates whether the byte-slice "appears" to be +// a JSON array or not. +// False-positives are possible, as this function does not check the internal +// structure of the array. It only checks that the outer syntax is present and +// correct. +func resemblesJSONArray(input []byte) bool { + input = bytes.TrimSpace(input) + + hasPrefix := bytes.HasPrefix(input, []byte("[")) + hasSuffix := bytes.HasSuffix(input, []byte("]")) + + return hasPrefix && hasSuffix +} + +// CreateMergePatch will return a merge patch document capable of converting +// the original document(s) to the modified document(s). +// The parameters can be bytes of either two JSON Documents, or two arrays of +// JSON documents. +// The merge patch returned follows the specification defined at http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07 +func CreateMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalResemblesArray := resemblesJSONArray(originalJSON) + modifiedResemblesArray := resemblesJSONArray(modifiedJSON) + + // Do both byte-slices seem like JSON arrays? + if originalResemblesArray && modifiedResemblesArray { + return createArrayMergePatch(originalJSON, modifiedJSON) + } + + // Are both byte-slices are not arrays? Then they are likely JSON objects... + if !originalResemblesArray && !modifiedResemblesArray { + return createObjectMergePatch(originalJSON, modifiedJSON) + } + + // None of the above? Then return an error because of mismatched types. + return nil, errBadMergeTypes +} + +// createObjectMergePatch will return a merge-patch document capable of +// converting the original document to the modified document. +func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDoc := map[string]interface{}{} + modifiedDoc := map[string]interface{}{} + + err := json.Unmarshal(originalJSON, &originalDoc) + if err != nil { + return nil, errBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDoc) + if err != nil { + return nil, errBadJSONDoc + } + + dest, err := getDiff(originalDoc, modifiedDoc) + if err != nil { + return nil, err + } + + return json.Marshal(dest) +} + +// createArrayMergePatch will return an array of merge-patch documents capable +// of converting the original document to the modified document for each +// pair of JSON documents provided in the arrays. +// Arrays of mismatched sizes will result in an error. +func createArrayMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDocs := []json.RawMessage{} + modifiedDocs := []json.RawMessage{} + + err := json.Unmarshal(originalJSON, &originalDocs) + if err != nil { + return nil, errBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDocs) + if err != nil { + return nil, errBadJSONDoc + } + + total := len(originalDocs) + if len(modifiedDocs) != total { + return nil, errBadJSONDoc + } + + result := []json.RawMessage{} + for i := 0; i < len(originalDocs); i++ { + original := originalDocs[i] + modified := modifiedDocs[i] + + patch, err := createObjectMergePatch(original, modified) + if err != nil { + return nil, err + } + + result = append(result, json.RawMessage(patch)) + } + + return json.Marshal(result) +} + +// Returns true if the array matches (must be json types). +// As is idiomatic for go, an empty array is not the same as a nil array. +func matchesArray(a, b []interface{}) bool { + if len(a) != len(b) { + return false + } + if (a == nil && b != nil) || (a != nil && b == nil) { + return false + } + for i := range a { + if !matchesValue(a[i], b[i]) { + return false + } + } + return true +} + +// Returns true if the values matches (must be json types) +// The types of the values must match, otherwise it will always return false +// If two map[string]interface{} are given, all elements must match. +func matchesValue(av, bv interface{}) bool { + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + return false + } + switch at := av.(type) { + case string: + bt := bv.(string) + if bt == at { + return true + } + case float64: + bt := bv.(float64) + if bt == at { + return true + } + case bool: + bt := bv.(bool) + if bt == at { + return true + } + case nil: + // Both nil, fine. + return true + case map[string]interface{}: + bt := bv.(map[string]interface{}) + for key := range at { + if !matchesValue(at[key], bt[key]) { + return false + } + } + for key := range bt { + if !matchesValue(at[key], bt[key]) { + return false + } + } + return true + case []interface{}: + bt := bv.([]interface{}) + return matchesArray(at, bt) + } + return false +} + +// getDiff returns the (recursive) difference between a and b as a map[string]interface{}. +func getDiff(a, b map[string]interface{}) (map[string]interface{}, error) { + into := map[string]interface{}{} + for key, bv := range b { + av, ok := a[key] + // value was added + if !ok { + into[key] = bv + continue + } + // If types have changed, replace completely + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + into[key] = bv + continue + } + // Types are the same, compare values + switch at := av.(type) { + case map[string]interface{}: + bt := bv.(map[string]interface{}) + dst := make(map[string]interface{}, len(bt)) + dst, err := getDiff(at, bt) + if err != nil { + return nil, err + } + if len(dst) > 0 { + into[key] = dst + } + case string, float64, bool: + if !matchesValue(av, bv) { + into[key] = bv + } + case []interface{}: + bt := bv.([]interface{}) + if !matchesArray(at, bt) { + into[key] = bv + } + case nil: + switch bv.(type) { + case nil: + // Both nil, fine. + default: + into[key] = bv + } + default: + panic(fmt.Sprintf("Unknown type:%T in key %s", av, key)) + } + } + // Now add all deleted values as nil + for key := range a { + _, found := b[key] + if !found { + into[key] = nil + } + } + return into, nil +} diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go new file mode 100644 index 000000000..c9cf59021 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -0,0 +1,696 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "strconv" + "strings" +) + +const ( + eRaw = iota + eDoc + eAry +) + +var ( + // SupportNegativeIndices decides whether to support non-standard practice of + // allowing negative indices to mean indices starting at the end of an array. + // Default to true. + SupportNegativeIndices bool = true + // AccumulatedCopySizeLimit limits the total size increase in bytes caused by + // "copy" operations in a patch. + AccumulatedCopySizeLimit int64 = 0 +) + +type lazyNode struct { + raw *json.RawMessage + doc partialDoc + ary partialArray + which int +} + +type operation map[string]*json.RawMessage + +// Patch is an ordered collection of operations. +type Patch []operation + +type partialDoc map[string]*lazyNode +type partialArray []*lazyNode + +type container interface { + get(key string) (*lazyNode, error) + set(key string, val *lazyNode) error + add(key string, val *lazyNode) error + remove(key string) error +} + +func newLazyNode(raw *json.RawMessage) *lazyNode { + return &lazyNode{raw: raw, doc: nil, ary: nil, which: eRaw} +} + +func (n *lazyNode) MarshalJSON() ([]byte, error) { + switch n.which { + case eRaw: + return json.Marshal(n.raw) + case eDoc: + return json.Marshal(n.doc) + case eAry: + return json.Marshal(n.ary) + default: + return nil, fmt.Errorf("Unknown type") + } +} + +func (n *lazyNode) UnmarshalJSON(data []byte) error { + dest := make(json.RawMessage, len(data)) + copy(dest, data) + n.raw = &dest + n.which = eRaw + return nil +} + +func deepCopy(src *lazyNode) (*lazyNode, int, error) { + if src == nil { + return nil, 0, nil + } + a, err := src.MarshalJSON() + if err != nil { + return nil, 0, err + } + sz := len(a) + ra := make(json.RawMessage, sz) + copy(ra, a) + return newLazyNode(&ra), sz, nil +} + +func (n *lazyNode) intoDoc() (*partialDoc, error) { + if n.which == eDoc { + return &n.doc, nil + } + + if n.raw == nil { + return nil, fmt.Errorf("Unable to unmarshal nil pointer as partial document") + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return nil, err + } + + n.which = eDoc + return &n.doc, nil +} + +func (n *lazyNode) intoAry() (*partialArray, error) { + if n.which == eAry { + return &n.ary, nil + } + + if n.raw == nil { + return nil, fmt.Errorf("Unable to unmarshal nil pointer as partial array") + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return nil, err + } + + n.which = eAry + return &n.ary, nil +} + +func (n *lazyNode) compact() []byte { + buf := &bytes.Buffer{} + + if n.raw == nil { + return nil + } + + err := json.Compact(buf, *n.raw) + + if err != nil { + return *n.raw + } + + return buf.Bytes() +} + +func (n *lazyNode) tryDoc() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return false + } + + n.which = eDoc + return true +} + +func (n *lazyNode) tryAry() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return false + } + + n.which = eAry + return true +} + +func (n *lazyNode) equal(o *lazyNode) bool { + if n.which == eRaw { + if !n.tryDoc() && !n.tryAry() { + if o.which != eRaw { + return false + } + + return bytes.Equal(n.compact(), o.compact()) + } + } + + if n.which == eDoc { + if o.which == eRaw { + if !o.tryDoc() { + return false + } + } + + if o.which != eDoc { + return false + } + + for k, v := range n.doc { + ov, ok := o.doc[k] + + if !ok { + return false + } + + if v == nil && ov == nil { + continue + } + + if !v.equal(ov) { + return false + } + } + + return true + } + + if o.which != eAry && !o.tryAry() { + return false + } + + if len(n.ary) != len(o.ary) { + return false + } + + for idx, val := range n.ary { + if !val.equal(o.ary[idx]) { + return false + } + } + + return true +} + +func (o operation) kind() string { + if obj, ok := o["op"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown" + } + + return op + } + + return "unknown" +} + +func (o operation) path() string { + if obj, ok := o["path"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown" + } + + return op + } + + return "unknown" +} + +func (o operation) from() string { + if obj, ok := o["from"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown" + } + + return op + } + + return "unknown" +} + +func (o operation) value() *lazyNode { + if obj, ok := o["value"]; ok { + return newLazyNode(obj) + } + + return nil +} + +func isArray(buf []byte) bool { +Loop: + for _, c := range buf { + switch c { + case ' ': + case '\n': + case '\t': + continue + case '[': + return true + default: + break Loop + } + } + + return false +} + +func findObject(pd *container, path string) (container, string) { + doc := *pd + + split := strings.Split(path, "/") + + if len(split) < 2 { + return nil, "" + } + + parts := split[1 : len(split)-1] + + key := split[len(split)-1] + + var err error + + for _, part := range parts { + + next, ok := doc.get(decodePatchKey(part)) + + if next == nil || ok != nil { + return nil, "" + } + + if isArray(*next.raw) { + doc, err = next.intoAry() + + if err != nil { + return nil, "" + } + } else { + doc, err = next.intoDoc() + + if err != nil { + return nil, "" + } + } + } + + return doc, decodePatchKey(key) +} + +func (d *partialDoc) set(key string, val *lazyNode) error { + (*d)[key] = val + return nil +} + +func (d *partialDoc) add(key string, val *lazyNode) error { + (*d)[key] = val + return nil +} + +func (d *partialDoc) get(key string) (*lazyNode, error) { + return (*d)[key], nil +} + +func (d *partialDoc) remove(key string) error { + _, ok := (*d)[key] + if !ok { + return fmt.Errorf("Unable to remove nonexistent key: %s", key) + } + + delete(*d, key) + return nil +} + +// set should only be used to implement the "replace" operation, so "key" must +// be an already existing index in "d". +func (d *partialArray) set(key string, val *lazyNode) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + (*d)[idx] = val + return nil +} + +func (d *partialArray) add(key string, val *lazyNode) error { + if key == "-" { + *d = append(*d, val) + return nil + } + + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + sz := len(*d) + 1 + + ary := make([]*lazyNode, sz) + + cur := *d + + if idx >= len(ary) { + return fmt.Errorf("Unable to access invalid index: %d", idx) + } + + if SupportNegativeIndices { + if idx < -len(ary) { + return fmt.Errorf("Unable to access invalid index: %d", idx) + } + + if idx < 0 { + idx += len(ary) + } + } + + copy(ary[0:idx], cur[0:idx]) + ary[idx] = val + copy(ary[idx+1:], cur[idx:]) + + *d = ary + return nil +} + +func (d *partialArray) get(key string) (*lazyNode, error) { + idx, err := strconv.Atoi(key) + + if err != nil { + return nil, err + } + + if idx >= len(*d) { + return nil, fmt.Errorf("Unable to access invalid index: %d", idx) + } + + return (*d)[idx], nil +} + +func (d *partialArray) remove(key string) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + cur := *d + + if idx >= len(cur) { + return fmt.Errorf("Unable to access invalid index: %d", idx) + } + + if SupportNegativeIndices { + if idx < -len(cur) { + return fmt.Errorf("Unable to access invalid index: %d", idx) + } + + if idx < 0 { + idx += len(cur) + } + } + + ary := make([]*lazyNode, len(cur)-1) + + copy(ary[0:idx], cur[0:idx]) + copy(ary[idx:], cur[idx+1:]) + + *d = ary + return nil + +} + +func (p Patch) add(doc *container, op operation) error { + path := op.path() + + con, key := findObject(doc, path) + + if con == nil { + return fmt.Errorf("jsonpatch add operation does not apply: doc is missing path: \"%s\"", path) + } + + return con.add(key, op.value()) +} + +func (p Patch) remove(doc *container, op operation) error { + path := op.path() + + con, key := findObject(doc, path) + + if con == nil { + return fmt.Errorf("jsonpatch remove operation does not apply: doc is missing path: \"%s\"", path) + } + + return con.remove(key) +} + +func (p Patch) replace(doc *container, op operation) error { + path := op.path() + + con, key := findObject(doc, path) + + if con == nil { + return fmt.Errorf("jsonpatch replace operation does not apply: doc is missing path: %s", path) + } + + _, ok := con.get(key) + if ok != nil { + return fmt.Errorf("jsonpatch replace operation does not apply: doc is missing key: %s", path) + } + + return con.set(key, op.value()) +} + +func (p Patch) move(doc *container, op operation) error { + from := op.from() + + con, key := findObject(doc, from) + + if con == nil { + return fmt.Errorf("jsonpatch move operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key) + if err != nil { + return err + } + + err = con.remove(key) + if err != nil { + return err + } + + path := op.path() + + con, key = findObject(doc, path) + + if con == nil { + return fmt.Errorf("jsonpatch move operation does not apply: doc is missing destination path: %s", path) + } + + return con.add(key, val) +} + +func (p Patch) test(doc *container, op operation) error { + path := op.path() + + con, key := findObject(doc, path) + + if con == nil { + return fmt.Errorf("jsonpatch test operation does not apply: is missing path: %s", path) + } + + val, err := con.get(key) + + if err != nil { + return err + } + + if val == nil { + if op.value().raw == nil { + return nil + } + return fmt.Errorf("Testing value %s failed", path) + } else if op.value() == nil { + return fmt.Errorf("Testing value %s failed", path) + } + + if val.equal(op.value()) { + return nil + } + + return fmt.Errorf("Testing value %s failed", path) +} + +func (p Patch) copy(doc *container, op operation, accumulatedCopySize *int64) error { + from := op.from() + + con, key := findObject(doc, from) + + if con == nil { + return fmt.Errorf("jsonpatch copy operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key) + if err != nil { + return err + } + + path := op.path() + + con, key = findObject(doc, path) + + if con == nil { + return fmt.Errorf("jsonpatch copy operation does not apply: doc is missing destination path: %s", path) + } + + valCopy, sz, err := deepCopy(val) + if err != nil { + return err + } + (*accumulatedCopySize) += int64(sz) + if AccumulatedCopySizeLimit > 0 && *accumulatedCopySize > AccumulatedCopySizeLimit { + return NewAccumulatedCopySizeError(AccumulatedCopySizeLimit, *accumulatedCopySize) + } + + return con.add(key, valCopy) +} + +// Equal indicates if 2 JSON documents have the same structural equality. +func Equal(a, b []byte) bool { + ra := make(json.RawMessage, len(a)) + copy(ra, a) + la := newLazyNode(&ra) + + rb := make(json.RawMessage, len(b)) + copy(rb, b) + lb := newLazyNode(&rb) + + return la.equal(lb) +} + +// DecodePatch decodes the passed JSON document as an RFC 6902 patch. +func DecodePatch(buf []byte) (Patch, error) { + var p Patch + + err := json.Unmarshal(buf, &p) + + if err != nil { + return nil, err + } + + return p, nil +} + +// Apply mutates a JSON document according to the patch, and returns the new +// document. +func (p Patch) Apply(doc []byte) ([]byte, error) { + return p.ApplyIndent(doc, "") +} + +// ApplyIndent mutates a JSON document according to the patch, and returns the new +// document indented. +func (p Patch) ApplyIndent(doc []byte, indent string) ([]byte, error) { + var pd container + if doc[0] == '[' { + pd = &partialArray{} + } else { + pd = &partialDoc{} + } + + err := json.Unmarshal(doc, pd) + + if err != nil { + return nil, err + } + + err = nil + + var accumulatedCopySize int64 + + for _, op := range p { + switch op.kind() { + case "add": + err = p.add(&pd, op) + case "remove": + err = p.remove(&pd, op) + case "replace": + err = p.replace(&pd, op) + case "move": + err = p.move(&pd, op) + case "test": + err = p.test(&pd, op) + case "copy": + err = p.copy(&pd, op, &accumulatedCopySize) + default: + err = fmt.Errorf("Unexpected kind: %s", op.kind()) + } + + if err != nil { + return nil, err + } + } + + if indent != "" { + return json.MarshalIndent(pd, "", indent) + } + + return json.Marshal(pd) +} + +// From http://tools.ietf.org/html/rfc6901#section-4 : +// +// Evaluation of each reference token begins by decoding any escaped +// character sequence. This is performed by first transforming any +// occurrence of the sequence '~1' to '/', and then transforming any +// occurrence of the sequence '~0' to '~'. + +var ( + rfc6901Decoder = strings.NewReplacer("~1", "/", "~0", "~") +) + +func decodePatchKey(k string) string { + return rfc6901Decoder.Replace(k) +} diff --git a/vendor/github.com/gobuffalo/envy/LICENSE b/vendor/github.com/gobuffalo/envy/LICENSE new file mode 100644 index 000000000..649efd437 --- /dev/null +++ b/vendor/github.com/gobuffalo/envy/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Mark Bates + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/gobuffalo/envy/LICENSE.txt b/vendor/github.com/gobuffalo/envy/LICENSE.txt new file mode 100644 index 000000000..123ddc0d8 --- /dev/null +++ b/vendor/github.com/gobuffalo/envy/LICENSE.txt @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright (c) 2018 Mark Bates + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/gobuffalo/envy/envy.go b/vendor/github.com/gobuffalo/envy/envy.go new file mode 100644 index 000000000..dc31ba2c0 --- /dev/null +++ b/vendor/github.com/gobuffalo/envy/envy.go @@ -0,0 +1,276 @@ +/* +package envy makes working with ENV variables in Go trivial. + +* Get ENV variables with default values. +* Set ENV variables safely without affecting the underlying system. +* Temporarily change ENV vars; useful for testing. +* Map all of the key/values in the ENV. +* Loads .env files (by using [godotenv](https://github.com/joho/godotenv/)) +* More! +*/ +package envy + +import ( + "errors" + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" + + "github.com/joho/godotenv" + "github.com/rogpeppe/go-internal/modfile" +) + +var gil = &sync.RWMutex{} +var env = map[string]string{} + +// GO111MODULE is ENV for turning mods on/off +const GO111MODULE = "GO111MODULE" + +func init() { + Load() + loadEnv() +} + +// Load the ENV variables to the env map +func loadEnv() { + gil.Lock() + defer gil.Unlock() + + if os.Getenv("GO_ENV") == "" { + // if the flag "test.v" is *defined*, we're running as a unit test. Note that we don't care + // about v.Value (verbose test mode); we just want to know if the test environment has defined + // it. It's also possible that the flags are not yet fully parsed (i.e. flag.Parsed() == false), + // so we could not depend on v.Value anyway. + // + if v := flag.Lookup("test.v"); v != nil { + env["GO_ENV"] = "test" + } + } + + // set the GOPATH if using >= 1.8 and the GOPATH isn't set + if os.Getenv("GOPATH") == "" { + out, err := exec.Command("go", "env", "GOPATH").Output() + if err == nil { + gp := strings.TrimSpace(string(out)) + os.Setenv("GOPATH", gp) + } + } + + for _, e := range os.Environ() { + pair := strings.Split(e, "=") + env[pair[0]] = os.Getenv(pair[0]) + } +} + +// Mods returns true if module support is enabled, false otherwise +// See https://github.com/golang/go/wiki/Modules#how-to-install-and-activate-module-support for details +func Mods() bool { + go111 := Get(GO111MODULE, "") + + if !InGoPath() { + return go111 != "off" + } + + return go111 == "on" +} + +// Reload the ENV variables. Useful if +// an external ENV manager has been used +func Reload() { + env = map[string]string{} + loadEnv() +} + +// Load .env files. Files will be loaded in the same order that are received. +// Redefined vars will override previously existing values. +// IE: envy.Load(".env", "test_env/.env") will result in DIR=test_env +// If no arg passed, it will try to load a .env file. +func Load(files ...string) error { + + // If no files received, load the default one + if len(files) == 0 { + err := godotenv.Overload() + if err == nil { + Reload() + } + return err + } + + // We received a list of files + for _, file := range files { + + // Check if it exists or we can access + if _, err := os.Stat(file); err != nil { + // It does not exist or we can not access. + // Return and stop loading + return err + } + + // It exists and we have permission. Load it + if err := godotenv.Overload(file); err != nil { + return err + } + + // Reload the env so all new changes are noticed + Reload() + + } + return nil +} + +// Get a value from the ENV. If it doesn't exist the +// default value will be returned. +func Get(key string, value string) string { + gil.RLock() + defer gil.RUnlock() + if v, ok := env[key]; ok { + return v + } + return value +} + +// Get a value from the ENV. If it doesn't exist +// an error will be returned +func MustGet(key string) (string, error) { + gil.RLock() + defer gil.RUnlock() + if v, ok := env[key]; ok { + return v, nil + } + return "", fmt.Errorf("could not find ENV var with %s", key) +} + +// Set a value into the ENV. This is NOT permanent. It will +// only affect values accessed through envy. +func Set(key string, value string) { + gil.Lock() + defer gil.Unlock() + env[key] = value +} + +// MustSet the value into the underlying ENV, as well as envy. +// This may return an error if there is a problem setting the +// underlying ENV value. +func MustSet(key string, value string) error { + gil.Lock() + defer gil.Unlock() + err := os.Setenv(key, value) + if err != nil { + return err + } + env[key] = value + return nil +} + +// Map all of the keys/values set in envy. +func Map() map[string]string { + gil.RLock() + defer gil.RUnlock() + cp := map[string]string{} + for k, v := range env { + cp[k] = v + } + return cp +} + +// Temp makes a copy of the values and allows operation on +// those values temporarily during the run of the function. +// At the end of the function run the copy is discarded and +// the original values are replaced. This is useful for testing. +// Warning: This function is NOT safe to use from a goroutine or +// from code which may access any Get or Set function from a goroutine +func Temp(f func()) { + oenv := env + env = map[string]string{} + for k, v := range oenv { + env[k] = v + } + defer func() { env = oenv }() + f() +} + +func GoPath() string { + return Get("GOPATH", "") +} + +func GoBin() string { + return Get("GO_BIN", "go") +} + +func InGoPath() bool { + pwd, _ := os.Getwd() + for _, p := range GoPaths() { + if strings.HasPrefix(pwd, p) { + return true + } + } + return false +} + +// GoPaths returns all possible GOPATHS that are set. +func GoPaths() []string { + gp := Get("GOPATH", "") + if runtime.GOOS == "windows" { + return strings.Split(gp, ";") // Windows uses a different separator + } + return strings.Split(gp, ":") +} + +func importPath(path string) string { + path = strings.TrimPrefix(path, "/private") + for _, gopath := range GoPaths() { + srcpath := filepath.Join(gopath, "src") + rel, err := filepath.Rel(srcpath, path) + if err == nil { + return filepath.ToSlash(rel) + } + } + + // fallback to trim + rel := strings.TrimPrefix(path, filepath.Join(GoPath(), "src")) + rel = strings.TrimPrefix(rel, string(filepath.Separator)) + return filepath.ToSlash(rel) +} + +// CurrentModule will attempt to return the module name from `go.mod` if +// modules are enabled. +// If modules are not enabled it will fallback to using CurrentPackage instead. +func CurrentModule() (string, error) { + if !Mods() { + return CurrentPackage(), nil + } + moddata, err := ioutil.ReadFile("go.mod") + if err != nil { + return "", errors.New("go.mod cannot be read or does not exist while go module is enabled") + } + packagePath := modfile.ModulePath(moddata) + if packagePath == "" { + return "", errors.New("go.mod is malformed") + } + return packagePath, nil +} + +// CurrentPackage attempts to figure out the current package name from the PWD +// Use CurrentModule for a more accurate package name. +func CurrentPackage() string { + if Mods() { + } + pwd, _ := os.Getwd() + return importPath(pwd) +} + +func Environ() []string { + gil.RLock() + defer gil.RUnlock() + var e []string + for k, v := range env { + e = append(e, fmt.Sprintf("%s=%s", k, v)) + } + return e +} diff --git a/vendor/github.com/gobuffalo/envy/version.go b/vendor/github.com/gobuffalo/envy/version.go new file mode 100644 index 000000000..e2cff15d6 --- /dev/null +++ b/vendor/github.com/gobuffalo/envy/version.go @@ -0,0 +1,3 @@ +package envy + +const Version = "v1.7.1" diff --git a/vendor/github.com/gogo/protobuf/AUTHORS b/vendor/github.com/gogo/protobuf/AUTHORS new file mode 100644 index 000000000..3d97fc7a2 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of GoGo authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS file, which +# lists people. For example, employees are listed in CONTRIBUTORS, +# but not in AUTHORS, because the employer holds the copyright. + +# Names should be added to this file as one of +# Organization's name +# Individual's name +# Individual's name + +# Please keep the list sorted. + +Sendgrid, Inc +Vastech SA (PTY) LTD +Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/CONTRIBUTORS b/vendor/github.com/gogo/protobuf/CONTRIBUTORS new file mode 100644 index 000000000..1b4f6c208 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/CONTRIBUTORS @@ -0,0 +1,23 @@ +Anton Povarov +Brian Goff +Clayton Coleman +Denis Smirnov +DongYun Kang +Dwayne Schultz +Georg Apitz +Gustav Paul +Johan Brandhorst +John Shahid +John Tuley +Laurent +Patrick Lee +Peter Edge +Roger Johansson +Sam Nguyen +Sergio Arbeo +Stephen J Day +Tamir Duberstein +Todd Eisenberger +Tormod Erevik Lea +Vyacheslav Kim +Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS b/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS new file mode 100644 index 000000000..b368efb7f --- /dev/null +++ b/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS @@ -0,0 +1,5 @@ +The contributors to the Go protobuf repository: + +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. \ No newline at end of file diff --git a/vendor/github.com/gogo/protobuf/LICENSE b/vendor/github.com/gogo/protobuf/LICENSE new file mode 100644 index 000000000..f57de90da --- /dev/null +++ b/vendor/github.com/gogo/protobuf/LICENSE @@ -0,0 +1,35 @@ +Copyright (c) 2013, The GoGo Authors. All rights reserved. + +Protocol Buffers for Go with Gadgets + +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/gogo/protobuf/proto/clone.go b/vendor/github.com/gogo/protobuf/proto/clone.go new file mode 100644 index 000000000..a26b046d9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/clone.go @@ -0,0 +1,258 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, ok := in.Addr().Interface().(extensionsBytes); ok { + emOut := out.Addr().Interface().(extensionsBytes) + bIn := emIn.GetExtensions() + bOut := emOut.GetExtensions() + *bOut = append(*bOut, *bIn...) + } else if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/custom_gogo.go b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go new file mode 100644 index 000000000..24552483c --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go @@ -0,0 +1,39 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "reflect" + +type custom interface { + Marshal() ([]byte, error) + Unmarshal(data []byte) error + Size() int +} + +var customType = reflect.TypeOf((*custom)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/decode.go b/vendor/github.com/gogo/protobuf/proto/decode.go new file mode 100644 index 000000000..d9aa3c42d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/decode.go @@ -0,0 +1,428 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/vendor/github.com/gogo/protobuf/proto/discard.go b/vendor/github.com/gogo/protobuf/proto/discard.go new file mode 100644 index 000000000..fe1bd7d90 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + discardInfo := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + discardInfo.discard(sp) + } + } + } + default: // E.g., *pb.T + discardInfo := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + discardInfo.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/duration.go b/vendor/github.com/gogo/protobuf/proto/duration.go new file mode 100644 index 000000000..93464c91c --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/duration.go @@ -0,0 +1,100 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Range of a Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid Duration +// may still be too large to fit into a time.Duration (the range of Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %#v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %#v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) + } + return nil +} + +// DurationFromProto converts a Duration to a time.Duration. DurationFromProto +// returns an error if the Duration is invalid or is too large to be +// represented in a time.Duration. +func durationFromProto(p *duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a Duration. +func durationProto(d time.Duration) *duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go new file mode 100644 index 000000000..e748e1730 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go @@ -0,0 +1,49 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +var durationType = reflect.TypeOf((*time.Duration)(nil)).Elem() + +type duration struct { + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` +} + +func (m *duration) Reset() { *m = duration{} } +func (*duration) ProtoMessage() {} +func (*duration) String() string { return "duration" } + +func init() { + RegisterType((*duration)(nil), "gogo.protobuf.proto.duration") +} diff --git a/vendor/github.com/gogo/protobuf/proto/encode.go b/vendor/github.com/gogo/protobuf/proto/encode.go new file mode 100644 index 000000000..3abfed2cf --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/encode.go @@ -0,0 +1,203 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "reflect" +) + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go new file mode 100644 index 000000000..0f5fb173e --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go @@ -0,0 +1,33 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +func NewRequiredNotSetError(field string) *RequiredNotSetError { + return &RequiredNotSetError{field} +} diff --git a/vendor/github.com/gogo/protobuf/proto/equal.go b/vendor/github.com/gogo/protobuf/proto/equal.go new file mode 100644 index 000000000..d4db5a1c1 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/equal.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + return bytes.Equal(u1, u2) +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1, m2 := e1.value, e2.value + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + return false + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions.go b/vendor/github.com/gogo/protobuf/proto/extensions.go new file mode 100644 index 000000000..44ebd457c --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/extensions.go @@ -0,0 +1,604 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "io" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + case extensionsBytes: + return slowExtensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + value interface{} + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + if ebase, ok := base.(extensionsBytes); ok { + clearExtension(base, id) + ext := ebase.GetExtensions() + *ext = append(*ext, b...) + return + } + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if ea, ok := pbi.(slowExtensionAdapter); ok { + pbi = ea.extensionsBytes + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + buf := *ext + o := 0 + for o < len(buf) { + tag, n := DecodeVarint(buf[o:]) + fieldNum := int32(tag >> 3) + if int32(fieldNum) == extension.Field { + return true + } + wireType := int(tag & 0x7) + o += n + l, err := size(buf[o:], wireType) + if err != nil { + return false + } + o += l + } + return false + } + // TODO: Check types, field numbers, etc.? + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + clearExtension(pb, extension.Field) +} + +func clearExtension(pb Message, fieldNum int32) { + if epb, ok := pb.(extensionsBytes); ok { + offset := 0 + for offset != -1 { + offset = deleteExtension(epb, fieldNum, offset) + } + return + } + epb, err := extendable(pb) + if err != nil { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, fieldNum) +} + +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + return decodeExtensionFromBytes(extension, *ext) + } + + epb, err := extendable(pb) + if err != nil { + return nil, err + } + + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if cerr := checkExtensionTypes(epb, extension); cerr != nil { + return nil, cerr + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return e.value, nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = v + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return e.value, nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + unmarshal := typeUnmarshaler(t, extension.Tag) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate space to store the pointer/slice. + value := reflect.New(t).Elem() + + var err error + for { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + wire := int(x) & 7 + + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { + return nil, err + } + + if len(b) == 0 { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + if epb, ok := pb.(extensionsBytes); ok { + newb, err := encodeExtension(extension, value) + if err != nil { + return err + } + bb := epb.GetExtensions() + *bb = append(*bb, newb...) + return nil + } + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return errors.New("proto: bad extension value type") + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + *ext = []byte{} + return + } + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go new file mode 100644 index 000000000..53ebd8cca --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go @@ -0,0 +1,368 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "sort" + "strings" + "sync" +) + +type extensionsBytes interface { + Message + ExtensionRangeArray() []ExtensionRange + GetExtensions() *[]byte +} + +type slowExtensionAdapter struct { + extensionsBytes +} + +func (s slowExtensionAdapter) extensionsWrite() map[int32]Extension { + panic("Please report a bug to github.com/gogo/protobuf if you see this message: Writing extensions is not supported for extensions stored in a byte slice field.") +} + +func (s slowExtensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + b := s.GetExtensions() + m, err := BytesToExtensionsMap(*b) + if err != nil { + panic(err) + } + return m, notLocker{} +} + +func GetBoolExtension(pb Message, extension *ExtensionDesc, ifnotset bool) bool { + if reflect.ValueOf(pb).IsNil() { + return ifnotset + } + value, err := GetExtension(pb, extension) + if err != nil { + return ifnotset + } + if value == nil { + return ifnotset + } + if value.(*bool) == nil { + return ifnotset + } + return *(value.(*bool)) +} + +func (this *Extension) Equal(that *Extension) bool { + if err := this.Encode(); err != nil { + return false + } + if err := that.Encode(); err != nil { + return false + } + return bytes.Equal(this.enc, that.enc) +} + +func (this *Extension) Compare(that *Extension) int { + if err := this.Encode(); err != nil { + return 1 + } + if err := that.Encode(); err != nil { + return -1 + } + return bytes.Compare(this.enc, that.enc) +} + +func SizeOfInternalExtension(m extendableProto) (n int) { + info := getMarshalInfo(reflect.TypeOf(m)) + return info.sizeV1Extensions(m.extensionsWrite()) +} + +type sortableMapElem struct { + field int32 + ext Extension +} + +func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions { + s := make(sortableExtensions, 0, len(m)) + for k, v := range m { + s = append(s, &sortableMapElem{field: k, ext: v}) + } + return s +} + +type sortableExtensions []*sortableMapElem + +func (this sortableExtensions) Len() int { return len(this) } + +func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] } + +func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field } + +func (this sortableExtensions) String() string { + sort.Sort(this) + ss := make([]string, len(this)) + for i := range this { + ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext) + } + return "map[" + strings.Join(ss, ",") + "]" +} + +func StringFromInternalExtension(m extendableProto) string { + return StringFromExtensionsMap(m.extensionsWrite()) +} + +func StringFromExtensionsMap(m map[int32]Extension) string { + return newSortableExtensionsFromMap(m).String() +} + +func StringFromExtensionsBytes(ext []byte) string { + m, err := BytesToExtensionsMap(ext) + if err != nil { + panic(err) + } + return StringFromExtensionsMap(m) +} + +func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error) { + return EncodeExtensionMap(m.extensionsWrite(), data) +} + +func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) { + o := 0 + for _, e := range m { + if err := e.Encode(); err != nil { + return 0, err + } + n := copy(data[o:], e.enc) + if n != len(e.enc) { + return 0, io.ErrShortBuffer + } + o += n + } + return o, nil +} + +func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) { + e := m[id] + if err := e.Encode(); err != nil { + return nil, err + } + return e.enc, nil +} + +func size(buf []byte, wire int) (int, error) { + switch wire { + case WireVarint: + _, n := DecodeVarint(buf) + return n, nil + case WireFixed64: + return 8, nil + case WireBytes: + v, n := DecodeVarint(buf) + return int(v) + n, nil + case WireFixed32: + return 4, nil + case WireStartGroup: + offset := 0 + for { + u, n := DecodeVarint(buf[offset:]) + fwire := int(u & 0x7) + offset += n + if fwire == WireEndGroup { + return offset, nil + } + s, err := size(buf[offset:], wire) + if err != nil { + return 0, err + } + offset += s + } + } + return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire) +} + +func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) { + m := make(map[int32]Extension) + i := 0 + for i < len(buf) { + tag, n := DecodeVarint(buf[i:]) + if n <= 0 { + return nil, fmt.Errorf("unable to decode varint") + } + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + l, err := size(buf[i+n:], wireType) + if err != nil { + return nil, err + } + end := i + int(l) + n + m[int32(fieldNum)] = Extension{enc: buf[i:end]} + i = end + } + return m, nil +} + +func NewExtension(e []byte) Extension { + ee := Extension{enc: make([]byte, len(e))} + copy(ee.enc, e) + return ee +} + +func AppendExtension(e Message, tag int32, buf []byte) { + if ee, eok := e.(extensionsBytes); eok { + ext := ee.GetExtensions() + *ext = append(*ext, buf...) + return + } + if ee, eok := e.(extendableProto); eok { + m := ee.extensionsWrite() + ext := m[int32(tag)] // may be missing + ext.enc = append(ext.enc, buf...) + m[int32(tag)] = ext + } +} + +func encodeExtension(extension *ExtensionDesc, value interface{}) ([]byte, error) { + u := getMarshalInfo(reflect.TypeOf(extension.ExtendedType)) + ei := u.getExtElemInfo(extension) + v := value + p := toAddrPointer(&v, ei.isptr) + siz := ei.sizer(p, SizeVarint(ei.wiretag)) + buf := make([]byte, 0, siz) + return ei.marshaler(buf, p, ei.wiretag, false) +} + +func decodeExtensionFromBytes(extension *ExtensionDesc, buf []byte) (interface{}, error) { + o := 0 + for o < len(buf) { + tag, n := DecodeVarint((buf)[o:]) + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + if o+n > len(buf) { + return nil, fmt.Errorf("unable to decode extension") + } + l, err := size((buf)[o+n:], wireType) + if err != nil { + return nil, err + } + if int32(fieldNum) == extension.Field { + if o+n+l > len(buf) { + return nil, fmt.Errorf("unable to decode extension") + } + v, err := decodeExtension((buf)[o:o+n+l], extension) + if err != nil { + return nil, err + } + return v, nil + } + o += n + l + } + return defaultExtensionValue(extension) +} + +func (this *Extension) Encode() error { + if this.enc == nil { + var err error + this.enc, err = encodeExtension(this.desc, this.value) + if err != nil { + return err + } + } + return nil +} + +func (this Extension) GoString() string { + if err := this.Encode(); err != nil { + return fmt.Sprintf("error encoding extension: %v", err) + } + return fmt.Sprintf("proto.NewExtension(%#v)", this.enc) +} + +func SetUnsafeExtension(pb Message, fieldNum int32, value interface{}) error { + typ := reflect.TypeOf(pb).Elem() + ext, ok := extensionMaps[typ] + if !ok { + return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) + } + desc, ok := ext[fieldNum] + if !ok { + return errors.New("proto: bad extension number; not in declared ranges") + } + return SetExtension(pb, desc, value) +} + +func GetUnsafeExtension(pb Message, fieldNum int32) (interface{}, error) { + typ := reflect.TypeOf(pb).Elem() + ext, ok := extensionMaps[typ] + if !ok { + return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) + } + desc, ok := ext[fieldNum] + if !ok { + return nil, fmt.Errorf("unregistered field number %d", fieldNum) + } + return GetExtension(pb, desc) +} + +func NewUnsafeXXX_InternalExtensions(m map[int32]Extension) XXX_InternalExtensions { + x := &XXX_InternalExtensions{ + p: new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }), + } + x.p.extensionMap = m + return *x +} + +func GetUnsafeExtensionsMap(extendable Message) map[int32]Extension { + pb := extendable.(extendableProto) + return pb.extensionsWrite() +} + +func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { + ext := pb.GetExtensions() + for offset < len(*ext) { + tag, n1 := DecodeVarint((*ext)[offset:]) + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + n2, err := size((*ext)[offset+n1:], wireType) + if err != nil { + panic(err) + } + newOffset := offset + n1 + n2 + if fieldNum == theFieldNum { + *ext = append((*ext)[:offset], (*ext)[newOffset:]...) + return offset + } + offset = newOffset + } + return -1 +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go new file mode 100644 index 000000000..b2271d0b7 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/lib.go @@ -0,0 +1,987 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/gogo/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/gogo/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// Stats records allocation details about the protocol buffer encoders +// and decoders. Useful for tuning the library itself. +type Stats struct { + Emalloc uint64 // mallocs in encode + Dmalloc uint64 // mallocs in decode + Encode uint64 // number of encodes + Decode uint64 // number of decodes + Chit uint64 // number of cache hits + Cmiss uint64 // number of cache misses + Size uint64 // number of sizes +} + +// Set to true to enable stats collection. +const collectStats = false + +var stats Stats + +// GetStats returns a copy of the global Stats structure. +func GetStats() Stats { return stats } + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + sindex := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = sindex +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or T or []*T or []T + switch f.Kind() { + case reflect.Struct: + setDefaults(f, recur, zeros) + + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.Kind() == reflect.Ptr && e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Struct: + nestedMessage = true // non-nullable + + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr, reflect.Struct: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const GoGoProtoPackageIsVersion2 = true + +// ProtoPackageIsVersion1 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const GoGoProtoPackageIsVersion1 = true + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go new file mode 100644 index 000000000..b3aa39190 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go @@ -0,0 +1,50 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "encoding/json" + "strconv" +) + +type Sizer interface { + Size() int +} + +type ProtoSizer interface { + ProtoSize() int +} + +func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) { + s, ok := m[value] + if !ok { + s = strconv.Itoa(int(value)) + } + return json.Marshal(s) +} diff --git a/vendor/github.com/gogo/protobuf/proto/message_set.go b/vendor/github.com/gogo/protobuf/proto/message_set.go new file mode 100644 index 000000000..3b6ca41d5 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/message_set.go @@ -0,0 +1,314 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "sync" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// MarshalMessageSet encodes the extension map represented by m in the message set wire format. +// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSet(exts interface{}) ([]byte, error) { + return marshalMessageSet(exts, false) +} + +// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal. +func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) { + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var u marshalInfo + siz := u.sizeMessageSet(exts) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, exts, deterministic) + + case map[int32]Extension: + // This is an old-style extension map. + // Wrap it in a new-style XXX_InternalExtensions. + ie := XXX_InternalExtensions{ + p: &struct { + mu sync.Mutex + extensionMap map[int32]Extension + }{ + extensionMap: exts, + }, + } + + var u marshalInfo + siz := u.sizeMessageSet(&ie) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, &ie, deterministic) + + default: + return nil, errors.New("proto: not an extension map") + } +} + +// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} + +// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. +// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var mu sync.Locker + m, mu = exts.extensionsRead() + if m != nil { + // Keep the extensions map locked until we're done marshaling to prevent + // races between marshaling and unmarshaling the lazily-{en,de}coded + // values. + mu.Lock() + defer mu.Unlock() + } + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + var b bytes.Buffer + b.WriteByte('{') + + // Process the map in key order for deterministic output. + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) // int32Slice defined in text.go + + for i, id := range ids { + ext := m[id] + msd, ok := messageSetMap[id] + if !ok { + // Unknown type; we can't render it, so skip it. + continue + } + + if i > 0 && b.Len() > 1 { + b.WriteByte(',') + } + + fmt.Fprintf(&b, `"[%s]":`, msd.name) + + x := ext.value + if x == nil { + x = reflect.New(msd.t.Elem()).Interface() + if err := Unmarshal(ext.enc, x.(Message)); err != nil { + return nil, err + } + } + d, err := json.Marshal(x) + if err != nil { + return nil, err + } + b.Write(d) + } + b.WriteByte('}') + return b.Bytes(), nil +} + +// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. +// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { + // Common-case fast path. + if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { + return nil + } + + // This is fairly tricky, and it's not clear that it is needed. + return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") +} + +// A global registry of types that can be used in a MessageSet. + +var messageSetMap = make(map[int32]messageSetDesc) + +type messageSetDesc struct { + t reflect.Type // pointer to struct + name string +} + +// RegisterMessageSetType is called from the generated code. +func RegisterMessageSetType(m Message, fieldNum int32, name string) { + messageSetMap[fieldNum] = messageSetDesc{ + t: reflect.TypeOf(m), + name: name, + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go new file mode 100644 index 000000000..b6cad9083 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go @@ -0,0 +1,357 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go new file mode 100644 index 000000000..7ffd3c29d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go @@ -0,0 +1,59 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" +) + +// TODO: untested, so probably incorrect. + +func (p pointer) getRef() pointer { + return pointer{v: p.v.Addr()} +} + +func (p pointer) appendRef(v pointer, typ reflect.Type) { + slice := p.getSlice(typ) + elem := v.asPointerTo(typ).Elem() + newSlice := reflect.Append(slice, elem) + slice.Set(newSlice) +} + +func (p pointer) getSlice(typ reflect.Type) reflect.Value { + sliceTyp := reflect.SliceOf(typ) + slice := p.asPointerTo(sliceTyp) + slice = slice.Elem() + return slice +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go new file mode 100644 index 000000000..d55a335d9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,308 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } + // The interface is not of pointer type. The data word is the pointer + // to the data. + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go new file mode 100644 index 000000000..aca8eed02 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go @@ -0,0 +1,56 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "unsafe" +) + +func (p pointer) getRef() pointer { + return pointer{p: (unsafe.Pointer)(&p.p)} +} + +func (p pointer) appendRef(v pointer, typ reflect.Type) { + slice := p.getSlice(typ) + elem := v.asPointerTo(typ).Elem() + newSlice := reflect.Append(slice, elem) + slice.Set(newSlice) +} + +func (p pointer) getSlice(typ reflect.Type) reflect.Value { + sliceTyp := reflect.SliceOf(typ) + slice := p.asPointerTo(sliceTyp) + slice = slice.Elem() + return slice +} diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go new file mode 100644 index 000000000..04dcb8d9e --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/properties.go @@ -0,0 +1,608 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + CustomType string + CastType string + StdTime bool + StdDuration bool + WktPointer bool + + stype reflect.Type // set for struct types only + ctype reflect.Type // set for custom types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + case strings.HasPrefix(f, "embedded="): + p.OrigName = strings.Split(f, "=")[1] + case strings.HasPrefix(f, "customtype="): + p.CustomType = strings.Split(f, "=")[1] + case strings.HasPrefix(f, "casttype="): + p.CastType = strings.Split(f, "=")[1] + case f == "stdtime": + p.StdTime = true + case f == "stdduration": + p.StdDuration = true + case f == "wktptr": + p.WktPointer = true + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + isMap := typ.Kind() == reflect.Map + if len(p.CustomType) > 0 && !isMap { + p.ctype = typ + p.setTag(lockGetProp) + return + } + if p.StdTime && !isMap { + p.setTag(lockGetProp) + return + } + if p.StdDuration && !isMap { + p.setTag(lockGetProp) + return + } + if p.WktPointer && !isMap { + p.setTag(lockGetProp) + return + } + switch t1 := typ; t1.Kind() { + case reflect.Struct: + p.stype = typ + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + case reflect.Slice: + switch t2 := t1.Elem(); t2.Kind() { + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + case reflect.Struct: + p.stype = t3 + } + case reflect.Struct: + p.stype = t2 + } + + case reflect.Map: + + p.mtype = t1 + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + + p.MapValProp.CustomType = p.CustomType + p.MapValProp.StdDuration = p.StdDuration + p.MapValProp.StdTime = p.StdTime + p.MapValProp.WktPointer = p.WktPointer + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + p.setTag(lockGetProp) +} + +func (p *Properties) setTag(lockGetProp bool) { + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + if collectStats { + stats.Chit++ + } + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + if collectStats { + stats.Chit++ + } + return prop + } + if collectStats { + stats.Cmiss++ + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + isOneofMessage := false + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + isOneofMessage = true + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); isOneofMessage && ok { + var oots []interface{} + _, _, _, oots = om.XXX_OneofFuncs() + + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) +var enumStringMaps = make(map[string]map[int32]string) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap + if _, ok := enumStringMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumStringMaps[typeName] = unusedNameMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go new file mode 100644 index 000000000..40ea3dd93 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go @@ -0,0 +1,36 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" +) + +var sizerType = reflect.TypeOf((*Sizer)(nil)).Elem() +var protosizerType = reflect.TypeOf((*ProtoSizer)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go new file mode 100644 index 000000000..5a5fd93f7 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go @@ -0,0 +1,119 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "io" +) + +func Skip(data []byte) (n int, err error) { + l := len(data) + index := 0 + for index < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + index++ + if data[index-1] < 0x80 { + break + } + } + return index, nil + case 1: + index += 8 + return index, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + index += length + return index, nil + case 3: + for { + var innerWire uint64 + var start int = index + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := Skip(data[start:]) + if err != nil { + return 0, err + } + index = start + next + } + return index, nil + case 4: + return index, nil + case 5: + index += 4 + return index, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal.go b/vendor/github.com/gogo/protobuf/proto/table_marshal.go new file mode 100644 index 000000000..ba58c49a4 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal.go @@ -0,0 +1,3006 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements + + hassizer bool // has custom sizer + hasprotosizer bool // has custom protosizer + + bytesExtensions field // offset of XXX_extensions where the field type is []byte +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex + + uint8SliceType = reflect.TypeOf(([]uint8)(nil)).Kind() +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + // Uses the message's Size method if available + if u.hassizer { + s := ptr.asPointerTo(u.typ).Interface().(Sizer) + return s.Size() + } + // Uses the message's ProtoSize method if available + if u.hasprotosizer { + s := ptr.asPointerTo(u.typ).Interface().(ProtoSizer) + return s.ProtoSize() + } + + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.bytesExtensions.IsValid() { + s := *ptr.offset(u.bytesExtensions).toBytes() + n += len(s) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + if u.bytesExtensions.IsValid() { + s := *ptr.offset(u.bytesExtensions).toBytes() + b = append(b, s...) + } + for _, f := range u.fields { + if f.required { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.bytesExtensions = invalidField + u.sizecache = invalidField + isOneofMessage := false + + if reflect.PtrTo(t).Implements(sizerType) { + u.hassizer = true + } + if reflect.PtrTo(t).Implements(protosizerType) { + u.hasprotosizer = true + } + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Tag.Get("protobuf_oneof") != "" { + isOneofMessage = true + } + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + if f.Type.Kind() == reflect.Map { + u.v1extensions = toField(&f) + } else { + u.bytesExtensions = toField(&f) + } + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // get oneof implementers + var oneofImplementers []interface{} + // gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler + if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok && isOneofMessage { + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizr, marshalr := typeMarshaler(t, tags, false, false) + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizr, + marshaler: marshalr, + isptr: t.Kind() == reflect.Ptr, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizr, marshalr := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizr, + marshaler: marshalr, + } + } +} + +type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + ctype := false + isTime := false + isDuration := false + isWktPointer := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + if strings.HasPrefix(tags[i], "customtype=") { + ctype = true + } + if tags[i] == "stdtime" { + isTime = true + } + if tags[i] == "stdduration" { + isDuration = true + } + if tags[i] == "wktptr" { + isWktPointer = true + } + } + validateUTF8 = validateUTF8 && proto3 + if !proto3 && !pointer && !slice { + nozero = false + } + + if ctype { + if reflect.PtrTo(t).Implements(customType) { + if slice { + return makeMessageRefSliceMarshaler(getMarshalInfo(t)) + } + if pointer { + return makeCustomPtrMarshaler(getMarshalInfo(t)) + } + return makeCustomMarshaler(getMarshalInfo(t)) + } else { + panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) + } + } + + if isTime { + if pointer { + if slice { + return makeTimePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeTimePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeTimeSliceMarshaler(getMarshalInfo(t)) + } + return makeTimeMarshaler(getMarshalInfo(t)) + } + + if isDuration { + if pointer { + if slice { + return makeDurationPtrSliceMarshaler(getMarshalInfo(t)) + } + return makeDurationPtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeDurationSliceMarshaler(getMarshalInfo(t)) + } + return makeDurationMarshaler(getMarshalInfo(t)) + } + + if isWktPointer { + switch t.Kind() { + case reflect.Float64: + if pointer { + if slice { + return makeStdDoubleValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdDoubleValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdDoubleValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdDoubleValueMarshaler(getMarshalInfo(t)) + case reflect.Float32: + if pointer { + if slice { + return makeStdFloatValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdFloatValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdFloatValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdFloatValueMarshaler(getMarshalInfo(t)) + case reflect.Int64: + if pointer { + if slice { + return makeStdInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt64ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdInt64ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt64ValueMarshaler(getMarshalInfo(t)) + case reflect.Uint64: + if pointer { + if slice { + return makeStdUInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt64ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdUInt64ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt64ValueMarshaler(getMarshalInfo(t)) + case reflect.Int32: + if pointer { + if slice { + return makeStdInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt32ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdInt32ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt32ValueMarshaler(getMarshalInfo(t)) + case reflect.Uint32: + if pointer { + if slice { + return makeStdUInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt32ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdUInt32ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt32ValueMarshaler(getMarshalInfo(t)) + case reflect.Bool: + if pointer { + if slice { + return makeStdBoolValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBoolValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdBoolValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBoolValueMarshaler(getMarshalInfo(t)) + case reflect.String: + if pointer { + if slice { + return makeStdStringValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdStringValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdStringValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdStringValueMarshaler(getMarshalInfo(t)) + case uint8SliceType: + if pointer { + if slice { + return makeStdBytesValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBytesValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdBytesValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBytesValueMarshaler(getMarshalInfo(t)) + default: + panic(fmt.Sprintf("unknown wktpointer type %#v", t)) + } + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if pointer { + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } else { + if slice { + return makeMessageRefSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageRefMarshaler(getMarshalInfo(t)) + } + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + tags := strings.Split(f.Tag.Get("protobuf"), ",") + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + stdOptions := false + for _, t := range tags { + if strings.HasPrefix(t, "customtype=") { + valTags = append(valTags, t) + } + if t == "stdtime" { + valTags = append(valTags, t) + stdOptions = true + } + if t == "stdduration" { + valTags = append(valTags, t) + stdOptions = true + } + if t == "wktptr" { + valTags = append(valTags, t) + } + } + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && !stdOptions && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if p.deterministic { + if _, ok := pb.(Marshaler); ok { + return fmt.Errorf("proto: deterministic not supported by the Marshal method of %T", pb) + } + } + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + var b []byte + b, err = m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go new file mode 100644 index 000000000..997f57c1e --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go @@ -0,0 +1,388 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +// makeMessageRefMarshaler differs a bit from makeMessageMarshaler +// It marshal a message T instead of a *T +func makeMessageRefMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + siz := u.size(ptr) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + b = appendVarint(b, wiretag) + siz := u.cachedsize(ptr) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, ptr, deterministic) + } +} + +// makeMessageRefSliceMarshaler differs quite a lot from makeMessageSliceMarshaler +// It marshals a slice of messages []T instead of []*T +func makeMessageRefSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + e := elem.Interface() + v := toAddrPointer(&e, false) + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + var err, errreq error + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + e := elem.Interface() + v := toAddrPointer(&e, false) + b = appendVarint(b, wiretag) + siz := u.size(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if err != nil { + if _, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errreq == nil { + errreq = err + } + continue + } + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + + return b, errreq + } +} + +func makeCustomPtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) + siz := m.Size() + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) + siz := m.Size() + buf, err := m.Marshal() + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + return b, nil + } +} + +func makeCustomMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(u.typ).Interface().(custom) + siz := m.Size() + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(u.typ).Interface().(custom) + siz := m.Size() + buf, err := m.Marshal() + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + return b, nil + } +} + +func makeTimeMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeTimePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeTimeSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(time.Time) + ts, err := timestampProto(t) + if err != nil { + return 0 + } + siz := Size(ts) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(time.Time) + ts, err := timestampProto(t) + if err != nil { + return nil, err + } + siz := Size(ts) + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeTimePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + siz := Size(ts) + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeDurationMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) + dur := durationProto(*d) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeDurationPtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) + dur := durationProto(*d) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeDurationSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(time.Duration) + dur := durationProto(d) + siz := Size(dur) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(time.Duration) + dur := durationProto(d) + siz := Size(dur) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeDurationPtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_merge.go b/vendor/github.com/gogo/protobuf/proto/table_merge.go new file mode 100644 index 000000000..f520106e0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_merge.go @@ -0,0 +1,657 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + mergeInfo.merge(dst, src) + } + case isSlice: // E.g., []*pb.T + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mergeInfo.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mergeInfo.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go new file mode 100644 index 000000000..e6b15c76c --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2245 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + if u.bytesExtensions.IsValid() { + z = m.offset(u.bytesExtensions).toBytes() + break + } + panic("no extensions field available") + } + } + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + u.bytesExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type == reflect.TypeOf((map[int32]Extension)(nil)) { + u.oldExtensions = toField(&f) + continue + } else if f.Type == reflect.TypeOf(([]byte)(nil)) { + u.bytesExtensions = toField(&f) + continue + } + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") + // gogo: len(oneofFields) > 0 is needed for embedded oneof messages, without a marshaler and unmarshaler + if fn.IsValid() && len(oneofFields) > 0 { + res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} + for i := res.Len() - 1; i >= 0; i-- { + v := res.Index(i) // interface{} + tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + } + } + + // Get extension ranges, if any. + fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() && !u.bytesExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + ctype := false + isTime := false + isDuration := false + isWktPointer := false + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + if strings.HasPrefix(tag, "customtype=") { + ctype = true + } + if tag == "stdtime" { + isTime = true + } + if tag == "stdduration" { + isDuration = true + } + if tag == "wktptr" { + isWktPointer = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + if ctype { + if reflect.PtrTo(t).Implements(customType) { + if slice { + return makeUnmarshalCustomSlice(getUnmarshalInfo(t), name) + } + if pointer { + return makeUnmarshalCustomPtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalCustom(getUnmarshalInfo(t), name) + } else { + panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) + } + } + + if isTime { + if pointer { + if slice { + return makeUnmarshalTimePtrSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalTimePtr(getUnmarshalInfo(t), name) + } + if slice { + return makeUnmarshalTimeSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalTime(getUnmarshalInfo(t), name) + } + + if isDuration { + if pointer { + if slice { + return makeUnmarshalDurationPtrSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalDurationPtr(getUnmarshalInfo(t), name) + } + if slice { + return makeUnmarshalDurationSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalDuration(getUnmarshalInfo(t), name) + } + + if isWktPointer { + switch t.Kind() { + case reflect.Float64: + if pointer { + if slice { + return makeStdDoubleValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdDoubleValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdDoubleValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdDoubleValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Float32: + if pointer { + if slice { + return makeStdFloatValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdFloatValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdFloatValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdFloatValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Int64: + if pointer { + if slice { + return makeStdInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt64ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Uint64: + if pointer { + if slice { + return makeStdUInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdUInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt64ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Int32: + if pointer { + if slice { + return makeStdInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt32ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Uint32: + if pointer { + if slice { + return makeStdUInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdUInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt32ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Bool: + if pointer { + if slice { + return makeStdBoolValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBoolValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdBoolValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBoolValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.String: + if pointer { + if slice { + return makeStdStringValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdStringValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdStringValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdStringValueUnmarshaler(getUnmarshalInfo(t), name) + case uint8SliceType: + if pointer { + if slice { + return makeStdBytesValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBytesValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdBytesValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBytesValueUnmarshaler(getUnmarshalInfo(t), name) + default: + panic(fmt.Sprintf("unknown wktpointer type %#v", t)) + } + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessage(getUnmarshalInfo(t), name) + } + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + tagArray := strings.Split(f.Tag.Get("protobuf"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + for _, t := range tagArray { + if strings.HasPrefix(t, "customtype=") { + valTags = append(valTags, t) + } + if t == "stdtime" { + valTags = append(valTags, t) + } + if t == "stdduration" { + valTags = append(valTags, t) + } + if t == "wktptr" { + valTags = append(valTags, t) + } + } + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, strings.Join(valTags, ",")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) <= 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go new file mode 100644 index 000000000..00d6c7ad9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go @@ -0,0 +1,385 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "io" + "reflect" +) + +func makeUnmarshalMessage(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f // gogo: changed from v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendRef(v, sub.typ) // gogo: changed from f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalCustomPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.New(sub.typ)) + m := s.Interface().(custom) + if err := m.Unmarshal(b[:x]); err != nil { + return nil, err + } + return b[x:], nil + } +} + +func makeUnmarshalCustomSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := reflect.New(sub.typ) + c := m.Interface().(custom) + if err := c.Unmarshal(b[:x]); err != nil { + return nil, err + } + v := valToPointer(m) + f.appendRef(v, sub.typ) + return b[x:], nil + } +} + +func makeUnmarshalCustom(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + + m := f.asPointerTo(sub.typ).Interface().(custom) + if err := m.Unmarshal(b[:x]); err != nil { + return nil, err + } + return b[x:], nil + } +} + +func makeUnmarshalTime(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(t)) + return b[x:], nil + } +} + +func makeUnmarshalTimePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&t)) + return b[x:], nil + } +} + +func makeUnmarshalTimePtrSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&t)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalTimeSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(t)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalDurationPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&d)) + return b[x:], nil + } +} + +func makeUnmarshalDuration(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(d)) + return b[x:], nil + } +} + +func makeUnmarshalDurationPtrSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&d)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalDurationSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(d)) + slice.Set(newSlice) + return b[x:], nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/text.go b/vendor/github.com/gogo/protobuf/proto/text.go new file mode 100644 index 000000000..0407ba85d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text.go @@ -0,0 +1,928 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" + "sync" + "time" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if len(props.Enum) > 0 { + if err := tm.writeEnum(w, v, props); err != nil { + return err + } + } else if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.MapValProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if props.proto3 && fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + if len(props.Enum) > 0 { + if err := tm.writeEnum(w, fv, props); err != nil { + return err + } + } else if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv + if pv.CanAddr() { + pv = sv.Addr() + } else { + pv = reflect.New(sv.Type()) + pv.Elem().Set(sv) + } + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + if props != nil { + if len(props.CustomType) > 0 { + custom, ok := v.Interface().(Marshaler) + if ok { + data, err := custom.Marshal() + if err != nil { + return err + } + if err := writeString(w, string(data)); err != nil { + return err + } + return nil + } + } else if len(props.CastType) > 0 { + if _, ok := v.Interface().(interface { + String() string + }); ok { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + _, err := fmt.Fprintf(w, "%d", v.Interface()) + return err + } + } + } else if props.StdTime { + t, ok := v.Interface().(time.Time) + if !ok { + return fmt.Errorf("stdtime is not time.Time, but %T", v.Interface()) + } + tproto, err := timestampProto(t) + if err != nil { + return err + } + propsCopy := *props // Make a copy so that this is goroutine-safe + propsCopy.StdTime = false + err = tm.writeAny(w, reflect.ValueOf(tproto), &propsCopy) + return err + } else if props.StdDuration { + d, ok := v.Interface().(time.Duration) + if !ok { + return fmt.Errorf("stdtime is not time.Duration, but %T", v.Interface()) + } + dproto := durationProto(d) + propsCopy := *props // Make a copy so that this is goroutine-safe + propsCopy.StdDuration = false + err := tm.writeAny(w, reflect.ValueOf(dproto), &propsCopy) + return err + } + } + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, ferr := fmt.Fprintf(w, "/* %v */\n", err) + return ferr + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, werr := w.Write(endBraceNewline); werr != nil { + return werr + } + continue + } + if _, ferr := fmt.Fprint(w, tag); ferr != nil { + return ferr + } + if wire != WireStartGroup { + if err = w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err = w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + e := pv.Interface().(Message) + + var m map[int32]Extension + var mu sync.Locker + if em, ok := e.(extensionsBytes); ok { + eb := em.GetExtensions() + var err error + m, err = BytesToExtensionsMap(*eb) + if err != nil { + return err + } + mu = notLocker{} + } else if _, ok := e.(extendableProto); ok { + ep, _ := extendable(e) + m, mu = ep.extensionsRead() + if m == nil { + return nil + } + } + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(e, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/gogo/protobuf/proto/text_gogo.go b/vendor/github.com/gogo/protobuf/proto/text_gogo.go new file mode 100644 index 000000000..1d6c6aa0e --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text_gogo.go @@ -0,0 +1,57 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" +) + +func (tm *TextMarshaler) writeEnum(w *textWriter, v reflect.Value, props *Properties) error { + m, ok := enumStringMaps[props.Enum] + if !ok { + if err := tm.writeAny(w, v, props); err != nil { + return err + } + } + key := int32(0) + if v.Kind() == reflect.Ptr { + key = int32(v.Elem().Int()) + } else { + key = int32(v.Int()) + } + s, ok := m[key] + if !ok { + if err := tm.writeAny(w, v, props); err != nil { + return err + } + } + _, err := fmt.Fprint(w, s) + return err +} diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser.go b/vendor/github.com/gogo/protobuf/proto/text_parser.go new file mode 100644 index 000000000..1ce0be2fa --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text_parser.go @@ -0,0 +1,1018 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + if len(props.CustomType) > 0 { + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + tc := reflect.TypeOf(new(Marshaler)) + ok := t.Elem().Implements(tc.Elem()) + if ok { + fv := v + flen := fv.Len() + if flen == fv.Cap() { + nav := reflect.MakeSlice(v.Type(), flen, 2*flen+1) + reflect.Copy(nav, fv) + fv.Set(nav) + } + fv.SetLen(flen + 1) + + // Read one. + p.back() + return p.readAny(fv.Index(flen), props) + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + custom := reflect.New(props.ctype.Elem()).Interface().(Unmarshaler) + err := custom.Unmarshal([]byte(tok.unquoted)) + if err != nil { + return p.errorf("%v %v: %v", err, v.Type(), tok.value) + } + v.Set(reflect.ValueOf(custom)) + } else { + custom := reflect.New(reflect.TypeOf(v.Interface())).Interface().(Unmarshaler) + err := custom.Unmarshal([]byte(tok.unquoted)) + if err != nil { + return p.errorf("%v %v: %v", err, v.Type(), tok.value) + } + v.Set(reflect.Indirect(reflect.ValueOf(custom))) + } + return nil + } + if props.StdTime { + fv := v + p.back() + props.StdTime = false + tproto := ×tamp{} + err := p.readAny(reflect.ValueOf(tproto).Elem(), props) + props.StdTime = true + if err != nil { + return err + } + tim, err := timestampFromProto(tproto) + if err != nil { + return err + } + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + if t.Elem().Kind() == reflect.Ptr { + ts := fv.Interface().([]*time.Time) + ts = append(ts, &tim) + fv.Set(reflect.ValueOf(ts)) + return nil + } else { + ts := fv.Interface().([]time.Time) + ts = append(ts, tim) + fv.Set(reflect.ValueOf(ts)) + return nil + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + v.Set(reflect.ValueOf(&tim)) + } else { + v.Set(reflect.Indirect(reflect.ValueOf(&tim))) + } + return nil + } + if props.StdDuration { + fv := v + p.back() + props.StdDuration = false + dproto := &duration{} + err := p.readAny(reflect.ValueOf(dproto).Elem(), props) + props.StdDuration = true + if err != nil { + return err + } + dur, err := durationFromProto(dproto) + if err != nil { + return err + } + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + if t.Elem().Kind() == reflect.Ptr { + ds := fv.Interface().([]*time.Duration) + ds = append(ds, &dur) + fv.Set(reflect.ValueOf(ds)) + return nil + } else { + ds := fv.Interface().([]time.Duration) + ds = append(ds, dur) + fv.Set(reflect.ValueOf(ds)) + return nil + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + v.Set(reflect.ValueOf(&dur)) + } else { + v.Set(reflect.Indirect(reflect.ValueOf(&dur))) + } + return nil + } + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + ntok := p.next() + if ntok.err != nil { + return ntok.err + } + if ntok.value == "]" { + break + } + if ntok.value != "," { + return p.errorf("Expected ']' or ',' found %q", ntok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int8: + if x, err := strconv.ParseInt(tok.value, 0, 8); err == nil { + fv.SetInt(x) + return nil + } + case reflect.Int16: + if x, err := strconv.ParseInt(tok.value, 0, 16); err == nil { + fv.SetInt(x) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint8: + if x, err := strconv.ParseUint(tok.value, 0, 8); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint16: + if x, err := strconv.ParseUint(tok.value, 0, 16); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp.go b/vendor/github.com/gogo/protobuf/proto/timestamp.go new file mode 100644 index 000000000..9324f6542 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/timestamp.go @@ -0,0 +1,113 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func timestampFromProto(ts *timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func timestampProto(t time.Time) (*timestamp, error) { + seconds := t.Unix() + nanos := int32(t.Sub(time.Unix(seconds, 0))) + ts := ×tamp{ + Seconds: seconds, + Nanos: nanos, + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go new file mode 100644 index 000000000..38439fa99 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go @@ -0,0 +1,49 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +var timeType = reflect.TypeOf((*time.Time)(nil)).Elem() + +type timestamp struct { + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` +} + +func (m *timestamp) Reset() { *m = timestamp{} } +func (*timestamp) ProtoMessage() {} +func (*timestamp) String() string { return "timestamp" } + +func init() { + RegisterType((*timestamp)(nil), "gogo.protobuf.proto.timestamp") +} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers.go b/vendor/github.com/gogo/protobuf/proto/wrappers.go new file mode 100644 index 000000000..b175d1b64 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/wrappers.go @@ -0,0 +1,1888 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "io" + "reflect" +) + +func makeStdDoubleValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*float64) + v := &float64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdDoubleValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) + v := &float64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdDoubleValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float64) + v := &float64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float64) + v := &float64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdDoubleValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdDoubleValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdDoubleValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdDoubleValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdDoubleValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdFloatValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*float32) + v := &float32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdFloatValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) + v := &float32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdFloatValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float32) + v := &float32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float32) + v := &float32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdFloatValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdFloatValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdFloatValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdFloatValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdFloatValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*int64) + v := &int64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) + v := &int64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int64) + v := &int64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int64) + v := &int64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*uint64) + v := &uint64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) + v := &uint64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint64) + v := &uint64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint64) + v := &uint64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdUInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdUInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*int32) + v := &int32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) + v := &int32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int32) + v := &int32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int32) + v := &int32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*uint32) + v := &uint32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) + v := &uint32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint32) + v := &uint32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint32) + v := &uint32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdUInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdUInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBoolValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*bool) + v := &boolValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBoolValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) + v := &boolValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBoolValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(bool) + v := &boolValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(bool) + v := &boolValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBoolValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBoolValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdBoolValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdBoolValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBoolValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdStringValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*string) + v := &stringValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdStringValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) + v := &stringValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdStringValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(string) + v := &stringValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(string) + v := &stringValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdStringValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdStringValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdStringValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdStringValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdStringValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBytesValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*[]byte) + v := &bytesValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBytesValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) + v := &bytesValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBytesValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().([]byte) + v := &bytesValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().([]byte) + v := &bytesValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBytesValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBytesValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdBytesValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdBytesValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBytesValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go new file mode 100644 index 000000000..c1cf7bf85 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go @@ -0,0 +1,113 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +type float64Value struct { + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *float64Value) Reset() { *m = float64Value{} } +func (*float64Value) ProtoMessage() {} +func (*float64Value) String() string { return "float64" } + +type float32Value struct { + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *float32Value) Reset() { *m = float32Value{} } +func (*float32Value) ProtoMessage() {} +func (*float32Value) String() string { return "float32" } + +type int64Value struct { + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *int64Value) Reset() { *m = int64Value{} } +func (*int64Value) ProtoMessage() {} +func (*int64Value) String() string { return "int64" } + +type uint64Value struct { + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *uint64Value) Reset() { *m = uint64Value{} } +func (*uint64Value) ProtoMessage() {} +func (*uint64Value) String() string { return "uint64" } + +type int32Value struct { + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *int32Value) Reset() { *m = int32Value{} } +func (*int32Value) ProtoMessage() {} +func (*int32Value) String() string { return "int32" } + +type uint32Value struct { + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *uint32Value) Reset() { *m = uint32Value{} } +func (*uint32Value) ProtoMessage() {} +func (*uint32Value) String() string { return "uint32" } + +type boolValue struct { + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *boolValue) Reset() { *m = boolValue{} } +func (*boolValue) ProtoMessage() {} +func (*boolValue) String() string { return "bool" } + +type stringValue struct { + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *stringValue) Reset() { *m = stringValue{} } +func (*stringValue) ProtoMessage() {} +func (*stringValue) String() string { return "string" } + +type bytesValue struct { + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *bytesValue) Reset() { *m = bytesValue{} } +func (*bytesValue) ProtoMessage() {} +func (*bytesValue) String() string { return "[]byte" } + +func init() { + RegisterType((*float64Value)(nil), "gogo.protobuf.proto.DoubleValue") + RegisterType((*float32Value)(nil), "gogo.protobuf.proto.FloatValue") + RegisterType((*int64Value)(nil), "gogo.protobuf.proto.Int64Value") + RegisterType((*uint64Value)(nil), "gogo.protobuf.proto.UInt64Value") + RegisterType((*int32Value)(nil), "gogo.protobuf.proto.Int32Value") + RegisterType((*uint32Value)(nil), "gogo.protobuf.proto.UInt32Value") + RegisterType((*boolValue)(nil), "gogo.protobuf.proto.BoolValue") + RegisterType((*stringValue)(nil), "gogo.protobuf.proto.StringValue") + RegisterType((*bytesValue)(nil), "gogo.protobuf.proto.BytesValue") +} diff --git a/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go b/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go new file mode 100644 index 000000000..ceadde6a5 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go @@ -0,0 +1,101 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package sortkeys + +import ( + "sort" +) + +func Strings(l []string) { + sort.Strings(l) +} + +func Float64s(l []float64) { + sort.Float64s(l) +} + +func Float32s(l []float32) { + sort.Sort(Float32Slice(l)) +} + +func Int64s(l []int64) { + sort.Sort(Int64Slice(l)) +} + +func Int32s(l []int32) { + sort.Sort(Int32Slice(l)) +} + +func Uint64s(l []uint64) { + sort.Sort(Uint64Slice(l)) +} + +func Uint32s(l []uint32) { + sort.Sort(Uint32Slice(l)) +} + +func Bools(l []bool) { + sort.Sort(BoolSlice(l)) +} + +type BoolSlice []bool + +func (p BoolSlice) Len() int { return len(p) } +func (p BoolSlice) Less(i, j int) bool { return p[j] } +func (p BoolSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Int64Slice []int64 + +func (p Int64Slice) Len() int { return len(p) } +func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Int32Slice []int32 + +func (p Int32Slice) Len() int { return len(p) } +func (p Int32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Int32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Uint64Slice []uint64 + +func (p Uint64Slice) Len() int { return len(p) } +func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Uint32Slice []uint32 + +func (p Uint32Slice) Len() int { return len(p) } +func (p Uint32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Uint32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Float32Slice []float32 + +func (p Float32Slice) Len() int { return len(p) } +func (p Float32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Float32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/github.com/golang/groupcache/LICENSE b/vendor/github.com/golang/groupcache/LICENSE new file mode 100644 index 000000000..37ec93a14 --- /dev/null +++ b/vendor/github.com/golang/groupcache/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/golang/groupcache/lru/lru.go b/vendor/github.com/golang/groupcache/lru/lru.go new file mode 100644 index 000000000..eac1c7664 --- /dev/null +++ b/vendor/github.com/golang/groupcache/lru/lru.go @@ -0,0 +1,133 @@ +/* +Copyright 2013 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package lru implements an LRU cache. +package lru + +import "container/list" + +// Cache is an LRU cache. It is not safe for concurrent access. +type Cache struct { + // MaxEntries is the maximum number of cache entries before + // an item is evicted. Zero means no limit. + MaxEntries int + + // OnEvicted optionally specifies a callback function to be + // executed when an entry is purged from the cache. + OnEvicted func(key Key, value interface{}) + + ll *list.List + cache map[interface{}]*list.Element +} + +// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators +type Key interface{} + +type entry struct { + key Key + value interface{} +} + +// New creates a new Cache. +// If maxEntries is zero, the cache has no limit and it's assumed +// that eviction is done by the caller. +func New(maxEntries int) *Cache { + return &Cache{ + MaxEntries: maxEntries, + ll: list.New(), + cache: make(map[interface{}]*list.Element), + } +} + +// Add adds a value to the cache. +func (c *Cache) Add(key Key, value interface{}) { + if c.cache == nil { + c.cache = make(map[interface{}]*list.Element) + c.ll = list.New() + } + if ee, ok := c.cache[key]; ok { + c.ll.MoveToFront(ee) + ee.Value.(*entry).value = value + return + } + ele := c.ll.PushFront(&entry{key, value}) + c.cache[key] = ele + if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries { + c.RemoveOldest() + } +} + +// Get looks up a key's value from the cache. +func (c *Cache) Get(key Key) (value interface{}, ok bool) { + if c.cache == nil { + return + } + if ele, hit := c.cache[key]; hit { + c.ll.MoveToFront(ele) + return ele.Value.(*entry).value, true + } + return +} + +// Remove removes the provided key from the cache. +func (c *Cache) Remove(key Key) { + if c.cache == nil { + return + } + if ele, hit := c.cache[key]; hit { + c.removeElement(ele) + } +} + +// RemoveOldest removes the oldest item from the cache. +func (c *Cache) RemoveOldest() { + if c.cache == nil { + return + } + ele := c.ll.Back() + if ele != nil { + c.removeElement(ele) + } +} + +func (c *Cache) removeElement(e *list.Element) { + c.ll.Remove(e) + kv := e.Value.(*entry) + delete(c.cache, kv.key) + if c.OnEvicted != nil { + c.OnEvicted(kv.key, kv.value) + } +} + +// Len returns the number of items in the cache. +func (c *Cache) Len() int { + if c.cache == nil { + return 0 + } + return c.ll.Len() +} + +// Clear purges all stored items from the cache. +func (c *Cache) Clear() { + if c.OnEvicted != nil { + for _, e := range c.cache { + kv := e.Value.(*entry) + c.OnEvicted(kv.key, kv.value) + } + } + c.ll = nil + c.cache = nil +} diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS new file mode 100644 index 000000000..15167cd74 --- /dev/null +++ b/vendor/github.com/golang/protobuf/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/golang/protobuf/CONTRIBUTORS new file mode 100644 index 000000000..1c4577e96 --- /dev/null +++ b/vendor/github.com/golang/protobuf/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE new file mode 100644 index 000000000..0f646931a --- /dev/null +++ b/vendor/github.com/golang/protobuf/LICENSE @@ -0,0 +1,28 @@ +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/golang/protobuf/descriptor/descriptor.go b/vendor/github.com/golang/protobuf/descriptor/descriptor.go new file mode 100644 index 000000000..ac7e51bfb --- /dev/null +++ b/vendor/github.com/golang/protobuf/descriptor/descriptor.go @@ -0,0 +1,93 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Package descriptor provides functions for obtaining protocol buffer +// descriptors for generated Go types. +// +// These functions cannot go in package proto because they depend on the +// generated protobuf descriptor messages, which themselves depend on proto. +package descriptor + +import ( + "bytes" + "compress/gzip" + "fmt" + "io/ioutil" + + "github.com/golang/protobuf/proto" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// extractFile extracts a FileDescriptorProto from a gzip'd buffer. +func extractFile(gz []byte) (*protobuf.FileDescriptorProto, error) { + r, err := gzip.NewReader(bytes.NewReader(gz)) + if err != nil { + return nil, fmt.Errorf("failed to open gzip reader: %v", err) + } + defer r.Close() + + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, fmt.Errorf("failed to uncompress descriptor: %v", err) + } + + fd := new(protobuf.FileDescriptorProto) + if err := proto.Unmarshal(b, fd); err != nil { + return nil, fmt.Errorf("malformed FileDescriptorProto: %v", err) + } + + return fd, nil +} + +// Message is a proto.Message with a method to return its descriptor. +// +// Message types generated by the protocol compiler always satisfy +// the Message interface. +type Message interface { + proto.Message + Descriptor() ([]byte, []int) +} + +// ForMessage returns a FileDescriptorProto and a DescriptorProto from within it +// describing the given message. +func ForMessage(msg Message) (fd *protobuf.FileDescriptorProto, md *protobuf.DescriptorProto) { + gz, path := msg.Descriptor() + fd, err := extractFile(gz) + if err != nil { + panic(fmt.Sprintf("invalid FileDescriptorProto for %T: %v", msg, err)) + } + + md = fd.MessageType[path[0]] + for _, i := range path[1:] { + md = md.NestedType[i] + } + return fd, md +} diff --git a/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go b/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go new file mode 100644 index 000000000..e9cc20258 --- /dev/null +++ b/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go @@ -0,0 +1,1284 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package jsonpb provides marshaling and unmarshaling between protocol buffers and JSON. +It follows the specification at https://developers.google.com/protocol-buffers/docs/proto3#json. + +This package produces a different output than the standard "encoding/json" package, +which does not operate correctly on protocol buffers. +*/ +package jsonpb + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" + + "github.com/golang/protobuf/proto" + + stpb "github.com/golang/protobuf/ptypes/struct" +) + +const secondInNanos = int64(time.Second / time.Nanosecond) +const maxSecondsInDuration = 315576000000 + +// Marshaler is a configurable object for converting between +// protocol buffer objects and a JSON representation for them. +type Marshaler struct { + // Whether to render enum values as integers, as opposed to string values. + EnumsAsInts bool + + // Whether to render fields with zero values. + EmitDefaults bool + + // A string to indent each level by. The presence of this field will + // also cause a space to appear between the field separator and + // value, and for newlines to be appear between fields and array + // elements. + Indent string + + // Whether to use the original (.proto) name for fields. + OrigName bool + + // A custom URL resolver to use when marshaling Any messages to JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// AnyResolver takes a type URL, present in an Any message, and resolves it into +// an instance of the associated message. +type AnyResolver interface { + Resolve(typeUrl string) (proto.Message, error) +} + +func defaultResolveAny(typeUrl string) (proto.Message, error) { + // Only the part of typeUrl after the last slash is relevant. + mname := typeUrl + if slash := strings.LastIndex(mname, "/"); slash >= 0 { + mname = mname[slash+1:] + } + mt := proto.MessageType(mname) + if mt == nil { + return nil, fmt.Errorf("unknown message type %q", mname) + } + return reflect.New(mt.Elem()).Interface().(proto.Message), nil +} + +// JSONPBMarshaler is implemented by protobuf messages that customize the +// way they are marshaled to JSON. Messages that implement this should +// also implement JSONPBUnmarshaler so that the custom format can be +// parsed. +// +// The JSON marshaling must follow the proto to JSON specification: +// https://developers.google.com/protocol-buffers/docs/proto3#json +type JSONPBMarshaler interface { + MarshalJSONPB(*Marshaler) ([]byte, error) +} + +// JSONPBUnmarshaler is implemented by protobuf messages that customize +// the way they are unmarshaled from JSON. Messages that implement this +// should also implement JSONPBMarshaler so that the custom format can be +// produced. +// +// The JSON unmarshaling must follow the JSON to proto specification: +// https://developers.google.com/protocol-buffers/docs/proto3#json +type JSONPBUnmarshaler interface { + UnmarshalJSONPB(*Unmarshaler, []byte) error +} + +// Marshal marshals a protocol buffer into JSON. +func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error { + v := reflect.ValueOf(pb) + if pb == nil || (v.Kind() == reflect.Ptr && v.IsNil()) { + return errors.New("Marshal called with nil") + } + // Check for unset required fields first. + if err := checkRequiredFields(pb); err != nil { + return err + } + writer := &errWriter{writer: out} + return m.marshalObject(writer, pb, "", "") +} + +// MarshalToString converts a protocol buffer object to JSON string. +func (m *Marshaler) MarshalToString(pb proto.Message) (string, error) { + var buf bytes.Buffer + if err := m.Marshal(&buf, pb); err != nil { + return "", err + } + return buf.String(), nil +} + +type int32Slice []int32 + +var nonFinite = map[string]float64{ + `"NaN"`: math.NaN(), + `"Infinity"`: math.Inf(1), + `"-Infinity"`: math.Inf(-1), +} + +// For sorting extensions ids to ensure stable output. +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +type wkt interface { + XXX_WellKnownType() string +} + +// marshalObject writes a struct to the Writer. +func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error { + if jsm, ok := v.(JSONPBMarshaler); ok { + b, err := jsm.MarshalJSONPB(m) + if err != nil { + return err + } + if typeURL != "" { + // we are marshaling this object to an Any type + var js map[string]*json.RawMessage + if err = json.Unmarshal(b, &js); err != nil { + return fmt.Errorf("type %T produced invalid JSON: %v", v, err) + } + turl, err := json.Marshal(typeURL) + if err != nil { + return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) + } + js["@type"] = (*json.RawMessage)(&turl) + if m.Indent != "" { + b, err = json.MarshalIndent(js, indent, m.Indent) + } else { + b, err = json.Marshal(js) + } + if err != nil { + return err + } + } + + out.write(string(b)) + return out.err + } + + s := reflect.ValueOf(v).Elem() + + // Handle well-known types. + if wkt, ok := v.(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + // "Wrappers use the same representation in JSON + // as the wrapped primitive type, ..." + sprop := proto.GetProperties(s.Type()) + return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent) + case "Any": + // Any is a bit more involved. + return m.marshalAny(out, v, indent) + case "Duration": + s, ns := s.Field(0).Int(), s.Field(1).Int() + if s < -maxSecondsInDuration || s > maxSecondsInDuration { + return fmt.Errorf("seconds out of range %v", s) + } + if ns <= -secondInNanos || ns >= secondInNanos { + return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos) + } + if (s > 0 && ns < 0) || (s < 0 && ns > 0) { + return errors.New("signs of seconds and nanos do not match") + } + // Generated output always contains 0, 3, 6, or 9 fractional digits, + // depending on required precision, followed by the suffix "s". + f := "%d.%09d" + if ns < 0 { + ns = -ns + if s == 0 { + f = "-%d.%09d" + } + } + x := fmt.Sprintf(f, s, ns) + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, ".000") + out.write(`"`) + out.write(x) + out.write(`s"`) + return out.err + case "Struct", "ListValue": + // Let marshalValue handle the `Struct.fields` map or the `ListValue.values` slice. + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, s.Field(0), indent) + case "Timestamp": + // "RFC 3339, where generated output will always be Z-normalized + // and uses 0, 3, 6 or 9 fractional digits." + s, ns := s.Field(0).Int(), s.Field(1).Int() + if ns < 0 || ns >= secondInNanos { + return fmt.Errorf("ns out of range [0, %v)", secondInNanos) + } + t := time.Unix(s, ns).UTC() + // time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). + x := t.Format("2006-01-02T15:04:05.000000000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, ".000") + out.write(`"`) + out.write(x) + out.write(`Z"`) + return out.err + case "Value": + // Value has a single oneof. + kind := s.Field(0) + if kind.IsNil() { + // "absence of any variant indicates an error" + return errors.New("nil Value") + } + // oneof -> *T -> T -> T.F + x := kind.Elem().Elem().Field(0) + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, x, indent) + } + } + + out.write("{") + if m.Indent != "" { + out.write("\n") + } + + firstField := true + + if typeURL != "" { + if err := m.marshalTypeURL(out, indent, typeURL); err != nil { + return err + } + firstField = false + } + + for i := 0; i < s.NumField(); i++ { + value := s.Field(i) + valueField := s.Type().Field(i) + if strings.HasPrefix(valueField.Name, "XXX_") { + continue + } + + // IsNil will panic on most value kinds. + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface: + if value.IsNil() { + continue + } + } + + if !m.EmitDefaults { + switch value.Kind() { + case reflect.Bool: + if !value.Bool() { + continue + } + case reflect.Int32, reflect.Int64: + if value.Int() == 0 { + continue + } + case reflect.Uint32, reflect.Uint64: + if value.Uint() == 0 { + continue + } + case reflect.Float32, reflect.Float64: + if value.Float() == 0 { + continue + } + case reflect.String: + if value.Len() == 0 { + continue + } + case reflect.Map, reflect.Ptr, reflect.Slice: + if value.IsNil() { + continue + } + } + } + + // Oneof fields need special handling. + if valueField.Tag.Get("protobuf_oneof") != "" { + // value is an interface containing &T{real_value}. + sv := value.Elem().Elem() // interface -> *T -> T + value = sv.Field(0) + valueField = sv.Type().Field(0) + } + prop := jsonProperties(valueField, m.OrigName) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, prop, value, indent); err != nil { + return err + } + firstField = false + } + + // Handle proto2 extensions. + if ep, ok := v.(proto.Message); ok { + extensions := proto.RegisteredExtensions(v) + // Sort extensions for stable output. + ids := make([]int32, 0, len(extensions)) + for id, desc := range extensions { + if !proto.HasExtension(ep, desc) { + continue + } + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + for _, id := range ids { + desc := extensions[id] + if desc == nil { + // unknown extension + continue + } + ext, extErr := proto.GetExtension(ep, desc) + if extErr != nil { + return extErr + } + value := reflect.ValueOf(ext) + var prop proto.Properties + prop.Parse(desc.Tag) + prop.JSONName = fmt.Sprintf("[%s]", desc.Name) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, &prop, value, indent); err != nil { + return err + } + firstField = false + } + + } + + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err +} + +func (m *Marshaler) writeSep(out *errWriter) { + if m.Indent != "" { + out.write(",\n") + } else { + out.write(",") + } +} + +func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error { + // "If the Any contains a value that has a special JSON mapping, + // it will be converted as follows: {"@type": xxx, "value": yyy}. + // Otherwise, the value will be converted into a JSON object, + // and the "@type" field will be inserted to indicate the actual data type." + v := reflect.ValueOf(any).Elem() + turl := v.Field(0).String() + val := v.Field(1).Bytes() + + var msg proto.Message + var err error + if m.AnyResolver != nil { + msg, err = m.AnyResolver.Resolve(turl) + } else { + msg, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if err := proto.Unmarshal(val, msg); err != nil { + return err + } + + if _, ok := msg.(wkt); ok { + out.write("{") + if m.Indent != "" { + out.write("\n") + } + if err := m.marshalTypeURL(out, indent, turl); err != nil { + return err + } + m.writeSep(out) + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + out.write(`"value": `) + } else { + out.write(`"value":`) + } + if err := m.marshalObject(out, msg, indent+m.Indent, ""); err != nil { + return err + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err + } + + return m.marshalObject(out, msg, indent, turl) +} + +func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"@type":`) + if m.Indent != "" { + out.write(" ") + } + b, err := json.Marshal(typeURL) + if err != nil { + return err + } + out.write(string(b)) + return out.err +} + +// marshalField writes field description and value to the Writer. +func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"`) + out.write(prop.JSONName) + out.write(`":`) + if m.Indent != "" { + out.write(" ") + } + if err := m.marshalValue(out, prop, v, indent); err != nil { + return err + } + return nil +} + +// marshalValue writes the value to the Writer. +func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + var err error + v = reflect.Indirect(v) + + // Handle nil pointer + if v.Kind() == reflect.Invalid { + out.write("null") + return out.err + } + + // Handle repeated elements. + if v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 { + out.write("[") + comma := "" + for i := 0; i < v.Len(); i++ { + sliceVal := v.Index(i) + out.write(comma) + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + if err := m.marshalValue(out, prop, sliceVal, indent+m.Indent); err != nil { + return err + } + comma = "," + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write("]") + return out.err + } + + // Handle well-known types. + // Most are handled up in marshalObject (because 99% are messages). + if wkt, ok := v.Interface().(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "NullValue": + out.write("null") + return out.err + } + } + + // Handle enumerations. + if !m.EnumsAsInts && prop.Enum != "" { + // Unknown enum values will are stringified by the proto library as their + // value. Such values should _not_ be quoted or they will be interpreted + // as an enum string instead of their value. + enumStr := v.Interface().(fmt.Stringer).String() + var valStr string + if v.Kind() == reflect.Ptr { + valStr = strconv.Itoa(int(v.Elem().Int())) + } else { + valStr = strconv.Itoa(int(v.Int())) + } + isKnownEnum := enumStr != valStr + if isKnownEnum { + out.write(`"`) + } + out.write(enumStr) + if isKnownEnum { + out.write(`"`) + } + return out.err + } + + // Handle nested messages. + if v.Kind() == reflect.Struct { + return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent, "") + } + + // Handle maps. + // Since Go randomizes map iteration, we sort keys for stable output. + if v.Kind() == reflect.Map { + out.write(`{`) + keys := v.MapKeys() + sort.Sort(mapKeys(keys)) + for i, k := range keys { + if i > 0 { + out.write(`,`) + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + + // TODO handle map key prop properly + b, err := json.Marshal(k.Interface()) + if err != nil { + return err + } + s := string(b) + + // If the JSON is not a string value, encode it again to make it one. + if !strings.HasPrefix(s, `"`) { + b, err := json.Marshal(s) + if err != nil { + return err + } + s = string(b) + } + + out.write(s) + out.write(`:`) + if m.Indent != "" { + out.write(` `) + } + + vprop := prop + if prop != nil && prop.MapValProp != nil { + vprop = prop.MapValProp + } + if err := m.marshalValue(out, vprop, v.MapIndex(k), indent+m.Indent); err != nil { + return err + } + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write(`}`) + return out.err + } + + // Handle non-finite floats, e.g. NaN, Infinity and -Infinity. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + f := v.Float() + var sval string + switch { + case math.IsInf(f, 1): + sval = `"Infinity"` + case math.IsInf(f, -1): + sval = `"-Infinity"` + case math.IsNaN(f): + sval = `"NaN"` + } + if sval != "" { + out.write(sval) + return out.err + } + } + + // Default handling defers to the encoding/json library. + b, err := json.Marshal(v.Interface()) + if err != nil { + return err + } + needToQuote := string(b[0]) != `"` && (v.Kind() == reflect.Int64 || v.Kind() == reflect.Uint64) + if needToQuote { + out.write(`"`) + } + out.write(string(b)) + if needToQuote { + out.write(`"`) + } + return out.err +} + +// Unmarshaler is a configurable object for converting from a JSON +// representation to a protocol buffer object. +type Unmarshaler struct { + // Whether to allow messages to contain unknown fields, as opposed to + // failing to unmarshal. + AllowUnknownFields bool + + // A custom URL resolver to use when unmarshaling Any messages from JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func (u *Unmarshaler) UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + inputValue := json.RawMessage{} + if err := dec.Decode(&inputValue); err != nil { + return err + } + if err := u.unmarshalValue(reflect.ValueOf(pb).Elem(), inputValue, nil); err != nil { + return err + } + return checkRequiredFields(pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func (u *Unmarshaler) Unmarshal(r io.Reader, pb proto.Message) error { + dec := json.NewDecoder(r) + return u.UnmarshalNext(dec, pb) +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + return new(Unmarshaler).UnmarshalNext(dec, pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func Unmarshal(r io.Reader, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(r, pb) +} + +// UnmarshalString will populate the fields of a protocol buffer based +// on a JSON string. This function is lenient and will decode any options +// permutations of the related Marshaler. +func UnmarshalString(str string, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(strings.NewReader(str), pb) +} + +// unmarshalValue converts/copies a value into the target. +// prop may be nil. +func (u *Unmarshaler) unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *proto.Properties) error { + targetType := target.Type() + + // Allocate memory for pointer fields. + if targetType.Kind() == reflect.Ptr { + // If input value is "null" and target is a pointer type, then the field should be treated as not set + // UNLESS the target is structpb.Value, in which case it should be set to structpb.NullValue. + _, isJSONPBUnmarshaler := target.Interface().(JSONPBUnmarshaler) + if string(inputValue) == "null" && targetType != reflect.TypeOf(&stpb.Value{}) && !isJSONPBUnmarshaler { + return nil + } + target.Set(reflect.New(targetType.Elem())) + + return u.unmarshalValue(target.Elem(), inputValue, prop) + } + + if jsu, ok := target.Addr().Interface().(JSONPBUnmarshaler); ok { + return jsu.UnmarshalJSONPB(u, []byte(inputValue)) + } + + // Handle well-known types that are not pointers. + if w, ok := target.Addr().Interface().(wkt); ok { + switch w.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + return u.unmarshalValue(target.Field(0), inputValue, prop) + case "Any": + // Use json.RawMessage pointer type instead of value to support pre-1.8 version. + // 1.8 changed RawMessage.MarshalJSON from pointer type to value type, see + // https://github.com/golang/go/issues/14493 + var jsonFields map[string]*json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + val, ok := jsonFields["@type"] + if !ok || val == nil { + return errors.New("Any JSON doesn't have '@type'") + } + + var turl string + if err := json.Unmarshal([]byte(*val), &turl); err != nil { + return fmt.Errorf("can't unmarshal Any's '@type': %q", *val) + } + target.Field(0).SetString(turl) + + var m proto.Message + var err error + if u.AnyResolver != nil { + m, err = u.AnyResolver.Resolve(turl) + } else { + m, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if _, ok := m.(wkt); ok { + val, ok := jsonFields["value"] + if !ok { + return errors.New("Any JSON doesn't have 'value'") + } + + if err := u.unmarshalValue(reflect.ValueOf(m).Elem(), *val, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } else { + delete(jsonFields, "@type") + nestedProto, err := json.Marshal(jsonFields) + if err != nil { + return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err) + } + + if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), nestedProto, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } + + b, err := proto.Marshal(m) + if err != nil { + return fmt.Errorf("can't marshal proto %T into Any.Value: %v", m, err) + } + target.Field(1).SetBytes(b) + + return nil + case "Duration": + unq, err := unquote(string(inputValue)) + if err != nil { + return err + } + + d, err := time.ParseDuration(unq) + if err != nil { + return fmt.Errorf("bad Duration: %v", err) + } + + ns := d.Nanoseconds() + s := ns / 1e9 + ns %= 1e9 + target.Field(0).SetInt(s) + target.Field(1).SetInt(ns) + return nil + case "Timestamp": + unq, err := unquote(string(inputValue)) + if err != nil { + return err + } + + t, err := time.Parse(time.RFC3339Nano, unq) + if err != nil { + return fmt.Errorf("bad Timestamp: %v", err) + } + + target.Field(0).SetInt(t.Unix()) + target.Field(1).SetInt(int64(t.Nanosecond())) + return nil + case "Struct": + var m map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &m); err != nil { + return fmt.Errorf("bad StructValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(map[string]*stpb.Value{})) + for k, jv := range m { + pv := &stpb.Value{} + if err := u.unmarshalValue(reflect.ValueOf(pv).Elem(), jv, prop); err != nil { + return fmt.Errorf("bad value in StructValue for key %q: %v", k, err) + } + target.Field(0).SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(pv)) + } + return nil + case "ListValue": + var s []json.RawMessage + if err := json.Unmarshal(inputValue, &s); err != nil { + return fmt.Errorf("bad ListValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(make([]*stpb.Value, len(s)))) + for i, sv := range s { + if err := u.unmarshalValue(target.Field(0).Index(i), sv, prop); err != nil { + return err + } + } + return nil + case "Value": + ivStr := string(inputValue) + if ivStr == "null" { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NullValue{})) + } else if v, err := strconv.ParseFloat(ivStr, 0); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NumberValue{v})) + } else if v, err := unquote(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StringValue{v})) + } else if v, err := strconv.ParseBool(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_BoolValue{v})) + } else if err := json.Unmarshal(inputValue, &[]json.RawMessage{}); err == nil { + lv := &stpb.ListValue{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_ListValue{lv})) + return u.unmarshalValue(reflect.ValueOf(lv).Elem(), inputValue, prop) + } else if err := json.Unmarshal(inputValue, &map[string]json.RawMessage{}); err == nil { + sv := &stpb.Struct{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StructValue{sv})) + return u.unmarshalValue(reflect.ValueOf(sv).Elem(), inputValue, prop) + } else { + return fmt.Errorf("unrecognized type for Value %q", ivStr) + } + return nil + } + } + + // Handle enums, which have an underlying type of int32, + // and may appear as strings. + // The case of an enum appearing as a number is handled + // at the bottom of this function. + if inputValue[0] == '"' && prop != nil && prop.Enum != "" { + vmap := proto.EnumValueMap(prop.Enum) + // Don't need to do unquoting; valid enum names + // are from a limited character set. + s := inputValue[1 : len(inputValue)-1] + n, ok := vmap[string(s)] + if !ok { + return fmt.Errorf("unknown value %q for enum %s", s, prop.Enum) + } + if target.Kind() == reflect.Ptr { // proto2 + target.Set(reflect.New(targetType.Elem())) + target = target.Elem() + } + if targetType.Kind() != reflect.Int32 { + return fmt.Errorf("invalid target %q for enum %s", targetType.Kind(), prop.Enum) + } + target.SetInt(int64(n)) + return nil + } + + // Handle nested messages. + if targetType.Kind() == reflect.Struct { + var jsonFields map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + consumeField := func(prop *proto.Properties) (json.RawMessage, bool) { + // Be liberal in what names we accept; both orig_name and camelName are okay. + fieldNames := acceptedJSONFieldNames(prop) + + vOrig, okOrig := jsonFields[fieldNames.orig] + vCamel, okCamel := jsonFields[fieldNames.camel] + if !okOrig && !okCamel { + return nil, false + } + // If, for some reason, both are present in the data, favour the camelName. + var raw json.RawMessage + if okOrig { + raw = vOrig + delete(jsonFields, fieldNames.orig) + } + if okCamel { + raw = vCamel + delete(jsonFields, fieldNames.camel) + } + return raw, true + } + + sprops := proto.GetProperties(targetType) + for i := 0; i < target.NumField(); i++ { + ft := target.Type().Field(i) + if strings.HasPrefix(ft.Name, "XXX_") { + continue + } + + valueForField, ok := consumeField(sprops.Prop[i]) + if !ok { + continue + } + + if err := u.unmarshalValue(target.Field(i), valueForField, sprops.Prop[i]); err != nil { + return err + } + } + // Check for any oneof fields. + if len(jsonFields) > 0 { + for _, oop := range sprops.OneofTypes { + raw, ok := consumeField(oop.Prop) + if !ok { + continue + } + nv := reflect.New(oop.Type.Elem()) + target.Field(oop.Field).Set(nv) + if err := u.unmarshalValue(nv.Elem().Field(0), raw, oop.Prop); err != nil { + return err + } + } + } + // Handle proto2 extensions. + if len(jsonFields) > 0 { + if ep, ok := target.Addr().Interface().(proto.Message); ok { + for _, ext := range proto.RegisteredExtensions(ep) { + name := fmt.Sprintf("[%s]", ext.Name) + raw, ok := jsonFields[name] + if !ok { + continue + } + delete(jsonFields, name) + nv := reflect.New(reflect.TypeOf(ext.ExtensionType).Elem()) + if err := u.unmarshalValue(nv.Elem(), raw, nil); err != nil { + return err + } + if err := proto.SetExtension(ep, ext, nv.Interface()); err != nil { + return err + } + } + } + } + if !u.AllowUnknownFields && len(jsonFields) > 0 { + // Pick any field to be the scapegoat. + var f string + for fname := range jsonFields { + f = fname + break + } + return fmt.Errorf("unknown field %q in %v", f, targetType) + } + return nil + } + + // Handle arrays (which aren't encoded bytes) + if targetType.Kind() == reflect.Slice && targetType.Elem().Kind() != reflect.Uint8 { + var slc []json.RawMessage + if err := json.Unmarshal(inputValue, &slc); err != nil { + return err + } + if slc != nil { + l := len(slc) + target.Set(reflect.MakeSlice(targetType, l, l)) + for i := 0; i < l; i++ { + if err := u.unmarshalValue(target.Index(i), slc[i], prop); err != nil { + return err + } + } + } + return nil + } + + // Handle maps (whose keys are always strings) + if targetType.Kind() == reflect.Map { + var mp map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &mp); err != nil { + return err + } + if mp != nil { + target.Set(reflect.MakeMap(targetType)) + for ks, raw := range mp { + // Unmarshal map key. The core json library already decoded the key into a + // string, so we handle that specially. Other types were quoted post-serialization. + var k reflect.Value + if targetType.Key().Kind() == reflect.String { + k = reflect.ValueOf(ks) + } else { + k = reflect.New(targetType.Key()).Elem() + var kprop *proto.Properties + if prop != nil && prop.MapKeyProp != nil { + kprop = prop.MapKeyProp + } + if err := u.unmarshalValue(k, json.RawMessage(ks), kprop); err != nil { + return err + } + } + + // Unmarshal map value. + v := reflect.New(targetType.Elem()).Elem() + var vprop *proto.Properties + if prop != nil && prop.MapValProp != nil { + vprop = prop.MapValProp + } + if err := u.unmarshalValue(v, raw, vprop); err != nil { + return err + } + target.SetMapIndex(k, v) + } + } + return nil + } + + // Non-finite numbers can be encoded as strings. + isFloat := targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isFloat { + if num, ok := nonFinite[string(inputValue)]; ok { + target.SetFloat(num) + return nil + } + } + + // integers & floats can be encoded as strings. In this case we drop + // the quotes and proceed as normal. + isNum := targetType.Kind() == reflect.Int64 || targetType.Kind() == reflect.Uint64 || + targetType.Kind() == reflect.Int32 || targetType.Kind() == reflect.Uint32 || + targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isNum && strings.HasPrefix(string(inputValue), `"`) { + inputValue = inputValue[1 : len(inputValue)-1] + } + + // Use the encoding/json for parsing other value types. + return json.Unmarshal(inputValue, target.Addr().Interface()) +} + +func unquote(s string) (string, error) { + var ret string + err := json.Unmarshal([]byte(s), &ret) + return ret, err +} + +// jsonProperties returns parsed proto.Properties for the field and corrects JSONName attribute. +func jsonProperties(f reflect.StructField, origName bool) *proto.Properties { + var prop proto.Properties + prop.Init(f.Type, f.Name, f.Tag.Get("protobuf"), &f) + if origName || prop.JSONName == "" { + prop.JSONName = prop.OrigName + } + return &prop +} + +type fieldNames struct { + orig, camel string +} + +func acceptedJSONFieldNames(prop *proto.Properties) fieldNames { + opts := fieldNames{orig: prop.OrigName, camel: prop.OrigName} + if prop.JSONName != "" { + opts.camel = prop.JSONName + } + return opts +} + +// Writer wrapper inspired by https://blog.golang.org/errors-are-values +type errWriter struct { + writer io.Writer + err error +} + +func (w *errWriter) write(str string) { + if w.err != nil { + return + } + _, w.err = w.writer.Write([]byte(str)) +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. +// +// Numeric keys are sorted in numeric order per +// https://developers.google.com/protocol-buffers/docs/proto#maps. +type mapKeys []reflect.Value + +func (s mapKeys) Len() int { return len(s) } +func (s mapKeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s mapKeys) Less(i, j int) bool { + if k := s[i].Kind(); k == s[j].Kind() { + switch k { + case reflect.String: + return s[i].String() < s[j].String() + case reflect.Int32, reflect.Int64: + return s[i].Int() < s[j].Int() + case reflect.Uint32, reflect.Uint64: + return s[i].Uint() < s[j].Uint() + } + } + return fmt.Sprint(s[i].Interface()) < fmt.Sprint(s[j].Interface()) +} + +// checkRequiredFields returns an error if any required field in the given proto message is not set. +// This function is used by both Marshal and Unmarshal. While required fields only exist in a +// proto2 message, a proto3 message can contain proto2 message(s). +func checkRequiredFields(pb proto.Message) error { + // Most well-known type messages do not contain required fields. The "Any" type may contain + // a message that has required fields. + // + // When an Any message is being marshaled, the code will invoked proto.Unmarshal on Any.Value + // field in order to transform that into JSON, and that should have returned an error if a + // required field is not set in the embedded message. + // + // When an Any message is being unmarshaled, the code will have invoked proto.Marshal on the + // embedded message to store the serialized message in Any.Value field, and that should have + // returned an error if a required field is not set. + if _, ok := pb.(wkt); ok { + return nil + } + + v := reflect.ValueOf(pb) + // Skip message if it is not a struct pointer. + if v.Kind() != reflect.Ptr { + return nil + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return nil + } + + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + sfield := v.Type().Field(i) + + if sfield.PkgPath != "" { + // blank PkgPath means the field is exported; skip if not exported + continue + } + + if strings.HasPrefix(sfield.Name, "XXX_") { + continue + } + + // Oneof field is an interface implemented by wrapper structs containing the actual oneof + // field, i.e. an interface containing &T{real_value}. + if sfield.Tag.Get("protobuf_oneof") != "" { + if field.Kind() != reflect.Interface { + continue + } + v := field.Elem() + if v.Kind() != reflect.Ptr || v.IsNil() { + continue + } + v = v.Elem() + if v.Kind() != reflect.Struct || v.NumField() < 1 { + continue + } + field = v.Field(0) + sfield = v.Type().Field(0) + } + + protoTag := sfield.Tag.Get("protobuf") + if protoTag == "" { + continue + } + var prop proto.Properties + prop.Init(sfield.Type, sfield.Name, protoTag, &sfield) + + switch field.Kind() { + case reflect.Map: + if field.IsNil() { + continue + } + // Check each map value. + keys := field.MapKeys() + for _, k := range keys { + v := field.MapIndex(k) + if err := checkRequiredFieldsInValue(v); err != nil { + return err + } + } + case reflect.Slice: + // Handle non-repeated type, e.g. bytes. + if !prop.Repeated { + if prop.Required && field.IsNil() { + return fmt.Errorf("required field %q is not set", prop.Name) + } + continue + } + + // Handle repeated type. + if field.IsNil() { + continue + } + // Check each slice item. + for i := 0; i < field.Len(); i++ { + v := field.Index(i) + if err := checkRequiredFieldsInValue(v); err != nil { + return err + } + } + case reflect.Ptr: + if field.IsNil() { + if prop.Required { + return fmt.Errorf("required field %q is not set", prop.Name) + } + continue + } + if err := checkRequiredFieldsInValue(field); err != nil { + return err + } + } + } + + // Handle proto2 extensions. + for _, ext := range proto.RegisteredExtensions(pb) { + if !proto.HasExtension(pb, ext) { + continue + } + ep, err := proto.GetExtension(pb, ext) + if err != nil { + return err + } + err = checkRequiredFieldsInValue(reflect.ValueOf(ep)) + if err != nil { + return err + } + } + + return nil +} + +func checkRequiredFieldsInValue(v reflect.Value) error { + if pm, ok := v.Interface().(proto.Message); ok { + return checkRequiredFields(pm) + } + return nil +} diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 000000000..3cd3249f7 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,253 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 000000000..63b0f08be --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,427 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go new file mode 100644 index 000000000..35b882c09 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/deprecated.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "errors" + +// Deprecated: do not use. +type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } + +// Deprecated: do not use. +func GetStats() Stats { return Stats{} } + +// Deprecated: do not use. +func MarshalMessageSet(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSet([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func MarshalMessageSetJSON(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSetJSON([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go new file mode 100644 index 000000000..dea2617ce --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + di.discard(sp) + } + } + } + default: // E.g., *pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + di.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go new file mode 100644 index 000000000..3abfed2cf --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/encode.go @@ -0,0 +1,203 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "reflect" +) + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go new file mode 100644 index 000000000..f9b6e41b3 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/equal.go @@ -0,0 +1,301 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + return bytes.Equal(u1, u2) +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1 := extensionAsLegacyType(e1.value) + m2 := extensionAsLegacyType(e2.value) + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + return false + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go new file mode 100644 index 000000000..fa88add30 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/extensions.go @@ -0,0 +1,607 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "io" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + + // value is a concrete value for the extension field. Let the type of + // desc.ExtensionType be the "API type" and the type of Extension.value + // be the "storage type". The API type and storage type are the same except: + // * For scalars (except []byte), the API type uses *T, + // while the storage type uses T. + // * For repeated fields, the API type uses []T, while the storage type + // uses *[]T. + // + // The reason for the divergence is so that the storage type more naturally + // matches what is expected of when retrieving the values through the + // protobuf reflection APIs. + // + // The value may only be populated if desc is also populated. + value interface{} + + // enc is the raw bytes for the extension field. + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + // TODO: Check types, field numbers, etc.? + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + epb, err := extendable(pb) + if err != nil { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, extension.Field) +} + +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return extensionAsLegacyType(e.value), nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = extensionAsStorageType(v) + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return extensionAsLegacyType(e.value), nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + unmarshal := typeUnmarshaler(t, extension.Tag) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate space to store the pointer/slice. + value := reflect.New(t).Elem() + + var err error + for { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + wire := int(x) & 7 + + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { + return nil, err + } + + if len(b) == 0 { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: extensionAsStorageType(value)} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} + +// extensionAsLegacyType converts an value in the storage type as the API type. +// See Extension.value. +func extensionAsLegacyType(v interface{}) interface{} { + switch rv := reflect.ValueOf(v); rv.Kind() { + case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: + // Represent primitive types as a pointer to the value. + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + case reflect.Ptr: + // Represent slice types as the value itself. + switch rv.Type().Elem().Kind() { + case reflect.Slice: + if rv.IsNil() { + v = reflect.Zero(rv.Type().Elem()).Interface() + } else { + v = rv.Elem().Interface() + } + } + } + return v +} + +// extensionAsStorageType converts an value in the API type as the storage type. +// See Extension.value. +func extensionAsStorageType(v interface{}) interface{} { + switch rv := reflect.ValueOf(v); rv.Kind() { + case reflect.Ptr: + // Represent slice types as the value itself. + switch rv.Type().Elem().Kind() { + case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: + if rv.IsNil() { + v = reflect.Zero(rv.Type().Elem()).Interface() + } else { + v = rv.Elem().Interface() + } + } + case reflect.Slice: + // Represent slice types as a pointer to the value. + if rv.Type().Elem().Kind() != reflect.Uint8 { + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + } + } + return v +} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 000000000..fdd328bb7 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,965 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +const ( + // ProtoPackageIsVersion3 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion3 = true + + // ProtoPackageIsVersion2 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion2 = true + + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion1 = true +) + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 000000000..f48a75676 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,181 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "errors" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func unmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 000000000..94fa9194a --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,360 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr, deref bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + if deref { + u = u.Elem() + } + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 000000000..dbfffe071 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,313 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr, deref bool) (p pointer) { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + p = pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } else { + // The interface is not of pointer type. The data word is the pointer + // to the data. + p = pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} + } + if deref { + p.p = *(*unsafe.Pointer)(p.p) + } + return p +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 000000000..a4b8c0cd3 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,544 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + log.Printf("proto: tag has too few fields: %q", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + log.Printf("proto: tag has unknown wire type: %q", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + switch t1 := typ; t1.Kind() { + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + + case reflect.Slice: + if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { + p.stype = t2.Elem() + } + + case reflect.Map: + p.mtype = t1 + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +type ( + oneofFuncsIface interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + oneofWrappersIface interface { + XXX_OneofWrappers() []interface{} + } +) + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + return prop + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + var oots []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oots = m.XXX_OneofFuncs() + case oneofWrappersIface: + oots = m.XXX_OneofWrappers() + } + if len(oots) > 0 { + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go new file mode 100644 index 000000000..5cb11fa95 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_marshal.go @@ -0,0 +1,2776 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) + deref bool // dereference the pointer before operating on it; implies isptr +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + for _, f := range u.fields { + if f.required { + if ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.sizecache = invalidField + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + // get oneof implementers + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + u.v1extensions = toField(&f) + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct { + t = t.Elem() + } + sizer, marshaler := typeMarshaler(t, tags, false, false) + var deref bool + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + t = reflect.PtrTo(t) + deref = true + } + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + isptr: t.Kind() == reflect.Ptr, + deref: deref, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + } + } +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, err := m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go new file mode 100644 index 000000000..5525def6a --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_merge.go @@ -0,0 +1,654 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("message field %s without pointer", tf)) + case isSlice: // E.g., []*pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mi.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mi.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go new file mode 100644 index 000000000..acee2fc52 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2053 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + panic("no extensions field available") + } + } + + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + u.oldExtensions = toField(&f) + continue + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + for _, v := range oneofImplementers { + tptr := reflect.TypeOf(v) // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + + } + + // Get extension ranges, if any. + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) == 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go new file mode 100644 index 000000000..1aaee725b --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,843 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.MapValProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 000000000..bb55a3af2 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,880 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go new file mode 100644 index 000000000..1ded05bbe --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go @@ -0,0 +1,2887 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/descriptor.proto + +package descriptor + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} + +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} + +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} + +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} + +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4, 0} +} + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} + +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} + +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} + +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} + +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} + +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} + +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} + +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} + +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{10, 0} +} + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} + +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} + +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} + +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} + +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12, 0} +} + +type FieldOptions_JSType int32 + +const ( + // Use the default type. + FieldOptions_JS_NORMAL FieldOptions_JSType = 0 + // Use JavaScript strings. + FieldOptions_JS_STRING FieldOptions_JSType = 1 + // Use JavaScript numbers. + FieldOptions_JS_NUMBER FieldOptions_JSType = 2 +) + +var FieldOptions_JSType_name = map[int32]string{ + 0: "JS_NORMAL", + 1: "JS_STRING", + 2: "JS_NUMBER", +} + +var FieldOptions_JSType_value = map[string]int32{ + "JS_NORMAL": 0, + "JS_STRING": 1, + "JS_NUMBER": 2, +} + +func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { + p := new(FieldOptions_JSType) + *p = x + return p +} + +func (x FieldOptions_JSType) String() string { + return proto.EnumName(FieldOptions_JSType_name, int32(x)) +} + +func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") + if err != nil { + return err + } + *x = FieldOptions_JSType(value) + return nil +} + +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12, 1} +} + +// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, +// or neither? HTTP based RPC implementation may choose GET verb for safe +// methods, and PUT verb for idempotent methods instead of the default POST. +type MethodOptions_IdempotencyLevel int32 + +const ( + MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 + MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 + MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 +) + +var MethodOptions_IdempotencyLevel_name = map[int32]string{ + 0: "IDEMPOTENCY_UNKNOWN", + 1: "NO_SIDE_EFFECTS", + 2: "IDEMPOTENT", +} + +var MethodOptions_IdempotencyLevel_value = map[string]int32{ + "IDEMPOTENCY_UNKNOWN": 0, + "NO_SIDE_EFFECTS": 1, + "IDEMPOTENT": 2, +} + +func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { + p := new(MethodOptions_IdempotencyLevel) + *p = x + return p +} + +func (x MethodOptions_IdempotencyLevel) String() string { + return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) +} + +func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") + if err != nil { + return err + } + *x = MethodOptions_IdempotencyLevel(value) + return nil +} + +func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{17, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{0} +} + +func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) +} +func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) +} +func (m *FileDescriptorSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorSet.Merge(m, src) +} +func (m *FileDescriptorSet) XXX_Size() int { + return xxx_messageInfo_FileDescriptorSet.Size(m) +} +func (m *FileDescriptorSet) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{1} +} + +func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) +} +func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FileDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorProto.Merge(m, src) +} +func (m *FileDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FileDescriptorProto.Size(m) +} +func (m *FileDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2} +} + +func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) +} +func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) +} +func (m *DescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto.Merge(m, src) +} +func (m *DescriptorProto) XXX_Size() int { + return xxx_messageInfo_DescriptorProto.Size(m) +} +func (m *DescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *DescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2, 0} +} + +func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(m, src) +} +func (m *DescriptorProto_ExtensionRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) +} +func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { + if m != nil { + return m.Options + } + return nil +} + +// Range of reserved tag numbers. Reserved tag numbers may not be used by +// fields or extension ranges in the same message. Reserved ranges may +// not overlap. +type DescriptorProto_ReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } +func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ReservedRange) ProtoMessage() {} +func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2, 1} +} + +func (m *DescriptorProto_ReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ReservedRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ReservedRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ReservedRange.Merge(m, src) +} +func (m *DescriptorProto_ReservedRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ReservedRange.Size(m) +} +func (m *DescriptorProto_ReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ReservedRange proto.InternalMessageInfo + +func (m *DescriptorProto_ReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +type ExtensionRangeOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } +func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } +func (*ExtensionRangeOptions) ProtoMessage() {} +func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{3} +} + +var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ExtensionRangeOptions +} + +func (m *ExtensionRangeOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExtensionRangeOptions.Unmarshal(m, b) +} +func (m *ExtensionRangeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExtensionRangeOptions.Marshal(b, m, deterministic) +} +func (m *ExtensionRangeOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtensionRangeOptions.Merge(m, src) +} +func (m *ExtensionRangeOptions) XXX_Size() int { + return xxx_messageInfo_ExtensionRangeOptions.Size(m) +} +func (m *ExtensionRangeOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ExtensionRangeOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ExtensionRangeOptions proto.InternalMessageInfo + +func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4} +} + +func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) +} +func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FieldDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldDescriptorProto.Merge(m, src) +} +func (m *FieldDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FieldDescriptorProto.Size(m) +} +func (m *FieldDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetJsonName() string { + if m != nil && m.JsonName != nil { + return *m.JsonName + } + return "" +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{5} +} + +func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) +} +func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) +} +func (m *OneofDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofDescriptorProto.Merge(m, src) +} +func (m *OneofDescriptorProto) XXX_Size() int { + return xxx_messageInfo_OneofDescriptorProto.Size(m) +} +func (m *OneofDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OneofDescriptorProto) GetOptions() *OneofOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{6} +} + +func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) +} +func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto.Merge(m, src) +} +func (m *EnumDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto.Size(m) +} +func (m *EnumDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +// Range of reserved numeric values. Reserved values may not be used by +// entries in the same enum. Reserved ranges may not overlap. +// +// Note that this is distinct from DescriptorProto.ReservedRange in that it +// is inclusive such that it can appropriately represent the entire int32 +// domain. +type EnumDescriptorProto_EnumReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} } +func (m *EnumDescriptorProto_EnumReservedRange) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} +func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{6, 0} +} + +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Unmarshal(m, b) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Merge(m, src) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Size(m) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto_EnumReservedRange proto.InternalMessageInfo + +func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{7} +} + +func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) +} +func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueDescriptorProto.Merge(m, src) +} +func (m *EnumValueDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumValueDescriptorProto.Size(m) +} +func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{8} +} + +func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) +} +func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) +} +func (m *ServiceDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceDescriptorProto.Merge(m, src) +} +func (m *ServiceDescriptorProto) XXX_Size() int { + return xxx_messageInfo_ServiceDescriptorProto.Size(m) +} +func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{9} +} + +func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) +} +func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) +} +func (m *MethodDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodDescriptorProto.Merge(m, src) +} +func (m *MethodDescriptorProto) XXX_Size() int { + return xxx_messageInfo_MethodDescriptorProto.Size(m) +} +func (m *MethodDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // This option does nothing. + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use. + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` + // Namespace for generated classes; defaults to the package. + CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be used + // for determining the namespace. + PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"` + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"` + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{10} +} + +var extRange_FileOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} + +func (m *FileOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileOptions.Unmarshal(m, b) +} +func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) +} +func (m *FileOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileOptions.Merge(m, src) +} +func (m *FileOptions) XXX_Size() int { + return xxx_messageInfo_FileOptions.Size(m) +} +func (m *FileOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FileOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FileOptions proto.InternalMessageInfo + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_PhpGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +// Deprecated: Do not use. +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return false +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetPhpGenericServices() bool { + if m != nil && m.PhpGenericServices != nil { + return *m.PhpGenericServices + } + return Default_FileOptions_PhpGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetObjcClassPrefix() string { + if m != nil && m.ObjcClassPrefix != nil { + return *m.ObjcClassPrefix + } + return "" +} + +func (m *FileOptions) GetCsharpNamespace() string { + if m != nil && m.CsharpNamespace != nil { + return *m.CsharpNamespace + } + return "" +} + +func (m *FileOptions) GetSwiftPrefix() string { + if m != nil && m.SwiftPrefix != nil { + return *m.SwiftPrefix + } + return "" +} + +func (m *FileOptions) GetPhpClassPrefix() string { + if m != nil && m.PhpClassPrefix != nil { + return *m.PhpClassPrefix + } + return "" +} + +func (m *FileOptions) GetPhpNamespace() string { + if m != nil && m.PhpNamespace != nil { + return *m.PhpNamespace + } + return "" +} + +func (m *FileOptions) GetPhpMetadataNamespace() string { + if m != nil && m.PhpMetadataNamespace != nil { + return *m.PhpMetadataNamespace + } + return "" +} + +func (m *FileOptions) GetRubyPackage() string { + if m != nil && m.RubyPackage != nil { + return *m.RubyPackage + } + return "" +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{11} +} + +var extRange_MessageOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} + +func (m *MessageOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageOptions.Unmarshal(m, b) +} +func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) +} +func (m *MessageOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageOptions.Merge(m, src) +} +func (m *MessageOptions) XXX_Size() int { + return xxx_messageInfo_MessageOptions.Size(m) +} +func (m *MessageOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MessageOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageOptions proto.InternalMessageInfo + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12} +} + +var extRange_FieldOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} + +func (m *FieldOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldOptions.Unmarshal(m, b) +} +func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) +} +func (m *FieldOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldOptions.Merge(m, src) +} +func (m *FieldOptions) XXX_Size() int { + return xxx_messageInfo_FieldOptions.Size(m) +} +func (m *FieldOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FieldOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldOptions proto.InternalMessageInfo + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetJstype() FieldOptions_JSType { + if m != nil && m.Jstype != nil { + return *m.Jstype + } + return Default_FieldOptions_Jstype +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type OneofOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{13} +} + +var extRange_OneofOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OneofOptions +} + +func (m *OneofOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofOptions.Unmarshal(m, b) +} +func (m *OneofOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofOptions.Marshal(b, m, deterministic) +} +func (m *OneofOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofOptions.Merge(m, src) +} +func (m *OneofOptions) XXX_Size() int { + return xxx_messageInfo_OneofOptions.Size(m) +} +func (m *OneofOptions) XXX_DiscardUnknown() { + xxx_messageInfo_OneofOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofOptions proto.InternalMessageInfo + +func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{14} +} + +var extRange_EnumOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} + +func (m *EnumOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumOptions.Unmarshal(m, b) +} +func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) +} +func (m *EnumOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumOptions.Merge(m, src) +} +func (m *EnumOptions) XXX_Size() int { + return xxx_messageInfo_EnumOptions.Size(m) +} +func (m *EnumOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumOptions proto.InternalMessageInfo + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{15} +} + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} + +func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) +} +func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) +} +func (m *EnumValueOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueOptions.Merge(m, src) +} +func (m *EnumValueOptions) XXX_Size() int { + return xxx_messageInfo_EnumValueOptions.Size(m) +} +func (m *EnumValueOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{16} +} + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} + +func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) +} +func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) +} +func (m *ServiceOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceOptions.Merge(m, src) +} +func (m *ServiceOptions) XXX_Size() int { + return xxx_messageInfo_ServiceOptions.Size(m) +} +func (m *ServiceOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{17} +} + +var extRange_MethodOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} + +func (m *MethodOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodOptions.Unmarshal(m, b) +} +func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) +} +func (m *MethodOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodOptions.Merge(m, src) +} +func (m *MethodOptions) XXX_Size() int { + return xxx_messageInfo_MethodOptions.Size(m) +} +func (m *MethodOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MethodOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodOptions proto.InternalMessageInfo + +const Default_MethodOptions_Deprecated bool = false +const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { + if m != nil && m.IdempotencyLevel != nil { + return *m.IdempotencyLevel + } + return Default_MethodOptions_IdempotencyLevel +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{18} +} + +func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) +} +func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption.Merge(m, src) +} +func (m *UninterpretedOption) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption.Size(m) +} +func (m *UninterpretedOption) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{18, 0} +} + +func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) +} +func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption_NamePart.Merge(m, src) +} +func (m *UninterpretedOption_NamePart) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) +} +func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{19} +} + +func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) +} +func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo.Merge(m, src) +} +func (m *SourceCodeInfo) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo.Size(m) +} +func (m *SourceCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{19, 0} +} + +func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) +} +func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo_Location.Merge(m, src) +} +func (m *SourceCodeInfo_Location) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo_Location.Size(m) +} +func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { + if m != nil { + return m.LeadingDetachedComments + } + return nil +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +type GeneratedCodeInfo struct { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{20} +} + +func (m *GeneratedCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo.Merge(m, src) +} +func (m *GeneratedCodeInfo) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo.Size(m) +} +func (m *GeneratedCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo proto.InternalMessageInfo + +func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { + if m != nil { + return m.Annotation + } + return nil +} + +type GeneratedCodeInfo_Annotation struct { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Identifies the filesystem path to the original source .proto. + SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } +func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} +func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{20, 0} +} + +func (m *GeneratedCodeInfo_Annotation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo_Annotation.Merge(m, src) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Size(m) +} +func (m *GeneratedCodeInfo_Annotation) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo_Annotation.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo_Annotation proto.InternalMessageInfo + +func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { + if m != nil && m.SourceFile != nil { + return *m.SourceFile + } + return "" +} + +func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { + if m != nil && m.Begin != nil { + return *m.Begin + } + return 0 +} + +func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func init() { + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") + proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") +} + +func init() { proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_e5baabe45344a177) } + +var fileDescriptor_e5baabe45344a177 = []byte{ + // 2589 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x8e, 0xdb, 0xc6, + 0x15, 0x0e, 0xf5, 0xb7, 0xd2, 0x91, 0x56, 0x3b, 0x3b, 0xbb, 0xb1, 0xe9, 0xcd, 0x8f, 0xd7, 0xca, + 0x8f, 0xd7, 0x4e, 0xac, 0x0d, 0x1c, 0xdb, 0x71, 0xd6, 0x45, 0x5a, 0xad, 0x44, 0x6f, 0xe4, 0xee, + 0x4a, 0x2a, 0xa5, 0x6d, 0x7e, 0x80, 0x82, 0x98, 0x25, 0x47, 0x12, 0x6d, 0x8a, 0x64, 0x48, 0xca, + 0xf6, 0x06, 0xbd, 0x30, 0xd0, 0xab, 0x5e, 0x15, 0xe8, 0x55, 0x51, 0x14, 0xbd, 0xe8, 0x4d, 0x80, + 0x3e, 0x40, 0x81, 0xde, 0xf5, 0x09, 0x0a, 0xe4, 0x0d, 0x8a, 0xb6, 0x40, 0xfb, 0x08, 0xbd, 0x2c, + 0x66, 0x86, 0xa4, 0x48, 0x49, 0x1b, 0x6f, 0x02, 0xc4, 0xb9, 0x92, 0xe6, 0x3b, 0xdf, 0x39, 0x73, + 0xe6, 0xcc, 0x99, 0x99, 0x33, 0x43, 0xd8, 0x1e, 0x39, 0xce, 0xc8, 0xa2, 0xbb, 0xae, 0xe7, 0x04, + 0xce, 0xc9, 0x74, 0xb8, 0x6b, 0x50, 0x5f, 0xf7, 0x4c, 0x37, 0x70, 0xbc, 0x3a, 0xc7, 0xf0, 0x9a, + 0x60, 0xd4, 0x23, 0x46, 0xed, 0x08, 0xd6, 0xef, 0x9b, 0x16, 0x6d, 0xc5, 0xc4, 0x3e, 0x0d, 0xf0, + 0x5d, 0xc8, 0x0d, 0x4d, 0x8b, 0xca, 0xd2, 0x76, 0x76, 0xa7, 0x7c, 0xf3, 0xcd, 0xfa, 0x9c, 0x52, + 0x3d, 0xad, 0xd1, 0x63, 0xb0, 0xca, 0x35, 0x6a, 0xff, 0xce, 0xc1, 0xc6, 0x12, 0x29, 0xc6, 0x90, + 0xb3, 0xc9, 0x84, 0x59, 0x94, 0x76, 0x4a, 0x2a, 0xff, 0x8f, 0x65, 0x58, 0x71, 0x89, 0xfe, 0x88, + 0x8c, 0xa8, 0x9c, 0xe1, 0x70, 0xd4, 0xc4, 0xaf, 0x03, 0x18, 0xd4, 0xa5, 0xb6, 0x41, 0x6d, 0xfd, + 0x54, 0xce, 0x6e, 0x67, 0x77, 0x4a, 0x6a, 0x02, 0xc1, 0xef, 0xc0, 0xba, 0x3b, 0x3d, 0xb1, 0x4c, + 0x5d, 0x4b, 0xd0, 0x60, 0x3b, 0xbb, 0x93, 0x57, 0x91, 0x10, 0xb4, 0x66, 0xe4, 0xab, 0xb0, 0xf6, + 0x84, 0x92, 0x47, 0x49, 0x6a, 0x99, 0x53, 0xab, 0x0c, 0x4e, 0x10, 0x9b, 0x50, 0x99, 0x50, 0xdf, + 0x27, 0x23, 0xaa, 0x05, 0xa7, 0x2e, 0x95, 0x73, 0x7c, 0xf4, 0xdb, 0x0b, 0xa3, 0x9f, 0x1f, 0x79, + 0x39, 0xd4, 0x1a, 0x9c, 0xba, 0x14, 0x37, 0xa0, 0x44, 0xed, 0xe9, 0x44, 0x58, 0xc8, 0x9f, 0x11, + 0x3f, 0xc5, 0x9e, 0x4e, 0xe6, 0xad, 0x14, 0x99, 0x5a, 0x68, 0x62, 0xc5, 0xa7, 0xde, 0x63, 0x53, + 0xa7, 0x72, 0x81, 0x1b, 0xb8, 0xba, 0x60, 0xa0, 0x2f, 0xe4, 0xf3, 0x36, 0x22, 0x3d, 0xdc, 0x84, + 0x12, 0x7d, 0x1a, 0x50, 0xdb, 0x37, 0x1d, 0x5b, 0x5e, 0xe1, 0x46, 0xde, 0x5a, 0x32, 0x8b, 0xd4, + 0x32, 0xe6, 0x4d, 0xcc, 0xf4, 0xf0, 0x1d, 0x58, 0x71, 0xdc, 0xc0, 0x74, 0x6c, 0x5f, 0x2e, 0x6e, + 0x4b, 0x3b, 0xe5, 0x9b, 0xaf, 0x2e, 0x4d, 0x84, 0xae, 0xe0, 0xa8, 0x11, 0x19, 0xb7, 0x01, 0xf9, + 0xce, 0xd4, 0xd3, 0xa9, 0xa6, 0x3b, 0x06, 0xd5, 0x4c, 0x7b, 0xe8, 0xc8, 0x25, 0x6e, 0xe0, 0xf2, + 0xe2, 0x40, 0x38, 0xb1, 0xe9, 0x18, 0xb4, 0x6d, 0x0f, 0x1d, 0xb5, 0xea, 0xa7, 0xda, 0xf8, 0x02, + 0x14, 0xfc, 0x53, 0x3b, 0x20, 0x4f, 0xe5, 0x0a, 0xcf, 0x90, 0xb0, 0x55, 0xfb, 0x6b, 0x01, 0xd6, + 0xce, 0x93, 0x62, 0xf7, 0x20, 0x3f, 0x64, 0xa3, 0x94, 0x33, 0xdf, 0x26, 0x06, 0x42, 0x27, 0x1d, + 0xc4, 0xc2, 0x77, 0x0c, 0x62, 0x03, 0xca, 0x36, 0xf5, 0x03, 0x6a, 0x88, 0x8c, 0xc8, 0x9e, 0x33, + 0xa7, 0x40, 0x28, 0x2d, 0xa6, 0x54, 0xee, 0x3b, 0xa5, 0xd4, 0xa7, 0xb0, 0x16, 0xbb, 0xa4, 0x79, + 0xc4, 0x1e, 0x45, 0xb9, 0xb9, 0xfb, 0x3c, 0x4f, 0xea, 0x4a, 0xa4, 0xa7, 0x32, 0x35, 0xb5, 0x4a, + 0x53, 0x6d, 0xdc, 0x02, 0x70, 0x6c, 0xea, 0x0c, 0x35, 0x83, 0xea, 0x96, 0x5c, 0x3c, 0x23, 0x4a, + 0x5d, 0x46, 0x59, 0x88, 0x92, 0x23, 0x50, 0xdd, 0xc2, 0x1f, 0xce, 0x52, 0x6d, 0xe5, 0x8c, 0x4c, + 0x39, 0x12, 0x8b, 0x6c, 0x21, 0xdb, 0x8e, 0xa1, 0xea, 0x51, 0x96, 0xf7, 0xd4, 0x08, 0x47, 0x56, + 0xe2, 0x4e, 0xd4, 0x9f, 0x3b, 0x32, 0x35, 0x54, 0x13, 0x03, 0x5b, 0xf5, 0x92, 0x4d, 0xfc, 0x06, + 0xc4, 0x80, 0xc6, 0xd3, 0x0a, 0xf8, 0x2e, 0x54, 0x89, 0xc0, 0x0e, 0x99, 0xd0, 0xad, 0x2f, 0xa1, + 0x9a, 0x0e, 0x0f, 0xde, 0x84, 0xbc, 0x1f, 0x10, 0x2f, 0xe0, 0x59, 0x98, 0x57, 0x45, 0x03, 0x23, + 0xc8, 0x52, 0xdb, 0xe0, 0xbb, 0x5c, 0x5e, 0x65, 0x7f, 0xf1, 0x4f, 0x66, 0x03, 0xce, 0xf2, 0x01, + 0xbf, 0xbd, 0x38, 0xa3, 0x29, 0xcb, 0xf3, 0xe3, 0xde, 0xfa, 0x00, 0x56, 0x53, 0x03, 0x38, 0x6f, + 0xd7, 0xb5, 0x5f, 0xc2, 0xcb, 0x4b, 0x4d, 0xe3, 0x4f, 0x61, 0x73, 0x6a, 0x9b, 0x76, 0x40, 0x3d, + 0xd7, 0xa3, 0x2c, 0x63, 0x45, 0x57, 0xf2, 0x7f, 0x56, 0xce, 0xc8, 0xb9, 0xe3, 0x24, 0x5b, 0x58, + 0x51, 0x37, 0xa6, 0x8b, 0xe0, 0xf5, 0x52, 0xf1, 0xbf, 0x2b, 0xe8, 0xd9, 0xb3, 0x67, 0xcf, 0x32, + 0xb5, 0xdf, 0x15, 0x60, 0x73, 0xd9, 0x9a, 0x59, 0xba, 0x7c, 0x2f, 0x40, 0xc1, 0x9e, 0x4e, 0x4e, + 0xa8, 0xc7, 0x83, 0x94, 0x57, 0xc3, 0x16, 0x6e, 0x40, 0xde, 0x22, 0x27, 0xd4, 0x92, 0x73, 0xdb, + 0xd2, 0x4e, 0xf5, 0xe6, 0x3b, 0xe7, 0x5a, 0x95, 0xf5, 0x43, 0xa6, 0xa2, 0x0a, 0x4d, 0xfc, 0x11, + 0xe4, 0xc2, 0x2d, 0x9a, 0x59, 0xb8, 0x7e, 0x3e, 0x0b, 0x6c, 0x2d, 0xa9, 0x5c, 0x0f, 0xbf, 0x02, + 0x25, 0xf6, 0x2b, 0x72, 0xa3, 0xc0, 0x7d, 0x2e, 0x32, 0x80, 0xe5, 0x05, 0xde, 0x82, 0x22, 0x5f, + 0x26, 0x06, 0x8d, 0x8e, 0xb6, 0xb8, 0xcd, 0x12, 0xcb, 0xa0, 0x43, 0x32, 0xb5, 0x02, 0xed, 0x31, + 0xb1, 0xa6, 0x94, 0x27, 0x7c, 0x49, 0xad, 0x84, 0xe0, 0xcf, 0x19, 0x86, 0x2f, 0x43, 0x59, 0xac, + 0x2a, 0xd3, 0x36, 0xe8, 0x53, 0xbe, 0x7b, 0xe6, 0x55, 0xb1, 0xd0, 0xda, 0x0c, 0x61, 0xdd, 0x3f, + 0xf4, 0x1d, 0x3b, 0x4a, 0x4d, 0xde, 0x05, 0x03, 0x78, 0xf7, 0x1f, 0xcc, 0x6f, 0xdc, 0xaf, 0x2d, + 0x1f, 0xde, 0x7c, 0x4e, 0xd5, 0xfe, 0x92, 0x81, 0x1c, 0xdf, 0x2f, 0xd6, 0xa0, 0x3c, 0xf8, 0xac, + 0xa7, 0x68, 0xad, 0xee, 0xf1, 0xfe, 0xa1, 0x82, 0x24, 0x5c, 0x05, 0xe0, 0xc0, 0xfd, 0xc3, 0x6e, + 0x63, 0x80, 0x32, 0x71, 0xbb, 0xdd, 0x19, 0xdc, 0xb9, 0x85, 0xb2, 0xb1, 0xc2, 0xb1, 0x00, 0x72, + 0x49, 0xc2, 0xfb, 0x37, 0x51, 0x1e, 0x23, 0xa8, 0x08, 0x03, 0xed, 0x4f, 0x95, 0xd6, 0x9d, 0x5b, + 0xa8, 0x90, 0x46, 0xde, 0xbf, 0x89, 0x56, 0xf0, 0x2a, 0x94, 0x38, 0xb2, 0xdf, 0xed, 0x1e, 0xa2, + 0x62, 0x6c, 0xb3, 0x3f, 0x50, 0xdb, 0x9d, 0x03, 0x54, 0x8a, 0x6d, 0x1e, 0xa8, 0xdd, 0xe3, 0x1e, + 0x82, 0xd8, 0xc2, 0x91, 0xd2, 0xef, 0x37, 0x0e, 0x14, 0x54, 0x8e, 0x19, 0xfb, 0x9f, 0x0d, 0x94, + 0x3e, 0xaa, 0xa4, 0xdc, 0x7a, 0xff, 0x26, 0x5a, 0x8d, 0xbb, 0x50, 0x3a, 0xc7, 0x47, 0xa8, 0x8a, + 0xd7, 0x61, 0x55, 0x74, 0x11, 0x39, 0xb1, 0x36, 0x07, 0xdd, 0xb9, 0x85, 0xd0, 0xcc, 0x11, 0x61, + 0x65, 0x3d, 0x05, 0xdc, 0xb9, 0x85, 0x70, 0xad, 0x09, 0x79, 0x9e, 0x5d, 0x18, 0x43, 0xf5, 0xb0, + 0xb1, 0xaf, 0x1c, 0x6a, 0xdd, 0xde, 0xa0, 0xdd, 0xed, 0x34, 0x0e, 0x91, 0x34, 0xc3, 0x54, 0xe5, + 0x67, 0xc7, 0x6d, 0x55, 0x69, 0xa1, 0x4c, 0x12, 0xeb, 0x29, 0x8d, 0x81, 0xd2, 0x42, 0xd9, 0x9a, + 0x0e, 0x9b, 0xcb, 0xf6, 0xc9, 0xa5, 0x2b, 0x23, 0x31, 0xc5, 0x99, 0x33, 0xa6, 0x98, 0xdb, 0x5a, + 0x98, 0xe2, 0x7f, 0x65, 0x60, 0x63, 0xc9, 0x59, 0xb1, 0xb4, 0x93, 0x1f, 0x43, 0x5e, 0xa4, 0xa8, + 0x38, 0x3d, 0xaf, 0x2d, 0x3d, 0x74, 0x78, 0xc2, 0x2e, 0x9c, 0xa0, 0x5c, 0x2f, 0x59, 0x41, 0x64, + 0xcf, 0xa8, 0x20, 0x98, 0x89, 0x85, 0x3d, 0xfd, 0x17, 0x0b, 0x7b, 0xba, 0x38, 0xf6, 0xee, 0x9c, + 0xe7, 0xd8, 0xe3, 0xd8, 0xb7, 0xdb, 0xdb, 0xf3, 0x4b, 0xf6, 0xf6, 0x7b, 0xb0, 0xbe, 0x60, 0xe8, + 0xdc, 0x7b, 0xec, 0xaf, 0x24, 0x90, 0xcf, 0x0a, 0xce, 0x73, 0x76, 0xba, 0x4c, 0x6a, 0xa7, 0xbb, + 0x37, 0x1f, 0xc1, 0x2b, 0x67, 0x4f, 0xc2, 0xc2, 0x5c, 0x7f, 0x25, 0xc1, 0x85, 0xe5, 0x95, 0xe2, + 0x52, 0x1f, 0x3e, 0x82, 0xc2, 0x84, 0x06, 0x63, 0x27, 0xaa, 0x96, 0xde, 0x5e, 0x72, 0x06, 0x33, + 0xf1, 0xfc, 0x64, 0x87, 0x5a, 0xc9, 0x43, 0x3c, 0x7b, 0x56, 0xb9, 0x27, 0xbc, 0x59, 0xf0, 0xf4, + 0xd7, 0x19, 0x78, 0x79, 0xa9, 0xf1, 0xa5, 0x8e, 0xbe, 0x06, 0x60, 0xda, 0xee, 0x34, 0x10, 0x15, + 0x91, 0xd8, 0x60, 0x4b, 0x1c, 0xe1, 0x9b, 0x17, 0xdb, 0x3c, 0xa7, 0x41, 0x2c, 0xcf, 0x72, 0x39, + 0x08, 0x88, 0x13, 0xee, 0xce, 0x1c, 0xcd, 0x71, 0x47, 0x5f, 0x3f, 0x63, 0xa4, 0x0b, 0x89, 0xf9, + 0x1e, 0x20, 0xdd, 0x32, 0xa9, 0x1d, 0x68, 0x7e, 0xe0, 0x51, 0x32, 0x31, 0xed, 0x11, 0x3f, 0x41, + 0x8a, 0x7b, 0xf9, 0x21, 0xb1, 0x7c, 0xaa, 0xae, 0x09, 0x71, 0x3f, 0x92, 0x32, 0x0d, 0x9e, 0x40, + 0x5e, 0x42, 0xa3, 0x90, 0xd2, 0x10, 0xe2, 0x58, 0xa3, 0xf6, 0xdb, 0x12, 0x94, 0x13, 0x75, 0x35, + 0xbe, 0x02, 0x95, 0x87, 0xe4, 0x31, 0xd1, 0xa2, 0xbb, 0x92, 0x88, 0x44, 0x99, 0x61, 0xbd, 0xf0, + 0xbe, 0xf4, 0x1e, 0x6c, 0x72, 0x8a, 0x33, 0x0d, 0xa8, 0xa7, 0xe9, 0x16, 0xf1, 0x7d, 0x1e, 0xb4, + 0x22, 0xa7, 0x62, 0x26, 0xeb, 0x32, 0x51, 0x33, 0x92, 0xe0, 0xdb, 0xb0, 0xc1, 0x35, 0x26, 0x53, + 0x2b, 0x30, 0x5d, 0x8b, 0x6a, 0xec, 0xf6, 0xe6, 0xf3, 0x93, 0x24, 0xf6, 0x6c, 0x9d, 0x31, 0x8e, + 0x42, 0x02, 0xf3, 0xc8, 0xc7, 0x2d, 0x78, 0x8d, 0xab, 0x8d, 0xa8, 0x4d, 0x3d, 0x12, 0x50, 0x8d, + 0x7e, 0x31, 0x25, 0x96, 0xaf, 0x11, 0xdb, 0xd0, 0xc6, 0xc4, 0x1f, 0xcb, 0x9b, 0xcc, 0xc0, 0x7e, + 0x46, 0x96, 0xd4, 0x4b, 0x8c, 0x78, 0x10, 0xf2, 0x14, 0x4e, 0x6b, 0xd8, 0xc6, 0xc7, 0xc4, 0x1f, + 0xe3, 0x3d, 0xb8, 0xc0, 0xad, 0xf8, 0x81, 0x67, 0xda, 0x23, 0x4d, 0x1f, 0x53, 0xfd, 0x91, 0x36, + 0x0d, 0x86, 0x77, 0xe5, 0x57, 0x92, 0xfd, 0x73, 0x0f, 0xfb, 0x9c, 0xd3, 0x64, 0x94, 0xe3, 0x60, + 0x78, 0x17, 0xf7, 0xa1, 0xc2, 0x26, 0x63, 0x62, 0x7e, 0x49, 0xb5, 0xa1, 0xe3, 0xf1, 0xa3, 0xb1, + 0xba, 0x64, 0x6b, 0x4a, 0x44, 0xb0, 0xde, 0x0d, 0x15, 0x8e, 0x1c, 0x83, 0xee, 0xe5, 0xfb, 0x3d, + 0x45, 0x69, 0xa9, 0xe5, 0xc8, 0xca, 0x7d, 0xc7, 0x63, 0x09, 0x35, 0x72, 0xe2, 0x00, 0x97, 0x45, + 0x42, 0x8d, 0x9c, 0x28, 0xbc, 0xb7, 0x61, 0x43, 0xd7, 0xc5, 0x98, 0x4d, 0x5d, 0x0b, 0xef, 0x58, + 0xbe, 0x8c, 0x52, 0xc1, 0xd2, 0xf5, 0x03, 0x41, 0x08, 0x73, 0xdc, 0xc7, 0x1f, 0xc2, 0xcb, 0xb3, + 0x60, 0x25, 0x15, 0xd7, 0x17, 0x46, 0x39, 0xaf, 0x7a, 0x1b, 0x36, 0xdc, 0xd3, 0x45, 0x45, 0x9c, + 0xea, 0xd1, 0x3d, 0x9d, 0x57, 0xfb, 0x00, 0x36, 0xdd, 0xb1, 0xbb, 0xa8, 0x77, 0x3d, 0xa9, 0x87, + 0xdd, 0xb1, 0x3b, 0xaf, 0xf8, 0x16, 0xbf, 0x70, 0x7b, 0x54, 0x27, 0x01, 0x35, 0xe4, 0x8b, 0x49, + 0x7a, 0x42, 0x80, 0x77, 0x01, 0xe9, 0xba, 0x46, 0x6d, 0x72, 0x62, 0x51, 0x8d, 0x78, 0xd4, 0x26, + 0xbe, 0x7c, 0x39, 0x49, 0xae, 0xea, 0xba, 0xc2, 0xa5, 0x0d, 0x2e, 0xc4, 0xd7, 0x61, 0xdd, 0x39, + 0x79, 0xa8, 0x8b, 0x94, 0xd4, 0x5c, 0x8f, 0x0e, 0xcd, 0xa7, 0xf2, 0x9b, 0x3c, 0xbe, 0x6b, 0x4c, + 0xc0, 0x13, 0xb2, 0xc7, 0x61, 0x7c, 0x0d, 0x90, 0xee, 0x8f, 0x89, 0xe7, 0xf2, 0x3d, 0xd9, 0x77, + 0x89, 0x4e, 0xe5, 0xb7, 0x04, 0x55, 0xe0, 0x9d, 0x08, 0x66, 0x4b, 0xc2, 0x7f, 0x62, 0x0e, 0x83, + 0xc8, 0xe2, 0x55, 0xb1, 0x24, 0x38, 0x16, 0x5a, 0xdb, 0x01, 0xc4, 0x42, 0x91, 0xea, 0x78, 0x87, + 0xd3, 0xaa, 0xee, 0xd8, 0x4d, 0xf6, 0xfb, 0x06, 0xac, 0x32, 0xe6, 0xac, 0xd3, 0x6b, 0xa2, 0x20, + 0x73, 0xc7, 0x89, 0x1e, 0x6f, 0xc1, 0x05, 0x46, 0x9a, 0xd0, 0x80, 0x18, 0x24, 0x20, 0x09, 0xf6, + 0xbb, 0x9c, 0xcd, 0xe2, 0x7e, 0x14, 0x0a, 0x53, 0x7e, 0x7a, 0xd3, 0x93, 0xd3, 0x38, 0xb3, 0x6e, + 0x08, 0x3f, 0x19, 0x16, 0xe5, 0xd6, 0xf7, 0x56, 0x74, 0xd7, 0xf6, 0xa0, 0x92, 0x4c, 0x7c, 0x5c, + 0x02, 0x91, 0xfa, 0x48, 0x62, 0x55, 0x50, 0xb3, 0xdb, 0x62, 0xf5, 0xcb, 0xe7, 0x0a, 0xca, 0xb0, + 0x3a, 0xea, 0xb0, 0x3d, 0x50, 0x34, 0xf5, 0xb8, 0x33, 0x68, 0x1f, 0x29, 0x28, 0x9b, 0x28, 0xd8, + 0x1f, 0xe4, 0x8a, 0x6f, 0xa3, 0xab, 0xb5, 0xaf, 0x33, 0x50, 0x4d, 0xdf, 0xc0, 0xf0, 0x8f, 0xe0, + 0x62, 0xf4, 0x5c, 0xe2, 0xd3, 0x40, 0x7b, 0x62, 0x7a, 0x7c, 0x45, 0x4e, 0x88, 0x38, 0x1d, 0xe3, + 0x9c, 0xd8, 0x0c, 0x59, 0x7d, 0x1a, 0x7c, 0x62, 0x7a, 0x6c, 0xbd, 0x4d, 0x48, 0x80, 0x0f, 0xe1, + 0xb2, 0xed, 0x68, 0x7e, 0x40, 0x6c, 0x83, 0x78, 0x86, 0x36, 0x7b, 0xa8, 0xd2, 0x88, 0xae, 0x53, + 0xdf, 0x77, 0xc4, 0x49, 0x18, 0x5b, 0x79, 0xd5, 0x76, 0xfa, 0x21, 0x79, 0x76, 0x44, 0x34, 0x42, + 0xea, 0x5c, 0xfe, 0x66, 0xcf, 0xca, 0xdf, 0x57, 0xa0, 0x34, 0x21, 0xae, 0x46, 0xed, 0xc0, 0x3b, + 0xe5, 0x75, 0x77, 0x51, 0x2d, 0x4e, 0x88, 0xab, 0xb0, 0xf6, 0x0b, 0xb9, 0xfe, 0x3c, 0xc8, 0x15, + 0x8b, 0xa8, 0xf4, 0x20, 0x57, 0x2c, 0x21, 0xa8, 0xfd, 0x33, 0x0b, 0x95, 0x64, 0x1d, 0xce, 0xae, + 0x35, 0x3a, 0x3f, 0xb2, 0x24, 0xbe, 0xa9, 0xbd, 0xf1, 0x8d, 0x55, 0x7b, 0xbd, 0xc9, 0xce, 0xb2, + 0xbd, 0x82, 0xa8, 0x8e, 0x55, 0xa1, 0xc9, 0xea, 0x08, 0x96, 0x6c, 0x54, 0x54, 0x23, 0x45, 0x35, + 0x6c, 0xe1, 0x03, 0x28, 0x3c, 0xf4, 0xb9, 0xed, 0x02, 0xb7, 0xfd, 0xe6, 0x37, 0xdb, 0x7e, 0xd0, + 0xe7, 0xc6, 0x4b, 0x0f, 0xfa, 0x5a, 0xa7, 0xab, 0x1e, 0x35, 0x0e, 0xd5, 0x50, 0x1d, 0x5f, 0x82, + 0x9c, 0x45, 0xbe, 0x3c, 0x4d, 0x9f, 0x7a, 0x1c, 0x3a, 0xef, 0x24, 0x5c, 0x82, 0xdc, 0x13, 0x4a, + 0x1e, 0xa5, 0xcf, 0x1a, 0x0e, 0x7d, 0x8f, 0x8b, 0x61, 0x17, 0xf2, 0x3c, 0x5e, 0x18, 0x20, 0x8c, + 0x18, 0x7a, 0x09, 0x17, 0x21, 0xd7, 0xec, 0xaa, 0x6c, 0x41, 0x20, 0xa8, 0x08, 0x54, 0xeb, 0xb5, + 0x95, 0xa6, 0x82, 0x32, 0xb5, 0xdb, 0x50, 0x10, 0x41, 0x60, 0x8b, 0x25, 0x0e, 0x03, 0x7a, 0x29, + 0x6c, 0x86, 0x36, 0xa4, 0x48, 0x7a, 0x7c, 0xb4, 0xaf, 0xa8, 0x28, 0x93, 0x9e, 0xea, 0x1c, 0xca, + 0xd7, 0x7c, 0xa8, 0x24, 0x0b, 0xf1, 0x17, 0x73, 0xc9, 0xfe, 0x9b, 0x04, 0xe5, 0x44, 0x61, 0xcd, + 0x2a, 0x22, 0x62, 0x59, 0xce, 0x13, 0x8d, 0x58, 0x26, 0xf1, 0xc3, 0xd4, 0x00, 0x0e, 0x35, 0x18, + 0x72, 0xde, 0xa9, 0x7b, 0x41, 0x4b, 0x24, 0x8f, 0x0a, 0xb5, 0x3f, 0x4a, 0x80, 0xe6, 0x2b, 0xdb, + 0x39, 0x37, 0xa5, 0x1f, 0xd2, 0xcd, 0xda, 0x1f, 0x24, 0xa8, 0xa6, 0xcb, 0xd9, 0x39, 0xf7, 0xae, + 0xfc, 0xa0, 0xee, 0xfd, 0x23, 0x03, 0xab, 0xa9, 0x22, 0xf6, 0xbc, 0xde, 0x7d, 0x01, 0xeb, 0xa6, + 0x41, 0x27, 0xae, 0x13, 0x50, 0x5b, 0x3f, 0xd5, 0x2c, 0xfa, 0x98, 0x5a, 0x72, 0x8d, 0x6f, 0x1a, + 0xbb, 0xdf, 0x5c, 0x26, 0xd7, 0xdb, 0x33, 0xbd, 0x43, 0xa6, 0xb6, 0xb7, 0xd1, 0x6e, 0x29, 0x47, + 0xbd, 0xee, 0x40, 0xe9, 0x34, 0x3f, 0xd3, 0x8e, 0x3b, 0x3f, 0xed, 0x74, 0x3f, 0xe9, 0xa8, 0xc8, + 0x9c, 0xa3, 0x7d, 0x8f, 0xcb, 0xbe, 0x07, 0x68, 0xde, 0x29, 0x7c, 0x11, 0x96, 0xb9, 0x85, 0x5e, + 0xc2, 0x1b, 0xb0, 0xd6, 0xe9, 0x6a, 0xfd, 0x76, 0x4b, 0xd1, 0x94, 0xfb, 0xf7, 0x95, 0xe6, 0xa0, + 0x2f, 0x1e, 0x3e, 0x62, 0xf6, 0x20, 0xb5, 0xc0, 0x6b, 0xbf, 0xcf, 0xc2, 0xc6, 0x12, 0x4f, 0x70, + 0x23, 0xbc, 0xb2, 0x88, 0x5b, 0xd4, 0x8d, 0xf3, 0x78, 0x5f, 0x67, 0x35, 0x43, 0x8f, 0x78, 0x41, + 0x78, 0xc3, 0xb9, 0x06, 0x2c, 0x4a, 0x76, 0x60, 0x0e, 0x4d, 0xea, 0x85, 0xef, 0x44, 0xe2, 0x1e, + 0xb3, 0x36, 0xc3, 0xc5, 0x53, 0xd1, 0xbb, 0x80, 0x5d, 0xc7, 0x37, 0x03, 0xf3, 0x31, 0xd5, 0x4c, + 0x3b, 0x7a, 0x54, 0x62, 0xf7, 0x9a, 0x9c, 0x8a, 0x22, 0x49, 0xdb, 0x0e, 0x62, 0xb6, 0x4d, 0x47, + 0x64, 0x8e, 0xcd, 0x36, 0xf3, 0xac, 0x8a, 0x22, 0x49, 0xcc, 0xbe, 0x02, 0x15, 0xc3, 0x99, 0xb2, + 0x62, 0x4f, 0xf0, 0xd8, 0xd9, 0x21, 0xa9, 0x65, 0x81, 0xc5, 0x94, 0xb0, 0x8c, 0x9f, 0xbd, 0x66, + 0x55, 0xd4, 0xb2, 0xc0, 0x04, 0xe5, 0x2a, 0xac, 0x91, 0xd1, 0xc8, 0x63, 0xc6, 0x23, 0x43, 0xe2, + 0x62, 0x52, 0x8d, 0x61, 0x4e, 0xdc, 0x7a, 0x00, 0xc5, 0x28, 0x0e, 0xec, 0xa8, 0x66, 0x91, 0xd0, + 0x5c, 0x71, 0xdb, 0xce, 0xec, 0x94, 0xd4, 0xa2, 0x1d, 0x09, 0xaf, 0x40, 0xc5, 0xf4, 0xb5, 0xd9, + 0xe3, 0x7c, 0x66, 0x3b, 0xb3, 0x53, 0x54, 0xcb, 0xa6, 0x1f, 0x3f, 0x6c, 0xd6, 0xbe, 0xca, 0x40, + 0x35, 0xfd, 0x71, 0x01, 0xb7, 0xa0, 0x68, 0x39, 0x3a, 0xe1, 0xa9, 0x25, 0xbe, 0x6c, 0xed, 0x3c, + 0xe7, 0x7b, 0x44, 0xfd, 0x30, 0xe4, 0xab, 0xb1, 0xe6, 0xd6, 0xdf, 0x25, 0x28, 0x46, 0x30, 0xbe, + 0x00, 0x39, 0x97, 0x04, 0x63, 0x6e, 0x2e, 0xbf, 0x9f, 0x41, 0x92, 0xca, 0xdb, 0x0c, 0xf7, 0x5d, + 0x62, 0xf3, 0x14, 0x08, 0x71, 0xd6, 0x66, 0xf3, 0x6a, 0x51, 0x62, 0xf0, 0x5b, 0x8f, 0x33, 0x99, + 0x50, 0x3b, 0xf0, 0xa3, 0x79, 0x0d, 0xf1, 0x66, 0x08, 0xe3, 0x77, 0x60, 0x3d, 0xf0, 0x88, 0x69, + 0xa5, 0xb8, 0x39, 0xce, 0x45, 0x91, 0x20, 0x26, 0xef, 0xc1, 0xa5, 0xc8, 0xae, 0x41, 0x03, 0xa2, + 0x8f, 0xa9, 0x31, 0x53, 0x2a, 0xf0, 0xd7, 0x8d, 0x8b, 0x21, 0xa1, 0x15, 0xca, 0x23, 0xdd, 0xda, + 0xd7, 0x12, 0xac, 0x47, 0xf7, 0x34, 0x23, 0x0e, 0xd6, 0x11, 0x00, 0xb1, 0x6d, 0x27, 0x48, 0x86, + 0x6b, 0x31, 0x95, 0x17, 0xf4, 0xea, 0x8d, 0x58, 0x49, 0x4d, 0x18, 0xd8, 0x9a, 0x00, 0xcc, 0x24, + 0x67, 0x86, 0xed, 0x32, 0x94, 0xc3, 0x2f, 0x47, 0xfc, 0xf3, 0xa3, 0xb8, 0xd9, 0x83, 0x80, 0xd8, + 0x85, 0x0e, 0x6f, 0x42, 0xfe, 0x84, 0x8e, 0x4c, 0x3b, 0x7c, 0x0f, 0x16, 0x8d, 0xe8, 0xfd, 0x25, + 0x17, 0xbf, 0xbf, 0xec, 0xff, 0x46, 0x82, 0x0d, 0xdd, 0x99, 0xcc, 0xfb, 0xbb, 0x8f, 0xe6, 0x9e, + 0x17, 0xfc, 0x8f, 0xa5, 0xcf, 0x3f, 0x1a, 0x99, 0xc1, 0x78, 0x7a, 0x52, 0xd7, 0x9d, 0xc9, 0xee, + 0xc8, 0xb1, 0x88, 0x3d, 0x9a, 0x7d, 0x3f, 0xe5, 0x7f, 0xf4, 0x1b, 0x23, 0x6a, 0xdf, 0x18, 0x39, + 0x89, 0xaf, 0xa9, 0xf7, 0x66, 0x7f, 0xff, 0x27, 0x49, 0x7f, 0xca, 0x64, 0x0f, 0x7a, 0xfb, 0x7f, + 0xce, 0x6c, 0x1d, 0x88, 0xee, 0x7a, 0x51, 0x78, 0x54, 0x3a, 0xb4, 0xa8, 0xce, 0x86, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xe8, 0xef, 0xc4, 0x9b, 0x1d, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/any.go b/vendor/github.com/golang/protobuf/ptypes/any.go new file mode 100644 index 000000000..70276e8f5 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any.go @@ -0,0 +1,141 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements functions to marshal proto.Message to/from +// google.protobuf.Any message. + +import ( + "fmt" + "reflect" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" +) + +const googleApis = "type.googleapis.com/" + +// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. +// +// Note that regular type assertions should be done using the Is +// function. AnyMessageName is provided for less common use cases like filtering a +// sequence of Any messages based on a set of allowed message type names. +func AnyMessageName(any *any.Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } + slash := strings.LastIndex(any.TypeUrl, "/") + if slash < 0 { + return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) + } + return any.TypeUrl[slash+1:], nil +} + +// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. +func MarshalAny(pb proto.Message) (*any.Any, error) { + value, err := proto.Marshal(pb) + if err != nil { + return nil, err + } + return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil +} + +// DynamicAny is a value that can be passed to UnmarshalAny to automatically +// allocate a proto.Message for the type specified in a google.protobuf.Any +// message. The allocated message is stored in the embedded proto.Message. +// +// Example: +// +// var x ptypes.DynamicAny +// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } +// fmt.Printf("unmarshaled message: %v", x.Message) +type DynamicAny struct { + proto.Message +} + +// Empty returns a new proto.Message of the type specified in a +// google.protobuf.Any message. It returns an error if corresponding message +// type isn't linked in. +func Empty(any *any.Any) (proto.Message, error) { + aname, err := AnyMessageName(any) + if err != nil { + return nil, err + } + + t := proto.MessageType(aname) + if t == nil { + return nil, fmt.Errorf("any: message type %q isn't linked in", aname) + } + return reflect.New(t.Elem()).Interface().(proto.Message), nil +} + +// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any +// message and places the decoded result in pb. It returns an error if type of +// contents of Any message does not match type of pb message. +// +// pb can be a proto.Message, or a *DynamicAny. +func UnmarshalAny(any *any.Any, pb proto.Message) error { + if d, ok := pb.(*DynamicAny); ok { + if d.Message == nil { + var err error + d.Message, err = Empty(any) + if err != nil { + return err + } + } + return UnmarshalAny(any, d.Message) + } + + aname, err := AnyMessageName(any) + if err != nil { + return err + } + + mname := proto.MessageName(pb) + if aname != mname { + return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) + } + return proto.Unmarshal(any.Value, pb) +} + +// Is returns true if any value contains a given message type. +func Is(any *any.Any, pb proto.Message) bool { + // The following is equivalent to AnyMessageName(any) == proto.MessageName(pb), + // but it avoids scanning TypeUrl for the slash. + if any == nil { + return false + } + name := proto.MessageName(pb) + prefix := len(any.TypeUrl) - len(name) + return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name +} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go new file mode 100644 index 000000000..78ee52334 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go @@ -0,0 +1,200 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/any.proto + +package any + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +type Any struct { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_b53526c13ae22eb4, []int{0} +} + +func (*Any) XXX_WellKnownType() string { return "Any" } + +func (m *Any) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Any.Unmarshal(m, b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) +} +func (m *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(m, src) +} +func (m *Any) XXX_Size() int { + return xxx_messageInfo_Any.Size(m) +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Any) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Any)(nil), "google.protobuf.Any") +} + +func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) } + +var fileDescriptor_b53526c13ae22eb4 = []byte{ + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, + 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, + 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, + 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, + 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce, + 0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52, + 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, + 0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, + 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, + 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/doc.go b/vendor/github.com/golang/protobuf/ptypes/doc.go new file mode 100644 index 000000000..c0d595da7 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/doc.go @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package ptypes contains code for interacting with well-known types. +*/ +package ptypes diff --git a/vendor/github.com/golang/protobuf/ptypes/duration.go b/vendor/github.com/golang/protobuf/ptypes/duration.go new file mode 100644 index 000000000..26d1ca2fb --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration.go @@ -0,0 +1,102 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" + + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + // Range of a durpb.Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the durpb.Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid durpb.Duration +// may still be too large to fit into a time.Duration (the range of durpb.Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *durpb.Duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) + } + return nil +} + +// Duration converts a durpb.Duration to a time.Duration. Duration +// returns an error if the durpb.Duration is invalid or is too large to be +// represented in a time.Duration. +func Duration(p *durpb.Duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) * time.Nanosecond + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a durpb.Duration. +func DurationProto(d time.Duration) *durpb.Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &durpb.Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go new file mode 100644 index 000000000..0d681ee21 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go @@ -0,0 +1,161 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/duration.proto + +package duration + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (m *Duration) String() string { return proto.CompactTextString(m) } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { + return fileDescriptor_23597b2ebd7ac6c5, []int{0} +} + +func (*Duration) XXX_WellKnownType() string { return "Duration" } + +func (m *Duration) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Duration.Unmarshal(m, b) +} +func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Duration.Marshal(b, m, deterministic) +} +func (m *Duration) XXX_Merge(src proto.Message) { + xxx_messageInfo_Duration.Merge(m, src) +} +func (m *Duration) XXX_Size() int { + return xxx_messageInfo_Duration.Size(m) +} +func (m *Duration) XXX_DiscardUnknown() { + xxx_messageInfo_Duration.DiscardUnknown(m) +} + +var xxx_messageInfo_Duration proto.InternalMessageInfo + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") +} + +func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) } + +var fileDescriptor_23597b2ebd7ac6c5 = []byte{ + // 190 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, + 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, + 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, + 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, + 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c, + 0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56, + 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, + 0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4, + 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78, + 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go b/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go new file mode 100644 index 000000000..b4eb03ecc --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go @@ -0,0 +1,83 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/empty.proto + +package empty + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_900544acb223d5b8, []int{0} +} + +func (*Empty) XXX_WellKnownType() string { return "Empty" } + +func (m *Empty) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Empty.Unmarshal(m, b) +} +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) +} +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) +} +func (m *Empty) XXX_Size() int { + return xxx_messageInfo_Empty.Size(m) +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") +} + +func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_900544acb223d5b8) } + +var fileDescriptor_900544acb223d5b8 = []byte{ + // 148 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28, + 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57, + 0x90, 0xbc, 0x53, 0x19, 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0xbc, 0x13, 0x17, 0x58, 0x36, + 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x52, 0x4f, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, + 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0x47, 0x58, 0x53, 0x50, 0x52, 0x59, 0x90, 0x5a, 0x0c, + 0xb1, 0xed, 0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10, + 0x13, 0x03, 0xa0, 0xea, 0xf4, 0xc2, 0x53, 0x73, 0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, + 0xea, 0x93, 0xd8, 0xc0, 0x06, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x64, 0xd4, 0xb3, 0xa6, + 0xb7, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go b/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go new file mode 100644 index 000000000..33daa73dd --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go @@ -0,0 +1,336 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/struct.proto + +package structpb + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +type NullValue int32 + +const ( + // Null value. + NullValue_NULL_VALUE NullValue = 0 +) + +var NullValue_name = map[int32]string{ + 0: "NULL_VALUE", +} + +var NullValue_value = map[string]int32{ + "NULL_VALUE": 0, +} + +func (x NullValue) String() string { + return proto.EnumName(NullValue_name, int32(x)) +} + +func (NullValue) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{0} +} + +func (NullValue) XXX_WellKnownType() string { return "NullValue" } + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +type Struct struct { + // Unordered map of dynamically typed values. + Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Struct) Reset() { *m = Struct{} } +func (m *Struct) String() string { return proto.CompactTextString(m) } +func (*Struct) ProtoMessage() {} +func (*Struct) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{0} +} + +func (*Struct) XXX_WellKnownType() string { return "Struct" } + +func (m *Struct) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Struct.Unmarshal(m, b) +} +func (m *Struct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Struct.Marshal(b, m, deterministic) +} +func (m *Struct) XXX_Merge(src proto.Message) { + xxx_messageInfo_Struct.Merge(m, src) +} +func (m *Struct) XXX_Size() int { + return xxx_messageInfo_Struct.Size(m) +} +func (m *Struct) XXX_DiscardUnknown() { + xxx_messageInfo_Struct.DiscardUnknown(m) +} + +var xxx_messageInfo_Struct proto.InternalMessageInfo + +func (m *Struct) GetFields() map[string]*Value { + if m != nil { + return m.Fields + } + return nil +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +type Value struct { + // The kind of value. + // + // Types that are valid to be assigned to Kind: + // *Value_NullValue + // *Value_NumberValue + // *Value_StringValue + // *Value_BoolValue + // *Value_StructValue + // *Value_ListValue + Kind isValue_Kind `protobuf_oneof:"kind"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Value) Reset() { *m = Value{} } +func (m *Value) String() string { return proto.CompactTextString(m) } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{1} +} + +func (*Value) XXX_WellKnownType() string { return "Value" } + +func (m *Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Value.Unmarshal(m, b) +} +func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Value.Marshal(b, m, deterministic) +} +func (m *Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Value.Merge(m, src) +} +func (m *Value) XXX_Size() int { + return xxx_messageInfo_Value.Size(m) +} +func (m *Value) XXX_DiscardUnknown() { + xxx_messageInfo_Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Value proto.InternalMessageInfo + +type isValue_Kind interface { + isValue_Kind() +} + +type Value_NullValue struct { + NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` +} + +type Value_NumberValue struct { + NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,proto3,oneof"` +} + +type Value_StringValue struct { + StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"` +} + +type Value_BoolValue struct { + BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,proto3,oneof"` +} + +type Value_StructValue struct { + StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,proto3,oneof"` +} + +type Value_ListValue struct { + ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,proto3,oneof"` +} + +func (*Value_NullValue) isValue_Kind() {} + +func (*Value_NumberValue) isValue_Kind() {} + +func (*Value_StringValue) isValue_Kind() {} + +func (*Value_BoolValue) isValue_Kind() {} + +func (*Value_StructValue) isValue_Kind() {} + +func (*Value_ListValue) isValue_Kind() {} + +func (m *Value) GetKind() isValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (m *Value) GetNullValue() NullValue { + if x, ok := m.GetKind().(*Value_NullValue); ok { + return x.NullValue + } + return NullValue_NULL_VALUE +} + +func (m *Value) GetNumberValue() float64 { + if x, ok := m.GetKind().(*Value_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (m *Value) GetStringValue() string { + if x, ok := m.GetKind().(*Value_StringValue); ok { + return x.StringValue + } + return "" +} + +func (m *Value) GetBoolValue() bool { + if x, ok := m.GetKind().(*Value_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *Value) GetStructValue() *Struct { + if x, ok := m.GetKind().(*Value_StructValue); ok { + return x.StructValue + } + return nil +} + +func (m *Value) GetListValue() *ListValue { + if x, ok := m.GetKind().(*Value_ListValue); ok { + return x.ListValue + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Value) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Value_NullValue)(nil), + (*Value_NumberValue)(nil), + (*Value_StringValue)(nil), + (*Value_BoolValue)(nil), + (*Value_StructValue)(nil), + (*Value_ListValue)(nil), + } +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +type ListValue struct { + // Repeated field of dynamically typed values. + Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListValue) Reset() { *m = ListValue{} } +func (m *ListValue) String() string { return proto.CompactTextString(m) } +func (*ListValue) ProtoMessage() {} +func (*ListValue) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{2} +} + +func (*ListValue) XXX_WellKnownType() string { return "ListValue" } + +func (m *ListValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListValue.Unmarshal(m, b) +} +func (m *ListValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListValue.Marshal(b, m, deterministic) +} +func (m *ListValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListValue.Merge(m, src) +} +func (m *ListValue) XXX_Size() int { + return xxx_messageInfo_ListValue.Size(m) +} +func (m *ListValue) XXX_DiscardUnknown() { + xxx_messageInfo_ListValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ListValue proto.InternalMessageInfo + +func (m *ListValue) GetValues() []*Value { + if m != nil { + return m.Values + } + return nil +} + +func init() { + proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) + proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") + proto.RegisterMapType((map[string]*Value)(nil), "google.protobuf.Struct.FieldsEntry") + proto.RegisterType((*Value)(nil), "google.protobuf.Value") + proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") +} + +func init() { proto.RegisterFile("google/protobuf/struct.proto", fileDescriptor_df322afd6c9fb402) } + +var fileDescriptor_df322afd6c9fb402 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xc7, 0x3b, 0xc9, 0x36, 0x98, 0x17, 0x59, 0x97, 0x11, 0xb4, 0xac, 0xa2, 0xa1, 0x7b, 0x09, + 0x22, 0x29, 0xd6, 0x8b, 0x18, 0x2f, 0x06, 0xd6, 0x5d, 0x30, 0x2c, 0x31, 0xba, 0x15, 0xbc, 0x94, + 0x26, 0x4d, 0x63, 0xe8, 0x74, 0x26, 0x24, 0x33, 0x4a, 0x8f, 0x7e, 0x0b, 0xcf, 0x1e, 0x3d, 0xfa, + 0xe9, 0x3c, 0xca, 0xcc, 0x24, 0xa9, 0xb4, 0xf4, 0x94, 0xbc, 0xf7, 0x7e, 0xef, 0x3f, 0xef, 0xff, + 0x66, 0xe0, 0x71, 0xc1, 0x58, 0x41, 0xf2, 0x49, 0x55, 0x33, 0xce, 0x52, 0xb1, 0x9a, 0x34, 0xbc, + 0x16, 0x19, 0xf7, 0x55, 0x8c, 0xef, 0xe9, 0xaa, 0xdf, 0x55, 0xc7, 0x3f, 0x11, 0x58, 0x1f, 0x15, + 0x81, 0x03, 0xb0, 0x56, 0x65, 0x4e, 0x96, 0xcd, 0x08, 0xb9, 0xa6, 0xe7, 0x4c, 0x2f, 0xfc, 0x3d, + 0xd8, 0xd7, 0xa0, 0xff, 0x4e, 0x51, 0x97, 0x94, 0xd7, 0xdb, 0xa4, 0x6d, 0x39, 0xff, 0x00, 0xce, + 0x7f, 0x69, 0x7c, 0x06, 0xe6, 0x3a, 0xdf, 0x8e, 0x90, 0x8b, 0x3c, 0x3b, 0x91, 0xbf, 0xf8, 0x39, + 0x0c, 0xbf, 0x2d, 0x88, 0xc8, 0x47, 0x86, 0x8b, 0x3c, 0x67, 0xfa, 0xe0, 0x40, 0x7c, 0x26, 0xab, + 0x89, 0x86, 0x5e, 0x1b, 0xaf, 0xd0, 0xf8, 0x8f, 0x01, 0x43, 0x95, 0xc4, 0x01, 0x00, 0x15, 0x84, + 0xcc, 0xb5, 0x80, 0x14, 0x3d, 0x9d, 0x9e, 0x1f, 0x08, 0xdc, 0x08, 0x42, 0x14, 0x7f, 0x3d, 0x48, + 0x6c, 0xda, 0x05, 0xf8, 0x02, 0xee, 0x52, 0xb1, 0x49, 0xf3, 0x7a, 0xbe, 0x3b, 0x1f, 0x5d, 0x0f, + 0x12, 0x47, 0x67, 0x7b, 0xa8, 0xe1, 0x75, 0x49, 0x8b, 0x16, 0x32, 0xe5, 0xe0, 0x12, 0xd2, 0x59, + 0x0d, 0x3d, 0x05, 0x48, 0x19, 0xeb, 0xc6, 0x38, 0x71, 0x91, 0x77, 0x47, 0x1e, 0x25, 0x73, 0x1a, + 0x78, 0xa3, 0x54, 0x44, 0xc6, 0x5b, 0x64, 0xa8, 0xac, 0x3e, 0x3c, 0xb2, 0xc7, 0x56, 0x5e, 0x64, + 0xbc, 0x77, 0x49, 0xca, 0xa6, 0xeb, 0xb5, 0x54, 0xef, 0xa1, 0xcb, 0xa8, 0x6c, 0x78, 0xef, 0x92, + 0x74, 0x41, 0x68, 0xc1, 0xc9, 0xba, 0xa4, 0xcb, 0x71, 0x00, 0x76, 0x4f, 0x60, 0x1f, 0x2c, 0x25, + 0xd6, 0xdd, 0xe8, 0xb1, 0xa5, 0xb7, 0xd4, 0xb3, 0x47, 0x60, 0xf7, 0x4b, 0xc4, 0xa7, 0x00, 0x37, + 0xb7, 0x51, 0x34, 0x9f, 0xbd, 0x8d, 0x6e, 0x2f, 0xcf, 0x06, 0xe1, 0x0f, 0x04, 0xf7, 0x33, 0xb6, + 0xd9, 0x97, 0x08, 0x1d, 0xed, 0x26, 0x96, 0x71, 0x8c, 0xbe, 0xbc, 0x28, 0x4a, 0xfe, 0x55, 0xa4, + 0x7e, 0xc6, 0x36, 0x93, 0x82, 0x91, 0x05, 0x2d, 0x76, 0x4f, 0xb1, 0xe2, 0xdb, 0x2a, 0x6f, 0xda, + 0x17, 0x19, 0xe8, 0x4f, 0x95, 0xfe, 0x45, 0xe8, 0x97, 0x61, 0x5e, 0xc5, 0xe1, 0x6f, 0xe3, 0xc9, + 0x95, 0x16, 0x8f, 0xbb, 0xf9, 0x3e, 0xe7, 0x84, 0xbc, 0xa7, 0xec, 0x3b, 0xfd, 0x24, 0x3b, 0x53, + 0x4b, 0x49, 0xbd, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x1b, 0x59, 0xf8, 0xe5, 0x02, 0x00, + 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/vendor/github.com/golang/protobuf/ptypes/timestamp.go new file mode 100644 index 000000000..8da0df01a --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp.go @@ -0,0 +1,132 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" + + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *tspb.Timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// Timestamp converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func Timestamp(ts *tspb.Timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *tspb.Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func TimestampProto(t time.Time) (*tspb.Timestamp, error) { + ts := &tspb.Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} + +// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid +// Timestamps, it returns an error message in parentheses. +func TimestampString(ts *tspb.Timestamp) string { + t, err := Timestamp(ts) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return t.Format(time.RFC3339Nano) +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go new file mode 100644 index 000000000..31cd846de --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go @@ -0,0 +1,179 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/timestamp.proto + +package timestamp + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime-- +// ) to obtain a formatter capable of generating timestamps in this format. +// +// +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (m *Timestamp) String() string { return proto.CompactTextString(m) } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { + return fileDescriptor_292007bbfe81227e, []int{0} +} + +func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } + +func (m *Timestamp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Timestamp.Unmarshal(m, b) +} +func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic) +} +func (m *Timestamp) XXX_Merge(src proto.Message) { + xxx_messageInfo_Timestamp.Merge(m, src) +} +func (m *Timestamp) XXX_Size() int { + return xxx_messageInfo_Timestamp.Size(m) +} +func (m *Timestamp) XXX_DiscardUnknown() { + xxx_messageInfo_Timestamp.DiscardUnknown(m) +} + +var xxx_messageInfo_Timestamp proto.InternalMessageInfo + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") +} + +func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) } + +var fileDescriptor_292007bbfe81227e = []byte{ + // 191 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, + 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, + 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, + 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, + 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70, + 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51, + 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, + 0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71, + 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a, + 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43, + 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go b/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go new file mode 100644 index 000000000..add19a1ad --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go @@ -0,0 +1,461 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/wrappers.proto + +package wrappers + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +type DoubleValue struct { + // The double value. + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DoubleValue) Reset() { *m = DoubleValue{} } +func (m *DoubleValue) String() string { return proto.CompactTextString(m) } +func (*DoubleValue) ProtoMessage() {} +func (*DoubleValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{0} +} + +func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" } + +func (m *DoubleValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DoubleValue.Unmarshal(m, b) +} +func (m *DoubleValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DoubleValue.Marshal(b, m, deterministic) +} +func (m *DoubleValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_DoubleValue.Merge(m, src) +} +func (m *DoubleValue) XXX_Size() int { + return xxx_messageInfo_DoubleValue.Size(m) +} +func (m *DoubleValue) XXX_DiscardUnknown() { + xxx_messageInfo_DoubleValue.DiscardUnknown(m) +} + +var xxx_messageInfo_DoubleValue proto.InternalMessageInfo + +func (m *DoubleValue) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +type FloatValue struct { + // The float value. + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FloatValue) Reset() { *m = FloatValue{} } +func (m *FloatValue) String() string { return proto.CompactTextString(m) } +func (*FloatValue) ProtoMessage() {} +func (*FloatValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{1} +} + +func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" } + +func (m *FloatValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FloatValue.Unmarshal(m, b) +} +func (m *FloatValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FloatValue.Marshal(b, m, deterministic) +} +func (m *FloatValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_FloatValue.Merge(m, src) +} +func (m *FloatValue) XXX_Size() int { + return xxx_messageInfo_FloatValue.Size(m) +} +func (m *FloatValue) XXX_DiscardUnknown() { + xxx_messageInfo_FloatValue.DiscardUnknown(m) +} + +var xxx_messageInfo_FloatValue proto.InternalMessageInfo + +func (m *FloatValue) GetValue() float32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +type Int64Value struct { + // The int64 value. + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int64Value) Reset() { *m = Int64Value{} } +func (m *Int64Value) String() string { return proto.CompactTextString(m) } +func (*Int64Value) ProtoMessage() {} +func (*Int64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{2} +} + +func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" } + +func (m *Int64Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Int64Value.Unmarshal(m, b) +} +func (m *Int64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Int64Value.Marshal(b, m, deterministic) +} +func (m *Int64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int64Value.Merge(m, src) +} +func (m *Int64Value) XXX_Size() int { + return xxx_messageInfo_Int64Value.Size(m) +} +func (m *Int64Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int64Value proto.InternalMessageInfo + +func (m *Int64Value) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +type UInt64Value struct { + // The uint64 value. + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt64Value) Reset() { *m = UInt64Value{} } +func (m *UInt64Value) String() string { return proto.CompactTextString(m) } +func (*UInt64Value) ProtoMessage() {} +func (*UInt64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{3} +} + +func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" } + +func (m *UInt64Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UInt64Value.Unmarshal(m, b) +} +func (m *UInt64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UInt64Value.Marshal(b, m, deterministic) +} +func (m *UInt64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt64Value.Merge(m, src) +} +func (m *UInt64Value) XXX_Size() int { + return xxx_messageInfo_UInt64Value.Size(m) +} +func (m *UInt64Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt64Value proto.InternalMessageInfo + +func (m *UInt64Value) GetValue() uint64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +type Int32Value struct { + // The int32 value. + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int32Value) Reset() { *m = Int32Value{} } +func (m *Int32Value) String() string { return proto.CompactTextString(m) } +func (*Int32Value) ProtoMessage() {} +func (*Int32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{4} +} + +func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" } + +func (m *Int32Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Int32Value.Unmarshal(m, b) +} +func (m *Int32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Int32Value.Marshal(b, m, deterministic) +} +func (m *Int32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int32Value.Merge(m, src) +} +func (m *Int32Value) XXX_Size() int { + return xxx_messageInfo_Int32Value.Size(m) +} +func (m *Int32Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int32Value proto.InternalMessageInfo + +func (m *Int32Value) GetValue() int32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +type UInt32Value struct { + // The uint32 value. + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt32Value) Reset() { *m = UInt32Value{} } +func (m *UInt32Value) String() string { return proto.CompactTextString(m) } +func (*UInt32Value) ProtoMessage() {} +func (*UInt32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{5} +} + +func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" } + +func (m *UInt32Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UInt32Value.Unmarshal(m, b) +} +func (m *UInt32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UInt32Value.Marshal(b, m, deterministic) +} +func (m *UInt32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt32Value.Merge(m, src) +} +func (m *UInt32Value) XXX_Size() int { + return xxx_messageInfo_UInt32Value.Size(m) +} +func (m *UInt32Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt32Value proto.InternalMessageInfo + +func (m *UInt32Value) GetValue() uint32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +type BoolValue struct { + // The bool value. + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoolValue) Reset() { *m = BoolValue{} } +func (m *BoolValue) String() string { return proto.CompactTextString(m) } +func (*BoolValue) ProtoMessage() {} +func (*BoolValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{6} +} + +func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" } + +func (m *BoolValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BoolValue.Unmarshal(m, b) +} +func (m *BoolValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BoolValue.Marshal(b, m, deterministic) +} +func (m *BoolValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoolValue.Merge(m, src) +} +func (m *BoolValue) XXX_Size() int { + return xxx_messageInfo_BoolValue.Size(m) +} +func (m *BoolValue) XXX_DiscardUnknown() { + xxx_messageInfo_BoolValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BoolValue proto.InternalMessageInfo + +func (m *BoolValue) GetValue() bool { + if m != nil { + return m.Value + } + return false +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +type StringValue struct { + // The string value. + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StringValue) Reset() { *m = StringValue{} } +func (m *StringValue) String() string { return proto.CompactTextString(m) } +func (*StringValue) ProtoMessage() {} +func (*StringValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{7} +} + +func (*StringValue) XXX_WellKnownType() string { return "StringValue" } + +func (m *StringValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StringValue.Unmarshal(m, b) +} +func (m *StringValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StringValue.Marshal(b, m, deterministic) +} +func (m *StringValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_StringValue.Merge(m, src) +} +func (m *StringValue) XXX_Size() int { + return xxx_messageInfo_StringValue.Size(m) +} +func (m *StringValue) XXX_DiscardUnknown() { + xxx_messageInfo_StringValue.DiscardUnknown(m) +} + +var xxx_messageInfo_StringValue proto.InternalMessageInfo + +func (m *StringValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +type BytesValue struct { + // The bytes value. + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BytesValue) Reset() { *m = BytesValue{} } +func (m *BytesValue) String() string { return proto.CompactTextString(m) } +func (*BytesValue) ProtoMessage() {} +func (*BytesValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{8} +} + +func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" } + +func (m *BytesValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BytesValue.Unmarshal(m, b) +} +func (m *BytesValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BytesValue.Marshal(b, m, deterministic) +} +func (m *BytesValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BytesValue.Merge(m, src) +} +func (m *BytesValue) XXX_Size() int { + return xxx_messageInfo_BytesValue.Size(m) +} +func (m *BytesValue) XXX_DiscardUnknown() { + xxx_messageInfo_BytesValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BytesValue proto.InternalMessageInfo + +func (m *BytesValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") + proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") + proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") + proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") + proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") + proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") + proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") + proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") + proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") +} + +func init() { proto.RegisterFile("google/protobuf/wrappers.proto", fileDescriptor_5377b62bda767935) } + +var fileDescriptor_5377b62bda767935 = []byte{ + // 259 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x2f, 0x4a, 0x2c, + 0x28, 0x48, 0x2d, 0x2a, 0xd6, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0xca, + 0x5c, 0xdc, 0x2e, 0xf9, 0xa5, 0x49, 0x39, 0xa9, 0x61, 0x89, 0x39, 0xa5, 0xa9, 0x42, 0x22, 0x5c, + 0xac, 0x65, 0x20, 0x86, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x63, 0x10, 0x84, 0xa3, 0xa4, 0xc4, 0xc5, + 0xe5, 0x96, 0x93, 0x9f, 0x58, 0x82, 0x45, 0x0d, 0x13, 0x92, 0x1a, 0xcf, 0xbc, 0x12, 0x33, 0x13, + 0x2c, 0x6a, 0x98, 0x61, 0x6a, 0x94, 0xb9, 0xb8, 0x43, 0x71, 0x29, 0x62, 0x41, 0x35, 0xc8, 0xd8, + 0x08, 0x8b, 0x1a, 0x56, 0x34, 0x83, 0xb0, 0x2a, 0xe2, 0x85, 0x29, 0x52, 0xe4, 0xe2, 0x74, 0xca, + 0xcf, 0xcf, 0xc1, 0xa2, 0x84, 0x03, 0xc9, 0x9c, 0xe0, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x2c, 0x8a, + 0x38, 0x91, 0x1c, 0xe4, 0x54, 0x59, 0x92, 0x5a, 0x8c, 0x45, 0x0d, 0x0f, 0x54, 0x8d, 0x53, 0x0d, + 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x5a, 0xe8, 0x3a, 0xf1, 0x86, 0x43, 0x83, 0x3f, 0x00, 0x24, + 0x12, 0xc0, 0x18, 0xa5, 0x95, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x9f, + 0x9e, 0x9f, 0x93, 0x98, 0x97, 0x8e, 0x88, 0xaa, 0x82, 0x92, 0xca, 0x82, 0xd4, 0x62, 0x78, 0x8c, + 0xfd, 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, + 0x00, 0x54, 0xa9, 0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, + 0x12, 0x1b, 0xd8, 0x0c, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x6c, 0xb9, 0xb8, 0xfe, + 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/google/go-cmp/LICENSE b/vendor/github.com/google/go-cmp/LICENSE new file mode 100644 index 000000000..32017f8fa --- /dev/null +++ b/vendor/github.com/google/go-cmp/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2017 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go new file mode 100644 index 000000000..c9a63ceda --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/compare.go @@ -0,0 +1,655 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package cmp determines equality of values. +// +// This package is intended to be a more powerful and safer alternative to +// reflect.DeepEqual for comparing whether two values are semantically equal. +// +// The primary features of cmp are: +// +// • When the default behavior of equality does not suit the needs of the test, +// custom equality functions can override the equality operation. +// For example, an equality function may report floats as equal so long as they +// are within some tolerance of each other. +// +// • Types that have an Equal method may use that method to determine equality. +// This allows package authors to determine the equality operation for the types +// that they define. +// +// • If no custom equality functions are used and no Equal method is defined, +// equality is determined by recursively comparing the primitive kinds on both +// values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, unexported +// fields are not compared by default; they result in panics unless suppressed +// by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly +// compared using the Exporter option. +package cmp + +import ( + "fmt" + "reflect" + "strings" + + "github.com/google/go-cmp/cmp/internal/diff" + "github.com/google/go-cmp/cmp/internal/flags" + "github.com/google/go-cmp/cmp/internal/function" + "github.com/google/go-cmp/cmp/internal/value" +) + +// Equal reports whether x and y are equal by recursively applying the +// following rules in the given order to x and y and all of their sub-values: +// +// • Let S be the set of all Ignore, Transformer, and Comparer options that +// remain after applying all path filters, value filters, and type filters. +// If at least one Ignore exists in S, then the comparison is ignored. +// If the number of Transformer and Comparer options in S is greater than one, +// then Equal panics because it is ambiguous which option to use. +// If S contains a single Transformer, then use that to transform the current +// values and recursively call Equal on the output values. +// If S contains a single Comparer, then use that to compare the current values. +// Otherwise, evaluation proceeds to the next rule. +// +// • If the values have an Equal method of the form "(T) Equal(T) bool" or +// "(T) Equal(I) bool" where T is assignable to I, then use the result of +// x.Equal(y) even if x or y is nil. Otherwise, no such method exists and +// evaluation proceeds to the next rule. +// +// • Lastly, try to compare x and y based on their basic kinds. +// Simple kinds like booleans, integers, floats, complex numbers, strings, and +// channels are compared using the equivalent of the == operator in Go. +// Functions are only equal if they are both nil, otherwise they are unequal. +// +// Structs are equal if recursively calling Equal on all fields report equal. +// If a struct contains unexported fields, Equal panics unless an Ignore option +// (e.g., cmpopts.IgnoreUnexported) ignores that field or the Exporter option +// explicitly permits comparing the unexported field. +// +// Slices are equal if they are both nil or both non-nil, where recursively +// calling Equal on all non-ignored slice or array elements report equal. +// Empty non-nil slices and nil slices are not equal; to equate empty slices, +// consider using cmpopts.EquateEmpty. +// +// Maps are equal if they are both nil or both non-nil, where recursively +// calling Equal on all non-ignored map entries report equal. +// Map keys are equal according to the == operator. +// To use custom comparisons for map keys, consider using cmpopts.SortMaps. +// Empty non-nil maps and nil maps are not equal; to equate empty maps, +// consider using cmpopts.EquateEmpty. +// +// Pointers and interfaces are equal if they are both nil or both non-nil, +// where they have the same underlying concrete type and recursively +// calling Equal on the underlying values reports equal. +// +// Before recursing into a pointer, slice element, or map, the current path +// is checked to detect whether the address has already been visited. +// If there is a cycle, then the pointed at values are considered equal +// only if both addresses were previously visited in the same path step. +func Equal(x, y interface{}, opts ...Option) bool { + vx := reflect.ValueOf(x) + vy := reflect.ValueOf(y) + + // If the inputs are different types, auto-wrap them in an empty interface + // so that they have the same parent type. + var t reflect.Type + if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() { + t = reflect.TypeOf((*interface{})(nil)).Elem() + if vx.IsValid() { + vvx := reflect.New(t).Elem() + vvx.Set(vx) + vx = vvx + } + if vy.IsValid() { + vvy := reflect.New(t).Elem() + vvy.Set(vy) + vy = vvy + } + } else { + t = vx.Type() + } + + s := newState(opts) + s.compareAny(&pathStep{t, vx, vy}) + return s.result.Equal() +} + +// Diff returns a human-readable report of the differences between two values. +// It returns an empty string if and only if Equal returns true for the same +// input values and options. +// +// The output is displayed as a literal in pseudo-Go syntax. +// At the start of each line, a "-" prefix indicates an element removed from x, +// a "+" prefix to indicates an element added to y, and the lack of a prefix +// indicates an element common to both x and y. If possible, the output +// uses fmt.Stringer.String or error.Error methods to produce more humanly +// readable outputs. In such cases, the string is prefixed with either an +// 's' or 'e' character, respectively, to indicate that the method was called. +// +// Do not depend on this output being stable. If you need the ability to +// programmatically interpret the difference, consider using a custom Reporter. +func Diff(x, y interface{}, opts ...Option) string { + r := new(defaultReporter) + eq := Equal(x, y, Options(opts), Reporter(r)) + d := r.String() + if (d == "") != eq { + panic("inconsistent difference and equality results") + } + return d +} + +type state struct { + // These fields represent the "comparison state". + // Calling statelessCompare must not result in observable changes to these. + result diff.Result // The current result of comparison + curPath Path // The current path in the value tree + curPtrs pointerPath // The current set of visited pointers + reporters []reporter // Optional reporters + + // recChecker checks for infinite cycles applying the same set of + // transformers upon the output of itself. + recChecker recChecker + + // dynChecker triggers pseudo-random checks for option correctness. + // It is safe for statelessCompare to mutate this value. + dynChecker dynChecker + + // These fields, once set by processOption, will not change. + exporters []exporter // List of exporters for structs with unexported fields + opts Options // List of all fundamental and filter options +} + +func newState(opts []Option) *state { + // Always ensure a validator option exists to validate the inputs. + s := &state{opts: Options{validator{}}} + s.curPtrs.Init() + s.processOption(Options(opts)) + return s +} + +func (s *state) processOption(opt Option) { + switch opt := opt.(type) { + case nil: + case Options: + for _, o := range opt { + s.processOption(o) + } + case coreOption: + type filtered interface { + isFiltered() bool + } + if fopt, ok := opt.(filtered); ok && !fopt.isFiltered() { + panic(fmt.Sprintf("cannot use an unfiltered option: %v", opt)) + } + s.opts = append(s.opts, opt) + case exporter: + s.exporters = append(s.exporters, opt) + case reporter: + s.reporters = append(s.reporters, opt) + default: + panic(fmt.Sprintf("unknown option %T", opt)) + } +} + +// statelessCompare compares two values and returns the result. +// This function is stateless in that it does not alter the current result, +// or output to any registered reporters. +func (s *state) statelessCompare(step PathStep) diff.Result { + // We do not save and restore curPath and curPtrs because all of the + // compareX methods should properly push and pop from them. + // It is an implementation bug if the contents of the paths differ from + // when calling this function to when returning from it. + + oldResult, oldReporters := s.result, s.reporters + s.result = diff.Result{} // Reset result + s.reporters = nil // Remove reporters to avoid spurious printouts + s.compareAny(step) + res := s.result + s.result, s.reporters = oldResult, oldReporters + return res +} + +func (s *state) compareAny(step PathStep) { + // Update the path stack. + s.curPath.push(step) + defer s.curPath.pop() + for _, r := range s.reporters { + r.PushStep(step) + defer r.PopStep() + } + s.recChecker.Check(s.curPath) + + // Cycle-detection for slice elements (see NOTE in compareSlice). + t := step.Type() + vx, vy := step.Values() + if si, ok := step.(SliceIndex); ok && si.isSlice && vx.IsValid() && vy.IsValid() { + px, py := vx.Addr(), vy.Addr() + if eq, visited := s.curPtrs.Push(px, py); visited { + s.report(eq, reportByCycle) + return + } + defer s.curPtrs.Pop(px, py) + } + + // Rule 1: Check whether an option applies on this node in the value tree. + if s.tryOptions(t, vx, vy) { + return + } + + // Rule 2: Check whether the type has a valid Equal method. + if s.tryMethod(t, vx, vy) { + return + } + + // Rule 3: Compare based on the underlying kind. + switch t.Kind() { + case reflect.Bool: + s.report(vx.Bool() == vy.Bool(), 0) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + s.report(vx.Int() == vy.Int(), 0) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + s.report(vx.Uint() == vy.Uint(), 0) + case reflect.Float32, reflect.Float64: + s.report(vx.Float() == vy.Float(), 0) + case reflect.Complex64, reflect.Complex128: + s.report(vx.Complex() == vy.Complex(), 0) + case reflect.String: + s.report(vx.String() == vy.String(), 0) + case reflect.Chan, reflect.UnsafePointer: + s.report(vx.Pointer() == vy.Pointer(), 0) + case reflect.Func: + s.report(vx.IsNil() && vy.IsNil(), 0) + case reflect.Struct: + s.compareStruct(t, vx, vy) + case reflect.Slice, reflect.Array: + s.compareSlice(t, vx, vy) + case reflect.Map: + s.compareMap(t, vx, vy) + case reflect.Ptr: + s.comparePtr(t, vx, vy) + case reflect.Interface: + s.compareInterface(t, vx, vy) + default: + panic(fmt.Sprintf("%v kind not handled", t.Kind())) + } +} + +func (s *state) tryOptions(t reflect.Type, vx, vy reflect.Value) bool { + // Evaluate all filters and apply the remaining options. + if opt := s.opts.filter(s, t, vx, vy); opt != nil { + opt.apply(s, vx, vy) + return true + } + return false +} + +func (s *state) tryMethod(t reflect.Type, vx, vy reflect.Value) bool { + // Check if this type even has an Equal method. + m, ok := t.MethodByName("Equal") + if !ok || !function.IsType(m.Type, function.EqualAssignable) { + return false + } + + eq := s.callTTBFunc(m.Func, vx, vy) + s.report(eq, reportByMethod) + return true +} + +func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value { + v = sanitizeValue(v, f.Type().In(0)) + if !s.dynChecker.Next() { + return f.Call([]reflect.Value{v})[0] + } + + // Run the function twice and ensure that we get the same results back. + // We run in goroutines so that the race detector (if enabled) can detect + // unsafe mutations to the input. + c := make(chan reflect.Value) + go detectRaces(c, f, v) + got := <-c + want := f.Call([]reflect.Value{v})[0] + if step.vx, step.vy = got, want; !s.statelessCompare(step).Equal() { + // To avoid false-positives with non-reflexive equality operations, + // we sanity check whether a value is equal to itself. + if step.vx, step.vy = want, want; !s.statelessCompare(step).Equal() { + return want + } + panic(fmt.Sprintf("non-deterministic function detected: %s", function.NameOf(f))) + } + return want +} + +func (s *state) callTTBFunc(f, x, y reflect.Value) bool { + x = sanitizeValue(x, f.Type().In(0)) + y = sanitizeValue(y, f.Type().In(1)) + if !s.dynChecker.Next() { + return f.Call([]reflect.Value{x, y})[0].Bool() + } + + // Swapping the input arguments is sufficient to check that + // f is symmetric and deterministic. + // We run in goroutines so that the race detector (if enabled) can detect + // unsafe mutations to the input. + c := make(chan reflect.Value) + go detectRaces(c, f, y, x) + got := <-c + want := f.Call([]reflect.Value{x, y})[0].Bool() + if !got.IsValid() || got.Bool() != want { + panic(fmt.Sprintf("non-deterministic or non-symmetric function detected: %s", function.NameOf(f))) + } + return want +} + +func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) { + var ret reflect.Value + defer func() { + recover() // Ignore panics, let the other call to f panic instead + c <- ret + }() + ret = f.Call(vs)[0] +} + +// sanitizeValue converts nil interfaces of type T to those of type R, +// assuming that T is assignable to R. +// Otherwise, it returns the input value as is. +func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value { + // TODO(dsnet): Workaround for reflect bug (https://golang.org/issue/22143). + if !flags.AtLeastGo110 { + if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t { + return reflect.New(t).Elem() + } + } + return v +} + +func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) { + var vax, vay reflect.Value // Addressable versions of vx and vy + + var mayForce, mayForceInit bool + step := StructField{&structField{}} + for i := 0; i < t.NumField(); i++ { + step.typ = t.Field(i).Type + step.vx = vx.Field(i) + step.vy = vy.Field(i) + step.name = t.Field(i).Name + step.idx = i + step.unexported = !isExported(step.name) + if step.unexported { + if step.name == "_" { + continue + } + // Defer checking of unexported fields until later to give an + // Ignore a chance to ignore the field. + if !vax.IsValid() || !vay.IsValid() { + // For retrieveUnexportedField to work, the parent struct must + // be addressable. Create a new copy of the values if + // necessary to make them addressable. + vax = makeAddressable(vx) + vay = makeAddressable(vy) + } + if !mayForceInit { + for _, xf := range s.exporters { + mayForce = mayForce || xf(t) + } + mayForceInit = true + } + step.mayForce = mayForce + step.pvx = vax + step.pvy = vay + step.field = t.Field(i) + } + s.compareAny(step) + } +} + +func (s *state) compareSlice(t reflect.Type, vx, vy reflect.Value) { + isSlice := t.Kind() == reflect.Slice + if isSlice && (vx.IsNil() || vy.IsNil()) { + s.report(vx.IsNil() && vy.IsNil(), 0) + return + } + + // NOTE: It is incorrect to call curPtrs.Push on the slice header pointer + // since slices represents a list of pointers, rather than a single pointer. + // The pointer checking logic must be handled on a per-element basis + // in compareAny. + // + // A slice header (see reflect.SliceHeader) in Go is a tuple of a starting + // pointer P, a length N, and a capacity C. Supposing each slice element has + // a memory size of M, then the slice is equivalent to the list of pointers: + // [P+i*M for i in range(N)] + // + // For example, v[:0] and v[:1] are slices with the same starting pointer, + // but they are clearly different values. Using the slice pointer alone + // violates the assumption that equal pointers implies equal values. + + step := SliceIndex{&sliceIndex{pathStep: pathStep{typ: t.Elem()}, isSlice: isSlice}} + withIndexes := func(ix, iy int) SliceIndex { + if ix >= 0 { + step.vx, step.xkey = vx.Index(ix), ix + } else { + step.vx, step.xkey = reflect.Value{}, -1 + } + if iy >= 0 { + step.vy, step.ykey = vy.Index(iy), iy + } else { + step.vy, step.ykey = reflect.Value{}, -1 + } + return step + } + + // Ignore options are able to ignore missing elements in a slice. + // However, detecting these reliably requires an optimal differencing + // algorithm, for which diff.Difference is not. + // + // Instead, we first iterate through both slices to detect which elements + // would be ignored if standing alone. The index of non-discarded elements + // are stored in a separate slice, which diffing is then performed on. + var indexesX, indexesY []int + var ignoredX, ignoredY []bool + for ix := 0; ix < vx.Len(); ix++ { + ignored := s.statelessCompare(withIndexes(ix, -1)).NumDiff == 0 + if !ignored { + indexesX = append(indexesX, ix) + } + ignoredX = append(ignoredX, ignored) + } + for iy := 0; iy < vy.Len(); iy++ { + ignored := s.statelessCompare(withIndexes(-1, iy)).NumDiff == 0 + if !ignored { + indexesY = append(indexesY, iy) + } + ignoredY = append(ignoredY, ignored) + } + + // Compute an edit-script for slices vx and vy (excluding ignored elements). + edits := diff.Difference(len(indexesX), len(indexesY), func(ix, iy int) diff.Result { + return s.statelessCompare(withIndexes(indexesX[ix], indexesY[iy])) + }) + + // Replay the ignore-scripts and the edit-script. + var ix, iy int + for ix < vx.Len() || iy < vy.Len() { + var e diff.EditType + switch { + case ix < len(ignoredX) && ignoredX[ix]: + e = diff.UniqueX + case iy < len(ignoredY) && ignoredY[iy]: + e = diff.UniqueY + default: + e, edits = edits[0], edits[1:] + } + switch e { + case diff.UniqueX: + s.compareAny(withIndexes(ix, -1)) + ix++ + case diff.UniqueY: + s.compareAny(withIndexes(-1, iy)) + iy++ + default: + s.compareAny(withIndexes(ix, iy)) + ix++ + iy++ + } + } +} + +func (s *state) compareMap(t reflect.Type, vx, vy reflect.Value) { + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), 0) + return + } + + // Cycle-detection for maps. + if eq, visited := s.curPtrs.Push(vx, vy); visited { + s.report(eq, reportByCycle) + return + } + defer s.curPtrs.Pop(vx, vy) + + // We combine and sort the two map keys so that we can perform the + // comparisons in a deterministic order. + step := MapIndex{&mapIndex{pathStep: pathStep{typ: t.Elem()}}} + for _, k := range value.SortKeys(append(vx.MapKeys(), vy.MapKeys()...)) { + step.vx = vx.MapIndex(k) + step.vy = vy.MapIndex(k) + step.key = k + if !step.vx.IsValid() && !step.vy.IsValid() { + // It is possible for both vx and vy to be invalid if the + // key contained a NaN value in it. + // + // Even with the ability to retrieve NaN keys in Go 1.12, + // there still isn't a sensible way to compare the values since + // a NaN key may map to multiple unordered values. + // The most reasonable way to compare NaNs would be to compare the + // set of values. However, this is impossible to do efficiently + // since set equality is provably an O(n^2) operation given only + // an Equal function. If we had a Less function or Hash function, + // this could be done in O(n*log(n)) or O(n), respectively. + // + // Rather than adding complex logic to deal with NaNs, make it + // the user's responsibility to compare such obscure maps. + const help = "consider providing a Comparer to compare the map" + panic(fmt.Sprintf("%#v has map key with NaNs\n%s", s.curPath, help)) + } + s.compareAny(step) + } +} + +func (s *state) comparePtr(t reflect.Type, vx, vy reflect.Value) { + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), 0) + return + } + + // Cycle-detection for pointers. + if eq, visited := s.curPtrs.Push(vx, vy); visited { + s.report(eq, reportByCycle) + return + } + defer s.curPtrs.Pop(vx, vy) + + vx, vy = vx.Elem(), vy.Elem() + s.compareAny(Indirect{&indirect{pathStep{t.Elem(), vx, vy}}}) +} + +func (s *state) compareInterface(t reflect.Type, vx, vy reflect.Value) { + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), 0) + return + } + vx, vy = vx.Elem(), vy.Elem() + if vx.Type() != vy.Type() { + s.report(false, 0) + return + } + s.compareAny(TypeAssertion{&typeAssertion{pathStep{vx.Type(), vx, vy}}}) +} + +func (s *state) report(eq bool, rf resultFlags) { + if rf&reportByIgnore == 0 { + if eq { + s.result.NumSame++ + rf |= reportEqual + } else { + s.result.NumDiff++ + rf |= reportUnequal + } + } + for _, r := range s.reporters { + r.Report(Result{flags: rf}) + } +} + +// recChecker tracks the state needed to periodically perform checks that +// user provided transformers are not stuck in an infinitely recursive cycle. +type recChecker struct{ next int } + +// Check scans the Path for any recursive transformers and panics when any +// recursive transformers are detected. Note that the presence of a +// recursive Transformer does not necessarily imply an infinite cycle. +// As such, this check only activates after some minimal number of path steps. +func (rc *recChecker) Check(p Path) { + const minLen = 1 << 16 + if rc.next == 0 { + rc.next = minLen + } + if len(p) < rc.next { + return + } + rc.next <<= 1 + + // Check whether the same transformer has appeared at least twice. + var ss []string + m := map[Option]int{} + for _, ps := range p { + if t, ok := ps.(Transform); ok { + t := t.Option() + if m[t] == 1 { // Transformer was used exactly once before + tf := t.(*transformer).fnc.Type() + ss = append(ss, fmt.Sprintf("%v: %v => %v", t, tf.In(0), tf.Out(0))) + } + m[t]++ + } + } + if len(ss) > 0 { + const warning = "recursive set of Transformers detected" + const help = "consider using cmpopts.AcyclicTransformer" + set := strings.Join(ss, "\n\t") + panic(fmt.Sprintf("%s:\n\t%s\n%s", warning, set, help)) + } +} + +// dynChecker tracks the state needed to periodically perform checks that +// user provided functions are symmetric and deterministic. +// The zero value is safe for immediate use. +type dynChecker struct{ curr, next int } + +// Next increments the state and reports whether a check should be performed. +// +// Checks occur every Nth function call, where N is a triangular number: +// 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 ... +// See https://en.wikipedia.org/wiki/Triangular_number +// +// This sequence ensures that the cost of checks drops significantly as +// the number of functions calls grows larger. +func (dc *dynChecker) Next() bool { + ok := dc.curr == dc.next + if ok { + dc.curr = 0 + dc.next++ + } + dc.curr++ + return ok +} + +// makeAddressable returns a value that is always addressable. +// It returns the input verbatim if it is already addressable, +// otherwise it creates a new value and returns an addressable copy. +func makeAddressable(v reflect.Value) reflect.Value { + if v.CanAddr() { + return v + } + vc := reflect.New(v.Type()).Elem() + vc.Set(v) + return vc +} diff --git a/vendor/github.com/google/go-cmp/cmp/export_panic.go b/vendor/github.com/google/go-cmp/cmp/export_panic.go new file mode 100644 index 000000000..dd032354f --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/export_panic.go @@ -0,0 +1,15 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build purego + +package cmp + +import "reflect" + +const supportExporters = false + +func retrieveUnexportedField(reflect.Value, reflect.StructField) reflect.Value { + panic("no support for forcibly accessing unexported fields") +} diff --git a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go new file mode 100644 index 000000000..57020e26c --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go @@ -0,0 +1,25 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !purego + +package cmp + +import ( + "reflect" + "unsafe" +) + +const supportExporters = true + +// retrieveUnexportedField uses unsafe to forcibly retrieve any field from +// a struct such that the value has read-write permissions. +// +// The parent struct, v, must be addressable, while f must be a StructField +// describing the field to retrieve. +func retrieveUnexportedField(v reflect.Value, f reflect.StructField) reflect.Value { + // See https://github.com/google/go-cmp/issues/167 for discussion of the + // following expression. + return reflect.NewAt(f.Type, unsafe.Pointer(uintptr(unsafe.Pointer(v.UnsafeAddr()))+f.Offset)).Elem() +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go new file mode 100644 index 000000000..fe98dcc67 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go @@ -0,0 +1,17 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !cmp_debug + +package diff + +var debug debugger + +type debugger struct{} + +func (debugger) Begin(_, _ int, f EqualFunc, _, _ *EditScript) EqualFunc { + return f +} +func (debugger) Update() {} +func (debugger) Finish() {} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go new file mode 100644 index 000000000..597b6ae56 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go @@ -0,0 +1,122 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build cmp_debug + +package diff + +import ( + "fmt" + "strings" + "sync" + "time" +) + +// The algorithm can be seen running in real-time by enabling debugging: +// go test -tags=cmp_debug -v +// +// Example output: +// === RUN TestDifference/#34 +// ┌───────────────────────────────┐ +// │ \ · · · · · · · · · · · · · · │ +// │ · # · · · · · · · · · · · · · │ +// │ · \ · · · · · · · · · · · · · │ +// │ · · \ · · · · · · · · · · · · │ +// │ · · · X # · · · · · · · · · · │ +// │ · · · # \ · · · · · · · · · · │ +// │ · · · · · # # · · · · · · · · │ +// │ · · · · · # \ · · · · · · · · │ +// │ · · · · · · · \ · · · · · · · │ +// │ · · · · · · · · \ · · · · · · │ +// │ · · · · · · · · · \ · · · · · │ +// │ · · · · · · · · · · \ · · # · │ +// │ · · · · · · · · · · · \ # # · │ +// │ · · · · · · · · · · · # # # · │ +// │ · · · · · · · · · · # # # # · │ +// │ · · · · · · · · · # # # # # · │ +// │ · · · · · · · · · · · · · · \ │ +// └───────────────────────────────┘ +// [.Y..M.XY......YXYXY.|] +// +// The grid represents the edit-graph where the horizontal axis represents +// list X and the vertical axis represents list Y. The start of the two lists +// is the top-left, while the ends are the bottom-right. The '·' represents +// an unexplored node in the graph. The '\' indicates that the two symbols +// from list X and Y are equal. The 'X' indicates that two symbols are similar +// (but not exactly equal) to each other. The '#' indicates that the two symbols +// are different (and not similar). The algorithm traverses this graph trying to +// make the paths starting in the top-left and the bottom-right connect. +// +// The series of '.', 'X', 'Y', and 'M' characters at the bottom represents +// the currently established path from the forward and reverse searches, +// separated by a '|' character. + +const ( + updateDelay = 100 * time.Millisecond + finishDelay = 500 * time.Millisecond + ansiTerminal = true // ANSI escape codes used to move terminal cursor +) + +var debug debugger + +type debugger struct { + sync.Mutex + p1, p2 EditScript + fwdPath, revPath *EditScript + grid []byte + lines int +} + +func (dbg *debugger) Begin(nx, ny int, f EqualFunc, p1, p2 *EditScript) EqualFunc { + dbg.Lock() + dbg.fwdPath, dbg.revPath = p1, p2 + top := "┌─" + strings.Repeat("──", nx) + "┐\n" + row := "│ " + strings.Repeat("· ", nx) + "│\n" + btm := "└─" + strings.Repeat("──", nx) + "┘\n" + dbg.grid = []byte(top + strings.Repeat(row, ny) + btm) + dbg.lines = strings.Count(dbg.String(), "\n") + fmt.Print(dbg) + + // Wrap the EqualFunc so that we can intercept each result. + return func(ix, iy int) (r Result) { + cell := dbg.grid[len(top)+iy*len(row):][len("│ ")+len("· ")*ix:][:len("·")] + for i := range cell { + cell[i] = 0 // Zero out the multiple bytes of UTF-8 middle-dot + } + switch r = f(ix, iy); { + case r.Equal(): + cell[0] = '\\' + case r.Similar(): + cell[0] = 'X' + default: + cell[0] = '#' + } + return + } +} + +func (dbg *debugger) Update() { + dbg.print(updateDelay) +} + +func (dbg *debugger) Finish() { + dbg.print(finishDelay) + dbg.Unlock() +} + +func (dbg *debugger) String() string { + dbg.p1, dbg.p2 = *dbg.fwdPath, dbg.p2[:0] + for i := len(*dbg.revPath) - 1; i >= 0; i-- { + dbg.p2 = append(dbg.p2, (*dbg.revPath)[i]) + } + return fmt.Sprintf("%s[%v|%v]\n\n", dbg.grid, dbg.p1, dbg.p2) +} + +func (dbg *debugger) print(d time.Duration) { + if ansiTerminal { + fmt.Printf("\x1b[%dA", dbg.lines) // Reset terminal cursor + } + fmt.Print(dbg) + time.Sleep(d) +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go new file mode 100644 index 000000000..3d2e42662 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go @@ -0,0 +1,372 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package diff implements an algorithm for producing edit-scripts. +// The edit-script is a sequence of operations needed to transform one list +// of symbols into another (or vice-versa). The edits allowed are insertions, +// deletions, and modifications. The summation of all edits is called the +// Levenshtein distance as this problem is well-known in computer science. +// +// This package prioritizes performance over accuracy. That is, the run time +// is more important than obtaining a minimal Levenshtein distance. +package diff + +// EditType represents a single operation within an edit-script. +type EditType uint8 + +const ( + // Identity indicates that a symbol pair is identical in both list X and Y. + Identity EditType = iota + // UniqueX indicates that a symbol only exists in X and not Y. + UniqueX + // UniqueY indicates that a symbol only exists in Y and not X. + UniqueY + // Modified indicates that a symbol pair is a modification of each other. + Modified +) + +// EditScript represents the series of differences between two lists. +type EditScript []EditType + +// String returns a human-readable string representing the edit-script where +// Identity, UniqueX, UniqueY, and Modified are represented by the +// '.', 'X', 'Y', and 'M' characters, respectively. +func (es EditScript) String() string { + b := make([]byte, len(es)) + for i, e := range es { + switch e { + case Identity: + b[i] = '.' + case UniqueX: + b[i] = 'X' + case UniqueY: + b[i] = 'Y' + case Modified: + b[i] = 'M' + default: + panic("invalid edit-type") + } + } + return string(b) +} + +// stats returns a histogram of the number of each type of edit operation. +func (es EditScript) stats() (s struct{ NI, NX, NY, NM int }) { + for _, e := range es { + switch e { + case Identity: + s.NI++ + case UniqueX: + s.NX++ + case UniqueY: + s.NY++ + case Modified: + s.NM++ + default: + panic("invalid edit-type") + } + } + return +} + +// Dist is the Levenshtein distance and is guaranteed to be 0 if and only if +// lists X and Y are equal. +func (es EditScript) Dist() int { return len(es) - es.stats().NI } + +// LenX is the length of the X list. +func (es EditScript) LenX() int { return len(es) - es.stats().NY } + +// LenY is the length of the Y list. +func (es EditScript) LenY() int { return len(es) - es.stats().NX } + +// EqualFunc reports whether the symbols at indexes ix and iy are equal. +// When called by Difference, the index is guaranteed to be within nx and ny. +type EqualFunc func(ix int, iy int) Result + +// Result is the result of comparison. +// NumSame is the number of sub-elements that are equal. +// NumDiff is the number of sub-elements that are not equal. +type Result struct{ NumSame, NumDiff int } + +// BoolResult returns a Result that is either Equal or not Equal. +func BoolResult(b bool) Result { + if b { + return Result{NumSame: 1} // Equal, Similar + } else { + return Result{NumDiff: 2} // Not Equal, not Similar + } +} + +// Equal indicates whether the symbols are equal. Two symbols are equal +// if and only if NumDiff == 0. If Equal, then they are also Similar. +func (r Result) Equal() bool { return r.NumDiff == 0 } + +// Similar indicates whether two symbols are similar and may be represented +// by using the Modified type. As a special case, we consider binary comparisons +// (i.e., those that return Result{1, 0} or Result{0, 1}) to be similar. +// +// The exact ratio of NumSame to NumDiff to determine similarity may change. +func (r Result) Similar() bool { + // Use NumSame+1 to offset NumSame so that binary comparisons are similar. + return r.NumSame+1 >= r.NumDiff +} + +// Difference reports whether two lists of lengths nx and ny are equal +// given the definition of equality provided as f. +// +// This function returns an edit-script, which is a sequence of operations +// needed to convert one list into the other. The following invariants for +// the edit-script are maintained: +// • eq == (es.Dist()==0) +// • nx == es.LenX() +// • ny == es.LenY() +// +// This algorithm is not guaranteed to be an optimal solution (i.e., one that +// produces an edit-script with a minimal Levenshtein distance). This algorithm +// favors performance over optimality. The exact output is not guaranteed to +// be stable and may change over time. +func Difference(nx, ny int, f EqualFunc) (es EditScript) { + // This algorithm is based on traversing what is known as an "edit-graph". + // See Figure 1 from "An O(ND) Difference Algorithm and Its Variations" + // by Eugene W. Myers. Since D can be as large as N itself, this is + // effectively O(N^2). Unlike the algorithm from that paper, we are not + // interested in the optimal path, but at least some "decent" path. + // + // For example, let X and Y be lists of symbols: + // X = [A B C A B B A] + // Y = [C B A B A C] + // + // The edit-graph can be drawn as the following: + // A B C A B B A + // ┌─────────────┐ + // C │_|_|\|_|_|_|_│ 0 + // B │_|\|_|_|\|\|_│ 1 + // A │\|_|_|\|_|_|\│ 2 + // B │_|\|_|_|\|\|_│ 3 + // A │\|_|_|\|_|_|\│ 4 + // C │ | |\| | | | │ 5 + // └─────────────┘ 6 + // 0 1 2 3 4 5 6 7 + // + // List X is written along the horizontal axis, while list Y is written + // along the vertical axis. At any point on this grid, if the symbol in + // list X matches the corresponding symbol in list Y, then a '\' is drawn. + // The goal of any minimal edit-script algorithm is to find a path from the + // top-left corner to the bottom-right corner, while traveling through the + // fewest horizontal or vertical edges. + // A horizontal edge is equivalent to inserting a symbol from list X. + // A vertical edge is equivalent to inserting a symbol from list Y. + // A diagonal edge is equivalent to a matching symbol between both X and Y. + + // Invariants: + // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx + // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny + // + // In general: + // • fwdFrontier.X < revFrontier.X + // • fwdFrontier.Y < revFrontier.Y + // Unless, it is time for the algorithm to terminate. + fwdPath := path{+1, point{0, 0}, make(EditScript, 0, (nx+ny)/2)} + revPath := path{-1, point{nx, ny}, make(EditScript, 0)} + fwdFrontier := fwdPath.point // Forward search frontier + revFrontier := revPath.point // Reverse search frontier + + // Search budget bounds the cost of searching for better paths. + // The longest sequence of non-matching symbols that can be tolerated is + // approximately the square-root of the search budget. + searchBudget := 4 * (nx + ny) // O(n) + + // The algorithm below is a greedy, meet-in-the-middle algorithm for + // computing sub-optimal edit-scripts between two lists. + // + // The algorithm is approximately as follows: + // • Searching for differences switches back-and-forth between + // a search that starts at the beginning (the top-left corner), and + // a search that starts at the end (the bottom-right corner). The goal of + // the search is connect with the search from the opposite corner. + // • As we search, we build a path in a greedy manner, where the first + // match seen is added to the path (this is sub-optimal, but provides a + // decent result in practice). When matches are found, we try the next pair + // of symbols in the lists and follow all matches as far as possible. + // • When searching for matches, we search along a diagonal going through + // through the "frontier" point. If no matches are found, we advance the + // frontier towards the opposite corner. + // • This algorithm terminates when either the X coordinates or the + // Y coordinates of the forward and reverse frontier points ever intersect. + // + // This algorithm is correct even if searching only in the forward direction + // or in the reverse direction. We do both because it is commonly observed + // that two lists commonly differ because elements were added to the front + // or end of the other list. + // + // Running the tests with the "cmp_debug" build tag prints a visualization + // of the algorithm running in real-time. This is educational for + // understanding how the algorithm works. See debug_enable.go. + f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) + for { + // Forward search from the beginning. + if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { + break + } + for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { + // Search in a diagonal pattern for a match. + z := zigzag(i) + p := point{fwdFrontier.X + z, fwdFrontier.Y - z} + switch { + case p.X >= revPath.X || p.Y < fwdPath.Y: + stop1 = true // Hit top-right corner + case p.Y >= revPath.Y || p.X < fwdPath.X: + stop2 = true // Hit bottom-left corner + case f(p.X, p.Y).Equal(): + // Match found, so connect the path to this point. + fwdPath.connect(p, f) + fwdPath.append(Identity) + // Follow sequence of matches as far as possible. + for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y { + if !f(fwdPath.X, fwdPath.Y).Equal() { + break + } + fwdPath.append(Identity) + } + fwdFrontier = fwdPath.point + stop1, stop2 = true, true + default: + searchBudget-- // Match not found + } + debug.Update() + } + // Advance the frontier towards reverse point. + if revPath.X-fwdFrontier.X >= revPath.Y-fwdFrontier.Y { + fwdFrontier.X++ + } else { + fwdFrontier.Y++ + } + + // Reverse search from the end. + if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { + break + } + for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { + // Search in a diagonal pattern for a match. + z := zigzag(i) + p := point{revFrontier.X - z, revFrontier.Y + z} + switch { + case fwdPath.X >= p.X || revPath.Y < p.Y: + stop1 = true // Hit bottom-left corner + case fwdPath.Y >= p.Y || revPath.X < p.X: + stop2 = true // Hit top-right corner + case f(p.X-1, p.Y-1).Equal(): + // Match found, so connect the path to this point. + revPath.connect(p, f) + revPath.append(Identity) + // Follow sequence of matches as far as possible. + for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y { + if !f(revPath.X-1, revPath.Y-1).Equal() { + break + } + revPath.append(Identity) + } + revFrontier = revPath.point + stop1, stop2 = true, true + default: + searchBudget-- // Match not found + } + debug.Update() + } + // Advance the frontier towards forward point. + if revFrontier.X-fwdPath.X >= revFrontier.Y-fwdPath.Y { + revFrontier.X-- + } else { + revFrontier.Y-- + } + } + + // Join the forward and reverse paths and then append the reverse path. + fwdPath.connect(revPath.point, f) + for i := len(revPath.es) - 1; i >= 0; i-- { + t := revPath.es[i] + revPath.es = revPath.es[:i] + fwdPath.append(t) + } + debug.Finish() + return fwdPath.es +} + +type path struct { + dir int // +1 if forward, -1 if reverse + point // Leading point of the EditScript path + es EditScript +} + +// connect appends any necessary Identity, Modified, UniqueX, or UniqueY types +// to the edit-script to connect p.point to dst. +func (p *path) connect(dst point, f EqualFunc) { + if p.dir > 0 { + // Connect in forward direction. + for dst.X > p.X && dst.Y > p.Y { + switch r := f(p.X, p.Y); { + case r.Equal(): + p.append(Identity) + case r.Similar(): + p.append(Modified) + case dst.X-p.X >= dst.Y-p.Y: + p.append(UniqueX) + default: + p.append(UniqueY) + } + } + for dst.X > p.X { + p.append(UniqueX) + } + for dst.Y > p.Y { + p.append(UniqueY) + } + } else { + // Connect in reverse direction. + for p.X > dst.X && p.Y > dst.Y { + switch r := f(p.X-1, p.Y-1); { + case r.Equal(): + p.append(Identity) + case r.Similar(): + p.append(Modified) + case p.Y-dst.Y >= p.X-dst.X: + p.append(UniqueY) + default: + p.append(UniqueX) + } + } + for p.X > dst.X { + p.append(UniqueX) + } + for p.Y > dst.Y { + p.append(UniqueY) + } + } +} + +func (p *path) append(t EditType) { + p.es = append(p.es, t) + switch t { + case Identity, Modified: + p.add(p.dir, p.dir) + case UniqueX: + p.add(p.dir, 0) + case UniqueY: + p.add(0, p.dir) + } + debug.Update() +} + +type point struct{ X, Y int } + +func (p *point) add(dx, dy int) { p.X += dx; p.Y += dy } + +// zigzag maps a consecutive sequence of integers to a zig-zag sequence. +// [0 1 2 3 4 5 ...] => [0 -1 +1 -2 +2 ...] +func zigzag(x int) int { + if x&1 != 0 { + x = ^x + } + return x >> 1 +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go new file mode 100644 index 000000000..a9e7fc0b5 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go @@ -0,0 +1,9 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package flags + +// Deterministic controls whether the output of Diff should be deterministic. +// This is only used for testing. +var Deterministic bool diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go new file mode 100644 index 000000000..01aed0a15 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go @@ -0,0 +1,10 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !go1.10 + +package flags + +// AtLeastGo110 reports whether the Go toolchain is at least Go 1.10. +const AtLeastGo110 = false diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go new file mode 100644 index 000000000..c0b667f58 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go @@ -0,0 +1,10 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build go1.10 + +package flags + +// AtLeastGo110 reports whether the Go toolchain is at least Go 1.10. +const AtLeastGo110 = true diff --git a/vendor/github.com/google/go-cmp/cmp/internal/function/func.go b/vendor/github.com/google/go-cmp/cmp/internal/function/func.go new file mode 100644 index 000000000..ace1dbe86 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/function/func.go @@ -0,0 +1,99 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package function provides functionality for identifying function types. +package function + +import ( + "reflect" + "regexp" + "runtime" + "strings" +) + +type funcType int + +const ( + _ funcType = iota + + tbFunc // func(T) bool + ttbFunc // func(T, T) bool + trbFunc // func(T, R) bool + tibFunc // func(T, I) bool + trFunc // func(T) R + + Equal = ttbFunc // func(T, T) bool + EqualAssignable = tibFunc // func(T, I) bool; encapsulates func(T, T) bool + Transformer = trFunc // func(T) R + ValueFilter = ttbFunc // func(T, T) bool + Less = ttbFunc // func(T, T) bool + ValuePredicate = tbFunc // func(T) bool + KeyValuePredicate = trbFunc // func(T, R) bool +) + +var boolType = reflect.TypeOf(true) + +// IsType reports whether the reflect.Type is of the specified function type. +func IsType(t reflect.Type, ft funcType) bool { + if t == nil || t.Kind() != reflect.Func || t.IsVariadic() { + return false + } + ni, no := t.NumIn(), t.NumOut() + switch ft { + case tbFunc: // func(T) bool + if ni == 1 && no == 1 && t.Out(0) == boolType { + return true + } + case ttbFunc: // func(T, T) bool + if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType { + return true + } + case trbFunc: // func(T, R) bool + if ni == 2 && no == 1 && t.Out(0) == boolType { + return true + } + case tibFunc: // func(T, I) bool + if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType { + return true + } + case trFunc: // func(T) R + if ni == 1 && no == 1 { + return true + } + } + return false +} + +var lastIdentRx = regexp.MustCompile(`[_\p{L}][_\p{L}\p{N}]*$`) + +// NameOf returns the name of the function value. +func NameOf(v reflect.Value) string { + fnc := runtime.FuncForPC(v.Pointer()) + if fnc == nil { + return "" + } + fullName := fnc.Name() // e.g., "long/path/name/mypkg.(*MyType).(long/path/name/mypkg.myMethod)-fm" + + // Method closures have a "-fm" suffix. + fullName = strings.TrimSuffix(fullName, "-fm") + + var name string + for len(fullName) > 0 { + inParen := strings.HasSuffix(fullName, ")") + fullName = strings.TrimSuffix(fullName, ")") + + s := lastIdentRx.FindString(fullName) + if s == "" { + break + } + name = s + "." + name + fullName = strings.TrimSuffix(fullName, s) + + if i := strings.LastIndexByte(fullName, '('); inParen && i >= 0 { + fullName = fullName[:i] + } + fullName = strings.TrimSuffix(fullName, ".") + } + return strings.TrimSuffix(name, ".") +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go new file mode 100644 index 000000000..0a01c4796 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go @@ -0,0 +1,23 @@ +// Copyright 2018, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build purego + +package value + +import "reflect" + +// Pointer is an opaque typed pointer and is guaranteed to be comparable. +type Pointer struct { + p uintptr + t reflect.Type +} + +// PointerOf returns a Pointer from v, which must be a +// reflect.Ptr, reflect.Slice, or reflect.Map. +func PointerOf(v reflect.Value) Pointer { + // NOTE: Storing a pointer as an uintptr is technically incorrect as it + // assumes that the GC implementation does not use a moving collector. + return Pointer{v.Pointer(), v.Type()} +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go new file mode 100644 index 000000000..da134ae2a --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go @@ -0,0 +1,26 @@ +// Copyright 2018, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !purego + +package value + +import ( + "reflect" + "unsafe" +) + +// Pointer is an opaque typed pointer and is guaranteed to be comparable. +type Pointer struct { + p unsafe.Pointer + t reflect.Type +} + +// PointerOf returns a Pointer from v, which must be a +// reflect.Ptr, reflect.Slice, or reflect.Map. +func PointerOf(v reflect.Value) Pointer { + // The proper representation of a pointer is unsafe.Pointer, + // which is necessary if the GC ever uses a moving collector. + return Pointer{unsafe.Pointer(v.Pointer()), v.Type()} +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go b/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go new file mode 100644 index 000000000..24fbae6e3 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go @@ -0,0 +1,106 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package value + +import ( + "fmt" + "math" + "reflect" + "sort" +) + +// SortKeys sorts a list of map keys, deduplicating keys if necessary. +// The type of each value must be comparable. +func SortKeys(vs []reflect.Value) []reflect.Value { + if len(vs) == 0 { + return vs + } + + // Sort the map keys. + sort.SliceStable(vs, func(i, j int) bool { return isLess(vs[i], vs[j]) }) + + // Deduplicate keys (fails for NaNs). + vs2 := vs[:1] + for _, v := range vs[1:] { + if isLess(vs2[len(vs2)-1], v) { + vs2 = append(vs2, v) + } + } + return vs2 +} + +// isLess is a generic function for sorting arbitrary map keys. +// The inputs must be of the same type and must be comparable. +func isLess(x, y reflect.Value) bool { + switch x.Type().Kind() { + case reflect.Bool: + return !x.Bool() && y.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return x.Int() < y.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return x.Uint() < y.Uint() + case reflect.Float32, reflect.Float64: + // NOTE: This does not sort -0 as less than +0 + // since Go maps treat -0 and +0 as equal keys. + fx, fy := x.Float(), y.Float() + return fx < fy || math.IsNaN(fx) && !math.IsNaN(fy) + case reflect.Complex64, reflect.Complex128: + cx, cy := x.Complex(), y.Complex() + rx, ix, ry, iy := real(cx), imag(cx), real(cy), imag(cy) + if rx == ry || (math.IsNaN(rx) && math.IsNaN(ry)) { + return ix < iy || math.IsNaN(ix) && !math.IsNaN(iy) + } + return rx < ry || math.IsNaN(rx) && !math.IsNaN(ry) + case reflect.Ptr, reflect.UnsafePointer, reflect.Chan: + return x.Pointer() < y.Pointer() + case reflect.String: + return x.String() < y.String() + case reflect.Array: + for i := 0; i < x.Len(); i++ { + if isLess(x.Index(i), y.Index(i)) { + return true + } + if isLess(y.Index(i), x.Index(i)) { + return false + } + } + return false + case reflect.Struct: + for i := 0; i < x.NumField(); i++ { + if isLess(x.Field(i), y.Field(i)) { + return true + } + if isLess(y.Field(i), x.Field(i)) { + return false + } + } + return false + case reflect.Interface: + vx, vy := x.Elem(), y.Elem() + if !vx.IsValid() || !vy.IsValid() { + return !vx.IsValid() && vy.IsValid() + } + tx, ty := vx.Type(), vy.Type() + if tx == ty { + return isLess(x.Elem(), y.Elem()) + } + if tx.Kind() != ty.Kind() { + return vx.Kind() < vy.Kind() + } + if tx.String() != ty.String() { + return tx.String() < ty.String() + } + if tx.PkgPath() != ty.PkgPath() { + return tx.PkgPath() < ty.PkgPath() + } + // This can happen in rare situations, so we fallback to just comparing + // the unique pointer for a reflect.Type. This guarantees deterministic + // ordering within a program, but it is obviously not stable. + return reflect.ValueOf(vx.Type()).Pointer() < reflect.ValueOf(vy.Type()).Pointer() + default: + // Must be Func, Map, or Slice; which are not comparable. + panic(fmt.Sprintf("%T is not comparable", x.Type())) + } +} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go b/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go new file mode 100644 index 000000000..06a8ffd03 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go @@ -0,0 +1,48 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package value + +import ( + "math" + "reflect" +) + +// IsZero reports whether v is the zero value. +// This does not rely on Interface and so can be used on unexported fields. +func IsZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return v.Bool() == false + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return math.Float64bits(v.Float()) == 0 + case reflect.Complex64, reflect.Complex128: + return math.Float64bits(real(v.Complex())) == 0 && math.Float64bits(imag(v.Complex())) == 0 + case reflect.String: + return v.String() == "" + case reflect.UnsafePointer: + return v.Pointer() == 0 + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + return v.IsNil() + case reflect.Array: + for i := 0; i < v.Len(); i++ { + if !IsZero(v.Index(i)) { + return false + } + } + return true + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if !IsZero(v.Field(i)) { + return false + } + } + return true + } + return false +} diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go new file mode 100644 index 000000000..abbd2a63b --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/options.go @@ -0,0 +1,549 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "regexp" + "strings" + + "github.com/google/go-cmp/cmp/internal/function" +) + +// Option configures for specific behavior of Equal and Diff. In particular, +// the fundamental Option functions (Ignore, Transformer, and Comparer), +// configure how equality is determined. +// +// The fundamental options may be composed with filters (FilterPath and +// FilterValues) to control the scope over which they are applied. +// +// The cmp/cmpopts package provides helper functions for creating options that +// may be used with Equal and Diff. +type Option interface { + // filter applies all filters and returns the option that remains. + // Each option may only read s.curPath and call s.callTTBFunc. + // + // An Options is returned only if multiple comparers or transformers + // can apply simultaneously and will only contain values of those types + // or sub-Options containing values of those types. + filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption +} + +// applicableOption represents the following types: +// Fundamental: ignore | validator | *comparer | *transformer +// Grouping: Options +type applicableOption interface { + Option + + // apply executes the option, which may mutate s or panic. + apply(s *state, vx, vy reflect.Value) +} + +// coreOption represents the following types: +// Fundamental: ignore | validator | *comparer | *transformer +// Filters: *pathFilter | *valuesFilter +type coreOption interface { + Option + isCore() +} + +type core struct{} + +func (core) isCore() {} + +// Options is a list of Option values that also satisfies the Option interface. +// Helper comparison packages may return an Options value when packing multiple +// Option values into a single Option. When this package processes an Options, +// it will be implicitly expanded into a flat list. +// +// Applying a filter on an Options is equivalent to applying that same filter +// on all individual options held within. +type Options []Option + +func (opts Options) filter(s *state, t reflect.Type, vx, vy reflect.Value) (out applicableOption) { + for _, opt := range opts { + switch opt := opt.filter(s, t, vx, vy); opt.(type) { + case ignore: + return ignore{} // Only ignore can short-circuit evaluation + case validator: + out = validator{} // Takes precedence over comparer or transformer + case *comparer, *transformer, Options: + switch out.(type) { + case nil: + out = opt + case validator: + // Keep validator + case *comparer, *transformer, Options: + out = Options{out, opt} // Conflicting comparers or transformers + } + } + } + return out +} + +func (opts Options) apply(s *state, _, _ reflect.Value) { + const warning = "ambiguous set of applicable options" + const help = "consider using filters to ensure at most one Comparer or Transformer may apply" + var ss []string + for _, opt := range flattenOptions(nil, opts) { + ss = append(ss, fmt.Sprint(opt)) + } + set := strings.Join(ss, "\n\t") + panic(fmt.Sprintf("%s at %#v:\n\t%s\n%s", warning, s.curPath, set, help)) +} + +func (opts Options) String() string { + var ss []string + for _, opt := range opts { + ss = append(ss, fmt.Sprint(opt)) + } + return fmt.Sprintf("Options{%s}", strings.Join(ss, ", ")) +} + +// FilterPath returns a new Option where opt is only evaluated if filter f +// returns true for the current Path in the value tree. +// +// This filter is called even if a slice element or map entry is missing and +// provides an opportunity to ignore such cases. The filter function must be +// symmetric such that the filter result is identical regardless of whether the +// missing value is from x or y. +// +// The option passed in may be an Ignore, Transformer, Comparer, Options, or +// a previously filtered Option. +func FilterPath(f func(Path) bool, opt Option) Option { + if f == nil { + panic("invalid path filter function") + } + if opt := normalizeOption(opt); opt != nil { + return &pathFilter{fnc: f, opt: opt} + } + return nil +} + +type pathFilter struct { + core + fnc func(Path) bool + opt Option +} + +func (f pathFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption { + if f.fnc(s.curPath) { + return f.opt.filter(s, t, vx, vy) + } + return nil +} + +func (f pathFilter) String() string { + return fmt.Sprintf("FilterPath(%s, %v)", function.NameOf(reflect.ValueOf(f.fnc)), f.opt) +} + +// FilterValues returns a new Option where opt is only evaluated if filter f, +// which is a function of the form "func(T, T) bool", returns true for the +// current pair of values being compared. If either value is invalid or +// the type of the values is not assignable to T, then this filter implicitly +// returns false. +// +// The filter function must be +// symmetric (i.e., agnostic to the order of the inputs) and +// deterministic (i.e., produces the same result when given the same inputs). +// If T is an interface, it is possible that f is called with two values with +// different concrete types that both implement T. +// +// The option passed in may be an Ignore, Transformer, Comparer, Options, or +// a previously filtered Option. +func FilterValues(f interface{}, opt Option) Option { + v := reflect.ValueOf(f) + if !function.IsType(v.Type(), function.ValueFilter) || v.IsNil() { + panic(fmt.Sprintf("invalid values filter function: %T", f)) + } + if opt := normalizeOption(opt); opt != nil { + vf := &valuesFilter{fnc: v, opt: opt} + if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { + vf.typ = ti + } + return vf + } + return nil +} + +type valuesFilter struct { + core + typ reflect.Type // T + fnc reflect.Value // func(T, T) bool + opt Option +} + +func (f valuesFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption { + if !vx.IsValid() || !vx.CanInterface() || !vy.IsValid() || !vy.CanInterface() { + return nil + } + if (f.typ == nil || t.AssignableTo(f.typ)) && s.callTTBFunc(f.fnc, vx, vy) { + return f.opt.filter(s, t, vx, vy) + } + return nil +} + +func (f valuesFilter) String() string { + return fmt.Sprintf("FilterValues(%s, %v)", function.NameOf(f.fnc), f.opt) +} + +// Ignore is an Option that causes all comparisons to be ignored. +// This value is intended to be combined with FilterPath or FilterValues. +// It is an error to pass an unfiltered Ignore option to Equal. +func Ignore() Option { return ignore{} } + +type ignore struct{ core } + +func (ignore) isFiltered() bool { return false } +func (ignore) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { return ignore{} } +func (ignore) apply(s *state, _, _ reflect.Value) { s.report(true, reportByIgnore) } +func (ignore) String() string { return "Ignore()" } + +// validator is a sentinel Option type to indicate that some options could not +// be evaluated due to unexported fields, missing slice elements, or +// missing map entries. Both values are validator only for unexported fields. +type validator struct{ core } + +func (validator) filter(_ *state, _ reflect.Type, vx, vy reflect.Value) applicableOption { + if !vx.IsValid() || !vy.IsValid() { + return validator{} + } + if !vx.CanInterface() || !vy.CanInterface() { + return validator{} + } + return nil +} +func (validator) apply(s *state, vx, vy reflect.Value) { + // Implies missing slice element or map entry. + if !vx.IsValid() || !vy.IsValid() { + s.report(vx.IsValid() == vy.IsValid(), 0) + return + } + + // Unable to Interface implies unexported field without visibility access. + if !vx.CanInterface() || !vy.CanInterface() { + const help = "consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported" + var name string + if t := s.curPath.Index(-2).Type(); t.Name() != "" { + // Named type with unexported fields. + name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType + } else { + // Unnamed type with unexported fields. Derive PkgPath from field. + var pkgPath string + for i := 0; i < t.NumField() && pkgPath == ""; i++ { + pkgPath = t.Field(i).PkgPath + } + name = fmt.Sprintf("%q.(%v)", pkgPath, t.String()) // e.g., "path/to/package".(struct { a int }) + } + panic(fmt.Sprintf("cannot handle unexported field at %#v:\n\t%v\n%s", s.curPath, name, help)) + } + + panic("not reachable") +} + +// identRx represents a valid identifier according to the Go specification. +const identRx = `[_\p{L}][_\p{L}\p{N}]*` + +var identsRx = regexp.MustCompile(`^` + identRx + `(\.` + identRx + `)*$`) + +// Transformer returns an Option that applies a transformation function that +// converts values of a certain type into that of another. +// +// The transformer f must be a function "func(T) R" that converts values of +// type T to those of type R and is implicitly filtered to input values +// assignable to T. The transformer must not mutate T in any way. +// +// To help prevent some cases of infinite recursive cycles applying the +// same transform to the output of itself (e.g., in the case where the +// input and output types are the same), an implicit filter is added such that +// a transformer is applicable only if that exact transformer is not already +// in the tail of the Path since the last non-Transform step. +// For situations where the implicit filter is still insufficient, +// consider using cmpopts.AcyclicTransformer, which adds a filter +// to prevent the transformer from being recursively applied upon itself. +// +// The name is a user provided label that is used as the Transform.Name in the +// transformation PathStep (and eventually shown in the Diff output). +// The name must be a valid identifier or qualified identifier in Go syntax. +// If empty, an arbitrary name is used. +func Transformer(name string, f interface{}) Option { + v := reflect.ValueOf(f) + if !function.IsType(v.Type(), function.Transformer) || v.IsNil() { + panic(fmt.Sprintf("invalid transformer function: %T", f)) + } + if name == "" { + name = function.NameOf(v) + if !identsRx.MatchString(name) { + name = "λ" // Lambda-symbol as placeholder name + } + } else if !identsRx.MatchString(name) { + panic(fmt.Sprintf("invalid name: %q", name)) + } + tr := &transformer{name: name, fnc: reflect.ValueOf(f)} + if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { + tr.typ = ti + } + return tr +} + +type transformer struct { + core + name string + typ reflect.Type // T + fnc reflect.Value // func(T) R +} + +func (tr *transformer) isFiltered() bool { return tr.typ != nil } + +func (tr *transformer) filter(s *state, t reflect.Type, _, _ reflect.Value) applicableOption { + for i := len(s.curPath) - 1; i >= 0; i-- { + if t, ok := s.curPath[i].(Transform); !ok { + break // Hit most recent non-Transform step + } else if tr == t.trans { + return nil // Cannot directly use same Transform + } + } + if tr.typ == nil || t.AssignableTo(tr.typ) { + return tr + } + return nil +} + +func (tr *transformer) apply(s *state, vx, vy reflect.Value) { + step := Transform{&transform{pathStep{typ: tr.fnc.Type().Out(0)}, tr}} + vvx := s.callTRFunc(tr.fnc, vx, step) + vvy := s.callTRFunc(tr.fnc, vy, step) + step.vx, step.vy = vvx, vvy + s.compareAny(step) +} + +func (tr transformer) String() string { + return fmt.Sprintf("Transformer(%s, %s)", tr.name, function.NameOf(tr.fnc)) +} + +// Comparer returns an Option that determines whether two values are equal +// to each other. +// +// The comparer f must be a function "func(T, T) bool" and is implicitly +// filtered to input values assignable to T. If T is an interface, it is +// possible that f is called with two values of different concrete types that +// both implement T. +// +// The equality function must be: +// • Symmetric: equal(x, y) == equal(y, x) +// • Deterministic: equal(x, y) == equal(x, y) +// • Pure: equal(x, y) does not modify x or y +func Comparer(f interface{}) Option { + v := reflect.ValueOf(f) + if !function.IsType(v.Type(), function.Equal) || v.IsNil() { + panic(fmt.Sprintf("invalid comparer function: %T", f)) + } + cm := &comparer{fnc: v} + if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { + cm.typ = ti + } + return cm +} + +type comparer struct { + core + typ reflect.Type // T + fnc reflect.Value // func(T, T) bool +} + +func (cm *comparer) isFiltered() bool { return cm.typ != nil } + +func (cm *comparer) filter(_ *state, t reflect.Type, _, _ reflect.Value) applicableOption { + if cm.typ == nil || t.AssignableTo(cm.typ) { + return cm + } + return nil +} + +func (cm *comparer) apply(s *state, vx, vy reflect.Value) { + eq := s.callTTBFunc(cm.fnc, vx, vy) + s.report(eq, reportByFunc) +} + +func (cm comparer) String() string { + return fmt.Sprintf("Comparer(%s)", function.NameOf(cm.fnc)) +} + +// Exporter returns an Option that specifies whether Equal is allowed to +// introspect into the unexported fields of certain struct types. +// +// Users of this option must understand that comparing on unexported fields +// from external packages is not safe since changes in the internal +// implementation of some external package may cause the result of Equal +// to unexpectedly change. However, it may be valid to use this option on types +// defined in an internal package where the semantic meaning of an unexported +// field is in the control of the user. +// +// In many cases, a custom Comparer should be used instead that defines +// equality as a function of the public API of a type rather than the underlying +// unexported implementation. +// +// For example, the reflect.Type documentation defines equality to be determined +// by the == operator on the interface (essentially performing a shallow pointer +// comparison) and most attempts to compare *regexp.Regexp types are interested +// in only checking that the regular expression strings are equal. +// Both of these are accomplished using Comparers: +// +// Comparer(func(x, y reflect.Type) bool { return x == y }) +// Comparer(func(x, y *regexp.Regexp) bool { return x.String() == y.String() }) +// +// In other cases, the cmpopts.IgnoreUnexported option can be used to ignore +// all unexported fields on specified struct types. +func Exporter(f func(reflect.Type) bool) Option { + if !supportExporters { + panic("Exporter is not supported on purego builds") + } + return exporter(f) +} + +type exporter func(reflect.Type) bool + +func (exporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { + panic("not implemented") +} + +// AllowUnexported returns an Options that allows Equal to forcibly introspect +// unexported fields of the specified struct types. +// +// See Exporter for the proper use of this option. +func AllowUnexported(types ...interface{}) Option { + m := make(map[reflect.Type]bool) + for _, typ := range types { + t := reflect.TypeOf(typ) + if t.Kind() != reflect.Struct { + panic(fmt.Sprintf("invalid struct type: %T", typ)) + } + m[t] = true + } + return exporter(func(t reflect.Type) bool { return m[t] }) +} + +// Result represents the comparison result for a single node and +// is provided by cmp when calling Result (see Reporter). +type Result struct { + _ [0]func() // Make Result incomparable + flags resultFlags +} + +// Equal reports whether the node was determined to be equal or not. +// As a special case, ignored nodes are considered equal. +func (r Result) Equal() bool { + return r.flags&(reportEqual|reportByIgnore) != 0 +} + +// ByIgnore reports whether the node is equal because it was ignored. +// This never reports true if Equal reports false. +func (r Result) ByIgnore() bool { + return r.flags&reportByIgnore != 0 +} + +// ByMethod reports whether the Equal method determined equality. +func (r Result) ByMethod() bool { + return r.flags&reportByMethod != 0 +} + +// ByFunc reports whether a Comparer function determined equality. +func (r Result) ByFunc() bool { + return r.flags&reportByFunc != 0 +} + +// ByCycle reports whether a reference cycle was detected. +func (r Result) ByCycle() bool { + return r.flags&reportByCycle != 0 +} + +type resultFlags uint + +const ( + _ resultFlags = (1 << iota) / 2 + + reportEqual + reportUnequal + reportByIgnore + reportByMethod + reportByFunc + reportByCycle +) + +// Reporter is an Option that can be passed to Equal. When Equal traverses +// the value trees, it calls PushStep as it descends into each node in the +// tree and PopStep as it ascend out of the node. The leaves of the tree are +// either compared (determined to be equal or not equal) or ignored and reported +// as such by calling the Report method. +func Reporter(r interface { + // PushStep is called when a tree-traversal operation is performed. + // The PathStep itself is only valid until the step is popped. + // The PathStep.Values are valid for the duration of the entire traversal + // and must not be mutated. + // + // Equal always calls PushStep at the start to provide an operation-less + // PathStep used to report the root values. + // + // Within a slice, the exact set of inserted, removed, or modified elements + // is unspecified and may change in future implementations. + // The entries of a map are iterated through in an unspecified order. + PushStep(PathStep) + + // Report is called exactly once on leaf nodes to report whether the + // comparison identified the node as equal, unequal, or ignored. + // A leaf node is one that is immediately preceded by and followed by + // a pair of PushStep and PopStep calls. + Report(Result) + + // PopStep ascends back up the value tree. + // There is always a matching pop call for every push call. + PopStep() +}) Option { + return reporter{r} +} + +type reporter struct{ reporterIface } +type reporterIface interface { + PushStep(PathStep) + Report(Result) + PopStep() +} + +func (reporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { + panic("not implemented") +} + +// normalizeOption normalizes the input options such that all Options groups +// are flattened and groups with a single element are reduced to that element. +// Only coreOptions and Options containing coreOptions are allowed. +func normalizeOption(src Option) Option { + switch opts := flattenOptions(nil, Options{src}); len(opts) { + case 0: + return nil + case 1: + return opts[0] + default: + return opts + } +} + +// flattenOptions copies all options in src to dst as a flat list. +// Only coreOptions and Options containing coreOptions are allowed. +func flattenOptions(dst, src Options) Options { + for _, opt := range src { + switch opt := opt.(type) { + case nil: + continue + case Options: + dst = flattenOptions(dst, opt) + case coreOption: + dst = append(dst, opt) + default: + panic(fmt.Sprintf("invalid option type: %T", opt)) + } + } + return dst +} diff --git a/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/google/go-cmp/cmp/path.go new file mode 100644 index 000000000..509d6b852 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/path.go @@ -0,0 +1,377 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "strings" + "unicode" + "unicode/utf8" + + "github.com/google/go-cmp/cmp/internal/value" +) + +// Path is a list of PathSteps describing the sequence of operations to get +// from some root type to the current position in the value tree. +// The first Path element is always an operation-less PathStep that exists +// simply to identify the initial type. +// +// When traversing structs with embedded structs, the embedded struct will +// always be accessed as a field before traversing the fields of the +// embedded struct themselves. That is, an exported field from the +// embedded struct will never be accessed directly from the parent struct. +type Path []PathStep + +// PathStep is a union-type for specific operations to traverse +// a value's tree structure. Users of this package never need to implement +// these types as values of this type will be returned by this package. +// +// Implementations of this interface are +// StructField, SliceIndex, MapIndex, Indirect, TypeAssertion, and Transform. +type PathStep interface { + String() string + + // Type is the resulting type after performing the path step. + Type() reflect.Type + + // Values is the resulting values after performing the path step. + // The type of each valid value is guaranteed to be identical to Type. + // + // In some cases, one or both may be invalid or have restrictions: + // • For StructField, both are not interface-able if the current field + // is unexported and the struct type is not explicitly permitted by + // an Exporter to traverse unexported fields. + // • For SliceIndex, one may be invalid if an element is missing from + // either the x or y slice. + // • For MapIndex, one may be invalid if an entry is missing from + // either the x or y map. + // + // The provided values must not be mutated. + Values() (vx, vy reflect.Value) +} + +var ( + _ PathStep = StructField{} + _ PathStep = SliceIndex{} + _ PathStep = MapIndex{} + _ PathStep = Indirect{} + _ PathStep = TypeAssertion{} + _ PathStep = Transform{} +) + +func (pa *Path) push(s PathStep) { + *pa = append(*pa, s) +} + +func (pa *Path) pop() { + *pa = (*pa)[:len(*pa)-1] +} + +// Last returns the last PathStep in the Path. +// If the path is empty, this returns a non-nil PathStep that reports a nil Type. +func (pa Path) Last() PathStep { + return pa.Index(-1) +} + +// Index returns the ith step in the Path and supports negative indexing. +// A negative index starts counting from the tail of the Path such that -1 +// refers to the last step, -2 refers to the second-to-last step, and so on. +// If index is invalid, this returns a non-nil PathStep that reports a nil Type. +func (pa Path) Index(i int) PathStep { + if i < 0 { + i = len(pa) + i + } + if i < 0 || i >= len(pa) { + return pathStep{} + } + return pa[i] +} + +// String returns the simplified path to a node. +// The simplified path only contains struct field accesses. +// +// For example: +// MyMap.MySlices.MyField +func (pa Path) String() string { + var ss []string + for _, s := range pa { + if _, ok := s.(StructField); ok { + ss = append(ss, s.String()) + } + } + return strings.TrimPrefix(strings.Join(ss, ""), ".") +} + +// GoString returns the path to a specific node using Go syntax. +// +// For example: +// (*root.MyMap["key"].(*mypkg.MyStruct).MySlices)[2][3].MyField +func (pa Path) GoString() string { + var ssPre, ssPost []string + var numIndirect int + for i, s := range pa { + var nextStep PathStep + if i+1 < len(pa) { + nextStep = pa[i+1] + } + switch s := s.(type) { + case Indirect: + numIndirect++ + pPre, pPost := "(", ")" + switch nextStep.(type) { + case Indirect: + continue // Next step is indirection, so let them batch up + case StructField: + numIndirect-- // Automatic indirection on struct fields + case nil: + pPre, pPost = "", "" // Last step; no need for parenthesis + } + if numIndirect > 0 { + ssPre = append(ssPre, pPre+strings.Repeat("*", numIndirect)) + ssPost = append(ssPost, pPost) + } + numIndirect = 0 + continue + case Transform: + ssPre = append(ssPre, s.trans.name+"(") + ssPost = append(ssPost, ")") + continue + } + ssPost = append(ssPost, s.String()) + } + for i, j := 0, len(ssPre)-1; i < j; i, j = i+1, j-1 { + ssPre[i], ssPre[j] = ssPre[j], ssPre[i] + } + return strings.Join(ssPre, "") + strings.Join(ssPost, "") +} + +type pathStep struct { + typ reflect.Type + vx, vy reflect.Value +} + +func (ps pathStep) Type() reflect.Type { return ps.typ } +func (ps pathStep) Values() (vx, vy reflect.Value) { return ps.vx, ps.vy } +func (ps pathStep) String() string { + if ps.typ == nil { + return "" + } + s := ps.typ.String() + if s == "" || strings.ContainsAny(s, "{}\n") { + return "root" // Type too simple or complex to print + } + return fmt.Sprintf("{%s}", s) +} + +// StructField represents a struct field access on a field called Name. +type StructField struct{ *structField } +type structField struct { + pathStep + name string + idx int + + // These fields are used for forcibly accessing an unexported field. + // pvx, pvy, and field are only valid if unexported is true. + unexported bool + mayForce bool // Forcibly allow visibility + pvx, pvy reflect.Value // Parent values + field reflect.StructField // Field information +} + +func (sf StructField) Type() reflect.Type { return sf.typ } +func (sf StructField) Values() (vx, vy reflect.Value) { + if !sf.unexported { + return sf.vx, sf.vy // CanInterface reports true + } + + // Forcibly obtain read-write access to an unexported struct field. + if sf.mayForce { + vx = retrieveUnexportedField(sf.pvx, sf.field) + vy = retrieveUnexportedField(sf.pvy, sf.field) + return vx, vy // CanInterface reports true + } + return sf.vx, sf.vy // CanInterface reports false +} +func (sf StructField) String() string { return fmt.Sprintf(".%s", sf.name) } + +// Name is the field name. +func (sf StructField) Name() string { return sf.name } + +// Index is the index of the field in the parent struct type. +// See reflect.Type.Field. +func (sf StructField) Index() int { return sf.idx } + +// SliceIndex is an index operation on a slice or array at some index Key. +type SliceIndex struct{ *sliceIndex } +type sliceIndex struct { + pathStep + xkey, ykey int + isSlice bool // False for reflect.Array +} + +func (si SliceIndex) Type() reflect.Type { return si.typ } +func (si SliceIndex) Values() (vx, vy reflect.Value) { return si.vx, si.vy } +func (si SliceIndex) String() string { + switch { + case si.xkey == si.ykey: + return fmt.Sprintf("[%d]", si.xkey) + case si.ykey == -1: + // [5->?] means "I don't know where X[5] went" + return fmt.Sprintf("[%d->?]", si.xkey) + case si.xkey == -1: + // [?->3] means "I don't know where Y[3] came from" + return fmt.Sprintf("[?->%d]", si.ykey) + default: + // [5->3] means "X[5] moved to Y[3]" + return fmt.Sprintf("[%d->%d]", si.xkey, si.ykey) + } +} + +// Key is the index key; it may return -1 if in a split state +func (si SliceIndex) Key() int { + if si.xkey != si.ykey { + return -1 + } + return si.xkey +} + +// SplitKeys are the indexes for indexing into slices in the +// x and y values, respectively. These indexes may differ due to the +// insertion or removal of an element in one of the slices, causing +// all of the indexes to be shifted. If an index is -1, then that +// indicates that the element does not exist in the associated slice. +// +// Key is guaranteed to return -1 if and only if the indexes returned +// by SplitKeys are not the same. SplitKeys will never return -1 for +// both indexes. +func (si SliceIndex) SplitKeys() (ix, iy int) { return si.xkey, si.ykey } + +// MapIndex is an index operation on a map at some index Key. +type MapIndex struct{ *mapIndex } +type mapIndex struct { + pathStep + key reflect.Value +} + +func (mi MapIndex) Type() reflect.Type { return mi.typ } +func (mi MapIndex) Values() (vx, vy reflect.Value) { return mi.vx, mi.vy } +func (mi MapIndex) String() string { return fmt.Sprintf("[%#v]", mi.key) } + +// Key is the value of the map key. +func (mi MapIndex) Key() reflect.Value { return mi.key } + +// Indirect represents pointer indirection on the parent type. +type Indirect struct{ *indirect } +type indirect struct { + pathStep +} + +func (in Indirect) Type() reflect.Type { return in.typ } +func (in Indirect) Values() (vx, vy reflect.Value) { return in.vx, in.vy } +func (in Indirect) String() string { return "*" } + +// TypeAssertion represents a type assertion on an interface. +type TypeAssertion struct{ *typeAssertion } +type typeAssertion struct { + pathStep +} + +func (ta TypeAssertion) Type() reflect.Type { return ta.typ } +func (ta TypeAssertion) Values() (vx, vy reflect.Value) { return ta.vx, ta.vy } +func (ta TypeAssertion) String() string { return fmt.Sprintf(".(%v)", ta.typ) } + +// Transform is a transformation from the parent type to the current type. +type Transform struct{ *transform } +type transform struct { + pathStep + trans *transformer +} + +func (tf Transform) Type() reflect.Type { return tf.typ } +func (tf Transform) Values() (vx, vy reflect.Value) { return tf.vx, tf.vy } +func (tf Transform) String() string { return fmt.Sprintf("%s()", tf.trans.name) } + +// Name is the name of the Transformer. +func (tf Transform) Name() string { return tf.trans.name } + +// Func is the function pointer to the transformer function. +func (tf Transform) Func() reflect.Value { return tf.trans.fnc } + +// Option returns the originally constructed Transformer option. +// The == operator can be used to detect the exact option used. +func (tf Transform) Option() Option { return tf.trans } + +// pointerPath represents a dual-stack of pointers encountered when +// recursively traversing the x and y values. This data structure supports +// detection of cycles and determining whether the cycles are equal. +// In Go, cycles can occur via pointers, slices, and maps. +// +// The pointerPath uses a map to represent a stack; where descension into a +// pointer pushes the address onto the stack, and ascension from a pointer +// pops the address from the stack. Thus, when traversing into a pointer from +// reflect.Ptr, reflect.Slice element, or reflect.Map, we can detect cycles +// by checking whether the pointer has already been visited. The cycle detection +// uses a seperate stack for the x and y values. +// +// If a cycle is detected we need to determine whether the two pointers +// should be considered equal. The definition of equality chosen by Equal +// requires two graphs to have the same structure. To determine this, both the +// x and y values must have a cycle where the previous pointers were also +// encountered together as a pair. +// +// Semantically, this is equivalent to augmenting Indirect, SliceIndex, and +// MapIndex with pointer information for the x and y values. +// Suppose px and py are two pointers to compare, we then search the +// Path for whether px was ever encountered in the Path history of x, and +// similarly so with py. If either side has a cycle, the comparison is only +// equal if both px and py have a cycle resulting from the same PathStep. +// +// Using a map as a stack is more performant as we can perform cycle detection +// in O(1) instead of O(N) where N is len(Path). +type pointerPath struct { + // mx is keyed by x pointers, where the value is the associated y pointer. + mx map[value.Pointer]value.Pointer + // my is keyed by y pointers, where the value is the associated x pointer. + my map[value.Pointer]value.Pointer +} + +func (p *pointerPath) Init() { + p.mx = make(map[value.Pointer]value.Pointer) + p.my = make(map[value.Pointer]value.Pointer) +} + +// Push indicates intent to descend into pointers vx and vy where +// visited reports whether either has been seen before. If visited before, +// equal reports whether both pointers were encountered together. +// Pop must be called if and only if the pointers were never visited. +// +// The pointers vx and vy must be a reflect.Ptr, reflect.Slice, or reflect.Map +// and be non-nil. +func (p pointerPath) Push(vx, vy reflect.Value) (equal, visited bool) { + px := value.PointerOf(vx) + py := value.PointerOf(vy) + _, ok1 := p.mx[px] + _, ok2 := p.my[py] + if ok1 || ok2 { + equal = p.mx[px] == py && p.my[py] == px // Pointers paired together + return equal, true + } + p.mx[px] = py + p.my[py] = px + return false, false +} + +// Pop ascends from pointers vx and vy. +func (p pointerPath) Pop(vx, vy reflect.Value) { + delete(p.mx, value.PointerOf(vx)) + delete(p.my, value.PointerOf(vy)) +} + +// isExported reports whether the identifier is exported. +func isExported(id string) bool { + r, _ := utf8.DecodeRuneInString(id) + return unicode.IsUpper(r) +} diff --git a/vendor/github.com/google/go-cmp/cmp/report.go b/vendor/github.com/google/go-cmp/cmp/report.go new file mode 100644 index 000000000..6ddf29993 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report.go @@ -0,0 +1,51 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +// defaultReporter implements the reporter interface. +// +// As Equal serially calls the PushStep, Report, and PopStep methods, the +// defaultReporter constructs a tree-based representation of the compared value +// and the result of each comparison (see valueNode). +// +// When the String method is called, the FormatDiff method transforms the +// valueNode tree into a textNode tree, which is a tree-based representation +// of the textual output (see textNode). +// +// Lastly, the textNode.String method produces the final report as a string. +type defaultReporter struct { + root *valueNode + curr *valueNode +} + +func (r *defaultReporter) PushStep(ps PathStep) { + r.curr = r.curr.PushStep(ps) + if r.root == nil { + r.root = r.curr + } +} +func (r *defaultReporter) Report(rs Result) { + r.curr.Report(rs) +} +func (r *defaultReporter) PopStep() { + r.curr = r.curr.PopStep() +} + +// String provides a full report of the differences detected as a structured +// literal in pseudo-Go syntax. String may only be called after the entire tree +// has been traversed. +func (r *defaultReporter) String() string { + assert(r.root != nil && r.curr == nil) + if r.root.NumDiff == 0 { + return "" + } + return formatOptions{}.FormatDiff(r.root).String() +} + +func assert(ok bool) { + if !ok { + panic("assertion failure") + } +} diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go new file mode 100644 index 000000000..17a05eede --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report_compare.go @@ -0,0 +1,296 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + + "github.com/google/go-cmp/cmp/internal/value" +) + +// TODO: Enforce limits? +// * Enforce maximum number of records to print per node? +// * Enforce maximum size in bytes allowed? +// * As a heuristic, use less verbosity for equal nodes than unequal nodes. +// TODO: Enforce unique outputs? +// * Avoid Stringer methods if it results in same output? +// * Print pointer address if outputs still equal? + +// numContextRecords is the number of surrounding equal records to print. +const numContextRecords = 2 + +type diffMode byte + +const ( + diffUnknown diffMode = 0 + diffIdentical diffMode = ' ' + diffRemoved diffMode = '-' + diffInserted diffMode = '+' +) + +type typeMode int + +const ( + // emitType always prints the type. + emitType typeMode = iota + // elideType never prints the type. + elideType + // autoType prints the type only for composite kinds + // (i.e., structs, slices, arrays, and maps). + autoType +) + +type formatOptions struct { + // DiffMode controls the output mode of FormatDiff. + // + // If diffUnknown, then produce a diff of the x and y values. + // If diffIdentical, then emit values as if they were equal. + // If diffRemoved, then only emit x values (ignoring y values). + // If diffInserted, then only emit y values (ignoring x values). + DiffMode diffMode + + // TypeMode controls whether to print the type for the current node. + // + // As a general rule of thumb, we always print the type of the next node + // after an interface, and always elide the type of the next node after + // a slice or map node. + TypeMode typeMode + + // formatValueOptions are options specific to printing reflect.Values. + formatValueOptions +} + +func (opts formatOptions) WithDiffMode(d diffMode) formatOptions { + opts.DiffMode = d + return opts +} +func (opts formatOptions) WithTypeMode(t typeMode) formatOptions { + opts.TypeMode = t + return opts +} + +// FormatDiff converts a valueNode tree into a textNode tree, where the later +// is a textual representation of the differences detected in the former. +func (opts formatOptions) FormatDiff(v *valueNode) textNode { + // Check whether we have specialized formatting for this node. + // This is not necessary, but helpful for producing more readable outputs. + if opts.CanFormatDiffSlice(v) { + return opts.FormatDiffSlice(v) + } + + // For leaf nodes, format the value based on the reflect.Values alone. + if v.MaxDepth == 0 { + switch opts.DiffMode { + case diffUnknown, diffIdentical: + // Format Equal. + if v.NumDiff == 0 { + outx := opts.FormatValue(v.ValueX, visitedPointers{}) + outy := opts.FormatValue(v.ValueY, visitedPointers{}) + if v.NumIgnored > 0 && v.NumSame == 0 { + return textEllipsis + } else if outx.Len() < outy.Len() { + return outx + } else { + return outy + } + } + + // Format unequal. + assert(opts.DiffMode == diffUnknown) + var list textList + outx := opts.WithTypeMode(elideType).FormatValue(v.ValueX, visitedPointers{}) + outy := opts.WithTypeMode(elideType).FormatValue(v.ValueY, visitedPointers{}) + if outx != nil { + list = append(list, textRecord{Diff: '-', Value: outx}) + } + if outy != nil { + list = append(list, textRecord{Diff: '+', Value: outy}) + } + return opts.WithTypeMode(emitType).FormatType(v.Type, list) + case diffRemoved: + return opts.FormatValue(v.ValueX, visitedPointers{}) + case diffInserted: + return opts.FormatValue(v.ValueY, visitedPointers{}) + default: + panic("invalid diff mode") + } + } + + // Descend into the child value node. + if v.TransformerName != "" { + out := opts.WithTypeMode(emitType).FormatDiff(v.Value) + out = textWrap{"Inverse(" + v.TransformerName + ", ", out, ")"} + return opts.FormatType(v.Type, out) + } else { + switch k := v.Type.Kind(); k { + case reflect.Struct, reflect.Array, reflect.Slice, reflect.Map: + return opts.FormatType(v.Type, opts.formatDiffList(v.Records, k)) + case reflect.Ptr: + return textWrap{"&", opts.FormatDiff(v.Value), ""} + case reflect.Interface: + return opts.WithTypeMode(emitType).FormatDiff(v.Value) + default: + panic(fmt.Sprintf("%v cannot have children", k)) + } + } +} + +func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) textNode { + // Derive record name based on the data structure kind. + var name string + var formatKey func(reflect.Value) string + switch k { + case reflect.Struct: + name = "field" + opts = opts.WithTypeMode(autoType) + formatKey = func(v reflect.Value) string { return v.String() } + case reflect.Slice, reflect.Array: + name = "element" + opts = opts.WithTypeMode(elideType) + formatKey = func(reflect.Value) string { return "" } + case reflect.Map: + name = "entry" + opts = opts.WithTypeMode(elideType) + formatKey = formatMapKey + } + + // Handle unification. + switch opts.DiffMode { + case diffIdentical, diffRemoved, diffInserted: + var list textList + var deferredEllipsis bool // Add final "..." to indicate records were dropped + for _, r := range recs { + // Elide struct fields that are zero value. + if k == reflect.Struct { + var isZero bool + switch opts.DiffMode { + case diffIdentical: + isZero = value.IsZero(r.Value.ValueX) || value.IsZero(r.Value.ValueY) + case diffRemoved: + isZero = value.IsZero(r.Value.ValueX) + case diffInserted: + isZero = value.IsZero(r.Value.ValueY) + } + if isZero { + continue + } + } + // Elide ignored nodes. + if r.Value.NumIgnored > 0 && r.Value.NumSame+r.Value.NumDiff == 0 { + deferredEllipsis = !(k == reflect.Slice || k == reflect.Array) + if !deferredEllipsis { + list.AppendEllipsis(diffStats{}) + } + continue + } + if out := opts.FormatDiff(r.Value); out != nil { + list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + } + } + if deferredEllipsis { + list.AppendEllipsis(diffStats{}) + } + return textWrap{"{", list, "}"} + case diffUnknown: + default: + panic("invalid diff mode") + } + + // Handle differencing. + var list textList + groups := coalesceAdjacentRecords(name, recs) + for i, ds := range groups { + // Handle equal records. + if ds.NumDiff() == 0 { + // Compute the number of leading and trailing records to print. + var numLo, numHi int + numEqual := ds.NumIgnored + ds.NumIdentical + for numLo < numContextRecords && numLo+numHi < numEqual && i != 0 { + if r := recs[numLo].Value; r.NumIgnored > 0 && r.NumSame+r.NumDiff == 0 { + break + } + numLo++ + } + for numHi < numContextRecords && numLo+numHi < numEqual && i != len(groups)-1 { + if r := recs[numEqual-numHi-1].Value; r.NumIgnored > 0 && r.NumSame+r.NumDiff == 0 { + break + } + numHi++ + } + if numEqual-(numLo+numHi) == 1 && ds.NumIgnored == 0 { + numHi++ // Avoid pointless coalescing of a single equal record + } + + // Format the equal values. + for _, r := range recs[:numLo] { + out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value) + list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + } + if numEqual > numLo+numHi { + ds.NumIdentical -= numLo + numHi + list.AppendEllipsis(ds) + } + for _, r := range recs[numEqual-numHi : numEqual] { + out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value) + list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + } + recs = recs[numEqual:] + continue + } + + // Handle unequal records. + for _, r := range recs[:ds.NumDiff()] { + switch { + case opts.CanFormatDiffSlice(r.Value): + out := opts.FormatDiffSlice(r.Value) + list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + case r.Value.NumChildren == r.Value.MaxDepth: + outx := opts.WithDiffMode(diffRemoved).FormatDiff(r.Value) + outy := opts.WithDiffMode(diffInserted).FormatDiff(r.Value) + if outx != nil { + list = append(list, textRecord{Diff: diffRemoved, Key: formatKey(r.Key), Value: outx}) + } + if outy != nil { + list = append(list, textRecord{Diff: diffInserted, Key: formatKey(r.Key), Value: outy}) + } + default: + out := opts.FormatDiff(r.Value) + list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) + } + } + recs = recs[ds.NumDiff():] + } + assert(len(recs) == 0) + return textWrap{"{", list, "}"} +} + +// coalesceAdjacentRecords coalesces the list of records into groups of +// adjacent equal, or unequal counts. +func coalesceAdjacentRecords(name string, recs []reportRecord) (groups []diffStats) { + var prevCase int // Arbitrary index into which case last occurred + lastStats := func(i int) *diffStats { + if prevCase != i { + groups = append(groups, diffStats{Name: name}) + prevCase = i + } + return &groups[len(groups)-1] + } + for _, r := range recs { + switch rv := r.Value; { + case rv.NumIgnored > 0 && rv.NumSame+rv.NumDiff == 0: + lastStats(1).NumIgnored++ + case rv.NumDiff == 0: + lastStats(1).NumIdentical++ + case rv.NumDiff > 0 && !rv.ValueY.IsValid(): + lastStats(2).NumRemoved++ + case rv.NumDiff > 0 && !rv.ValueX.IsValid(): + lastStats(2).NumInserted++ + default: + lastStats(2).NumModified++ + } + } + return groups +} diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go new file mode 100644 index 000000000..2761b6289 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report_reflect.go @@ -0,0 +1,278 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "unicode" + + "github.com/google/go-cmp/cmp/internal/flags" + "github.com/google/go-cmp/cmp/internal/value" +) + +type formatValueOptions struct { + // AvoidStringer controls whether to avoid calling custom stringer + // methods like error.Error or fmt.Stringer.String. + AvoidStringer bool + + // ShallowPointers controls whether to avoid descending into pointers. + // Useful when printing map keys, where pointer comparison is performed + // on the pointer address rather than the pointed-at value. + ShallowPointers bool + + // PrintAddresses controls whether to print the address of all pointers, + // slice elements, and maps. + PrintAddresses bool +} + +// FormatType prints the type as if it were wrapping s. +// This may return s as-is depending on the current type and TypeMode mode. +func (opts formatOptions) FormatType(t reflect.Type, s textNode) textNode { + // Check whether to emit the type or not. + switch opts.TypeMode { + case autoType: + switch t.Kind() { + case reflect.Struct, reflect.Slice, reflect.Array, reflect.Map: + if s.Equal(textNil) { + return s + } + default: + return s + } + case elideType: + return s + } + + // Determine the type label, applying special handling for unnamed types. + typeName := t.String() + if t.Name() == "" { + // According to Go grammar, certain type literals contain symbols that + // do not strongly bind to the next lexicographical token (e.g., *T). + switch t.Kind() { + case reflect.Chan, reflect.Func, reflect.Ptr: + typeName = "(" + typeName + ")" + } + typeName = strings.Replace(typeName, "struct {", "struct{", -1) + typeName = strings.Replace(typeName, "interface {", "interface{", -1) + } + + // Avoid wrap the value in parenthesis if unnecessary. + if s, ok := s.(textWrap); ok { + hasParens := strings.HasPrefix(s.Prefix, "(") && strings.HasSuffix(s.Suffix, ")") + hasBraces := strings.HasPrefix(s.Prefix, "{") && strings.HasSuffix(s.Suffix, "}") + if hasParens || hasBraces { + return textWrap{typeName, s, ""} + } + } + return textWrap{typeName + "(", s, ")"} +} + +// FormatValue prints the reflect.Value, taking extra care to avoid descending +// into pointers already in m. As pointers are visited, m is also updated. +func (opts formatOptions) FormatValue(v reflect.Value, m visitedPointers) (out textNode) { + if !v.IsValid() { + return nil + } + t := v.Type() + + // Check whether there is an Error or String method to call. + if !opts.AvoidStringer && v.CanInterface() { + // Avoid calling Error or String methods on nil receivers since many + // implementations crash when doing so. + if (t.Kind() != reflect.Ptr && t.Kind() != reflect.Interface) || !v.IsNil() { + switch v := v.Interface().(type) { + case error: + return textLine("e" + formatString(v.Error())) + case fmt.Stringer: + return textLine("s" + formatString(v.String())) + } + } + } + + // Check whether to explicitly wrap the result with the type. + var skipType bool + defer func() { + if !skipType { + out = opts.FormatType(t, out) + } + }() + + var ptr string + switch t.Kind() { + case reflect.Bool: + return textLine(fmt.Sprint(v.Bool())) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return textLine(fmt.Sprint(v.Int())) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + // Unnamed uints are usually bytes or words, so use hexadecimal. + if t.PkgPath() == "" || t.Kind() == reflect.Uintptr { + return textLine(formatHex(v.Uint())) + } + return textLine(fmt.Sprint(v.Uint())) + case reflect.Float32, reflect.Float64: + return textLine(fmt.Sprint(v.Float())) + case reflect.Complex64, reflect.Complex128: + return textLine(fmt.Sprint(v.Complex())) + case reflect.String: + return textLine(formatString(v.String())) + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + return textLine(formatPointer(v)) + case reflect.Struct: + var list textList + for i := 0; i < v.NumField(); i++ { + vv := v.Field(i) + if value.IsZero(vv) { + continue // Elide fields with zero values + } + s := opts.WithTypeMode(autoType).FormatValue(vv, m) + list = append(list, textRecord{Key: t.Field(i).Name, Value: s}) + } + return textWrap{"{", list, "}"} + case reflect.Slice: + if v.IsNil() { + return textNil + } + if opts.PrintAddresses { + ptr = formatPointer(v) + } + fallthrough + case reflect.Array: + var list textList + for i := 0; i < v.Len(); i++ { + vi := v.Index(i) + if vi.CanAddr() { // Check for cyclic elements + p := vi.Addr() + if m.Visit(p) { + var out textNode + out = textLine(formatPointer(p)) + out = opts.WithTypeMode(emitType).FormatType(p.Type(), out) + out = textWrap{"*", out, ""} + list = append(list, textRecord{Value: out}) + continue + } + } + s := opts.WithTypeMode(elideType).FormatValue(vi, m) + list = append(list, textRecord{Value: s}) + } + return textWrap{ptr + "{", list, "}"} + case reflect.Map: + if v.IsNil() { + return textNil + } + if m.Visit(v) { + return textLine(formatPointer(v)) + } + + var list textList + for _, k := range value.SortKeys(v.MapKeys()) { + sk := formatMapKey(k) + sv := opts.WithTypeMode(elideType).FormatValue(v.MapIndex(k), m) + list = append(list, textRecord{Key: sk, Value: sv}) + } + if opts.PrintAddresses { + ptr = formatPointer(v) + } + return textWrap{ptr + "{", list, "}"} + case reflect.Ptr: + if v.IsNil() { + return textNil + } + if m.Visit(v) || opts.ShallowPointers { + return textLine(formatPointer(v)) + } + if opts.PrintAddresses { + ptr = formatPointer(v) + } + skipType = true // Let the underlying value print the type instead + return textWrap{"&" + ptr, opts.FormatValue(v.Elem(), m), ""} + case reflect.Interface: + if v.IsNil() { + return textNil + } + // Interfaces accept different concrete types, + // so configure the underlying value to explicitly print the type. + skipType = true // Print the concrete type instead + return opts.WithTypeMode(emitType).FormatValue(v.Elem(), m) + default: + panic(fmt.Sprintf("%v kind not handled", v.Kind())) + } +} + +// formatMapKey formats v as if it were a map key. +// The result is guaranteed to be a single line. +func formatMapKey(v reflect.Value) string { + var opts formatOptions + opts.TypeMode = elideType + opts.ShallowPointers = true + s := opts.FormatValue(v, visitedPointers{}).String() + return strings.TrimSpace(s) +} + +// formatString prints s as a double-quoted or backtick-quoted string. +func formatString(s string) string { + // Use quoted string if it the same length as a raw string literal. + // Otherwise, attempt to use the raw string form. + qs := strconv.Quote(s) + if len(qs) == 1+len(s)+1 { + return qs + } + + // Disallow newlines to ensure output is a single line. + // Only allow printable runes for readability purposes. + rawInvalid := func(r rune) bool { + return r == '`' || r == '\n' || !(unicode.IsPrint(r) || r == '\t') + } + if strings.IndexFunc(s, rawInvalid) < 0 { + return "`" + s + "`" + } + return qs +} + +// formatHex prints u as a hexadecimal integer in Go notation. +func formatHex(u uint64) string { + var f string + switch { + case u <= 0xff: + f = "0x%02x" + case u <= 0xffff: + f = "0x%04x" + case u <= 0xffffff: + f = "0x%06x" + case u <= 0xffffffff: + f = "0x%08x" + case u <= 0xffffffffff: + f = "0x%010x" + case u <= 0xffffffffffff: + f = "0x%012x" + case u <= 0xffffffffffffff: + f = "0x%014x" + case u <= 0xffffffffffffffff: + f = "0x%016x" + } + return fmt.Sprintf(f, u) +} + +// formatPointer prints the address of the pointer. +func formatPointer(v reflect.Value) string { + p := v.Pointer() + if flags.Deterministic { + p = 0xdeadf00f // Only used for stable testing purposes + } + return fmt.Sprintf("⟪0x%x⟫", p) +} + +type visitedPointers map[value.Pointer]struct{} + +// Visit inserts pointer v into the visited map and reports whether it had +// already been visited before. +func (m visitedPointers) Visit(v reflect.Value) bool { + p := value.PointerOf(v) + _, visited := m[p] + m[p] = struct{}{} + return visited +} diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go new file mode 100644 index 000000000..eafcf2e4c --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report_slices.go @@ -0,0 +1,333 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "bytes" + "fmt" + "reflect" + "strings" + "unicode" + "unicode/utf8" + + "github.com/google/go-cmp/cmp/internal/diff" +) + +// CanFormatDiffSlice reports whether we support custom formatting for nodes +// that are slices of primitive kinds or strings. +func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { + switch { + case opts.DiffMode != diffUnknown: + return false // Must be formatting in diff mode + case v.NumDiff == 0: + return false // No differences detected + case v.NumIgnored+v.NumCompared+v.NumTransformed > 0: + // TODO: Handle the case where someone uses bytes.Equal on a large slice. + return false // Some custom option was used to determined equality + case !v.ValueX.IsValid() || !v.ValueY.IsValid(): + return false // Both values must be valid + } + + switch t := v.Type; t.Kind() { + case reflect.String: + case reflect.Array, reflect.Slice: + // Only slices of primitive types have specialized handling. + switch t.Elem().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, + reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: + default: + return false + } + + // If a sufficient number of elements already differ, + // use specialized formatting even if length requirement is not met. + if v.NumDiff > v.NumSame { + return true + } + default: + return false + } + + // Use specialized string diffing for longer slices or strings. + const minLength = 64 + return v.ValueX.Len() >= minLength && v.ValueY.Len() >= minLength +} + +// FormatDiffSlice prints a diff for the slices (or strings) represented by v. +// This provides custom-tailored logic to make printing of differences in +// textual strings and slices of primitive kinds more readable. +func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { + assert(opts.DiffMode == diffUnknown) + t, vx, vy := v.Type, v.ValueX, v.ValueY + + // Auto-detect the type of the data. + var isLinedText, isText, isBinary bool + var sx, sy string + switch { + case t.Kind() == reflect.String: + sx, sy = vx.String(), vy.String() + isText = true // Initial estimate, verify later + case t.Kind() == reflect.Slice && t.Elem() == reflect.TypeOf(byte(0)): + sx, sy = string(vx.Bytes()), string(vy.Bytes()) + isBinary = true // Initial estimate, verify later + case t.Kind() == reflect.Array: + // Arrays need to be addressable for slice operations to work. + vx2, vy2 := reflect.New(t).Elem(), reflect.New(t).Elem() + vx2.Set(vx) + vy2.Set(vy) + vx, vy = vx2, vy2 + } + if isText || isBinary { + var numLines, lastLineIdx, maxLineLen int + isBinary = false + for i, r := range sx + sy { + if !(unicode.IsPrint(r) || unicode.IsSpace(r)) || r == utf8.RuneError { + isBinary = true + break + } + if r == '\n' { + if maxLineLen < i-lastLineIdx { + maxLineLen = i - lastLineIdx + } + lastLineIdx = i + 1 + numLines++ + } + } + isText = !isBinary + isLinedText = isText && numLines >= 4 && maxLineLen <= 256 + } + + // Format the string into printable records. + var list textList + var delim string + switch { + // If the text appears to be multi-lined text, + // then perform differencing across individual lines. + case isLinedText: + ssx := strings.Split(sx, "\n") + ssy := strings.Split(sy, "\n") + list = opts.formatDiffSlice( + reflect.ValueOf(ssx), reflect.ValueOf(ssy), 1, "line", + func(v reflect.Value, d diffMode) textRecord { + s := formatString(v.Index(0).String()) + return textRecord{Diff: d, Value: textLine(s)} + }, + ) + delim = "\n" + // If the text appears to be single-lined text, + // then perform differencing in approximately fixed-sized chunks. + // The output is printed as quoted strings. + case isText: + list = opts.formatDiffSlice( + reflect.ValueOf(sx), reflect.ValueOf(sy), 64, "byte", + func(v reflect.Value, d diffMode) textRecord { + s := formatString(v.String()) + return textRecord{Diff: d, Value: textLine(s)} + }, + ) + delim = "" + // If the text appears to be binary data, + // then perform differencing in approximately fixed-sized chunks. + // The output is inspired by hexdump. + case isBinary: + list = opts.formatDiffSlice( + reflect.ValueOf(sx), reflect.ValueOf(sy), 16, "byte", + func(v reflect.Value, d diffMode) textRecord { + var ss []string + for i := 0; i < v.Len(); i++ { + ss = append(ss, formatHex(v.Index(i).Uint())) + } + s := strings.Join(ss, ", ") + comment := commentString(fmt.Sprintf("%c|%v|", d, formatASCII(v.String()))) + return textRecord{Diff: d, Value: textLine(s), Comment: comment} + }, + ) + // For all other slices of primitive types, + // then perform differencing in approximately fixed-sized chunks. + // The size of each chunk depends on the width of the element kind. + default: + var chunkSize int + if t.Elem().Kind() == reflect.Bool { + chunkSize = 16 + } else { + switch t.Elem().Bits() { + case 8: + chunkSize = 16 + case 16: + chunkSize = 12 + case 32: + chunkSize = 8 + default: + chunkSize = 8 + } + } + list = opts.formatDiffSlice( + vx, vy, chunkSize, t.Elem().Kind().String(), + func(v reflect.Value, d diffMode) textRecord { + var ss []string + for i := 0; i < v.Len(); i++ { + switch t.Elem().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + ss = append(ss, fmt.Sprint(v.Index(i).Int())) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + ss = append(ss, formatHex(v.Index(i).Uint())) + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: + ss = append(ss, fmt.Sprint(v.Index(i).Interface())) + } + } + s := strings.Join(ss, ", ") + return textRecord{Diff: d, Value: textLine(s)} + }, + ) + } + + // Wrap the output with appropriate type information. + var out textNode = textWrap{"{", list, "}"} + if !isText { + // The "{...}" byte-sequence literal is not valid Go syntax for strings. + // Emit the type for extra clarity (e.g. "string{...}"). + if t.Kind() == reflect.String { + opts = opts.WithTypeMode(emitType) + } + return opts.FormatType(t, out) + } + switch t.Kind() { + case reflect.String: + out = textWrap{"strings.Join(", out, fmt.Sprintf(", %q)", delim)} + if t != reflect.TypeOf(string("")) { + out = opts.FormatType(t, out) + } + case reflect.Slice: + out = textWrap{"bytes.Join(", out, fmt.Sprintf(", %q)", delim)} + if t != reflect.TypeOf([]byte(nil)) { + out = opts.FormatType(t, out) + } + } + return out +} + +// formatASCII formats s as an ASCII string. +// This is useful for printing binary strings in a semi-legible way. +func formatASCII(s string) string { + b := bytes.Repeat([]byte{'.'}, len(s)) + for i := 0; i < len(s); i++ { + if ' ' <= s[i] && s[i] <= '~' { + b[i] = s[i] + } + } + return string(b) +} + +func (opts formatOptions) formatDiffSlice( + vx, vy reflect.Value, chunkSize int, name string, + makeRec func(reflect.Value, diffMode) textRecord, +) (list textList) { + es := diff.Difference(vx.Len(), vy.Len(), func(ix int, iy int) diff.Result { + return diff.BoolResult(vx.Index(ix).Interface() == vy.Index(iy).Interface()) + }) + + appendChunks := func(v reflect.Value, d diffMode) int { + n0 := v.Len() + for v.Len() > 0 { + n := chunkSize + if n > v.Len() { + n = v.Len() + } + list = append(list, makeRec(v.Slice(0, n), d)) + v = v.Slice(n, v.Len()) + } + return n0 - v.Len() + } + + groups := coalesceAdjacentEdits(name, es) + groups = coalesceInterveningIdentical(groups, chunkSize/4) + for i, ds := range groups { + // Print equal. + if ds.NumDiff() == 0 { + // Compute the number of leading and trailing equal bytes to print. + var numLo, numHi int + numEqual := ds.NumIgnored + ds.NumIdentical + for numLo < chunkSize*numContextRecords && numLo+numHi < numEqual && i != 0 { + numLo++ + } + for numHi < chunkSize*numContextRecords && numLo+numHi < numEqual && i != len(groups)-1 { + numHi++ + } + if numEqual-(numLo+numHi) <= chunkSize && ds.NumIgnored == 0 { + numHi = numEqual - numLo // Avoid pointless coalescing of single equal row + } + + // Print the equal bytes. + appendChunks(vx.Slice(0, numLo), diffIdentical) + if numEqual > numLo+numHi { + ds.NumIdentical -= numLo + numHi + list.AppendEllipsis(ds) + } + appendChunks(vx.Slice(numEqual-numHi, numEqual), diffIdentical) + vx = vx.Slice(numEqual, vx.Len()) + vy = vy.Slice(numEqual, vy.Len()) + continue + } + + // Print unequal. + nx := appendChunks(vx.Slice(0, ds.NumIdentical+ds.NumRemoved+ds.NumModified), diffRemoved) + vx = vx.Slice(nx, vx.Len()) + ny := appendChunks(vy.Slice(0, ds.NumIdentical+ds.NumInserted+ds.NumModified), diffInserted) + vy = vy.Slice(ny, vy.Len()) + } + assert(vx.Len() == 0 && vy.Len() == 0) + return list +} + +// coalesceAdjacentEdits coalesces the list of edits into groups of adjacent +// equal or unequal counts. +func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) { + var prevCase int // Arbitrary index into which case last occurred + lastStats := func(i int) *diffStats { + if prevCase != i { + groups = append(groups, diffStats{Name: name}) + prevCase = i + } + return &groups[len(groups)-1] + } + for _, e := range es { + switch e { + case diff.Identity: + lastStats(1).NumIdentical++ + case diff.UniqueX: + lastStats(2).NumRemoved++ + case diff.UniqueY: + lastStats(2).NumInserted++ + case diff.Modified: + lastStats(2).NumModified++ + } + } + return groups +} + +// coalesceInterveningIdentical coalesces sufficiently short (<= windowSize) +// equal groups into adjacent unequal groups that currently result in a +// dual inserted/removed printout. This acts as a high-pass filter to smooth +// out high-frequency changes within the windowSize. +func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStats { + groups, groupsOrig := groups[:0], groups + for i, ds := range groupsOrig { + if len(groups) >= 2 && ds.NumDiff() > 0 { + prev := &groups[len(groups)-2] // Unequal group + curr := &groups[len(groups)-1] // Equal group + next := &groupsOrig[i] // Unequal group + hadX, hadY := prev.NumRemoved > 0, prev.NumInserted > 0 + hasX, hasY := next.NumRemoved > 0, next.NumInserted > 0 + if ((hadX || hasX) && (hadY || hasY)) && curr.NumIdentical <= windowSize { + *prev = prev.Append(*curr).Append(*next) + groups = groups[:len(groups)-1] // Truncate off equal group + continue + } + } + groups = append(groups, ds) + } + return groups +} diff --git a/vendor/github.com/google/go-cmp/cmp/report_text.go b/vendor/github.com/google/go-cmp/cmp/report_text.go new file mode 100644 index 000000000..8b8fcab7b --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report_text.go @@ -0,0 +1,387 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "bytes" + "fmt" + "math/rand" + "strings" + "time" + + "github.com/google/go-cmp/cmp/internal/flags" +) + +var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 + +type indentMode int + +func (n indentMode) appendIndent(b []byte, d diffMode) []byte { + // The output of Diff is documented as being unstable to provide future + // flexibility in changing the output for more humanly readable reports. + // This logic intentionally introduces instability to the exact output + // so that users can detect accidental reliance on stability early on, + // rather than much later when an actual change to the format occurs. + if flags.Deterministic || randBool { + // Use regular spaces (U+0020). + switch d { + case diffUnknown, diffIdentical: + b = append(b, " "...) + case diffRemoved: + b = append(b, "- "...) + case diffInserted: + b = append(b, "+ "...) + } + } else { + // Use non-breaking spaces (U+00a0). + switch d { + case diffUnknown, diffIdentical: + b = append(b, "  "...) + case diffRemoved: + b = append(b, "- "...) + case diffInserted: + b = append(b, "+ "...) + } + } + return repeatCount(n).appendChar(b, '\t') +} + +type repeatCount int + +func (n repeatCount) appendChar(b []byte, c byte) []byte { + for ; n > 0; n-- { + b = append(b, c) + } + return b +} + +// textNode is a simplified tree-based representation of structured text. +// Possible node types are textWrap, textList, or textLine. +type textNode interface { + // Len reports the length in bytes of a single-line version of the tree. + // Nested textRecord.Diff and textRecord.Comment fields are ignored. + Len() int + // Equal reports whether the two trees are structurally identical. + // Nested textRecord.Diff and textRecord.Comment fields are compared. + Equal(textNode) bool + // String returns the string representation of the text tree. + // It is not guaranteed that len(x.String()) == x.Len(), + // nor that x.String() == y.String() implies that x.Equal(y). + String() string + + // formatCompactTo formats the contents of the tree as a single-line string + // to the provided buffer. Any nested textRecord.Diff and textRecord.Comment + // fields are ignored. + // + // However, not all nodes in the tree should be collapsed as a single-line. + // If a node can be collapsed as a single-line, it is replaced by a textLine + // node. Since the top-level node cannot replace itself, this also returns + // the current node itself. + // + // This does not mutate the receiver. + formatCompactTo([]byte, diffMode) ([]byte, textNode) + // formatExpandedTo formats the contents of the tree as a multi-line string + // to the provided buffer. In order for column alignment to operate well, + // formatCompactTo must be called before calling formatExpandedTo. + formatExpandedTo([]byte, diffMode, indentMode) []byte +} + +// textWrap is a wrapper that concatenates a prefix and/or a suffix +// to the underlying node. +type textWrap struct { + Prefix string // e.g., "bytes.Buffer{" + Value textNode // textWrap | textList | textLine + Suffix string // e.g., "}" +} + +func (s textWrap) Len() int { + return len(s.Prefix) + s.Value.Len() + len(s.Suffix) +} +func (s1 textWrap) Equal(s2 textNode) bool { + if s2, ok := s2.(textWrap); ok { + return s1.Prefix == s2.Prefix && s1.Value.Equal(s2.Value) && s1.Suffix == s2.Suffix + } + return false +} +func (s textWrap) String() string { + var d diffMode + var n indentMode + _, s2 := s.formatCompactTo(nil, d) + b := n.appendIndent(nil, d) // Leading indent + b = s2.formatExpandedTo(b, d, n) // Main body + b = append(b, '\n') // Trailing newline + return string(b) +} +func (s textWrap) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { + n0 := len(b) // Original buffer length + b = append(b, s.Prefix...) + b, s.Value = s.Value.formatCompactTo(b, d) + b = append(b, s.Suffix...) + if _, ok := s.Value.(textLine); ok { + return b, textLine(b[n0:]) + } + return b, s +} +func (s textWrap) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { + b = append(b, s.Prefix...) + b = s.Value.formatExpandedTo(b, d, n) + b = append(b, s.Suffix...) + return b +} + +// textList is a comma-separated list of textWrap or textLine nodes. +// The list may be formatted as multi-lines or single-line at the discretion +// of the textList.formatCompactTo method. +type textList []textRecord +type textRecord struct { + Diff diffMode // e.g., 0 or '-' or '+' + Key string // e.g., "MyField" + Value textNode // textWrap | textLine + Comment fmt.Stringer // e.g., "6 identical fields" +} + +// AppendEllipsis appends a new ellipsis node to the list if none already +// exists at the end. If cs is non-zero it coalesces the statistics with the +// previous diffStats. +func (s *textList) AppendEllipsis(ds diffStats) { + hasStats := ds != diffStats{} + if len(*s) == 0 || !(*s)[len(*s)-1].Value.Equal(textEllipsis) { + if hasStats { + *s = append(*s, textRecord{Value: textEllipsis, Comment: ds}) + } else { + *s = append(*s, textRecord{Value: textEllipsis}) + } + return + } + if hasStats { + (*s)[len(*s)-1].Comment = (*s)[len(*s)-1].Comment.(diffStats).Append(ds) + } +} + +func (s textList) Len() (n int) { + for i, r := range s { + n += len(r.Key) + if r.Key != "" { + n += len(": ") + } + n += r.Value.Len() + if i < len(s)-1 { + n += len(", ") + } + } + return n +} + +func (s1 textList) Equal(s2 textNode) bool { + if s2, ok := s2.(textList); ok { + if len(s1) != len(s2) { + return false + } + for i := range s1 { + r1, r2 := s1[i], s2[i] + if !(r1.Diff == r2.Diff && r1.Key == r2.Key && r1.Value.Equal(r2.Value) && r1.Comment == r2.Comment) { + return false + } + } + return true + } + return false +} + +func (s textList) String() string { + return textWrap{"{", s, "}"}.String() +} + +func (s textList) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { + s = append(textList(nil), s...) // Avoid mutating original + + // Determine whether we can collapse this list as a single line. + n0 := len(b) // Original buffer length + var multiLine bool + for i, r := range s { + if r.Diff == diffInserted || r.Diff == diffRemoved { + multiLine = true + } + b = append(b, r.Key...) + if r.Key != "" { + b = append(b, ": "...) + } + b, s[i].Value = r.Value.formatCompactTo(b, d|r.Diff) + if _, ok := s[i].Value.(textLine); !ok { + multiLine = true + } + if r.Comment != nil { + multiLine = true + } + if i < len(s)-1 { + b = append(b, ", "...) + } + } + // Force multi-lined output when printing a removed/inserted node that + // is sufficiently long. + if (d == diffInserted || d == diffRemoved) && len(b[n0:]) > 80 { + multiLine = true + } + if !multiLine { + return b, textLine(b[n0:]) + } + return b, s +} + +func (s textList) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { + alignKeyLens := s.alignLens( + func(r textRecord) bool { + _, isLine := r.Value.(textLine) + return r.Key == "" || !isLine + }, + func(r textRecord) int { return len(r.Key) }, + ) + alignValueLens := s.alignLens( + func(r textRecord) bool { + _, isLine := r.Value.(textLine) + return !isLine || r.Value.Equal(textEllipsis) || r.Comment == nil + }, + func(r textRecord) int { return len(r.Value.(textLine)) }, + ) + + // Format the list as a multi-lined output. + n++ + for i, r := range s { + b = n.appendIndent(append(b, '\n'), d|r.Diff) + if r.Key != "" { + b = append(b, r.Key+": "...) + } + b = alignKeyLens[i].appendChar(b, ' ') + + b = r.Value.formatExpandedTo(b, d|r.Diff, n) + if !r.Value.Equal(textEllipsis) { + b = append(b, ',') + } + b = alignValueLens[i].appendChar(b, ' ') + + if r.Comment != nil { + b = append(b, " // "+r.Comment.String()...) + } + } + n-- + + return n.appendIndent(append(b, '\n'), d) +} + +func (s textList) alignLens( + skipFunc func(textRecord) bool, + lenFunc func(textRecord) int, +) []repeatCount { + var startIdx, endIdx, maxLen int + lens := make([]repeatCount, len(s)) + for i, r := range s { + if skipFunc(r) { + for j := startIdx; j < endIdx && j < len(s); j++ { + lens[j] = repeatCount(maxLen - lenFunc(s[j])) + } + startIdx, endIdx, maxLen = i+1, i+1, 0 + } else { + if maxLen < lenFunc(r) { + maxLen = lenFunc(r) + } + endIdx = i + 1 + } + } + for j := startIdx; j < endIdx && j < len(s); j++ { + lens[j] = repeatCount(maxLen - lenFunc(s[j])) + } + return lens +} + +// textLine is a single-line segment of text and is always a leaf node +// in the textNode tree. +type textLine []byte + +var ( + textNil = textLine("nil") + textEllipsis = textLine("...") +) + +func (s textLine) Len() int { + return len(s) +} +func (s1 textLine) Equal(s2 textNode) bool { + if s2, ok := s2.(textLine); ok { + return bytes.Equal([]byte(s1), []byte(s2)) + } + return false +} +func (s textLine) String() string { + return string(s) +} +func (s textLine) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { + return append(b, s...), s +} +func (s textLine) formatExpandedTo(b []byte, _ diffMode, _ indentMode) []byte { + return append(b, s...) +} + +type diffStats struct { + Name string + NumIgnored int + NumIdentical int + NumRemoved int + NumInserted int + NumModified int +} + +func (s diffStats) NumDiff() int { + return s.NumRemoved + s.NumInserted + s.NumModified +} + +func (s diffStats) Append(ds diffStats) diffStats { + assert(s.Name == ds.Name) + s.NumIgnored += ds.NumIgnored + s.NumIdentical += ds.NumIdentical + s.NumRemoved += ds.NumRemoved + s.NumInserted += ds.NumInserted + s.NumModified += ds.NumModified + return s +} + +// String prints a humanly-readable summary of coalesced records. +// +// Example: +// diffStats{Name: "Field", NumIgnored: 5}.String() => "5 ignored fields" +func (s diffStats) String() string { + var ss []string + var sum int + labels := [...]string{"ignored", "identical", "removed", "inserted", "modified"} + counts := [...]int{s.NumIgnored, s.NumIdentical, s.NumRemoved, s.NumInserted, s.NumModified} + for i, n := range counts { + if n > 0 { + ss = append(ss, fmt.Sprintf("%d %v", n, labels[i])) + } + sum += n + } + + // Pluralize the name (adjusting for some obscure English grammar rules). + name := s.Name + if sum > 1 { + name += "s" + if strings.HasSuffix(name, "ys") { + name = name[:len(name)-2] + "ies" // e.g., "entrys" => "entries" + } + } + + // Format the list according to English grammar (with Oxford comma). + switch n := len(ss); n { + case 0: + return "" + case 1, 2: + return strings.Join(ss, " and ") + " " + name + default: + return strings.Join(ss[:n-1], ", ") + ", and " + ss[n-1] + " " + name + } +} + +type commentString string + +func (s commentString) String() string { return string(s) } diff --git a/vendor/github.com/google/go-cmp/cmp/report_value.go b/vendor/github.com/google/go-cmp/cmp/report_value.go new file mode 100644 index 000000000..83031a7f5 --- /dev/null +++ b/vendor/github.com/google/go-cmp/cmp/report_value.go @@ -0,0 +1,121 @@ +// Copyright 2019, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import "reflect" + +// valueNode represents a single node within a report, which is a +// structured representation of the value tree, containing information +// regarding which nodes are equal or not. +type valueNode struct { + parent *valueNode + + Type reflect.Type + ValueX reflect.Value + ValueY reflect.Value + + // NumSame is the number of leaf nodes that are equal. + // All descendants are equal only if NumDiff is 0. + NumSame int + // NumDiff is the number of leaf nodes that are not equal. + NumDiff int + // NumIgnored is the number of leaf nodes that are ignored. + NumIgnored int + // NumCompared is the number of leaf nodes that were compared + // using an Equal method or Comparer function. + NumCompared int + // NumTransformed is the number of non-leaf nodes that were transformed. + NumTransformed int + // NumChildren is the number of transitive descendants of this node. + // This counts from zero; thus, leaf nodes have no descendants. + NumChildren int + // MaxDepth is the maximum depth of the tree. This counts from zero; + // thus, leaf nodes have a depth of zero. + MaxDepth int + + // Records is a list of struct fields, slice elements, or map entries. + Records []reportRecord // If populated, implies Value is not populated + + // Value is the result of a transformation, pointer indirect, of + // type assertion. + Value *valueNode // If populated, implies Records is not populated + + // TransformerName is the name of the transformer. + TransformerName string // If non-empty, implies Value is populated +} +type reportRecord struct { + Key reflect.Value // Invalid for slice element + Value *valueNode +} + +func (parent *valueNode) PushStep(ps PathStep) (child *valueNode) { + vx, vy := ps.Values() + child = &valueNode{parent: parent, Type: ps.Type(), ValueX: vx, ValueY: vy} + switch s := ps.(type) { + case StructField: + assert(parent.Value == nil) + parent.Records = append(parent.Records, reportRecord{Key: reflect.ValueOf(s.Name()), Value: child}) + case SliceIndex: + assert(parent.Value == nil) + parent.Records = append(parent.Records, reportRecord{Value: child}) + case MapIndex: + assert(parent.Value == nil) + parent.Records = append(parent.Records, reportRecord{Key: s.Key(), Value: child}) + case Indirect: + assert(parent.Value == nil && parent.Records == nil) + parent.Value = child + case TypeAssertion: + assert(parent.Value == nil && parent.Records == nil) + parent.Value = child + case Transform: + assert(parent.Value == nil && parent.Records == nil) + parent.Value = child + parent.TransformerName = s.Name() + parent.NumTransformed++ + default: + assert(parent == nil) // Must be the root step + } + return child +} + +func (r *valueNode) Report(rs Result) { + assert(r.MaxDepth == 0) // May only be called on leaf nodes + + if rs.ByIgnore() { + r.NumIgnored++ + } else { + if rs.Equal() { + r.NumSame++ + } else { + r.NumDiff++ + } + } + assert(r.NumSame+r.NumDiff+r.NumIgnored == 1) + + if rs.ByMethod() { + r.NumCompared++ + } + if rs.ByFunc() { + r.NumCompared++ + } + assert(r.NumCompared <= 1) +} + +func (child *valueNode) PopStep() (parent *valueNode) { + if child.parent == nil { + return nil + } + parent = child.parent + parent.NumSame += child.NumSame + parent.NumDiff += child.NumDiff + parent.NumIgnored += child.NumIgnored + parent.NumCompared += child.NumCompared + parent.NumTransformed += child.NumTransformed + parent.NumChildren += child.NumChildren + 1 + if parent.MaxDepth < child.MaxDepth+1 { + parent.MaxDepth = child.MaxDepth + 1 + } + return parent +} diff --git a/vendor/github.com/google/gofuzz/LICENSE b/vendor/github.com/google/gofuzz/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/google/gofuzz/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/gofuzz/doc.go b/vendor/github.com/google/gofuzz/doc.go new file mode 100644 index 000000000..9f9956d4a --- /dev/null +++ b/vendor/github.com/google/gofuzz/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package fuzz is a library for populating go objects with random values. +package fuzz diff --git a/vendor/github.com/google/gofuzz/fuzz.go b/vendor/github.com/google/gofuzz/fuzz.go new file mode 100644 index 000000000..1dfa80a6f --- /dev/null +++ b/vendor/github.com/google/gofuzz/fuzz.go @@ -0,0 +1,487 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fuzz + +import ( + "fmt" + "math/rand" + "reflect" + "time" +) + +// fuzzFuncMap is a map from a type to a fuzzFunc that handles that type. +type fuzzFuncMap map[reflect.Type]reflect.Value + +// Fuzzer knows how to fill any object with random fields. +type Fuzzer struct { + fuzzFuncs fuzzFuncMap + defaultFuzzFuncs fuzzFuncMap + r *rand.Rand + nilChance float64 + minElements int + maxElements int + maxDepth int +} + +// New returns a new Fuzzer. Customize your Fuzzer further by calling Funcs, +// RandSource, NilChance, or NumElements in any order. +func New() *Fuzzer { + return NewWithSeed(time.Now().UnixNano()) +} + +func NewWithSeed(seed int64) *Fuzzer { + f := &Fuzzer{ + defaultFuzzFuncs: fuzzFuncMap{ + reflect.TypeOf(&time.Time{}): reflect.ValueOf(fuzzTime), + }, + + fuzzFuncs: fuzzFuncMap{}, + r: rand.New(rand.NewSource(seed)), + nilChance: .2, + minElements: 1, + maxElements: 10, + maxDepth: 100, + } + return f +} + +// Funcs adds each entry in fuzzFuncs as a custom fuzzing function. +// +// Each entry in fuzzFuncs must be a function taking two parameters. +// The first parameter must be a pointer or map. It is the variable that +// function will fill with random data. The second parameter must be a +// fuzz.Continue, which will provide a source of randomness and a way +// to automatically continue fuzzing smaller pieces of the first parameter. +// +// These functions are called sensibly, e.g., if you wanted custom string +// fuzzing, the function `func(s *string, c fuzz.Continue)` would get +// called and passed the address of strings. Maps and pointers will always +// be made/new'd for you, ignoring the NilChange option. For slices, it +// doesn't make much sense to pre-create them--Fuzzer doesn't know how +// long you want your slice--so take a pointer to a slice, and make it +// yourself. (If you don't want your map/pointer type pre-made, take a +// pointer to it, and make it yourself.) See the examples for a range of +// custom functions. +func (f *Fuzzer) Funcs(fuzzFuncs ...interface{}) *Fuzzer { + for i := range fuzzFuncs { + v := reflect.ValueOf(fuzzFuncs[i]) + if v.Kind() != reflect.Func { + panic("Need only funcs!") + } + t := v.Type() + if t.NumIn() != 2 || t.NumOut() != 0 { + panic("Need 2 in and 0 out params!") + } + argT := t.In(0) + switch argT.Kind() { + case reflect.Ptr, reflect.Map: + default: + panic("fuzzFunc must take pointer or map type") + } + if t.In(1) != reflect.TypeOf(Continue{}) { + panic("fuzzFunc's second parameter must be type fuzz.Continue") + } + f.fuzzFuncs[argT] = v + } + return f +} + +// RandSource causes f to get values from the given source of randomness. +// Use if you want deterministic fuzzing. +func (f *Fuzzer) RandSource(s rand.Source) *Fuzzer { + f.r = rand.New(s) + return f +} + +// NilChance sets the probability of creating a nil pointer, map, or slice to +// 'p'. 'p' should be between 0 (no nils) and 1 (all nils), inclusive. +func (f *Fuzzer) NilChance(p float64) *Fuzzer { + if p < 0 || p > 1 { + panic("p should be between 0 and 1, inclusive.") + } + f.nilChance = p + return f +} + +// NumElements sets the minimum and maximum number of elements that will be +// added to a non-nil map or slice. +func (f *Fuzzer) NumElements(atLeast, atMost int) *Fuzzer { + if atLeast > atMost { + panic("atLeast must be <= atMost") + } + if atLeast < 0 { + panic("atLeast must be >= 0") + } + f.minElements = atLeast + f.maxElements = atMost + return f +} + +func (f *Fuzzer) genElementCount() int { + if f.minElements == f.maxElements { + return f.minElements + } + return f.minElements + f.r.Intn(f.maxElements-f.minElements+1) +} + +func (f *Fuzzer) genShouldFill() bool { + return f.r.Float64() > f.nilChance +} + +// MaxDepth sets the maximum number of recursive fuzz calls that will be made +// before stopping. This includes struct members, pointers, and map and slice +// elements. +func (f *Fuzzer) MaxDepth(d int) *Fuzzer { + f.maxDepth = d + return f +} + +// Fuzz recursively fills all of obj's fields with something random. First +// this tries to find a custom fuzz function (see Funcs). If there is no +// custom function this tests whether the object implements fuzz.Interface and, +// if so, calls Fuzz on it to fuzz itself. If that fails, this will see if +// there is a default fuzz function provided by this package. If all of that +// fails, this will generate random values for all primitive fields and then +// recurse for all non-primitives. +// +// This is safe for cyclic or tree-like structs, up to a limit. Use the +// MaxDepth method to adjust how deep you need it to recurse. +// +// obj must be a pointer. Only exported (public) fields can be set (thanks, +// golang :/ ) Intended for tests, so will panic on bad input or unimplemented +// fields. +func (f *Fuzzer) Fuzz(obj interface{}) { + v := reflect.ValueOf(obj) + if v.Kind() != reflect.Ptr { + panic("needed ptr!") + } + v = v.Elem() + f.fuzzWithContext(v, 0) +} + +// FuzzNoCustom is just like Fuzz, except that any custom fuzz function for +// obj's type will not be called and obj will not be tested for fuzz.Interface +// conformance. This applies only to obj and not other instances of obj's +// type. +// Not safe for cyclic or tree-like structs! +// obj must be a pointer. Only exported (public) fields can be set (thanks, golang :/ ) +// Intended for tests, so will panic on bad input or unimplemented fields. +func (f *Fuzzer) FuzzNoCustom(obj interface{}) { + v := reflect.ValueOf(obj) + if v.Kind() != reflect.Ptr { + panic("needed ptr!") + } + v = v.Elem() + f.fuzzWithContext(v, flagNoCustomFuzz) +} + +const ( + // Do not try to find a custom fuzz function. Does not apply recursively. + flagNoCustomFuzz uint64 = 1 << iota +) + +func (f *Fuzzer) fuzzWithContext(v reflect.Value, flags uint64) { + fc := &fuzzerContext{fuzzer: f} + fc.doFuzz(v, flags) +} + +// fuzzerContext carries context about a single fuzzing run, which lets Fuzzer +// be thread-safe. +type fuzzerContext struct { + fuzzer *Fuzzer + curDepth int +} + +func (fc *fuzzerContext) doFuzz(v reflect.Value, flags uint64) { + if fc.curDepth >= fc.fuzzer.maxDepth { + return + } + fc.curDepth++ + defer func() { fc.curDepth-- }() + + if !v.CanSet() { + return + } + + if flags&flagNoCustomFuzz == 0 { + // Check for both pointer and non-pointer custom functions. + if v.CanAddr() && fc.tryCustom(v.Addr()) { + return + } + if fc.tryCustom(v) { + return + } + } + + if fn, ok := fillFuncMap[v.Kind()]; ok { + fn(v, fc.fuzzer.r) + return + } + switch v.Kind() { + case reflect.Map: + if fc.fuzzer.genShouldFill() { + v.Set(reflect.MakeMap(v.Type())) + n := fc.fuzzer.genElementCount() + for i := 0; i < n; i++ { + key := reflect.New(v.Type().Key()).Elem() + fc.doFuzz(key, 0) + val := reflect.New(v.Type().Elem()).Elem() + fc.doFuzz(val, 0) + v.SetMapIndex(key, val) + } + return + } + v.Set(reflect.Zero(v.Type())) + case reflect.Ptr: + if fc.fuzzer.genShouldFill() { + v.Set(reflect.New(v.Type().Elem())) + fc.doFuzz(v.Elem(), 0) + return + } + v.Set(reflect.Zero(v.Type())) + case reflect.Slice: + if fc.fuzzer.genShouldFill() { + n := fc.fuzzer.genElementCount() + v.Set(reflect.MakeSlice(v.Type(), n, n)) + for i := 0; i < n; i++ { + fc.doFuzz(v.Index(i), 0) + } + return + } + v.Set(reflect.Zero(v.Type())) + case reflect.Array: + if fc.fuzzer.genShouldFill() { + n := v.Len() + for i := 0; i < n; i++ { + fc.doFuzz(v.Index(i), 0) + } + return + } + v.Set(reflect.Zero(v.Type())) + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + fc.doFuzz(v.Field(i), 0) + } + case reflect.Chan: + fallthrough + case reflect.Func: + fallthrough + case reflect.Interface: + fallthrough + default: + panic(fmt.Sprintf("Can't handle %#v", v.Interface())) + } +} + +// tryCustom searches for custom handlers, and returns true iff it finds a match +// and successfully randomizes v. +func (fc *fuzzerContext) tryCustom(v reflect.Value) bool { + // First: see if we have a fuzz function for it. + doCustom, ok := fc.fuzzer.fuzzFuncs[v.Type()] + if !ok { + // Second: see if it can fuzz itself. + if v.CanInterface() { + intf := v.Interface() + if fuzzable, ok := intf.(Interface); ok { + fuzzable.Fuzz(Continue{fc: fc, Rand: fc.fuzzer.r}) + return true + } + } + // Finally: see if there is a default fuzz function. + doCustom, ok = fc.fuzzer.defaultFuzzFuncs[v.Type()] + if !ok { + return false + } + } + + switch v.Kind() { + case reflect.Ptr: + if v.IsNil() { + if !v.CanSet() { + return false + } + v.Set(reflect.New(v.Type().Elem())) + } + case reflect.Map: + if v.IsNil() { + if !v.CanSet() { + return false + } + v.Set(reflect.MakeMap(v.Type())) + } + default: + return false + } + + doCustom.Call([]reflect.Value{v, reflect.ValueOf(Continue{ + fc: fc, + Rand: fc.fuzzer.r, + })}) + return true +} + +// Interface represents an object that knows how to fuzz itself. Any time we +// find a type that implements this interface we will delegate the act of +// fuzzing itself. +type Interface interface { + Fuzz(c Continue) +} + +// Continue can be passed to custom fuzzing functions to allow them to use +// the correct source of randomness and to continue fuzzing their members. +type Continue struct { + fc *fuzzerContext + + // For convenience, Continue implements rand.Rand via embedding. + // Use this for generating any randomness if you want your fuzzing + // to be repeatable for a given seed. + *rand.Rand +} + +// Fuzz continues fuzzing obj. obj must be a pointer. +func (c Continue) Fuzz(obj interface{}) { + v := reflect.ValueOf(obj) + if v.Kind() != reflect.Ptr { + panic("needed ptr!") + } + v = v.Elem() + c.fc.doFuzz(v, 0) +} + +// FuzzNoCustom continues fuzzing obj, except that any custom fuzz function for +// obj's type will not be called and obj will not be tested for fuzz.Interface +// conformance. This applies only to obj and not other instances of obj's +// type. +func (c Continue) FuzzNoCustom(obj interface{}) { + v := reflect.ValueOf(obj) + if v.Kind() != reflect.Ptr { + panic("needed ptr!") + } + v = v.Elem() + c.fc.doFuzz(v, flagNoCustomFuzz) +} + +// RandString makes a random string up to 20 characters long. The returned string +// may include a variety of (valid) UTF-8 encodings. +func (c Continue) RandString() string { + return randString(c.Rand) +} + +// RandUint64 makes random 64 bit numbers. +// Weirdly, rand doesn't have a function that gives you 64 random bits. +func (c Continue) RandUint64() uint64 { + return randUint64(c.Rand) +} + +// RandBool returns true or false randomly. +func (c Continue) RandBool() bool { + return randBool(c.Rand) +} + +func fuzzInt(v reflect.Value, r *rand.Rand) { + v.SetInt(int64(randUint64(r))) +} + +func fuzzUint(v reflect.Value, r *rand.Rand) { + v.SetUint(randUint64(r)) +} + +func fuzzTime(t *time.Time, c Continue) { + var sec, nsec int64 + // Allow for about 1000 years of random time values, which keeps things + // like JSON parsing reasonably happy. + sec = c.Rand.Int63n(1000 * 365 * 24 * 60 * 60) + c.Fuzz(&nsec) + *t = time.Unix(sec, nsec) +} + +var fillFuncMap = map[reflect.Kind]func(reflect.Value, *rand.Rand){ + reflect.Bool: func(v reflect.Value, r *rand.Rand) { + v.SetBool(randBool(r)) + }, + reflect.Int: fuzzInt, + reflect.Int8: fuzzInt, + reflect.Int16: fuzzInt, + reflect.Int32: fuzzInt, + reflect.Int64: fuzzInt, + reflect.Uint: fuzzUint, + reflect.Uint8: fuzzUint, + reflect.Uint16: fuzzUint, + reflect.Uint32: fuzzUint, + reflect.Uint64: fuzzUint, + reflect.Uintptr: fuzzUint, + reflect.Float32: func(v reflect.Value, r *rand.Rand) { + v.SetFloat(float64(r.Float32())) + }, + reflect.Float64: func(v reflect.Value, r *rand.Rand) { + v.SetFloat(r.Float64()) + }, + reflect.Complex64: func(v reflect.Value, r *rand.Rand) { + panic("unimplemented") + }, + reflect.Complex128: func(v reflect.Value, r *rand.Rand) { + panic("unimplemented") + }, + reflect.String: func(v reflect.Value, r *rand.Rand) { + v.SetString(randString(r)) + }, + reflect.UnsafePointer: func(v reflect.Value, r *rand.Rand) { + panic("unimplemented") + }, +} + +// randBool returns true or false randomly. +func randBool(r *rand.Rand) bool { + if r.Int()&1 == 1 { + return true + } + return false +} + +type charRange struct { + first, last rune +} + +// choose returns a random unicode character from the given range, using the +// given randomness source. +func (r *charRange) choose(rand *rand.Rand) rune { + count := int64(r.last - r.first) + return r.first + rune(rand.Int63n(count)) +} + +var unicodeRanges = []charRange{ + {' ', '~'}, // ASCII characters + {'\u00a0', '\u02af'}, // Multi-byte encoded characters + {'\u4e00', '\u9fff'}, // Common CJK (even longer encodings) +} + +// randString makes a random string up to 20 characters long. The returned string +// may include a variety of (valid) UTF-8 encodings. +func randString(r *rand.Rand) string { + n := r.Intn(20) + runes := make([]rune, n) + for i := range runes { + runes[i] = unicodeRanges[r.Intn(len(unicodeRanges))].choose(r) + } + return string(runes) +} + +// randUint64 makes random 64 bit numbers. +// Weirdly, rand doesn't have a function that gives you 64 random bits. +func randUint64(r *rand.Rand) uint64 { + return uint64(r.Uint32())<<32 | uint64(r.Uint32()) +} diff --git a/vendor/github.com/google/licenseclassifier/LICENSE b/vendor/github.com/google/licenseclassifier/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/licenseclassifier/classifier.go b/vendor/github.com/google/licenseclassifier/classifier.go new file mode 100644 index 000000000..8d39cafbf --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/classifier.go @@ -0,0 +1,429 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package licenseclassifier provides methods to identify the open source +// license that most closely matches an unknown license. +package licenseclassifier + +import ( + "archive/tar" + "bytes" + "compress/gzip" + "fmt" + "html" + "io" + "math" + "regexp" + "sort" + "strings" + "sync" + "unicode" + + "github.com/google/licenseclassifier/stringclassifier" + "github.com/google/licenseclassifier/stringclassifier/searchset" +) + +// DefaultConfidenceThreshold is the minimum confidence percentage we're willing to accept in order +// to say that a match is good. +const DefaultConfidenceThreshold = 0.80 + +var ( + // Normalizers is a list of functions that get applied to the strings + // before they are registered with the string classifier. + Normalizers = []stringclassifier.NormalizeFunc{ + html.UnescapeString, + removeShebangLine, + RemoveNonWords, + NormalizeEquivalentWords, + NormalizePunctuation, + strings.ToLower, + removeIgnorableTexts, + stringclassifier.FlattenWhitespace, + strings.TrimSpace, + } + + // commonLicenseWords are words that are common to all known licenses. + // If an unknown text doesn't have at least one of these, then we can + // ignore it. + commonLicenseWords = []*regexp.Regexp{ + regexp.MustCompile(`(?i)\bcode\b`), + regexp.MustCompile(`(?i)\blicense\b`), + regexp.MustCompile(`(?i)\boriginal\b`), + regexp.MustCompile(`(?i)\brights\b`), + regexp.MustCompile(`(?i)\bsoftware\b`), + regexp.MustCompile(`(?i)\bterms\b`), + regexp.MustCompile(`(?i)\bversion\b`), + regexp.MustCompile(`(?i)\bwork\b`), + } +) + +// License is a classifier pre-loaded with known open source licenses. +type License struct { + c *stringclassifier.Classifier + + // Threshold is the lowest confidence percentage acceptable for the + // classifier. + Threshold float64 +} + +// New creates a license classifier and pre-loads it with known open source licenses. +func New(threshold float64) (*License, error) { + classifier := &License{ + c: stringclassifier.New(threshold, Normalizers...), + Threshold: threshold, + } + if err := classifier.registerLicenses(LicenseArchive); err != nil { + return nil, fmt.Errorf("cannot register licenses: %v", err) + } + return classifier, nil +} + +// NewWithForbiddenLicenses creates a license classifier and pre-loads it with +// known open source licenses which are forbidden. +func NewWithForbiddenLicenses(threshold float64) (*License, error) { + classifier := &License{ + c: stringclassifier.New(threshold, Normalizers...), + Threshold: threshold, + } + if err := classifier.registerLicenses(ForbiddenLicenseArchive); err != nil { + return nil, fmt.Errorf("cannot register licenses: %v", err) + } + return classifier, nil +} + +// WithinConfidenceThreshold returns true if the confidence value is above or +// equal to the confidence threshold. +func (c *License) WithinConfidenceThreshold(conf float64) bool { + return conf > c.Threshold || math.Abs(conf-c.Threshold) < math.SmallestNonzeroFloat64 +} + +// NearestMatch returns the "nearest" match to the given set of known licenses. +// Returned are the name of the license, and a confidence percentage indicating +// how confident the classifier is in the result. +func (c *License) NearestMatch(contents string) *stringclassifier.Match { + if !c.hasCommonLicenseWords(contents) { + return nil + } + m := c.c.NearestMatch(contents) + m.Name = strings.TrimSuffix(m.Name, ".header") + return m +} + +// MultipleMatch matches all licenses within an unknown text. +func (c *License) MultipleMatch(contents string, includeHeaders bool) stringclassifier.Matches { + norm := normalizeText(contents) + if !c.hasCommonLicenseWords(norm) { + return nil + } + + m := make(map[stringclassifier.Match]bool) + var matches stringclassifier.Matches + for _, v := range c.c.MultipleMatch(norm) { + if !c.WithinConfidenceThreshold(v.Confidence) { + continue + } + + if !includeHeaders && strings.HasSuffix(v.Name, ".header") { + continue + } + + v.Name = strings.TrimSuffix(v.Name, ".header") + if re, ok := forbiddenRegexps[v.Name]; ok && !re.MatchString(norm) { + continue + } + if _, ok := m[*v]; !ok { + m[*v] = true + matches = append(matches, v) + } + } + sort.Sort(matches) + return matches +} + +func normalizeText(s string) string { + for _, n := range Normalizers { + s = n(s) + } + return s +} + +// hasCommonLicenseWords returns true if the unknown text has at least one word +// that's common to all licenses. +func (c *License) hasCommonLicenseWords(s string) bool { + for _, re := range commonLicenseWords { + if re.MatchString(s) { + return true + } + } + return false +} + +type archivedValue struct { + name string + normalized string + set *searchset.SearchSet +} + +// registerLicenses loads all known licenses and adds them to c as known values +// for comparison. The allocated space after ingesting the 'licenses.db' +// archive is ~167M. +func (c *License) registerLicenses(archive string) error { + contents, err := ReadLicenseFile(archive) + if err != nil { + return err + } + + reader := bytes.NewReader(contents) + gr, err := gzip.NewReader(reader) + if err != nil { + return err + } + defer gr.Close() + + tr := tar.NewReader(gr) + + var muVals sync.Mutex + var vals []archivedValue + for i := 0; ; i++ { + hdr, err := tr.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + name := strings.TrimSuffix(hdr.Name, ".txt") + + // Read normalized value. + var b bytes.Buffer + if _, err := io.Copy(&b, tr); err != nil { + return err + } + normalized := b.String() + b.Reset() + + // Read precomputed hashes. + hdr, err = tr.Next() + if err != nil { + return err + } + + if _, err := io.Copy(&b, tr); err != nil { + return err + } + + var set searchset.SearchSet + searchset.Deserialize(&b, &set) + + muVals.Lock() + vals = append(vals, archivedValue{name, normalized, &set}) + muVals.Unlock() + } + + for _, v := range vals { + if err = c.c.AddPrecomputedValue(v.name, v.normalized, v.set); err != nil { + return err + } + } + return nil +} + +// endOfLicenseText is text commonly associated with the end of a license. We +// can remove text that occurs after it. +var endOfLicenseText = []string{ + "END OF TERMS AND CONDITIONS", +} + +// TrimExtraneousTrailingText removes text after an obvious end of the license +// and does not include substantive text of the license. +func TrimExtraneousTrailingText(s string) string { + for _, e := range endOfLicenseText { + if i := strings.LastIndex(s, e); i != -1 { + return s[:i+len(e)] + } + } + return s +} + +var copyrightRE = regexp.MustCompile(`(?m)(?i:Copyright)\s+(?i:©\s+|\(c\)\s+)?(?:\d{2,4})(?:[-,]\s*\d{2,4})*,?\s*(?i:by)?\s*(.*?(?i:\s+Inc\.)?)[.,]?\s*(?i:All rights reserved\.?)?\s*$`) + +// CopyrightHolder finds a copyright notification, if it exists, and returns +// the copyright holder. +func CopyrightHolder(contents string) string { + matches := copyrightRE.FindStringSubmatch(contents) + if len(matches) == 2 { + return matches[1] + } + return "" +} + +var publicDomainRE = regexp.MustCompile("(?i)(this file )?is( in the)? public domain") + +// HasPublicDomainNotice performs a simple regex over the contents to see if a +// public domain notice is in there. As you can imagine, this isn't 100% +// definitive, but can be useful if a license match isn't found. +func (c *License) HasPublicDomainNotice(contents string) bool { + return publicDomainRE.FindString(contents) != "" +} + +// ignorableTexts is a list of lines at the start of the string we can remove +// to get a cleaner match. +var ignorableTexts = []*regexp.Regexp{ + regexp.MustCompile(`(?i)^(?:the )?mit license(?: \(mit\))?$`), + regexp.MustCompile(`(?i)^(?:new )?bsd license$`), + regexp.MustCompile(`(?i)^copyright and permission notice$`), + regexp.MustCompile(`(?i)^copyright (\(c\) )?(\[yyyy\]|\d{4})[,.]? .*$`), + regexp.MustCompile(`(?i)^(all|some) rights reserved\.?$`), + regexp.MustCompile(`(?i)^@license$`), + regexp.MustCompile(`^\s*$`), +} + +// removeIgnorableTexts removes common text, which is not important for +// classification, that shows up before the body of the license. +func removeIgnorableTexts(s string) string { + lines := strings.Split(strings.TrimRight(s, "\n"), "\n") + var start int + for ; start < len(lines); start++ { + line := strings.TrimSpace(lines[start]) + var matches bool + for _, re := range ignorableTexts { + if re.MatchString(line) { + matches = true + break + } + } + if !matches { + break + } + } + end := len(lines) + if start > end { + return "\n" + } + return strings.Join(lines[start:end], "\n") + "\n" +} + +// removeShebangLine removes the '#!...' line if it's the first line in the +// file. Note that if it's the only line in a comment, it won't be removed. +func removeShebangLine(s string) string { + lines := strings.Split(s, "\n") + if len(lines) <= 1 || !strings.HasPrefix(lines[0], "#!") { + return s + } + + return strings.Join(lines[1:], "\n") +} + +// isDecorative returns true if the line is made up purely of non-letter and +// non-digit characters. +func isDecorative(s string) bool { + for _, c := range s { + if unicode.IsLetter(c) || unicode.IsDigit(c) { + return false + } + } + return true +} + +var nonWords = regexp.MustCompile("[[:punct:]]+") + +// RemoveNonWords removes non-words from the string. +func RemoveNonWords(s string) string { + return nonWords.ReplaceAllString(s, " ") +} + +// interchangeablePunctutation is punctuation that can be normalized. +var interchangeablePunctuation = []struct { + interchangeable *regexp.Regexp + substitute string +}{ + // Hyphen, Dash, En Dash, and Em Dash. + {regexp.MustCompile(`[-‒–—]`), "-"}, + // Single, Double, Curly Single, and Curly Double. + {regexp.MustCompile("['\"`‘’“”]"), "'"}, + // Copyright. + {regexp.MustCompile("©"), "(c)"}, + // Hyphen-separated words. + {regexp.MustCompile(`(\S)-\s+(\S)`), "${1}-${2}"}, + // Currency and Section. (Different copies of the CDDL use each marker.) + {regexp.MustCompile("[§¤]"), "(s)"}, + // Middle Dot + {regexp.MustCompile("·"), "*"}, +} + +// NormalizePunctuation takes all hyphens and quotes and normalizes them. +func NormalizePunctuation(s string) string { + for _, iw := range interchangeablePunctuation { + s = iw.interchangeable.ReplaceAllString(s, iw.substitute) + } + return s +} + +// interchangeableWords are words we can substitute for a normalized form +// without changing the meaning of the license. See +// https://spdx.org/spdx-license-list/matching-guidelines for the list. +var interchangeableWords = []struct { + interchangeable *regexp.Regexp + substitute string +}{ + {regexp.MustCompile("(?i)Acknowledgment"), "Acknowledgement"}, + {regexp.MustCompile("(?i)Analogue"), "Analog"}, + {regexp.MustCompile("(?i)Analyse"), "Analyze"}, + {regexp.MustCompile("(?i)Artefact"), "Artifact"}, + {regexp.MustCompile("(?i)Authorisation"), "Authorization"}, + {regexp.MustCompile("(?i)Authorised"), "Authorized"}, + {regexp.MustCompile("(?i)Calibre"), "Caliber"}, + {regexp.MustCompile("(?i)Cancelled"), "Canceled"}, + {regexp.MustCompile("(?i)Capitalisations"), "Capitalizations"}, + {regexp.MustCompile("(?i)Catalogue"), "Catalog"}, + {regexp.MustCompile("(?i)Categorise"), "Categorize"}, + {regexp.MustCompile("(?i)Centre"), "Center"}, + {regexp.MustCompile("(?i)Emphasised"), "Emphasized"}, + {regexp.MustCompile("(?i)Favour"), "Favor"}, + {regexp.MustCompile("(?i)Favourite"), "Favorite"}, + {regexp.MustCompile("(?i)Fulfil"), "Fulfill"}, + {regexp.MustCompile("(?i)Fulfilment"), "Fulfillment"}, + {regexp.MustCompile("(?i)Initialise"), "Initialize"}, + {regexp.MustCompile("(?i)Judgment"), "Judgement"}, + {regexp.MustCompile("(?i)Labelling"), "Labeling"}, + {regexp.MustCompile("(?i)Labour"), "Labor"}, + {regexp.MustCompile("(?i)Licence"), "License"}, + {regexp.MustCompile("(?i)Maximise"), "Maximize"}, + {regexp.MustCompile("(?i)Modelled"), "Modeled"}, + {regexp.MustCompile("(?i)Modelling"), "Modeling"}, + {regexp.MustCompile("(?i)Offence"), "Offense"}, + {regexp.MustCompile("(?i)Optimise"), "Optimize"}, + {regexp.MustCompile("(?i)Organisation"), "Organization"}, + {regexp.MustCompile("(?i)Organise"), "Organize"}, + {regexp.MustCompile("(?i)Practise"), "Practice"}, + {regexp.MustCompile("(?i)Programme"), "Program"}, + {regexp.MustCompile("(?i)Realise"), "Realize"}, + {regexp.MustCompile("(?i)Recognise"), "Recognize"}, + {regexp.MustCompile("(?i)Signalling"), "Signaling"}, + {regexp.MustCompile("(?i)Sub[- ]license"), "Sublicense"}, + {regexp.MustCompile("(?i)Utilisation"), "Utilization"}, + {regexp.MustCompile("(?i)Whilst"), "While"}, + {regexp.MustCompile("(?i)Wilful"), "Wilfull"}, + {regexp.MustCompile("(?i)Non-commercial"), "Noncommercial"}, + {regexp.MustCompile("(?i)Per cent"), "Percent"}, +} + +// NormalizeEquivalentWords normalizes equivalent words that are interchangeable. +func NormalizeEquivalentWords(s string) string { + for _, iw := range interchangeableWords { + s = iw.interchangeable.ReplaceAllString(s, iw.substitute) + } + return s +} diff --git a/vendor/github.com/google/licenseclassifier/file_system_resources.go b/vendor/github.com/google/licenseclassifier/file_system_resources.go new file mode 100644 index 000000000..0d92e3aec --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/file_system_resources.go @@ -0,0 +1,65 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package licenseclassifier + +import ( + "go/build" + "io/ioutil" + "os" + "path/filepath" +) + +const ( + // LicenseDirectory is the directory where the prototype licenses are kept. + LicenseDirectory = "src/github.com/google/licenseclassifier/licenses" + // LicenseArchive is the name of the archive containing preprocessed + // license texts. + LicenseArchive = "licenses.db" + // ForbiddenLicenseArchive is the name of the archive containing preprocessed + // forbidden license texts only. + ForbiddenLicenseArchive = "forbidden_licenses.db" +) + +func findInGOPATH(rel string) (fullPath string, err error) { + for _, path := range filepath.SplitList(build.Default.GOPATH) { + fullPath := filepath.Join(path, rel) + if _, err := os.Stat(fullPath); err != nil { + if os.IsNotExist(err) { + continue + } + return "", err + } + return fullPath, nil + } + return "", nil +} + +// ReadLicenseFile locates and reads the license file. +func ReadLicenseFile(filename string) ([]byte, error) { + archive, err := findInGOPATH(filepath.Join(LicenseDirectory, filename)) + if err != nil || archive == "" { + return nil, err + } + return ioutil.ReadFile(archive) +} + +// ReadLicenseDir reads directory containing the license files. +func ReadLicenseDir() ([]os.FileInfo, error) { + filename, err := findInGOPATH(filepath.Join(LicenseDirectory, LicenseArchive)) + if err != nil || filename == "" { + return nil, err + } + return ioutil.ReadDir(filepath.Dir(filename)) +} diff --git a/vendor/github.com/google/licenseclassifier/forbidden.go b/vendor/github.com/google/licenseclassifier/forbidden.go new file mode 100644 index 000000000..6c02ee5d6 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/forbidden.go @@ -0,0 +1,48 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package licenseclassifier + +import "regexp" + +var ( + reCCBYNC = regexp.MustCompile(`(?i).*\bAttribution NonCommercial\b.*`) + reCCBYNCND = regexp.MustCompile(`(?i).*\bAttribution NonCommercial NoDerivs\b.*`) + reCCBYNCSA = regexp.MustCompile(`(?i).*\bAttribution NonCommercial ShareAlike\b.*`) + + // forbiddenRegexps are regular expressions we expect to find in + // forbidden licenses. If we think we have a forbidden license but + // don't find the equivalent phrase, then it's probably just a + // misclassification. + forbiddenRegexps = map[string]*regexp.Regexp{ + AGPL10: regexp.MustCompile(`(?i).*\bAFFERO GENERAL PUBLIC LICENSE\b.*`), + AGPL30: regexp.MustCompile(`(?i).*\bGNU AFFERO GENERAL PUBLIC LICENSE\b.*`), + CCBYNC10: reCCBYNC, + CCBYNC20: reCCBYNC, + CCBYNC25: reCCBYNC, + CCBYNC30: reCCBYNC, + CCBYNC40: reCCBYNC, + CCBYNCND10: regexp.MustCompile(`(?i).*\bAttribution NoDerivs NonCommercial\b.*`), + CCBYNCND20: reCCBYNCND, + CCBYNCND25: reCCBYNCND, + CCBYNCND30: reCCBYNCND, + CCBYNCND40: regexp.MustCompile(`(?i).*\bAttribution NonCommercial NoDerivatives\b.*`), + CCBYNCSA10: reCCBYNCSA, + CCBYNCSA20: reCCBYNCSA, + CCBYNCSA25: reCCBYNCSA, + CCBYNCSA30: reCCBYNCSA, + CCBYNCSA40: reCCBYNCSA, + WTFPL: regexp.MustCompile(`(?i).*\bDO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\b.*`), + } +) diff --git a/vendor/github.com/google/licenseclassifier/internal/sets/sets.go b/vendor/github.com/google/licenseclassifier/internal/sets/sets.go new file mode 100644 index 000000000..f34ae5bf8 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/internal/sets/sets.go @@ -0,0 +1,20 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package sets provides sets for storing collections of unique elements. +package sets + +// present is an empty struct used as the "value" in the map[int], since +// empty structs consume zero bytes (unlike 1 unnecessary byte per bool). +type present struct{} diff --git a/vendor/github.com/google/licenseclassifier/internal/sets/stringset.go b/vendor/github.com/google/licenseclassifier/internal/sets/stringset.go new file mode 100644 index 000000000..54edbd4bf --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/internal/sets/stringset.go @@ -0,0 +1,228 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package sets + +import ( + "fmt" + "sort" + "strings" +) + +// StringSet stores a set of unique string elements. +type StringSet struct { + set map[string]present +} + +// NewStringSet creates a StringSet containing the supplied initial string elements. +func NewStringSet(elements ...string) *StringSet { + s := &StringSet{} + s.set = make(map[string]present) + s.Insert(elements...) + return s +} + +// Copy returns a newly allocated copy of the supplied StringSet. +func (s *StringSet) Copy() *StringSet { + c := NewStringSet() + if s != nil { + for e := range s.set { + c.set[e] = present{} + } + } + return c +} + +// Insert zero or more string elements into the StringSet. +// As expected for a Set, elements already present in the StringSet are +// simply ignored. +func (s *StringSet) Insert(elements ...string) { + for _, e := range elements { + s.set[e] = present{} + } +} + +// Delete zero or more string elements from the StringSet. +// Any elements not present in the StringSet are simply ignored. +func (s *StringSet) Delete(elements ...string) { + for _, e := range elements { + delete(s.set, e) + } +} + +// Intersect returns a new StringSet containing the intersection of the +// receiver and argument StringSets. Returns an empty set if the argument is nil. +func (s *StringSet) Intersect(other *StringSet) *StringSet { + if other == nil { + return NewStringSet() + } + + // Point a and b to the maps, setting a to the smaller of the two. + a, b := s.set, other.set + if len(b) < len(a) { + a, b = b, a + } + + // Perform the intersection. + intersect := NewStringSet() + for e := range a { + if _, ok := b[e]; ok { + intersect.set[e] = present{} + } + } + return intersect +} + +// Disjoint returns true if the intersection of the receiver and the argument +// StringSets is the empty set. Returns true if the argument is nil or either +// StringSet is the empty set. +func (s *StringSet) Disjoint(other *StringSet) bool { + if other == nil || len(other.set) == 0 || len(s.set) == 0 { + return true + } + + // Point a and b to the maps, setting a to the smaller of the two. + a, b := s.set, other.set + if len(b) < len(a) { + a, b = b, a + } + + // Check for non-empty intersection. + for e := range a { + if _, ok := b[e]; ok { + return false // Early-exit because intersecting. + } + } + return true +} + +// Difference returns a new StringSet containing the elements in the receiver +// that are not present in the argument StringSet. Returns a copy of the +// receiver if the argument is nil. +func (s *StringSet) Difference(other *StringSet) *StringSet { + if other == nil { + return s.Copy() + } + + // Insert only the elements in the receiver that are not present in the + // argument StringSet. + diff := NewStringSet() + for e := range s.set { + if _, ok := other.set[e]; !ok { + diff.set[e] = present{} + } + } + return diff +} + +// Unique returns a new StringSet containing the elements in the receiver +// that are not present in the argument StringSet *and* the elements in the +// argument StringSet that are not in the receiver (which is the union of two +// disjoint sets). Returns a copy of the +// receiver if the argument is nil. +func (s *StringSet) Unique(other *StringSet) *StringSet { + if other == nil { + return s.Copy() + } + + sNotInOther := s.Difference(other) + otherNotInS := other.Difference(s) + + // Duplicate Union implementation here to avoid extra Copy, since both + // sNotInOther and otherNotInS are already copies. + unique := sNotInOther + for e := range otherNotInS.set { + unique.set[e] = present{} + } + return unique +} + +// Equal returns true if the receiver and the argument StringSet contain +// exactly the same elements. +func (s *StringSet) Equal(other *StringSet) bool { + if s == nil || other == nil { + return s == nil && other == nil + } + + // Two sets of different length cannot have the exact same unique elements. + if len(s.set) != len(other.set) { + return false + } + + // Only one loop is needed. If the two sets are known to be of equal + // length, then the two sets are equal only if exactly all of the elements + // in the first set are found in the second. + for e := range s.set { + if _, ok := other.set[e]; !ok { + return false + } + } + + return true +} + +// Union returns a new StringSet containing the union of the receiver and +// argument StringSets. Returns a copy of the receiver if the argument is nil. +func (s *StringSet) Union(other *StringSet) *StringSet { + union := s.Copy() + if other != nil { + for e := range other.set { + union.set[e] = present{} + } + } + return union +} + +// Contains returns true if element is in the StringSet. +func (s *StringSet) Contains(element string) bool { + _, in := s.set[element] + return in +} + +// Len returns the number of unique elements in the StringSet. +func (s *StringSet) Len() int { + return len(s.set) +} + +// Empty returns true if the receiver is the empty set. +func (s *StringSet) Empty() bool { + return len(s.set) == 0 +} + +// Elements returns a []string of the elements in the StringSet, in no +// particular (or consistent) order. +func (s *StringSet) Elements() []string { + elements := []string{} // Return at least an empty slice rather than nil. + for e := range s.set { + elements = append(elements, e) + } + return elements +} + +// Sorted returns a sorted []string of the elements in the StringSet. +func (s *StringSet) Sorted() []string { + elements := s.Elements() + sort.Strings(elements) + return elements +} + +// String formats the StringSet elements as sorted strings, representing them +// in "array initializer" syntax. +func (s *StringSet) String() string { + elements := s.Sorted() + var quoted []string + for _, e := range elements { + quoted = append(quoted, fmt.Sprintf("%q", e)) + } + return fmt.Sprintf("{%s}", strings.Join(quoted, ", ")) +} diff --git a/vendor/github.com/google/licenseclassifier/license_type.go b/vendor/github.com/google/licenseclassifier/license_type.go new file mode 100644 index 000000000..43923be72 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/license_type.go @@ -0,0 +1,376 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package licenseclassifier + +// *** NOTE: Update this file when adding a new license. You need to: +// +// 1. Add the canonical name to the list, and +// 2. Categorize the license. + +import "github.com/google/licenseclassifier/internal/sets" + +// Canonical names of the licenses. +const ( + // The names come from the https://spdx.org/licenses website, and are + // also the filenames of the licenses in licenseclassifier/licenses. + AFL11 = "AFL-1.1" + AFL12 = "AFL-1.2" + AFL20 = "AFL-2.0" + AFL21 = "AFL-2.1" + AFL30 = "AFL-3.0" + AGPL10 = "AGPL-1.0" + AGPL30 = "AGPL-3.0" + Apache10 = "Apache-1.0" + Apache11 = "Apache-1.1" + Apache20 = "Apache-2.0" + APSL10 = "APSL-1.0" + APSL11 = "APSL-1.1" + APSL12 = "APSL-1.2" + APSL20 = "APSL-2.0" + Artistic10cl8 = "Artistic-1.0-cl8" + Artistic10Perl = "Artistic-1.0-Perl" + Artistic10 = "Artistic-1.0" + Artistic20 = "Artistic-2.0" + BCL = "BCL" + Beerware = "Beerware" + BSD2ClauseFreeBSD = "BSD-2-Clause-FreeBSD" + BSD2ClauseNetBSD = "BSD-2-Clause-NetBSD" + BSD2Clause = "BSD-2-Clause" + BSD3ClauseAttribution = "BSD-3-Clause-Attribution" + BSD3ClauseClear = "BSD-3-Clause-Clear" + BSD3ClauseLBNL = "BSD-3-Clause-LBNL" + BSD3Clause = "BSD-3-Clause" + BSD4Clause = "BSD-4-Clause" + BSD4ClauseUC = "BSD-4-Clause-UC" + BSDProtection = "BSD-Protection" + BSL10 = "BSL-1.0" + CC010 = "CC0-1.0" + CCBY10 = "CC-BY-1.0" + CCBY20 = "CC-BY-2.0" + CCBY25 = "CC-BY-2.5" + CCBY30 = "CC-BY-3.0" + CCBY40 = "CC-BY-4.0" + CCBYNC10 = "CC-BY-NC-1.0" + CCBYNC20 = "CC-BY-NC-2.0" + CCBYNC25 = "CC-BY-NC-2.5" + CCBYNC30 = "CC-BY-NC-3.0" + CCBYNC40 = "CC-BY-NC-4.0" + CCBYNCND10 = "CC-BY-NC-ND-1.0" + CCBYNCND20 = "CC-BY-NC-ND-2.0" + CCBYNCND25 = "CC-BY-NC-ND-2.5" + CCBYNCND30 = "CC-BY-NC-ND-3.0" + CCBYNCND40 = "CC-BY-NC-ND-4.0" + CCBYNCSA10 = "CC-BY-NC-SA-1.0" + CCBYNCSA20 = "CC-BY-NC-SA-2.0" + CCBYNCSA25 = "CC-BY-NC-SA-2.5" + CCBYNCSA30 = "CC-BY-NC-SA-3.0" + CCBYNCSA40 = "CC-BY-NC-SA-4.0" + CCBYND10 = "CC-BY-ND-1.0" + CCBYND20 = "CC-BY-ND-2.0" + CCBYND25 = "CC-BY-ND-2.5" + CCBYND30 = "CC-BY-ND-3.0" + CCBYND40 = "CC-BY-ND-4.0" + CCBYSA10 = "CC-BY-SA-1.0" + CCBYSA20 = "CC-BY-SA-2.0" + CCBYSA25 = "CC-BY-SA-2.5" + CCBYSA30 = "CC-BY-SA-3.0" + CCBYSA40 = "CC-BY-SA-4.0" + CDDL10 = "CDDL-1.0" + CDDL11 = "CDDL-1.1" + CommonsClause = "Commons-Clause" + CPAL10 = "CPAL-1.0" + CPL10 = "CPL-1.0" + eGenix = "eGenix" + EPL10 = "EPL-1.0" + EUPL10 = "EUPL-1.0" + EUPL11 = "EUPL-1.1" + Facebook2Clause = "Facebook-2-Clause" + Facebook3Clause = "Facebook-3-Clause" + FacebookExamples = "Facebook-Examples" + FreeImage = "FreeImage" + FTL = "FTL" + GPL10 = "GPL-1.0" + GPL20 = "GPL-2.0" + GPL20withautoconfexception = "GPL-2.0-with-autoconf-exception" + GPL20withbisonexception = "GPL-2.0-with-bison-exception" + GPL20withclasspathexception = "GPL-2.0-with-classpath-exception" + GPL20withfontexception = "GPL-2.0-with-font-exception" + GPL20withGCCexception = "GPL-2.0-with-GCC-exception" + GPL30 = "GPL-3.0" + GPL30withautoconfexception = "GPL-3.0-with-autoconf-exception" + GPL30withGCCexception = "GPL-3.0-with-GCC-exception" + GUSTFont = "GUST-Font-License" + ImageMagick = "ImageMagick" + IPL10 = "IPL-1.0" + ISC = "ISC" + LGPL20 = "LGPL-2.0" + LGPL21 = "LGPL-2.1" + LGPL30 = "LGPL-3.0" + LGPLLR = "LGPLLR" + Libpng = "Libpng" + Lil10 = "Lil-1.0" + LPL102 = "LPL-1.02" + LPL10 = "LPL-1.0" + LPPL13c = "LPPL-1.3c" + MIT = "MIT" + MPL10 = "MPL-1.0" + MPL11 = "MPL-1.1" + MPL20 = "MPL-2.0" + MSPL = "MS-PL" + NCSA = "NCSA" + NPL10 = "NPL-1.0" + NPL11 = "NPL-1.1" + OFL = "OFL" + OpenSSL = "OpenSSL" + OSL10 = "OSL-1.0" + OSL11 = "OSL-1.1" + OSL20 = "OSL-2.0" + OSL21 = "OSL-2.1" + OSL30 = "OSL-3.0" + PHP301 = "PHP-3.01" + PHP30 = "PHP-3.0" + PIL = "PIL" + Python20complete = "Python-2.0-complete" + Python20 = "Python-2.0" + QPL10 = "QPL-1.0" + Ruby = "Ruby" + SGIB10 = "SGI-B-1.0" + SGIB11 = "SGI-B-1.1" + SGIB20 = "SGI-B-2.0" + SISSL12 = "SISSL-1.2" + SISSL = "SISSL" + Sleepycat = "Sleepycat" + UnicodeTOU = "Unicode-TOU" + Unlicense = "Unlicense" + W3C19980720 = "W3C-19980720" + W3C = "W3C" + WTFPL = "WTFPL" + X11 = "X11" + Xnet = "Xnet" + Zend20 = "Zend-2.0" + ZlibAcknowledgement = "zlib-acknowledgement" + Zlib = "Zlib" + ZPL11 = "ZPL-1.1" + ZPL20 = "ZPL-2.0" + ZPL21 = "ZPL-2.1" +) + +var ( + // Licenses Categorized by Type + + // restricted - Licenses in this category require mandatory source + // distribution if we ships a product that includes third-party code + // protected by such a license. + restrictedType = sets.NewStringSet( + BCL, + CCBYND10, + CCBYND20, + CCBYND25, + CCBYND30, + CCBYND40, + CCBYSA10, + CCBYSA20, + CCBYSA25, + CCBYSA30, + CCBYSA40, + GPL10, + GPL20, + GPL20withautoconfexception, + GPL20withbisonexception, + GPL20withclasspathexception, + GPL20withfontexception, + GPL20withGCCexception, + GPL30, + GPL30withautoconfexception, + GPL30withGCCexception, + LGPL20, + LGPL21, + LGPL30, + NPL10, + NPL11, + OSL10, + OSL11, + OSL20, + OSL21, + OSL30, + QPL10, + Sleepycat, + ) + + // reciprocal - These licenses allow usage of software made available + // under such licenses freely in *unmodified* form. If the third-party + // source code is modified in any way these modifications to the + // original third-party source code must be made available. + reciprocalType = sets.NewStringSet( + APSL10, + APSL11, + APSL12, + APSL20, + CDDL10, + CDDL11, + CPL10, + EPL10, + FreeImage, + IPL10, + MPL10, + MPL11, + MPL20, + Ruby, + ) + + // notice - These licenses contain few restrictions, allowing original + // or modified third-party software to be shipped in any product + // without endangering or encumbering our source code. All of the + // licenses in this category do, however, have an "original Copyright + // notice" or "advertising clause", wherein any external distributions + // must include the notice or clause specified in the license. + noticeType = sets.NewStringSet( + AFL11, + AFL12, + AFL20, + AFL21, + AFL30, + Apache10, + Apache11, + Apache20, + Artistic10cl8, + Artistic10Perl, + Artistic10, + Artistic20, + BSL10, + BSD2ClauseFreeBSD, + BSD2ClauseNetBSD, + BSD2Clause, + BSD3ClauseAttribution, + BSD3ClauseClear, + BSD3ClauseLBNL, + BSD3Clause, + BSD4Clause, + BSD4ClauseUC, + BSDProtection, + CCBY10, + CCBY20, + CCBY25, + CCBY30, + CCBY40, + FTL, + ISC, + ImageMagick, + Libpng, + Lil10, + LPL102, + LPL10, + MSPL, + MIT, + NCSA, + OpenSSL, + PHP301, + PHP30, + PIL, + Python20, + Python20complete, + SGIB10, + SGIB11, + SGIB20, + UnicodeTOU, + W3C19980720, + W3C, + X11, + Xnet, + Zend20, + ZlibAcknowledgement, + Zlib, + ZPL11, + ZPL20, + ZPL21, + ) + + // permissive - These licenses can be used in (relatively rare) cases + // where third-party software is under a license (not "Public Domain" + // or "free for any use" like 'unencumbered') that is even more lenient + // than a 'notice' license. Use the 'permissive' license type when even + // a copyright notice is not required for license compliance. + permissiveType = sets.NewStringSet() + + // unencumbered - Licenses that basically declare that the code is "free for any use". + unencumberedType = sets.NewStringSet( + CC010, + Unlicense, + ) + + // byexceptiononly - Licenses that are incompatible with all (or most) + // uses in combination with our source code. Commercial third-party + // packages that are purchased and licensed only for a specific use + // fall into this category. + byExceptionOnlyType = sets.NewStringSet( + Beerware, + OFL, + ) + + // forbidden - Licenses that are forbidden to be used. + forbiddenType = sets.NewStringSet( + AGPL10, + AGPL30, + CCBYNC10, + CCBYNC20, + CCBYNC25, + CCBYNC30, + CCBYNC40, + CCBYNCND10, + CCBYNCND20, + CCBYNCND25, + CCBYNCND30, + CCBYNCND40, + CCBYNCSA10, + CCBYNCSA20, + CCBYNCSA25, + CCBYNCSA30, + CCBYNCSA40, + CommonsClause, + Facebook2Clause, + Facebook3Clause, + FacebookExamples, + WTFPL, + ) + + // LicenseTypes is a set of the types of licenses Google recognizes. + LicenseTypes = sets.NewStringSet( + "restricted", + "reciprocal", + "notice", + "permissive", + "unencumbered", + "by_exception_only", + ) +) + +// LicenseType returns the type the license has. +func LicenseType(name string) string { + switch { + case restrictedType.Contains(name): + return "restricted" + case reciprocalType.Contains(name): + return "reciprocal" + case noticeType.Contains(name): + return "notice" + case permissiveType.Contains(name): + return "permissive" + case unencumberedType.Contains(name): + return "unencumbered" + case forbiddenType.Contains(name): + return "FORBIDDEN" + } + return "" +} diff --git a/vendor/github.com/google/licenseclassifier/licenses/Unlicense.txt b/vendor/github.com/google/licenseclassifier/licenses/Unlicense.txt new file mode 100644 index 000000000..ac8f5f5f1 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/licenses/Unlicense.txt @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute +this software, either in source code form or as a compiled binary, for any +purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and + +successors. We intend this dedication to be an overt act of relinquishment in +perpetuity of all present and future rights to this software under copyright +law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + diff --git a/vendor/github.com/google/licenseclassifier/licenses/licenses.db b/vendor/github.com/google/licenseclassifier/licenses/licenses.db new file mode 100644 index 0000000000000000000000000000000000000000..8d6ca7473c2a2bc935929aa57914bee4a63d7a93 GIT binary patch literal 5479632 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­{Gp4xe8=cz5Dwv5^` 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%0Aa^*@MXA+>!o=0ifT-jff9cWPHo?;NVOG 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 SBnqO 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%0DO{LKX`?Do*~yi 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 z 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�ldea0(qWR# zIinx7`+6BDq1_lgc+-b=?JQFzv{(DWx86cbz(-9$GymS9j|-XlX2bfY?aEOZ@MiAK zH+&}%hp9Wvws~~Mx>tnIZd3X3NA_i{z+F>w%yYbk-v3=TOS#(4SmxcUsDnHD7u5 zm!}J{o#uvX-dSHM2g?zj%#rWdwf;ogvprJTP4_|P+Amb3?W)x?8?L|N@kET(uhe35 z+C94>?&r9vX8+I5v|~%5sb=v$FWT3MJR+fN^vu&A-StX^gz~9`0&2Z)R~$uVzDd2X ztG)lkYj%G0%%+Eqc|yntH4}FDbCpPcy8#70TofQA*PEf8}C3 zHWC}{-oi6)%v`s|Hoi}TKzWJR z5S~4x3W#}P!b3O0xV`zu4;YV}3kprDM#dH{K6WVaEZ$JCD96ke=| zZ$R#WbOwS}NWnsC2$>3|F9A?up`Ba33+Yk zG$8Q9auQJrR$wAofAd6#+547O^;nm<%FItn9H; z#SRf!GAso!a3C&2!VB{#Vmo+eLUIV9D7Mg8+aiMjSuR`&SV16p1^qDe_{h3J!h-M^ z1i}dW!MK2gIYb|>)viA8#13pVuy=x#6QU?&Ymw*1HV&y0tSq2Of&va3I_SU<`$O~% zx*r6)ATdN{92q*O^q{1HJ`^cQ=$WudgMtN0QKa6m*@3JMa#6haAt8dc4*5$+$e~t2 z^b2}vWdD(@gESQJKWxyD1ILmLn_gHaFsULN4kaBFxXA3m0RaUrL~YPUBBujU8??BH zi9@@IFef5Jkjh}g0sTKxVwedLFhZCJ6E}8lh!R6a3}pqD$XJTQHG8%rGV{V6p142B=s-R(pMh0RIB&?y! zL(~G=VAo%6IzE_-oip^cP_f2YKt_TrGE5p+u|d@a z`9E^#@H=7ifGq>o_XtuWp9mo*1a}aFU@HYRH9{eXyCS{`Z5;Ax5K|&0h%FJ;ZO{%w z=z+i^;>l29z)65TCK4HtI>T55_XnarSoLCU3FWhElBZT|4YBor&wr zG1t!bov?m4tYncvM(!Kp24wM}#KUSbHau2u{^biWT|qqq;W2d9$f;ug_@C>_cBKxr zBZ9xkT*sd31+!Y$L#qpk2oiSiBq4wY9|}Th2yZ}xgDel+3fN4+aD#mm0^isOK!bqL zn`^L%UmW!$WMgoEA=3#98U#@Y;==BL{2daX2+z3=_sQ>ndJDo*u!})pfiMkZ^az;6 zI+ESLA=&}U0m4_Xl_AcJ#1G;!h=4$N>b~~rin(KObU>q0L8v2tg*K9w693 zd;{TTY;fQkK+@DT*xJEckA*~i`%Utn>O&h({`fxVjUnPd1`N?ZM3o>PbgPuFoVW5N zq*THkOk5%_@p3xfHMy2VnhhxyF-QsX=22TAdQB2 z+>MIVkLFzn1sfb{$XY>)PLW^)LVz1Eg!e@#Nw)?|HpTAWLJrW#J(0M~} z12+zo4~Wts)c{>Jbd^XYL)eXc9UL7{#lfe7%rd0;2sgvBiA^P}2rwYHTiE^hx9)`c z3F>wPQr#a`{pzl3k?6z@9X<}|36KYe6c|BpZit#fMhr6`oEz{}!nA?tJ@f|<1Rya1B_@n-u-`zA080mw!$=7ujEl6J(aV6}wR7WNke-r?nhI0_jbq{ATENA}mHK*Nd| ziE0m~L70gVBu54p@jPUw5cNPZAJPb9(2!t&3L735$OEBth1wVz7}!f;*n&<6fnB&@ zoFleLrg?DGB3K7ICtShES3o=pTL{b-Fl{1&?ZQSgPgbQ)?9?D-c?<%5xqghRYaqraJ4_Gc}Byk zY7tezq3ReT@3wlTodr~tPAX+lKZFW5HO8(Pbj|Uo7GK>ZkufpKghd()iqt8aWQ>=} zGHMkmfTaU~;tWQ2853llo6aVR%&7umK7g6Qn433rNhjTFsexR9aX^$ zI8zA2Bm;e#bl6gVz~mrhp!7Gh!~;_@R0PwQ&0+_XHPa_V9TMHx)LF4w1f2?W+{7I8 zDye7Amx*k8Yw1*@jGiV0=Gm!dWeSJ}GFldyg{Og!!Y#_DXx^e~iGER99Vok|{gO5* z8i1)gr*VxLd0Lie52ogtnQr2#5tkxjIw@%ary!H&VQTFtRibZ;8E_V* zpjMkFi+^kP1)AZkUIn%8~hA8dB+{XTpQtCc0GVJEYN{X0o{Ri4G5EW~JPR#`;*H46XA* z2@1{Xv`kT)O-no-zRYw|56$EqEr(3U()S+Ir>XgpngOQdX#k}@mgWX}`dH3{f}xnw zm4a-oaYDrz%L!085ig751Ywi|(o{s5B<=Rhk<&Uu0Rde=EaE~RI}2A(5l%M`Wmxpy zQwT{X2MxTj3O=+CvV050i!=_>Hcufu%iFL-gi6vWx1^FFW@u)q0@dr$W=A^_jUM#a z&{)az8=WYWa8vO|Um?|av^i3cM|%LXi>!RYB0&^ourvT=Z7gO)-xu9Z%(TyFr`D8&IVfBY0{ujg&B2LcAyoH@=z*&>6v5g7b=4& zL1&=~mWE;tAL{q0VW3)o^(S$o2FPAn^dh6-bVg(#pF(~Pz z*q=68Dhnz0ro@QVduU%`^(-n^SvZE`dps57Ipn}%zuz*s;qri@W( zbgYn?x_($ig!at1zs2c$sU2mZ0M@mk*p=oA)>&a8jab3HqH&3yK$a78UK&>7qV|m< zSbC~iV~(aY7A0hzw3s(aZHKH_#u6E<7sqlDEE&g&3)HXEOhiW??eny!QQb~sDFts7 zkI`F5?K`VH(PYfp8q`$N@msq%8mq9dd;;yYtR~4)78JA5 zuSnS_4eP7`M`I^z|FMP&wa~0GNKXpQaa7B)FbvD*(8EWc6aDqIinXVGSKKpmjR2yu}lL?udwNu>BL1Q3G z_0WaIT3xJpz)EEF53&eT%v_*FIw>V&5h|9SihCiQ6PrGG);glJKJJ%vb&qI+qlS~! zzUVxqYm&udXq}+jkrr(hM`Rrrig9BmO&V&|AxE=5>x-}k6^kiQpUH7QuNP)j&wWI*iYvO3%60m-P$a9NW(V$^AvQm z>IUmsveqB#8nE;fwc1o^v&srhrxX~|kWIG;i(t?I$dWm3rh2ZGKC;h@Uv}xp*@xNBi@pq%KL?^pD!c} z?sG+^u@9Pu4=kUb^tJB0-;rGEH`~v3rh-;K-__FY7uu5r{jwIz_g$HMzayE-6q2b- z-p^+{0zV&gG^dl9mcU*IueT+eDde(gKf5T%;V`Yiq9C2^?BE3lJp1DIRNZ5AqtW&- z@Y++`wx_m@sXgV?=1h%bYTLGz+Sb&zZTs!L_y6Vn@+4U+$;y+Qb@q8q_HS=>zAK^% z1izzE*cR{S;Ih-1aGdy>v&&jE}W<3jBMnaKV5|khQscZF7odn zvrfUpiKootD(_=a{y0R)t`ON9`C&s}o2jHxO9rXK5oo&yIYb@1Qdd4O>(QV5HLSIW zw)g4D4;wknv82hm35*5U(4M;^V%0-7Bha#56=Gh@tDIfyEKu?Y1|zN`jW1}`qgtvO zXMEST;V44$2gL}!UhJ0^bLVmh~C3o_5r8i5?qx5*<*U zhCSDeqYVpgK6V~#Ylh!973%tkTJOe|mvC-<^|-WdB9hJ9&OENa8n@6`@CWpLzJh(e zhBenohnaq?JJJbB2wflD+KFy4Pxrh!-6fd~YMFFoyCoyAc6C^FKfNc}c5V%Uy>;e2 zzKfMX=Jy3WyoY2*!DdgcG4x0G*Ld_OK6K%qU^ zpxN6{#`d1dcr)8TMm9P#5I#K`U5%$UcwO=G5YW%2)F%mXe>_&;vL=R}yd5b(5DmU` z)b11?d-Wfco|V@_-3#Z=9(_V%75cCfPW@-Gd&pq2m45+LUNIdMy?iLQcdjQHq2ZS+ z>JalX627=Pf5?xY-g_X$y?>A$S7t(Z+uPYw6^5v7gO5FQ;}G>~BYM+#mI*&F`DYiU zzde+5>=E*dKkX?wD_-Zi5Iz07>q>1TqF4lqS+m!n1V`Qm zfvfTcipsx>Vfk~CHKghM`E$lZov_(^Tif7M5Dq?BYoo#WVxXCPTlJBxLQCgP)BD4j z3CGgTLwDrjks1%HkoD)7drC{exhhq><=b zhH!a*;%H}jY5Qk-#ay?JZ+fth4|;W#+HC_Du(KDR3rAs@LM`i^7=9d}=fvycu_`#$ z6MJrCtjHI$x8)^7mZ&`2L0GG~hx2FA+{Xp`hmkn9vHjmc^^sWar_w2_M~Uj4IiT#z zUr!DFN;icDe0;_TyZIrx=YQ6(9R@V7Rt23$NY-L%D-AZ3^LP7MYeBiDkr^yD`z(LN zK67EO{MObVO*}kK$%R`w5`Pg;uM`$q(2*eS!;Ucyc&vxhq))W<(IUCEZ4T;V8YsD5 z%&;9U*dQ>U`wS;_=ujx+*&r>Npb^Zm#O;Rd3RrbrR6sk=(HgIcm z3X?3Dm6B3 z2Bsr9TM5IIF@mJNYwE82Oa*FB8E2#Mhv>~6A5eh`!il{`f{Sl`TGqdr&UvJxA$4=f zuz9_R@YMlHJ%G4Iv??V_3Pp76!>U+oEw>aV2=J&%4&W5?DzY0cuQaR(FDq@vjwbc5n*6%Rh1^3 z@Gb*IsZqQX@5jF;?%_TSwa1BvoL|PBkCOJ2&$pg2HJG0R?2_XGV=K5MY|R08*-ntC z)7`ia@v}EE>n;+wpBdjvWXmM%>OhFXfYSOP1N$%N$9dA*KiwR|r*6-`BKOc^P}+d3HEM@e5oQw5~p--M@&kly>rVeJ(& z4rG6Q#aW&n9;1d(M1fL;pu4o@aiLgR#jU$_&NN2Hw6oEFu38%-W%q#S0p^#~qdY^Z z0p9B(8lSLqFdE|vtvVW)w6A~G_X20ZaW3;s(rD(H{V(@GJn{n>N96Q`XTow=JSvR3 z9VW7|N`_9Yg7R#5+pZ;G(ORgUhPAB?YMN_!rwLdDdD1_w8LLv@5sMpLi_NrxuWI*N z=`mh%N6`jO%NicbWWN{9K;~>$tCz3&o-_Q2psS-!pw%nzk?7DBsAFi<(v+7I9nVdVE_> z-=AeTe^V#?6YF!gGR&>2btoQRae@ar{Pmt%xh$s0DGkG8y85=?A(@EZ8gK%|Cz{aj z#Ev|qRz-~A)8<+H1X;2nxU;2oS#41*l+wi~maTM8_;JFYMR}G}1^RB30Okw zaLy|$=W4|#nlwC zx9+6DDAVi4;lbP3UM{{x0XW?^>J6IAb>}!ZzeXm46*aug9VgDh_)P%<9SywAfv4(n z+yo9~g%zl;F2y&lhT4v0nktvFf_G>`ceGQ|x+(&>u{Yj2IVrB@z+Bln|1AQ*X_E(T zSl<&bA;e%jF?fWKy+6?&5|ySTuYK#uAz;0sW$8IVlQkzb!U%5zI%cgn$LP9V3E-Qv zem}b8mt^|UW@EKjmWh7~YIMJF04X;wfW*1tLDKxZd@}qfaXq3ObkxS@fV)SK!G!sphj)I`@IzfSsC0REKg>McF|&`&YjdA%)5oq84|KJSCuc4*grD3pk6 ztFoiqEA-yj_mGN9)G|p)+%lPPl=kX95&!aA_eZY~?6K8r#<-ioQgLGNaRUpWfC$Sc zDS;WPPiV|hGC=T(^JthkfYvxWaawfIlRTd4%*BC&^hKaM{11R3Kqx)0c5Wyt`MFf` zA-Q_hT{|MW^YUwKxF^(17EklBvlwq$cRY5A=Z9ac9?3R_zsoIowEGAw>jwjT((|G( z#-jhx{*ivj#PgGWh|GEN!EszUUB%0Oc*#N^`Vvgt@tw8mMF5}bzLm8BS<17vzmqkW ze@i4^>~9L9=#=1J?Lm>o77?A7(ubdb#kPs~7210`;|?vpw^LXz)qJZT@TVSOX^p;V zJ^}1h^v3TW_B|L>QdAY$yP*oPH9|xN+CCO{B`4>q@bGHzr<45!?1sHB;Wa;W0@ar1 zof&~&FHx-R+UP@E-jc;K$wOaoIBQue_nVH#kJOUY{w(!zZ?O#qywm4XA6Yy?Fz?eC zcflx^8GL==z8Lot^A2*?UbD{~kn*c#o5r=Jb(k1!W+JsRHw1N7ALarsR(_H5*>q{RW6Vd^gXM!iSS z)D;8XPxEQ!{EY4ZFVR;8QC7|=MCj7Q3@0j|og-3}`*soaOtke5} z@-?nsDgf`?(!~w0eWX_D&7ZIK_>)HXm(fB2f(!m~%GMmde)Q7NsiqqC2il9 zMml|0&sUtmaFig6hN8KRU|77nD|T|b`otTO)(-t$uXl@YL);BF(-IxKf4vkDIwtz4 z!N|TY5IA<%6fO|+Odw27FHEWNGckG6&N`w(OmBm8eL`Pm4Kjhw;$TBtW zhFvj-w8_s$j);y8xMpK##ixKQPIyQOnB^rx5$IJsBSJ^cAn>9>$hHZn=D~sMZQ+c1N=4qU0h-mB4b! zTG=|@`zq*SOQVVxRLd;?@j#sZ)GT{Jm`r6zHqe}JyuC$uJ97gk*v5vzj zaRkJ5@iacBEn4uw3X5)UF*?(gNU7xn{I7@cZZRl2s7!moOON7|<}r@L=ofOq`aeAD z7`!rUu}m$tV_=)bh;N{9{KT^s9|vL<<;-))^zurrhAlw9)=4M{(OWU4y0WN1`e=-vrC{VE+DVgpB4U-JWv)7bLFSbXzK~ zBF{5tUqDw9<9Nh5-5_x1Zh(bsU}JcrWJ0z*<@H=g{30=TC7#V9_+Ea!!FwmJ-2cI~ zm%z!WqOXNi&a&LJ;($c3E$bto#=ik!~N?RU`jd=o2a)wj}CbyX%4#Ss_Zo2ceC% z2U(QWqP|=*l?Qcv>y{-uT(ub+eE02J>m}~ikH0|;^4x^Emz95)2Oc&1uBW}qb2X}4 z$cWZ8#H;Q)<{iUMeZD0pa7y%Hy#&uwDK~6CJYm@VCgtm)&f0puA)CFjp1URxl6)dq zwt^>6U^C)s--ut4IV0V^Lh~N(qxqvsf+Hlu<6Xveca@)4kDQG`z|^O_V~N)(lJ5OG z_v{WvRQWp{h{%ZfWiilma0rtNp7XR(?KT-Vhx+YJ8*Gae^fOPHPF5Atl z#43s36x+!6R6{Gq$-mPtY8;+pJ$M+gGdFX2TThAj@@-a)Wsk4_ojCy*o~HHWg`91#7YzbyqqnO0Jc*@*FzEw$|1^Oh0`s;8^ge!I*i5;*J+RME9O4tniQY&1_R z&PEQz`0bt!ShZe%_1kT}t|y+o8xCmSiB+*@AmnXyO(TA8T;dRPPNJzx22dzR6}7}p zOn*HN_*$-#Q*IAuq^C+{>0q}J{!tQe=e=pAt>L&?I7;MoR-DU}-dNpbmJ%xIv)U`q z*p}|ZBT=Rh-YQHznvv2NWVTcHaeY&XoL-iWjPB&HMi)w(SaDmV?HrPxs97bW`4i`; z&QT&wG+B;#kM)5?{ zWi7FecS*!P=64oU4ySC8&miKyAt7@uAHC>Qe8B>?*Aw{IUA9G~^V zpFOVf8z*maw>_^54`(YrI*)AepM6akJ3IArlImq!{6juVN!X{pl%fGD=PgYEm|lbw zwXmV|8;+Y2({-i{*@6^v^621)+VKn~i?h^4m8iE<{7%%rgLDt;YwxRcNLk|@&y3y| zmO|ZsLDi-LOlh3Jd6TBIYGIQEW^03wzeNd#GI4--H^fY5S6WS#!*xB**p*)rW#%Xe zZ3s%f^<>tThoQ~Zu1!UEbh+B&w~_JPh7Wx2(sVxX$Y*_DvddEEH%Y4J5b&{`v}4oMZWKz{F0H1|%t8312~E>FHL&!2Z1 zZ6yq&dz5$8dm^{teVZ(@ST88Q$-U%{9GvALK6QLbKFs+m0`+ypJ~fnI2F={iUmTL} zFofsUZ<+(9S#cLp4UU`H+>yjwX|{P*kxC=%YMj*m$nHKw8_qPR4os~z@8%B)RB1T4 z=(jSmax)LX8?8C}MC?}462GOz1y$ck6v^}0E6!mJR^ArO*vSk@BCa__UstEg@sBo7 z)Fvd*ku3z~y*+BS800>+7tS!z<5DZ|cZ2 z{Psg6m?)sA>@j1G&d5ie&U&*Gd_(jrV!zn;d^uPuLcb1!xII;#YodoBB`MnNCojQc zHB1aSo(*P~$5_X=(}C}Hp-l%*D4e0+g&0%uXw*+IS#w2&S&h}_NT?&C4c7p&)BLWz zogljmLX}>4SnE}Vlylk0Q6#Di$M&xaE)#Khng%ab>C`*`h7t?!3s%-0og6k*M)!zQ zuOQWsfuZl3MFWGv@6~wlUx8BaG~TG||N1?Zt<~3PxBGLa5j}P!xPi)R^IY`%QRqsx zbxcPR(dbHMCf<1l3$Q$t)|emIHPFU%)#riarUDJ%hR;1#dC-6{@buBPMZRye{6zUd zhCFXerqGfJV`z=h%ALmu#%}29Y&Z+;U>!0I?yOsMy(=+js|NBC{VhSOeaBtDPmYTb z%X=WgNEul)qB1_-yZj#QjhQIBvn0YfgWM=}g>i?8jNLSim;ulWqr6eS#s|ceZ7vxq zsvxV9a)h{yq0yW<&6&O@U8j72>djku@gNJovpQRw7Vvh}U4wRJwt!8GCv#MytdbooyyJ zmw?7UKQ;`tyJ5!ZrcWloh~ZB+1Kr3gR$%{z*7W}5rTH3^3WCCDXFx(x ztp@-wFx_DhCA8m>=5I}ZFR)kn;CZ;LR6lrYYiD3LQyI@MI~P1Guw}21<=#(_cbfwC zH5knR&fdo-6I*O;a$Py%@QCM0eF-!jF7_QYt@*Oq@3+>*f`mqUP>ow-rM;`B6(rY> ztB3IN27`avewDm*WWDaENK`PEYIZ~M%4oaPXLz^wk!@~LGGarLXIfG{t7_Zg$vh57 z|AhIR$3lj9kkm%4CRFykHt0KNoz|6g`e*!b@P|M`ejypd&4oWWKw^Fl{1bh_oO$S> z>*er|KV@s(?3M%k*jEQHD#k`c&ET3*%&Q=X5HK*uUfsj}gdKLdSGr*2fABU2siGuA z-@mAy&-TR1p``p&kRmlB+BZN_jj99h$$g+s)2G|ul_5)cHvzyV_qI3WdL-Y ze-5TUW%mq5k`-*XqV_Dl0;@5!;gth=tz5Ql8ge&|u@1WGruG@Wg zwGs%YgmW$+0s}i9hFlHP6nr$RrkiJ2FjN~}lSvA;Gqwi8n3wB*k;IN)OPfnr?Ah9h z)luDK>-F8;*AM8=qzWTJQlDp(9HMJSX!gU&5vBVR(D)A=9wW&c`a@P5t}Y|U>wFQ% z4sGAif02d}1No^i1{xeSrY3^WpS^d+(!Uo@J^?(5o-`{Vu4N3jj@!qb?r&4M*teR@ z8dnZ~nO=5Zqg6PDrhsXBuuA__x_*I#{NeP?c578~%@#eIMTqdEkon661klzoe7SlM z8cl@|(m`?!1RY#tZ{Yp@-Zcw_P5LFVnIXg1CR?eBHh}mmVEO!tnF6>O_k?0~|Ma)Q zf-X+DjX(4e+A=YY{Ii7z#M&7X-79Wiv4zcEz=T56@^1te)qo=fUs4}F2lG^uQ3Tsn z)~;$gF)w1HJ<@Ct@sk=Is1YFU>TJI3@@o!4MWiCtaDG+i$@%oJCP_ zWAG1|^Efp53&^SEk!b6ux3Rv zvK+!)-$i-EvnUPu>>zPQfA~a~%rWhyFM+XMrP828=V;U`mSFT7zFY_*gN6|e30I%| zr^CX$KlHMyb~rIBuQ9I<>n=dUIH0V|1-B3mb&r%+k`dt#{J`j$ik0m`-#mHre#LXR zM+`UM3|qtm_=e(W2n<1vAp$n`j)A|nwY#mtL(pTujYCAB!wuvKkU9neWr(IcfIo1* z4y3p_ioiRlm^FZ#bPoudwai}?8;BnuO;3pi_7|(~ui@`LlEV=843U3WVru?a*m2Gx zqFC(c{^pq2?J$-K+Rr%Jg2rfiKh6N0dh(?=efI5_-YO|*OWk7qNRHv5+KqoI84Z+- zJ`cwAh%q$bVb=7(jv@Z)bCA1 z*fAWy`zcXnEN3|XUkd$UT{Z(2TWi|{^?0%>TjbU}LG7UH}+My+yp{UotsJf7F z7UalSj`vgGW!N_v-D=n-Zr$kECR$+suv0 zx|lX#4NXl0(2|n$>oZV@A)s6wdYB2RgG)y<4c6@ z8NoxZ!Z8dxHNnU@XfE!>Jxft9$3H*-gc_&!wjF#hJCxtlnxph7KRh}V_&el)_HZHCo>qt;7?nO8 z6$GB{FeiAcfy_LFk-=~&guJedI5?$FNE_IswoDutnU*&9rt8N`Ad5t;AJ{G8volyL z!dOyJG($xo3S4DPKYvbJC@!Az>2=T`3sg@)Z$^l5AZ7wMtu49K!xa8u_XWcZ4dJhQ64*v%z%5kL3m^xJ$Q)3c!o?!{ z@DVc*Y+|9+vEIMjswm@gDn3s@c54SHLU)x8q=c`ZT%oDWblT&Mc>x-IuNemdh`|bh zzmZ&eWTj#AycJwlYm4)``22}eX2c+1c)EH=@BG^l#xjD+S^B-f@0cVS!Rna+Nnn_a zj8-Tx)ir!=%eM*D#tvt20sb$D&!(hfh`dTU8Z;)TSkS+~^7OH2x?(S|$m-!DRTRLt zj>X=Po2SI$AW8dro$tF>smU|U)pys&vpb8=Yr=4#1aw2(SmO@~-J@eN;OgATqimc= zQApc>tZ3b!a#KbD=h-m*;*ck`f>xdlSlWBB&N$iX&mkN!xcrtPs}D;u(B#@pa;*D( zL5N`Y8xW2OEC2|7JJIZL_6eXBpI>`?Vtxm@D$jBqUh#@Ok<=WEbt4%~iAjL-Oo`zK z{7;;c4yQ2%w?{5^h-;^Ts*SZB&yl{Lj+GJ5x6m zp65{jP%O6#)5SX=BHNj>u4kNJ1bDN9{=Y%zd^*R!4pzj4KeJ-AVct4X51^DfVu+!@ z+E7s-y_-;7jlV8=2P5+s^={7!A5D*VH>hJq#D0KX^?g-=FrUAErO4Rk3GVJh1m`6E zjkt_?AU)3?jS~|v0V3H9^#SAq(kA_yuaQ)onH*oR*rrTku?|?J|0j@!cOg~;(SjuC z@L*8g$xNWZ?8wA=*042wl)*%}#HrieQ~hylh3t49=~VtzE8eu$2G9VLuT$#%3oQZz4I; zXEL%)j~Dvm*%32q{UzM%5y<){TuEH3)=z1xCn9{#@Y;&#>S_r&N8X;pg6$A#M~A!} zihn)WRg)r#3;;_Izn8cy21#1YQeUtAac7eh%FBCFm^}&dzz}JlXyLzabU=gFN+tTN zMP^V9E@JolJg|44F1{m~b?hHSfsS#k9|~<-T91I}iP(IySna^{wJGw@T;&W#hnvuF z*~li}Q%eQEBB><1Sb43RYC|jVJlJ`NSeqQ zCWvk9>&Hx}@Y1;H`ME=S7bk?dn7ec_#qHTI&n&a!d(#z9fCgIdvKi)+*%s$*V%MqW zyCWo~h&w-wsh{IZABf7vnbhukmfff5X~*={9@k(Yd^?`|45Pdi6MoxE`FsG^@o5o9 z*Je0dNDIu<2LGl$087W^>mNhp(GpxxslUJb-=UM8E&oS{_vRyiw+(DG6(DPx*KZ#J z*DmLCE@(L!T+~98_5DBmCVk3#l=kN|KlzhcVn5X*J5!4+OrAUWZND&IGWYl(DwbrG zPMt3Mpj+tkuOw)9A=TrCWT_(~E_{OJ;0v&YRC9J||8(HbLFb(?_7JW9q7` zz0?J+r;LG!pa05;Sqr+jo!bu+^CPu=q1)TPF~?@(ft4{_JZEvdFAWLr=zIWziJ((tbHxlxm=B> zjbF3%Ji_&!5)B?N(daP*43koLT)4%{6f@q8S0_)l878bcT>J#x;F2+}c<;9-$|UiL zW&Uxw@96`;vAgtfURG2m1nt8qAAq$e6_q)oOvug(txN8iS>2B#3uhonMvGUc{|e52 zWFhOA%2-VqL|zcB8aK4i_XK{Wlh1T4e1EJ+y8)plJ5;^(bl{337g+uidL3Gt=hx5q zPo)~A7&#DUxwKsn_LNG)I0lBY^wFSG-FSB)w?3trN-Cbm<0Z}LEBCu$%Ti|*=CaMl z{ZVx-k8=jA%YX2iWUE8s1;3!n`uA#sj1b5YB8;VW{-f`&a0$g0Qogmt1|WuSlLfvU zmtthW6Z-!_a*|5%7r(MnYd#Dg1PiyEZZ8-fd}ca+wvt?rSIKvFM5D%7FT9;8vY_o| z(63FcJ*;t~DLI}gxlE+dX^;mmCvR2s@cW7vyiy>Ur!_3|GkAihlL;?eB#SHYueg0=9hwVa_G_K7k zE)Vn;yupd7A+-uCpyp#&owK9~QI6>pHz(Agd5kS~Py67#D}c)(GY?=!#$%Xs&|WpA zfqln8FVr36{RqpICMN+S zW5yN_VWJogQ~b7(`a4n-!d+0IZ;QIG#j3fs! zPsoOmYdj>$F^s|Y1Y(B!6A;epY#Pfa`D-EDtlA@Eeu%6=JHXg7lNkZ-;LGTtBvD;@ z^I%HFDErZHMbwFR_$euBuKpI`^{_)7lO>Bv5p9z&a^;i_Afj5a$b{DNi?U4e6s0kC6Ck=qTf30kdUtTe`oa5Be0b7%rb+E7$eAOeo60PQxJ zQja?{3w23UELmV0_zLC!u|a(_*Ka?($adhU5L{QaMa4^DG*}_V;5@|4kN=MiMi3_m z#88pZ20(%L|C|ybU%dDq8#Mg`n@A<5zSPwAKQ;*W+vh)Qkjxv{fMksZsH?S<)W?N) zwd{?d5F14(_b%B%Gm>_Mu;DH^U;iH)jD-ZE){fzTvC**@otL_C+C=>DjvG zvPS(M8>9?^OEumHyQUB`*On%4_zTDLARePib{%mJX@VGYL2(1;L><^M>}D(r*@)#l zyJRf#0QC+p<|zX(Wr#5NmOzUNNg)_ah}O%##Ak$e@x=y(#M~lkgeked*dRgp|IY>~ z=n&bclMZAIjWQ8MQN=EYJw;8RtOWOFWZp@20AOFWw3ZIYhGDQM3xt+9!~;=EQ52w; zvP9sZd$8DXV)iLc;ryU?h_wy-Ucg$I0!fxOdX^zVaZPMc(@CR3Ibh=mLI9?bz#sUO zb22U>q~Mibnd1LtgHOG_#Gy)*n?^|f58zH>i~rmcp{c;nP-5c6CZfObCxpq+4E!BB zndtHchv%V%iX{tr0$+w6-u`qk`157GKmWcVVgF?f?EfDdq&WY}L{fn@^-h5nCIIOQ znzAM(hO9)mIURQBW`mT3Ab(w=BOeAFW&a-=+}TEjFf9ztq`2FI<0kEcyC$4Tlxb`I zKQ_4V9C$=5G5&q z2SWlChdLmo1i|J$yh}pk}Vkhvt`-=Jz zz=hk(V(CLxC>=Lfsd|?5jZYQMHTNwrVc4xoFe>9kYwuP zddGCBKf$lbybDXKCl3%pHX|AG%P2eu6~zoRJVAj0xXL{Dv}pr_r^mu^ZoECJ<; zN^4^U@*HKNx(7-V@x(Ylam)n{te%rhYNM`uN^|3i_9F^fQT8v4jFAe*{#$Y6q)hx%eEe12muck zYA1KqKaY4C>&YgjIfatcXe})A^O~!keXwH01YtNd(SjYm-!+iHk&no1}A2ac*c8yv{czl&<#Dl?_eI})@%W2K-JXO5ym$|GouD*l2v zqNH7rLnYM-s|zntWQ60diNL2!Tau|i0F=$h`&pQD@&(Z=@i#dJN~me>iLI;?OmHY! zIXbJH!R8UvzJ;q-zaViq=h6IO zmg6G7mA|pwdPg)-pWb?gBX6*j^LK?ic;Zl*y;O%>8IDGB7R;H3A@2U82K*Ue#EIk# zTq(W6{6$&spKsY#Z(0;x*3A(}KVy~2>(Epy|M4(koQx~8en{J~>?bDtR{1Vj%DL~B zus%gD>Ov;@F;3AhA!=P;=n+jV_o8Y=mX8}}k3M>l`euqBPi}NlKqr--5&F}z%q(TZ zOgBsj0l_onJZ~=zoAL!G1+JJqO&2nZt~AbkJPGDFg;`%iRblfxloAz%Bngt@_dZ1$ zDj)5JKPsi7Y)Idk=h)R6m7yW20IrCtq9YMx-E&fU+j zOmHwJZgM=%G|5b(&uY|Om6{jO$rR{kjhe1hmcswqN&Dkz4U?K$a2+IP@KQ=gU5K5H zFFsmrHBwL$&CFr#gV$ITn)Fi!!N0W4m_92EPq)Kzpdci*3W+Z+WhhJ*P_pxbNqL;D zl=|ZtGal;8eF=TOefo^CHPn$z(M(#Wx-R0eP~I$X@E87N3Rq!!BsEnT zvn5%6cNCZH3!4slfD+X~_3kpl%5%V!f86dWotr9>kd!mwfnxoZINU9~B(4sd*W!IdNiaI*Z9Pfxw zqRw6COqrrMrH>M(3H!O68$~6lE05~E0vXrsV#TuvJRKF!xav#+`s|0ww9>t>&k@JE z%A8UgQ8?NU*m5!O7tvCWkmngXSQQo_HPZ?ok#O`05M~D3qZA_BfW`QzYK4>mT_Owz z{me=arJ#lYV}fWU3Db0fj;hta0&>A<*HG3?WeRcwW6ag*BC%S8M%cTE=~iV?!Nhe; zb++qC3D32JeE?|%nFtw6q$?w~NF;J0q>~O6m7^<2qSPRfd^$>$fh+zNlkNMiq8I5v z^IY$&_i!%(V~I!r&#(Oimq8>2%-|A%XkzO$Xu1w#HWYkVogzRUtS+O~;a6tQfbfxn z5ho6PWy-w8G*;R>U02@lSMsK%cHv4iHV-``U2oA_nx}zz5Z#;UG;CPC)p?$p0CiTO zX_%E+S-jKp+bnM#lnMu0Gwtd{IeO~n$+Bq=ZW2u{PSS&68vbq|TQOh37NCye1^h@Vk2;nr z+tR|kg*qud7c93tC)^osA_BgHtR)W#Gk7z@4BBULvr7~1lF4OqtIM+QT8 zl++fE1k#Hj0BGaPY7tu3j>>b4k~n3xRe&GPFSK-QraqXO-nlWUT&{ePbT4L!%-9h5 z$zi<~*cka5p-Qx0En*rXq0NuPbKBxLS+rXK)Q+uiN8P4W404oKHwBuJ`<2>*f8+SD zd2+mx@PBJ!!Yz?(Z2EhmPpWOOW|37Ll!L$5@iVl`|s&(P{e>zDueH_X~o zP}@B8K$lNchd83}-w{QAVpt;PQDCk_tmNa-Y#~M<)r7Vy5Llp%82bxX=PH8J*ixma zBx%ssbNcw)LXvQyJ5Syp`dE7=Skm9}cVV!5s>R^>lX@M!GkxjNP&4 zO|`U#j5-V6&o-;kpPzl7A6?hgQ^ZebQ_EVIAmIUr8y(eUhwEYvPR`}e)PvP%515vQ z&7||uhCK6X5=I1P`TEpu<$WJa8fMHu&90aMvNyA$d6uO7M~b(c%kCgw&;(0E@r{5R zz~w5v4MFJ0q;%X{Sfd7Z(hN~ZMp?9+B(_z)i)asV7Ec?f4ad&B!#9%-<{V90V+XdLuU%BdwG$KM~lq(=?k0Ec;gG`i!;2k*8P zG1o-7P{}_%H|6UMI^P}GJ9t_e&W_zEaaI@@RVm*F&X-+1OS8}E_tYvyC#91|p_zbp zs(wyoQyZ`E7OPKSdF6_Y16k^m8~(u;RfyR(r*g&bRo+`^{XhLIm{(I9yQbv-ff5`3 zzRPq9t|r<`GSKLOZY^zh_kxUav+pQuWkjp{xEw3U-f*SclBEeLzyCQ$tt^!+U8pi! znOtSYfVF@ALy}`EoJiM37<_fRT31B@l`2NRAUdsLTRbLZA!nZSk~yMpTxt{hVAlDR z+r3fmqsmKy1lvWS1Ls_7w!)>^9;=GiH4OZSJ4|k>Tt{zk-w$j*6-d>5-HZ!|cYd}V zbjS8%OB2l0#dYKhQG|ZL_Sa-=!9nWA0VWiyGuQBlW-P!Ib;lehkY*y32V&b-~JRmJ;V= zJlWO?zPn$9f%`#@xZV*R!N!nWKUK?Z%v*WYJq&4P<+2FXfTZwt0t=DuDpOa8Wqf!>o39<&d{ z>unRnBgo&pat=s`F|$>;f`t>_+2em&r(@Tf)D(Qrw3b~?Wy109Vi@+*DL%bE3x97u zoZl)4n{vhYp(Wq;L4L`C>YPHo+ac`WptPB9i`21nlNjW_0jd(yVh-6*wOiJgu9&}TN*T%<2vEu$XwsGEnoUaE z+!qPv3(LoA;Bj+zEt(Ovd4_*_JtzcrD<&Haw5V|vvyTuC!u*AMp+=5DyfLtHy#whl z5Kjt$)Wb9NTt*Z&d>oYP_UZCUoki=ml#GP6HVh5gjEOyb0g!IWQgOGigB) zVcbg3K;<4@+v*oXCMtP7cdw!F1-$D=L-W#0xRQ>ITBVm;JDk2%!ihQ4sIx+2a>_=7 zRw#XnUk3`22PWgUB}spFz|HbR#n%<7)4R#aNfJX77i_^MZfGMwRr~k`0Zr|X-v3%bTeoCBxPRszky zZTfKclo$UPSe>(V{399(MA0vDSmg4I?l)PXN;Fu0^xPfrEmCf4Qk1T4ItBqd++(~S z)BL9>}3nf=(R)?=jlhg z(m@bXHUb9whhT1`HKgO;T1D$RM7L^UhPDqL;-*5#_rG4alzF;h$CxbPn1~ncK|I`gSoSBANsMKYt)DFSmR% zb#>xuV!dR@8xOA!{j!nQaswBe6BmKS*NR?^O+a`=3yDjvnT6?9p{#B z{rlYIza(PO%u0dM=_Xti2CJ5Ln9_i=3A zWwQ4q+W2|hxc!^%`5?oxCY&=*+D|)lQHH3%nWSN?%c3b_vz_u8kZl!{%vaxSe4MXJ z$SeWcQ&zeT2Ia{HKJ;o2_8%zs40kkVS8yNeBC{q)LrSX;pAr-8azF%;jH%7}1}n)IhMt)dXV}Y%%#|Gm6L%ZjZV%7c zD1VJamnp`EvZK>)5Osu)EEm$l9NfK!^aqA`DC@%4?Kw}mJql+$A%s&wmp3~?DXV)= zCd*vkv_x9Foo+2g*gd^`_Wc@1_70m#5t58t(&kFO=Uujd%;cvi9@OBTcIJP}*~(9+ zj$`SsRY+TGO0QnYYxP|ND+Be{TlfMqd`e;D5dzZLYg>;;A48N+NgdJRqP$~3;e|`GO)ck zIk$|bISuwq6~((}(22Oe(XM5;`57jF_8`HhMzbEylt#|plh@q|m=zTwsl=FO+x3dv zV1Z`IQ;%VhdcS*RURL|)rctJI_)Zjh>+;nYe$ol)EP(?KSSZVEwfLjBWHV27BD_nyn5CF^}ZRsI=@r(TS7LnK^2>#mp2`PwtCh zAdJ1V8orKgQJOG$?**j&|f=S*#A@6k>>W-B_zhpn!##nG54ZdJ`A@{=6Vk>mX z3?pA-o1DqMJ~{F%>y@I-PM4|#d%ONLJ+H|KT}U%79nXS1)Q{;P(0YTs-eL~=9)_qh zF+(+LrNCVpVNiPH-Z)>W8`l~ZxoJS0yP@fKGpC&~F60h9kkqKv`6TyTm!Wc|xi-c( zIgCWkj>lga6d0~pNHO;!$yKSB{_y4onuum?RH0O?ZNNvN7qi6ko;a8qkk_4YN8PZu z;ZWRFR12xZOG|DI$o>afvU7B<-Ats*q)toTSxmKc&;i7$n__Cq7wbzXi}!m!-h4I` z=msf}r7l431zmbTf30#-AN1mh>^oBAjRzNEPIoBLN2iZ2_o49^5o*e1K+JOcL7E@` z4~sx_zZsl(*NoXV-QnOI|F0z#|E>O&=zrRi`S$;Ub9|}(XYyWq?zQKXa{bTbsZ;(( z|MP$2-|X(QDn#mz36i;%_G5wq$^}$P^_=X&Ad^SEfa;mae0z{bnSi=)wg)W>^IaWz zlndw|{Wu#L0qMTL^Soi*=O(1&2;Jv+p5J|Tg(SMq@gyOYbAlxWsrRJ%+ih+6pdgj_ z+J%)OmG)#fRW***ult7yNuW@{a?cyneZD=&a(j@fV+zTf{i;-aE7OWYG<08_5UD-! zyIrYFVb3YJ#A?qAH|M*TNmw->Aa74X%tUL6tXCPP-#zz zng<}4cR%P!pW-SM)eLH*To1|-RJ()^Y72mcE*?4XQXRWDQ~{`sLif(hU(wuEa4!7X zNN42?_lZ=&8Rfx+m)Q|GUyk>rM#Fo~?_L|Ju$*l@I`guUGhgIM-%pKD_ZSdzs}xSN41#qYgXF5fHPPYdoV1NHL4$T{>MtYZE_YycczM+?0pp# zWzLO=4pVV3udL#Tc+*wPb&tS4+ln?%s*sR#uDlvmojJFip5u~|Z(rp}9RteF;g(3| zogu9<+i4$S#d=SwU5v{a%v?iPyvS!;@p{R#t$5#)ilx~u=hmvg?t-JQ*7$u@t>M8Qw0#0cMu%1i?ZHs~cU@R!{V#j!7*Et9S9FjzL2StH0(+-&p66uzD7T4)uN#R=1a) zz52}f*{}4Z3epk@t5-%BTz!WpeTr&839Hw6BK9L2byBH*#*_NE_)5a+&H9;-J*k3L zP{Qg@Z3oCmSmQ;ccdT|0EOI|6BLt$m3L(MD*l`FBB-D$6{gB{@ zI(~vvjAS2y1ZNTaCQXC{=es%)TuShcQ!5Xyifu?K53V!eO>HW;%Vs*bpWruXH6(aQ zJ+Zwz5fVIMt5NWROZVkCQrVV-l|TsB?OlXe$*u)jdCtdHalDkQZZU&q4U9_K8cqn; z?QeuwBOSf8rZ`$<%^>(RuYy=}>x5%1a)e{8h#J&`I*68P{KMlWL9ET{Pos)$sS})V zpW24C*Jji@gA*u};|%v#t;V(HSa;#SV9&aI9!T$#GBFbwq}W-7hK#;ktd0 zkWgRSMnl61ezSoJ5*mGdJPb|LF!~52G}movLA+=~OJYPDTIa|uwAC1ryBiY{+Uaz8 z)K#I-iRR)59if6(r`hnP{L&nE(rIF`j`jr zdvG!&JjiK!q#DV6QQZuWb$AU=)_`PBTSCI>`t0d6NO++`;7YsyHF4-7ye{tT?bi)* zcz@kMg->Z9bM{L@!snwc)+1L*>N!%Vm*`MeFC~`8dKor3^$JvJ%x+RhyqSNHr_?kb0vDzI!I9i0f554NkLduii|z>$ytUDD&Dvhp=Tf(JPIJ z%^p)oz12=Dn}6o=>TPpKI7|pc7xf|aj>SggdbLjTS6oA^$FV&m1neFXQh(M%LPo4c zo0m$}MJn1z7+5y|2}2xnP8jX}UKjlm+~}7uUE!peWP~KlcHC{kVnRafG&Ce(xf_%d zw!{up!cK?YgYl!DaD))F_sT*N&bp0Xbz7=Wu`SgP+w!ZQu1I~N?OW?-)w%2XMfUjD zFDLlMOj3KP-`fEL^#^FszGu`#Nd2n#&{$uSoU!+q_iN&;pnjYc)Yp_Nx(gRlf2Bjv z21irsZ;qpQyNzh-?|0}rgA@fo4`~wB zAj5s-K}dsKW%?ck01ZkVAvdVJj{OGx;@NL7!e+lgjYDpOsqySLh{Zw;mJlpw8xEww z>R2S&U`rkQ4feSD+~81LZqwj++&Aa#B%%RdAD5CmZqQFkcc@FsiPO`hf>`+{RoH$c zX`uUlRjlxnhTAHVG=bo~PZNbC&3)`W&yb{PaqZ2wH8E+qO=Z$5d(e{BI?*O+gPnyY zZHZHjr0uq7lMcAV9CjuZBChC8X|0Z7A~ zI-xf#bU*DD`*v>^r!^czs2{iE8q#oB?7J=~YB-xvKW+~;q~U_Ph}>|U$YWy&(n2_W=m!;%VLLj=54N0!F zM=W`uJVx2aF>MSamEttO%0Ib8k3?<(x2uM!gYJUA<2sfiSawYA<1i z#q0)$B=5KNF!{8@Tk_c$Atzs~BSRFQx*Mn=jVwp3jWV4atx>KsD2)mU39$>YkVd71 zpuLU(X*4J!m&l%?09x0IC*=PB`~ow6gA^OS>x zdNF(8At@(a7OoHyxO&-mv-9c>_to9;H13b1@r3jKdDrnbz7*>X z8avrtYJxMYsmY3B&Hj8yYI^LbrsiEgs;Ol$@I7@9ArReq4M`ngTVm=2NA9ULQJk7O z?RspOI>W(!sY~P3Bz2{$CaIeoL8opfgxuZ!kW`K8qb5v%q#m^yPCe-eDD_NSa7;ZP zA4pS$5VTJOK$;{whS4NjQM-FO0MaBsO0;uE0MbO=no`zes0)yrjEIiBeQE&GWSk2P zn#_n(f+q7~l%UCSM|Ya6v*p%gllxCw9cyT^lMu9*M&;S$Xq<~~a@i=W#}+w4Yzw7m{LX@}wmH0@Xn zGDvNZL?ilJ$$K{cvEO>^s}V4D`%D57b($(EfBK9HuporaqZjWfWeBV!G) zX^q2n(^)oHX*%Ckh^C9`dR^}Hw8o?&c0_Hu-uC=Wx4ZrAiqq$&`(lAx)8ju2G)>Rh zDv<7rbC>DiI0v7e;k@R;mGqKW5v7;g45SZ;aZc%j2`GW2yAwF+V;ucSpKzTQOrPx9 zN&5VFVwS{8E!~;JPTv~a)s7fflfFO3)ubP@O(wn8aW(079-n^sdRLQv)p0e=lAOV5 zmga)mW?6Py&GKVCU$dfUd(A52Os!cT*VLK~u?5&{q$9v)W8;`?HZhjTW;5d)U9&~5 zqieR>k!7Tn(!-EuM{WGu>?9#*pE`jwJL8&5v&$|`5~r>i zfmoU{(g-1UCkrGa&sn_6aHp{|`WS^X`|=jA`a$?O;}X z@2UmPNft=P3PQb@^DK~zjrM3{>?H*4Er5`W1J1~0oQRWR#u-Y4A&DHan8JOl-_6Rn2XEU1@5<>3j7)bNds2Viy@6Ne5ce9%2L*s_Kd7LL` zUK8)jn$NNY*W8Wz%~!;GvgT`IJX!N?4sovMYknY3n9YyG^;cWB$k*I;{+XUQ=aCtX zbsm}O0v?6WAX!|Cgt#>B#v$hc|=VTKkYnRQyVRw2q%Yl4Zr`*otr>?Rt#CG12Y{P4r zoc7M90u zf5}<>GfbP~nooN$j4oZH)uvd)PxNN$x9 zIuVjP(E+8olWhacolfxHdylq1%ONOtek?(YZ7y?HxxcTC<1%++ESI^v+zcxB(9cOZ z?nb`c%eKbn3c+sGu>`+4aR|wqKnU9B79n|4e@15BJX?l&ZoZSZE{>8-b)%NI>*usM zTRQS;V|qRR^L|wMqh}r=ZIcOs=*dS&Tg5(O%#u{wLJb{bCo8RO%N%;z_KA^X+X4DY zbc0meVXo1%b=R!hR{xB~wo{$4Y`Zvi9NI>gDDP2<*1NrJvGbI+I~?5EcDD*KdZrT6 zcE6)UZI9b(+V-@orfts>0@1UUkhYiVkVSsoR>k~;SofWuNzz?PoYrXutTn&X?DHzR~S{Tb(@H?=lmP&RJSW`vbORwRcyq+Mm5%UhOYB zq!e25q!hZrt}v$#I~Nw%x?Nc2x`@JxSQk;)uMScd4z(?%aE#m7cxU;j(4FZloc1#p zTsX_=$K8-zxH?W13)kDqSGXfi`3iT(p|8Rt_RL_Rrg+ZTUP$42TRMf}bkMvPx z5Kso`kmKl1hdf7K9g5=R)uGJhwZj0jgKXmckPd_6Nb4}%;kd)ZI9@tTiKDs0JlA46 zEUz2k4r}VbdxuRl_StPn@luz&;b3U!J(7Kp}CV~?*QqPLYQayg?3gf*lyRt5a~#(L*{r`&m1${@G^6&hAE!&T)RQ^L{6Ybygf4 zJsl6}e7cUVi*bZpvn`=C>V*2bU`egrAt*GIzmdgE)cjAgdfby**?($Qs;>oL3RbcNDoUpxng<2X3u zOx>7m23;<@SfniA3}#u9nYgXHkpNPbW*bsju{%y>WwGN_)?3G^7*aO4?v0^wZ;W;$ zW?7A+1Z8Rl<{kq`*=$ENWs6)|mJ$5+3RBrCTL@(v97QeL>^Ox5@g< zy$6u8qh{dD54FyV(Zz}~XCrG@pCY?S_fCRz4cqK?O>qe6njXL0)ipb2xvQ(@gdICU zy7qCI@7h0>`L0!U_*8#%5p&lm&RS^K8HA8~qXMMsTtdjbR{_#>xqCdT>qdvZZ84cm z*PVnw^a21#*8_3gAGbx<^_&|vyQ=b!8)dq>=IV7fpCj9DiK@zD$0~!}Qtj`%Wt*ct z6DB~q<<Z$1{c{kML@duvAgL$)aj=Ch**B3CZu?yi^exFd|^Rnb#O&TSQt@-Z0!3)M}O_(a^GX13)XrJy>5(pjJ5$okE!-%+%b?IGt^C# zKzhu#cZEgwjzM}XvJJY&T7u==p#kaP?%waQGgiPo_BzcUjZ0Q~oUoOzhkJUf$K`k( z@4+!TUg2(esmP2UiU%PTxps10QEB&9(bs)_Kx`6KQRV1O#TY`+zM}(DF~J__is_om zMK9)nRLmlT>#pa3RJc=L73<<&+;shmyKFgC93?ck?oJO##R)>tzS#p(!Ol!d&xELj z^h{B->E87L>6sS0WwmFaO>WN$$0_&h^D_UR0{QV$p94bsb$4SbUy99?+;h@3{`Eb*GT?S{fF z6V8`De(_a6LhB)+O~eNljJjPPw?aZYh`-8w>u0Q0ymXTxs;Jx?4Eq29OpVrg^B#;FOE`@|v5P$ekBkk8NtMDJl z014F)x7mBcSnaJ45-uU$`^Qxe14&3F&U<3p8V@3S5ivFS*Qsg{ADi67QZaOcpptl6 zw=nr*%KHZ{LIPJ*UCJO0XQAiilz)_rhGyYtbtJ^l)}-X?EIzOgOb zLU#PfX5UEVWuZCy&9@9{bWR_SLINjPkl-HV% zhg(XHpLw@fU$!=wv&`J{i-x^{KIl)}aq#zT;FiGW*{g22;Ek!KTvx&{S`v@_xi_g} zvCcuPi^LO4|F_E%Q{UIFtI99`_>&rgUC@z7CB38?99RkotRQYQXGv@2I2jU3BksOn z{^LO8G9uTATlT8h??r?m@Th7mf?z2@!ljUKIq}6G^9I4KrOJWF&#Z%6e35^-?#wuC zc@HGCpLlAYO1}=8ejgyt_-@3?0P;~ph-^V*J0Wrykz;D&i=s#1#aa!q)~QDIfrR=K z|NWO|)_Y>>|3?evbAtbGYW>!Fh_#9M^nv3qz^&WNeZJp*0dA#4K79U{H|Wd7s=LI` zT>U|f(o+EO6cgY3#h9<*Rzl{E9V`D1x8g2O{oNbt8|+H6-08Vb_o=2;n?wD4#|LM! z;TBxw^wfUa;8q;vJ=6cbROLPr5*SPTfUmJS<21xNOMK@02|3#T zWC*4aXC^K;e*2`kOorPXJNgXVD(aly{5xgRF2Bp8PcO}fTdbDvTYLXOxK(KRj*GXa zYg1<-xInxVjh^+y)StDBa&oU7wRfqc`a?p4h^LNzW4KCcxP}|z?r+sUtdE-^;cdhN zH+O$m+boBmH}QK_zwD)hJ=a_?!;e07!&!Y?4)LrazP#*JwI{oXB)>HC!k2K1Lh{g> z-%nOioq+_;5ubVb#45l8i}*2r;!q$m6Op;Z*GBBj48>GwuPb5fl-8}Q(CSt)bt{m% zl{%f$mca~j`vfOm8>T+au6xcM-k5Sk+00XqPW*@87tU5T7ela&c*6@V%YCuc_MOV? zb>&c_FA?E%9{86r92nik`{`l^rQuvQF=OLa;D#&q=;6&mZN}e4Iw_rP87;|eYxV1^S(cCq^QrfcA z_K5#|G&l!tsdN6?_rE*fR`KQj`+n6~`8ogz9wvUP@flT+&;dy3F!9sxU;Rc!bQa>d zK%6~iwxSHXo<9#7KS@W-u2jtbeEt^EaVUjY<-{Mi`>I+WCqt}h#K)RuPt(U45NkH^ z-tQY2cefB?Eg^p9iPq)XQK`mS;%&YAZPdr3=CUKM8hg7Ms9mp^Z%TjcVYroGxi9P%oVTX0!kKW6!V=;a_6^*lO@$$zB;x6-p1P_m^n-W@5|8UYswLcF@0|O~;UB{- zl*$j?_3;EHG8JNF5Wo3j6IEC%4`LM(zg2LTdZo}B1;WI$x=tDdL^dI^mH7U@XR2H9 zFvRO2{;+jRrO7U<&FSagJq@=KF6UkQOdqW@h?Pma@SD$XQ6b z;-hzVQg7fH3h|5}_U+vC8r-Vo+_lL^?cf&nit>2L01nzf`t_sQ=U7O10&%N~7TcAZOAuTozURL;sxu3en)`P6{wKGz zP;HzB3C<+0*YG#0*w!Y9wUxM8D6PE;JRK6sBCh`Rq)9+3GKfP370^~^D*7faYnb{c zxOJfUt_Z#O3>o zO+dCF-bCU@|CXqfddEY&)x^&P+GGPYm`a@VuN)JsmO#AAiEn#lQ-8Si+_~@i2hByf;;RNoaE{zIG0MJw!mVauyPCUS^BfAEn*+WcgQcN+2CbnQ6Ys@>e$_X~A# zp%akMY2rMbZLa(egLp;~-+1=8#+krzNZ=H4plXeR+h77Dm`r@jO;^+Ou>cY*CjQMo zJG})&79g^i`15DIiui;3&CNc%=*oXgCYNBY=i#GcOGaz2W#%FpzW?{0AdrA$;={dr zbO457B>i;vFk(${aN8}Xo$Z30as$iEvyeo+tef3-I#;#D!LtdDq8ey$bct?ECPg^w_gjbqd zVfck*|Jr3CasiRcicb$lZ@ClCMu=yN2EJN|*Ho6TR1l|}jDT2U^p6D)Yq5gSt&s2z z;|di|o&wPj_Mhk4t2SU61S^T>K6&Yg2ZH?&9IC5z&h6j$Qaz@3mAU4PZ!Prg z);7yE(ILLn<{u_%E{24c5tkl&T5}AA<(>d>_Dx5>R}I?;32Y&L>e1ij>R5##p(NsE zy-(=ChDNKk5PvZ17Ih663c(2Cdbf>!OH;cA3Lvz-G11HU#IrDZ^`3-wKtj7!R>kJd zAAYypPK{5V0}#();&E?Pk5JmyL&BSg=Xc)qxwh|vAWVE?n>PmN;~o28{M4bYiXglzA>K8_&)u<9lgGexNMIK6Z|IkrnuI5s z%a-`hOMAZpOh;rEG3FjK!#@Fn8scrAobRd4UVwNm6TjEyhz}U2;qvhrFDa71atKxt z4}9e}{q)5Ih$or2<@BxEzrP>EKajX@>3PLQfwPdn1>&mT=cq#rFNB1b5LZ6=fTkT* z7R1UW9=PZZRc7xPjRM4PUmpB}3TeJ3f5g>e3N$6NDj-%L;_?oE)?clq=1wpkFuQgn zFaU#z+g;dlHxN02$Z6uIUdvDdkP6YTcIcHq-mTOI%l$=FQLa zaVx~LgZRl!dmCu#yc*)wgwr=1;u}qT>b7gkm5Vj1+{8~cdhS{6qK_tA#NoHURb92_ zDHbC>`0lOy_2oX0aDU?MXCpe8o-O7^O3wLd;0G!$kGX4*tA^g)&jYbeL9ANUO@V}b z#2v2Ob}tawj>sw+13-5xGEIbLkb6&Lu;TM*PQ$KdLnbHkrHi z_|CL%G@}iUgapSD@5%YcANBF1ra{EJ|MKHa`gj!*6yhb#O4h14s?9ZT-2B@&)NsNB zAmPEpeH)(qt#&k8;TUnrGle<;-V+e-Y2v$fA62g(NQVTnh_^1jQSlSbnR`ij=c>h; zPxw<5dlQde`_Lk|h5Y&d?wzLg8!UnZONnP5|IG9|(p)&k+h55zx? zagQb&#O0%^)HivKLp-O5@7 z`tr9+J&@oUNN~Ms!gh$Yi@5K(8`V`szwxs z_>%OGqtQz_#di_nyQ1V&Lqb#ZkDZXv9*ry|3J-|KKQh!fxl@X*iT8e0*-Q;H4dTtz zfIbW2ok#rKO~0I_eB`L#Ccf7HtU~wTSV(XJae_BpO(Apy5;{&i>-D*sdigC)gNVD$ z8l=PFOEDLl^6SsPv{Zi`2k}oNp1b2lP;8~s%iWY1xU=NNI)=FdOTm&ce( zJUO{|*J>T3FvLnCet63EFI4qrK*F<$-|4neldJG{NO%|VhG$zeR+{^oD`NS?L+iZS z)N0Mfh)2Ku;_p-|Rzd=6hYZK0Ae7!n*xT>0md%Ahq%-3{?O{rtOtAs9~l^pEvY z^t+jmz+B>In}0u1`y2=fR}nwn{%%e8Pz*sC@!Wxj6jNZVx_{#TySPXD^iPNQXAxhh zx7@Fttbkani9f&jjC!9?5+syL{KCr;{8yK z#M%t8wh^~m|Aw*^s)dBk6aVvXcZ~)j8xh$;+`xZvzW$a531t%BKCp)-4c=W4?_T2J zfty}cYNkVcvxr+h^rkv#f2z6NmG9g>uTp!>P(MmM@rIj}lh90aF(bcrOOj@1;USRl zaN;iIlP)NqqWFZk`H!ENnF)sYJj8<@|APi#-!O=8BymO2P3r!AXCb}|#0UQGuVymv zlIHxxoys0~K>OWqt}Nw*+s7NpXF{wT;*^``c=T~E#5zFy@Y>H6ZH3Aqq29#Hw!S+B zNJI+p#mvN=Kx8>0tBCg=Dph)**wP|?``3*Pr>h|TwZtzzw0MuoeJ~_2ROOxu31$%Y z|DsmA4jxm#PW<|34;Z|19umAn{QkpjQk9Y+=2lOBuJss=qSi5pb&|OK`AC0QT4K|+zBnhC3*p}_^Tm)b%p-J=5Ag-{mj=IWrBr}U&p7qS3m~4w#7)ymHN){L9RcDtc=o@l zAhi(xdE)#%3*J;lR+t-idGY;o6cPnzL4xyCUp7O6+lc>j?R2pU_7Ws?l{jN`^N0@P zWJq`#@riMPHb7(^A`6K-fAV^!O6nTKPsE<#4{7%S)k2H-yPkQ99;|-m;#lUt4;-eC zM7wl59Qu?g;l1P>6GW&Q7e+QmkdB5}(==ok8U0b*SyZhm~gH0@#$B)pV(PS+%b zAmOE|qr^9ze)%BK4+Du0ofpva4O$`hwmGDuSRN<5)@XSqJsKrof~Y|3A?MQ<6z zTR}Yk&F03jlL>LT9!c(6WJL&8&tSMO|RR<$Y=;u04gdE}%%o`&Eo@!cOkq5|<8QMg1L=snr2 z-E!RSDp1AUfk9+I4*VICZZ>$QnROC|* z@%C2PWI=qn#H0UEPg4@_L5TMV@k@=qQv!TTAim|qw_IDLkRxym5;#e`U-m1;z&;2L z5?@Z8V-`CHLOfN(>z>GeTE(>$;@?5sz0J9mz%)c=5)WVh-*x)tO3loPhfTZNEQ9Tb z_zn@Ddgiz3%E&Hr?=l};-Q1^wod*dmB)-*u&pdrRYOW#X4`#pG0EnDNCOAjc zOIv5vgo$5x$G=MDwHD&tpz<1NZk^``Lp?RV`36FKRm6)w?V};xci!9r&yVeTw|3IU;gH~H;#c>sH1m47nlupqZhCOM zHdUe7BypFg_df`fs=#`^F|!C5k80ue?_H zg89V#$5oXmm7^inIO6|=L?d`;7$h{3IQ7Fkb*KK55dRtC8=m=6zYQ;dgclQ6A9+oU z5BU%j5x?}WFU)q9Z4mEH;y!J=-tLF^rb2u()PawL_{ZuWH4wjMGX5hF|8b2&>5yO+ z@s+pA&uAp+1_@LWBp{HWk9hGNqckuEsv&_X#Q9%7Y#h-UNa!5#55LdVA@pp9c(xJm z{q{GHD$Um*0V1|$->upiOwn$LA3J}$Sz9=$VTriWcVB;{-=;u3>BL`O$o^5kT?X;5 zByO^=ySntiL`YyV@xsE3tCZi>5Ue9U&}H|T1`uqG*5?qK~7B9sz0JN~voAX6aT z>BN~UCoAOeS?a=x@4dq6%>xr4fg0kz_1+t;kEbDlv&4`5md#@10!U~v@z^JyYNF!b z2k{>yKHSyPL?^T#5;{b@@YO5d1Ce8hoFwk_HCoZZTtqv|Y6%w35e6-CQ8bd>4A)yJxg_o|X&4vy` zLdS^fjhv>buvfjBMf~m){mm+B4kVaQ-1}tf$MxlG#oxqN8@wC@BI^;^L>#(n`*Frx-CF>WJ&5clZn@wa9Wu`nh-W#m_qnf>GhZKwuRrn1^MkaBz-mZf z9r5`IpZ=g7tkq748$LPYHGMp)%0!&^(mTe>WkS3;#Q)i`LxEf{QC$r2%}YGD1Ce!z zY$SfX;WK6{O##GLO#JCXcWdDGjfMCo5I;LSRRgX+8RAbPelfGgV9ZiefP|m=^mcV> zmIbjAiPul8RwAr15NkZ~Z4WOoA-BNPDB{68z8t0Or9nKI#QQ3*eWo2Le71;7f0z?g z_5zSV0`b+?za6Qv-3VNcc z4Fv0nS0sOCHU;IVqaa>+PvV{GwiBXtMI=z5o{D(!)4Og^ZQB3|ZzldJfqtcpq(P8L zJmsWUS@K+jc&-rt>gr)tT>lzV0ELt8KeJnjUIGa$Cw}&qwGMjkn^DndmA`1~&LcA0%{TQ!IJ?8f z7OJ(qA)$W6AKd=#3ZOUo5&s}llbc|YSbV57eV|>iN7m&MG;-_tSQ&Rx89njBw6Di)_Z1z(6o@ySII!mN2bHQb>fVXlCC@f-S8+gq`1WDmHu`uD61qs7 zcwxr|AR-X>h`(=_VwUbZ{1VrycH#;IOnh&X#+^M7&oPMSqymAvvarobD|ymPTJ%=Hl8CgSeR}m57E(4zP=s=ZdSSHSH-EpG6dIDmdCT{iU-_?G?yCLCy#Lvx{bXj}d3-KNx zuHC#=ouu~=#Cw!D_k$H{m57;;;9TMkIgwOgEG7_N_~SwKpUd>|BE)-z_;3IGFi*u_q?nQTxrr+@>G9`5{Ds6DXWgqoEmQ#s^&#$;mDNne zl>tFEan-a>x_BX;711(pV(pI>^O3O6l&ImgPdzq7`|1Pn_9ssK&jV%^$OrL6 z#N(g1NuvaMD4{@vJ@|KwEw1Mz7v_0?*ot*Sp8;-61E;dCdnYbHUl3~{enpN>;7 zkO&E+s1qnumqncYWkOiT@(3hwocQD0{-6X~hfGN)ei}2k1CiZ`>?6)PLM=3e7D2q~ zY=hfPVJ!aWh*>`gtW}^$><#_!4;2AJED!PctLyiB5ZQ&uUM2IGrdGr=Ms_zqrW%4N z#Nj`EqEX#fW-8n9l(Zk7(H6Hr0^5l**531t4)q{NcnGmKX@{AmzNp@Y`0-a~eFv1I zH}TRN8mJO@7DGJCh<#6#E6VnzLVOv-fBwZQqZE6sfcT8o_k~yki2FP{NQXaE0ts~^ zPTP=eHrMrr`1=vxv8wvt`gjWBuOmh+n#Od!JJEl!7 zG&QAo>z}`RPRDFF#Ji99!~cv_ui@Ja@ogg>@@0bA1A7JHXX32arZiQ#&4mOP5WoF{ zzafx^LgHI8A=JUKXrb>Mby1jeofA6r1F!|hlSJ#U^bqA9^cX^A;HR}T@{j>1r>?I7Jz zI$!u)Y9XJ)vmfMueV%P3uQIt!gn6!k^Lq2hj2nkgA_~JE5k6V2iD}IkracyMyIO1L zVyX1DJN)tPl#{PU!63kc8OP!7ndW(}8)tJ}tm9&Q_&q8sc2M2GANLaLB8;0bxJN9l z4(}C;Xjn)u-KKAT_gVo7W3V=T*4XBAZEN{$wd~g#OsG!R6b+oRReMEvAj`V&xpX94r zD+HY)n_78n>yYf2M=;0S4RmhJ#US{`8>e}EIuON^JR_s<2=$oS_U5cXDHZF}87Ljf zWk>F(llEXdH|kn=WM#o)k7yaUDV~o^$xz06+=fh43NC|lvInkD3&Rec=Aj*ja|tm4 zcS9im`R8{HQe6GB)!PPdkG+nQ-ME`ZB2NP`)tpy|mkOL>LaYaFu8h5SD9Vw{zo_RP zTG6prWU@ZLH1TW1KZ5gv2VS+$%5+%M;E^ZEUoQUEsi|{^iNO>`>NSl{pCj3Z!8K#) zU3RhBIKqPSdk1bm>l=S9Nu@8nn%PxR2>eAT^`t#5KG6hokCG9Y>MOMO`#m0$2#l5n zXGw;2pg{MHXTv)S9E#SIyYPZrw{nIOtChmsoHnu5AWMV+_RQ96u`e-s7@`7F5s$fa znrAp~V!Uk=E1b^XQQBtG<_t%63)L`qbBlK9MZ6}czSPE=x9xfltT*x%BD)wPP_Sh3 z*cn<5M$LmGI72){GDWNzx==bpv-39qHs2QMo96~R3dGwq-GrxMBgAp0?{wEA1Cu(( z!5_q#$V`8_kZ`+Vw_Trh5$0#Kyq&TR%)rRmT%EJP4M+SYUA#%YafjbD*Ap8Top;mP!{7Dap>i%W5dyu+XZ{gFwT$@E<31auTsU6eI! z8pX>5*o091YiEZftchSaeC*QIPCpKiPSgm>rl&^#9JKabkllbVahhf9G5U1#-_kEe zw3S_C#R)t-8>|h&4+RJ^o5Fa)CBgXPA#g4cM%gZ43DQ((&{!maPQml>SBQd)^~vhDLS6$FoXu=G0gA0r4p+28&OOy(7RfEl^F}ZJN$WUY`AA*+o5NEV zjX?x!Ma8F)o}Vu2dfZUajImoDuTrjhMFlaUcj)IaT*2rHxtO_aVUI*iQ*ftX~HLc`1gfYlD(HMDZ_hc%j@n|m16XT)rY~E06M@%7* z;Bk+$$G^X&DD8pi^mi{Va{_%!;o9-ri*4KDR5wYG!N4OvoP2#Q+<6i9>&r^Z-qm@u zF8KW9rR!BKgFq~3EW+Q(#vB#I8#(fBvqtwt(~OV}G6FGt+>&88Xh6c&mR-3vg{pjH zd50}eF7z7LOLx0rpHo49OK{zOc`y@6>Q&!PC%R8ZK{24jbYE!t zdWsc+8eqyC)jJ~@Xrrc%d14tXQJSVfs!`eH(qi9WRRok#v zpzzTEt+Q;p=lIys`OamMgP}fL5eh<*SJs{c(VY z8;;U~&sMh&=ydi|ozppbz}<|DHt;e~ZffvR}#{D~u^W#IgAzb!uO}{q6VX;MQ|H zCHUkni})VdO(m{fA9V4b5a$GsgJ%(!?_PuyEQvg{F2M&H`y3RXzuq-_O|T~~z(lm9 zEwDR#Ik*OmLAo>!;2vqjsk%xvQo^v;B_kYA&ntMF_%i0PU6Te}46VvA`qdE5)j>6A zo36eqmZS47Gj0Cd7>z5q1bY~2hAjCzJQN;Ltx8G98D8N6@$nKq2c7u4G$TyXpP0{o zKR$hQ-KU`V9F~@v>o2{NU>9}oe7H%_h1mC==euH#uQGfhtcZ|PaOuI^%&;ejf#NN( z+BOBHKjlD6*j?$63r7n2JTyoxGW_i`tr_0x&w^75$B zh}(&~A4fFWcCxpZOV^a7bS`Mf9uc?x9O`O4&=@Mo0e`ET`b9FmO8elu;ig;KakQUY z7WJN6gZ|t=vZjbE>MlIJ=cPjc5&}-m<8>%v$|iP14bgd_gVy!za6U?GBoRjICFikg zJf9)wH#W|M4Y-|15A$DJF|MDfM5}%bkdk<*ciMiUq-YGgQ|c~f(LUj!_#DM^=R0Wa ziv|@%9xzh9aUV7GA4DIRZ$KRXmh~fkieuBI=`DW{jUfE_e8u@3)JHAy_wS;ERyd#d zfbXq8D&_45`MwQsKexZygX{4V&M0Q@IuKIV7-rLB}l!X_dPs-dPqNpDo*ys#RfR zWP!mZ6k9pyg5Wf!<4V(H-#P9YD0yM=MvP#^grIV`mG#wdNPPD+JI0Uhvkokfm_>_4PkbgeL&|@*sn31d(B*yVdea8)rc|2b>6v>c#qD~+`*_rF zyJS<-bfddoV|~@3t8~bXMe7-=zIAALeE!P!9v*>SnzQD{dU4A?X6f+v!nbQ{|Lf}8 zcxEr^{Q()fGugH@N-<9th(Kld-|rHwhmhX%83@zU5|uW7QG+xZi;pA%_LZlpOiu8-JR=t-8ijdUagN&m-|`y zEX@77>-x0UP^4>kW}Q26Z}EXOLn#X1yNTRp@&&>@Cs&cbKle@l0^MzC`6kJ_{dc9p z6Zdb3@;#`$S*ml1Wc|KScvmMwslvBTYs|s(VjX+uQ>hmJO*r%GG6LTfgxA^r*KWAui{dqYpO zqa;K!oXy@%zq{90hty`|D%$qv4DT1$9I&$aL`tm zHC1Wg_i5Gf;}uw?ymxTkBH4 zM;7|YFezzHfs?rxmt~uy0Zzf;T6Z;hYyr$&`X z#ivT6d(Kr(Ec=2aip*p<-MpHvhvy3ho_WfLm^+v1=ei&9Z|@aUs~x zmp4Zm+C5F$Z^19$P#~?@bjL@&VxC;;744JMG(Ybf)zz$e5R?yjcPvF*A{evm%5dU! z=>9oJ@8DbFinm_goGXzSX0mA0LB6|8n(=0!0)=25Ng(pp|R2cl%>QqNr_YE@>vrrLhzA|;!960G66u5ySY zvo8K)c--#dE+81vNu@e~?{fJ`bzhI_d3-3%?gmnE$@$5OT;U9Zk1ho=W;v}2N@_qX0nX5AM9T0WPmnlOgP z`O`PQ?{>|KbQQgtN?hE}H=5pfHcwP?uHO3RPFNR*tBb9X&p9%ehaq+><-V?=?_G`y z%UAqit>JRKBkO4+rkK0|qt;F+pCsUlJPO#4UGl$>t^!z$9`8KR>eU%ewFVr=cPe+hBzi=(@ zJR7-~PYkYJO=D~KW)xS~wewfjYA3`Sdl_p~bDu{lN$!fh?+P<O+(V<*gf-S z{UMt5$lAbD>6zGF%zv# z-FMcXxlnADWjN!mtciZE51!fy$yB5pdOY#G^Fl%Ff)&_Wo@G^pdZ9x20ogoL>0e?!!8;*`sr*h`R;sat|(_ckf)n zd$poFt*|pnw7%_FGRp0=XNo&Ltm5xj`tie`BT~ZuT_!oh1D+~+i+9tyKL3N@hj#Ri zIq#;@Zm%8DmrD#)g~!gNQX9pOZLmhQJswSB)(+I&PN?PcA8Ir+xZ;dhx54F*Q?DlB zzaC$GTZcl6-luvr@m5p&CFMRxs9#bW9*@wkzv`SknW!>Kbu2|=^6SJkt@dW-Xz6j> zlbuK|d#KvsbS&kQ2zD!MHyE$DZt`iK*Qk3 zAXceg1lVW+Tfs;is)KW3mC9vEF0f~eXAwY}kOPu!qC$D1>Ch^WIA@m^ga>n32*X4r zHnK_y91P?`b=4`$upCCveuwmqJdhwIM|u~)fGi+B`vYbf{{B9IO*EYsTd-?Xb1C5> z`Z}nG@Pa~F9|rT?-{mqMv1}lQnn@N}C~~>w2$HA{MlEr?UjAD!ZZ~}w91VLiS6|dG z(%Q@Iz!s;k;aBu|%74TW zB7gdjoKNP9JkN{Kh9w<{4<`ig!=zpWZX+(Q8<`gEq&^!~ZV9!8HJ9%%fFmOS*u|G& z!pAh|Cl|xKz@^6qzy;}rc$p>}@%MMVFiW}@zz_$rgJGa;TP(;L87#%hbO=vqA*sq7 z(N`E*i3Q?7WoVfz;s<09REC7zDRP#EFA+N!CspFG=%JVhHE^6deLd-Z7*|nKzIlm!z_DY8eSO#&5$G|%BJ@MXF?v@FuaVPt$blU zvSn0HLBEv{##6#Z$hf9@IxIXY@DuJOBp{9f5-R_cIrZ+t%KuLte1*a>NVDuEZ*iW^4a5E%Lr_fJ5v}VuVmdvlD zq?-ar?FU-jK8M{>l5kO7f!u%%>RH$98$nDX;Z5>w-#&p5cYrO;c2OQaObSVa37{4L zpw?}CIdgb<&IJxh$f4q|ufIMOk(a$nX7ef@J61%c5!WUutA~l(s#9z|A)J$TM*3Pl z*gW&}i+(4IQdaSYbtElf&3ArhS;dl|%>5-8AI<})1Pe!&)eJyG4t*IZ5-(D2ao%`N z^~WOgpb-XMVT=;1(1)R!gV_L{AQmQ`6$BoHDpKOZ0vZGzb3m=gFD90<_}mBv?E$KI zxsd6%qdQ;*+CFMT34|Hto>+QR{5=5URRvIt_!x$6M*uWK`->RhBccnkwh2@Uab_@g zAS1#Sk=WLOkw$rE1xSU{ha1fg9EYPPUNGpPf)c_mG6E`lbq5e z+cyFbqy$I$23Sj8de++xe_TU*gBzkuQHy>7pHOtB$`U2$kSb;pND#;|i(R3MqQzJj z1C9|v$`}}(STs_d$Q5^g5Fvf=aH7vC+Nk_50=K?d8{|Gg`Un)!KuuI=bO0xOJZ_LM zO?jw)Km`j0HTir%f!te$U3mTz2Ta45P3GjqjUy6^)sb(3a(VyI!Wl6IaJa zMug?KmpMKtK8!T7)c|xGb{yD41RO0#+~=NrStbCsz(BR(8WXZY2wBdm0|r9hgR(M# z+bFd0JijH&h&a2YX`MBf(r!`_K;y74q^co-X~-So>R-s|;CP_w8GqyMGqd-;0g=FY zVF9gMgt3<`RiuBaigTZLN2>$aMaimidI#T9w#UJG;`;KIT=I9{k{U|pA;233n2J@? zRZs$#%ZRe?<_^}SG9W+MfaC!eibZumZ3U&{8e0-}3_`pzCMh9E-e!Dwpe#d=1f&@A z{_Oj`5u=c%C_1|HiK9<-_fzJcol(@bBE`ej255(X2MYitU=d8f4I?+0{RNC4e3y7_ zwB|$vvj%MpybTwV3NZ&=x-w*ohe>vwmHJ0(;{;#@{MD)HOUz8-Jy>79Z|}hgFhXYF z%rf{}ez#hATP@*+UaOLj6CkQ&4(%@=HsN8@P}YV|<2D|E>B1R2g33cry8Z5BwqEA! z-z5A+A|e3y4PYH^Mz7AZsZNlO6<|abj#B%Ph5#M_j;~Qx2{}VeT>Sa;>+#j}p(Ow> z^1b$KCj^4oN->fnX~lU)u0jn9r@gTS@dkvO_ozuWlNcK)M}~=EiTePw!h)=bvGN#T zp(qg^c@Z!_l74>fA9!9K>V5{*2?Htss{oKhfDM8%+LTmd(81klCO71ExAB;S*z;K( zI{p_y@o88h7v@=k`A9|h>Ea#Sw&RBgeN?#pgqgU0l{^Mu0pZ*9@pa5tZ>ZcMoDO$f z0XVAXNt2~w{pg6G+ln9wHKC~$b0x+20+N9{;=n#|j6y-9*ggc{!RiP{^nq=|&_KzD z!GowlZ91_#U9vB_vZ^6h} zFN6lniWMwMOVuYB;ZS%09B~UMfMtPGJpn`nj#P4KP(A&Qb?YH393qH!j%d%jgG*_k zNfXm1-m`?7PqRN0ygtu6Kza%VbERIcEbT=cLFZcH695&DrSz9i!#}M?gd~yat&M@k z;nq|=%wQZqQ_@d)>aiW}kFS-0I;m~p!f5oAPHCVB+k4PifH#1Fbf5&-7<2T~iyMPY z=(*3|1#lk=(1-5APkAYG26?d;2^aVfYtuz+{?7D2{9q)EXvquU6TN$dlI_3c%>`p-1n>S_=(o>t8QP}INY@Rf7mdS z-gg;4I6ChZis+z#i%WQqkOddg7s!pIuNKfumJZWHLeoC=b7E9jcsiv2Qvf0?4hoiV zPX#O`!HED|7HsrM8xx6%Z_c?{(uWw=0!;~M;x2mE+Mpi^8Hk6?E9-Kv6A zKnpBL+-}-`ue!2EB0(^b6TpiCRVKE~>p>o&gOZAwgx=_OKhJOdhKa{53x(Q<3en~D z1!BesmVU(LeLCly zMhNfm0yDFiE2s5sd_&Lysd*ku?gz^m=z{3>dqCY!(=fbq`rqG-P|CE4!(iB?{pX`N z*uj?z5L#C%nH9`?O6p6R6idZ8Myo6HT{-;LKJ765{bVABE2W+&vg7zMRs5Y zDA^T9%zY>h=M(^drd49mYB6V14i10SJf(@XKNLw?!Kqw}I_qE_3d4_h1>~tj z@DLug3@8e`@_!yZ-D!V&{Q^V-S$~S3kEP=lq-D-}U0nwV5!TivxP6iJ%eo_zgDnk( zx)1Tblf6~ZLUN;<0*!i!%XRA$=)!JleMFp5>EQqu!@Q79QL&8ZIn#hI@Obr4LQ2+@{H4=tq!g}0;E3_8Kh*W;C z0WWgEv0)fbfMAZYp$2n-*i#{0im;6t`!~JSpkSrID>#tmJ-1a7k2>kI27a-jSBN@QqN%@`_K5^dWlIk0jHxE zRLH<`{g4Qo7y;9#9q|W~S*uc^kHig{apA%9b&o1XrB#8|dg(k8znTurV#x`W=Pe>< z)D{^@-=|UZqUL-x9!4(u3dlln3IhzHj09}|l98z>5|TR!0*}cJ6&a5rizf%HAngW$ zTTv?G!ECaOb;e{eYiW+BNWP&^7a83!bte>>Y7m&mgIW~BG?4<{L>rn;nL93VGrLn4 zgu_UC6GY1N7pxjYb@weXg3>rCsE;}F07irXeoNJxcEeJXgY45%-*@sK28sGqi{3#W znQJj&Oet{H61VB#moea)^DBKsD_<*8qzAFVPEph9l;wh==NjT1N5xP`WHxXTK$~aX* ziXA7IAhJfi#P7^deo-QF+Al#|)Dmn#aa02=FsKZ7nD&&p-@5S<;qnb|K!D!s1bwOA zz+_QquSV*MdT%#K+$s4@wfXE&q)l zjRK^>?s0^0CT5WJeo9$l00x3yKr&LP@89R2VO!H7iqiHHfBj5uVmU3bnTX3cWfugc z=F}8*q9S%vou~XvB3cSgvsA4<+`UKMFV0&)WvNr_Nnub9R3(`5r!{m1Co9|}$1BK4 zwkLm(#ZFBom8I+g#Gbfa*Kp|UiFAwQ((2uPeEusO^~5~`u( zgygF9wE8YE*EH(fFpLa@)j= zUCn2>$Q+ehfP0 zRAiLAAwTTCcfbi3*;X`!q}gC3ha%h{6yxvxKq{XgWSTk&cIYf>5$Ri_k^a?ZV#b3E zk1jH*0!Jzu;1Nr}e<%5G>_cRCj78+CNZ4} zj{+TiA`yZFBT)ka`|xNbhJxsKX7%55=+f4Ip5j*cRfa1hd!7LuLluk!2q7(1<66o6 zXfZ}YnM?;KAe{y$-y?M=sFxvsDGSzSqNzr1%18K}s)|mqA*WS?WLZ+{iJX%?C5Cbu z#uA01SM?>ZA|W;uXT*f*>w%oe3~T5Y(QzscXBbnu!S%j*Di1@LS@3lx%tvMqUW}l0 zWn7|B)^dHEKDpjOoC<9SD&BWE+8As@`9K3V8VdNo`U|Y+n5oLDZB<0?*QAYONM`wf z$(+fgeehJ$&KMC%`D~!is3I!(_?F>+`avYpl*xHCsC)Tc2}2*~KEf>sfv$F?SyXjOyhwVc)(Dv-W{ken^Ct9IZog3f z2?3o30+ogNM&IMbL{pv@Y!jjU2g{ZB2u^Qx+80H(6zKKUS{@hz>LDqg#ShRD83P>% z{`uzaVHH9sZL9|0y#i%LT1%cSL#=F92B8w>fJJ3J>o=N^rd#uxQEfZGSkmQmMpSd- z55wRVWb^R&6J+V+DOTj|GZKhr6JMvFsvtMWbe{GK)69LG$tF^ z*6d5ze#;AUGf#7*KvW4xQ$+a=;KYDfri-P zRzQB-A<94_>?NVVcsIa4I#t2hDAKQt-3oH39*V^ zy$|5IzK3CeIC5ipfEn^Zg0d3I*SvmRN_q02Kt`YNpciIB_>u~J0B1;_RL^TjtSp!| z#8e{>6&_U+x(d%I4q7bwY}j)i!YB&`hWP5Ft%Z&n8kdC3%LkO-vz6m3-`QAm2A=#G zE7H||C8Sa)PuczdVxy1j|7#A$({~J{!vD$zWB>)o1WJIQOeP$-U5bHO_}cpUI5^Xm zZzjU?x6&4cIDoo<`NFt{*1-C`Hy%2#gcuaPGuR(J{@4>-A@>#$hzdYr@$_x~oPef@ z|9mCDwuWqcHj!+XZmNH=%2udIc{6kr-ihxU!?&Wz4VDLXei0ter#IMDBIu3+sjJVH zO1nI0hbF=shMX2n6(*KB%exOiH+Y93Z`k*-nzuM4OKP7K?m<3a8-6PJ&2cQA&A@RX z9U1{xcWmXF^TO4zMY^|?9$9_2Wa_9s>FV@{q{02<(J3%zbXVnlne?sC7}V~E&qca{ zlKH?8cv7v}h7e3`kR80IG9d$einKE0e|(J3Y$Toj&=5Ep{lBP6hi}KqZ`zLXSQ3?qG9 z;Jc47JMe=yJ; z@4fuLVqot7Xw7{fqc|ZB5FKnjf5xG4?U6nuD+E)-fvJuI@Dn~hF&F{eyrjDfWW&at&?AZ(nKGand+62!Z z`wyrd-_% zD+MIzo}ozh%@vltk+T~&>QJmw;+ari|0f%C@BE)wLitmc$Xx|2&B%K-@iHj45ylAr zt651rOF}VX{U%eU&cOAy) zZ_SV2^d)WuP$OG{{*gm@-mLJ3U3xoRwS1lt3RUMn%)PNHT6*&?U6eOtW?#nvg?8SI zxko*){3bO2oBs+9zp2vjVr3-$U$qGZF8=#}l=+=+)9}BhsuDm-943$aQv3%v2m_wF zwTS_~hkHKef1?V-se)*P9%sK<)AHHO5#!BRZf_SPWd0HZqEO6oq56i zucu?B|L=I}+uJa{fnhOn`$r**A#Wu9ydu{BIoq28M}`m~0t{Xe27G&x{L;6z>OZ99 zf8O=nv!TB9BJLsf+uP;2x_bBecK`l*n#1mp^HfqZd62>G5WDC8TzE73 zq{XNev~c)<*j@Ru^^*Ri6%}j?xnfsgjktYSRAstCRpDazDki*u6>egrU3GV_dZgtg z=5NUYy4#sLWrj=fp*^{L+*19PQJwspm)2i%FW6ZIyICjP1I=I`Av$ppN`}WdQ>N%=+wz(k^{a+rQ%WYh zr?R8dSd`GR*8ZC0qSKXSXIi60k^zX(x?aUYv8hRo(J?dLxlObBxI_w)KRn(F$h^VC ze-IM|{)BK{9eJyZ%@9v~kY!KG$6fsetAB8nN$c?u^^To}qLXa`55=Sz8$Ben^QYQ# zC<{%vA29-N2md`K(SS*pF3r(3yZ5tmMEJeSJ=N+?uP+NbzF*;cbU65~#Bxo#;)0xj zG`)(icJyqjUbt>}a_y)l_EKqR3JxqApB4NOKZYBP!0P`+e|(~;(Th+}8ZT1!61%^f zT|pE`e-?3KzAaP#i*D8pIzdA5)2HNfi@winxP8xrLb}P0{tWMuqoOW81?D5h0 zr$b5pcf~ZnU0J_6^@K8RIvaaLDG%h7E z;>+7s%8VAZ^L^M^;PXAr_`OI82dI9ZsC;-d^~aPE$!_g;m*UkyQQD1A)o;cmgLkpg zHEn?`OqWrQb-821#X^;W9MNvBRX;WwJFmZZ@ajT3Eu{Ut0!U*DA`k~tbn!(w3?tx?T< z$-K%UnZlXGuT9P&0Tk2C%4d(2PX6WN&N^!vwAW^f8uTVrM(P-5Iq%33emMLH zSlqii5uM7lFTj;UovTk*el+zZ;7+K)pQzo>2^-A%0AD$BjlwXto&4Bun;cgUq!+R* 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 z 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

(aJ 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 Je!=qFSVCoCU;9lKe6Am}*!=Lu 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 z zw<_rX?8wPkpx^@vB!KlKNLB?w-o+3Y{S&Pd2R!tPB>;UeOCNxaU~XNNU1M3S{I2S~sAL00XG_0|O3KphMHZSA1+xFqRI= zE=2>GQ3@#GS`gIh9KJV6i08%-C3SLhn!r%IFgX2?>ngJw~Jr9K*Uj(oTz(^9L z1}&cjz1;_qtxxuI9vC`aGI~SmUlrt+B?p20AkYZ};sC5W1KhZtkQ+e1bK|1+OR69T4D?Jm3wq`Q ziID)-lOUNV1bG*OVS-OoPcCUnL-$$EK}h19C-iOzEwHq^y;K5!82zNFc7Ji>$Yr3- zwuCl27-o1DxX(fqc^f*MxCe=92GV&6?uf^#CtJ&;6_j*qFdz-O5kmzU<`n;4;WjJQwJD9$YID0df|f1 z#vPy=2aUngw`d|0q85oMZqUodKdCAYuSpAOrSu|2%--0OSQzaDg55x(XsM zfI7TjfV8s!vIEElpalt%l%(nu0I~pRNK&!^B@=*JBuG+n0!Rm-1b`DHB?o|<0J@PN zNeRZcL_tjPT$Oi=Q{m zZZr2Jna@`1{$of+4xy9t5P|_@LM5Woq9%Z&BuE7yIe;n z#G@!6vjM#OV1E{Xi3Ep}K;p*$N;-h-Ucj?K4zhED>|_8^0muzT@M8t=5`gjms`^7Y zV3be};zN*w5llns0tOl&iUKGCAP!W6Q2{6oAPs;*0M?%akaUjt0K||WDd!`ghu=S@&YXiX#Gf8B>`js&?wNC-SCtTjDrE= z)PvUnkr~V=1>gpNerEu@1RyVfC=w(o!O12<_m=!lCIKX#A%~QVw7wmDu2f`Qq&eA|XrG6DG7-)Z?u0b)p|1~^5xo{amflN@~Ile~d zP%{7u&!>dE+T@fos;{ZQiUwL0(nDd!G9Vo#2nh!v$smJx5EK#?2pJm+Nd1=*s5ya} z3aC|p+5o7lL4iGgNVrN8Qc+S--I(JB?LXJlB6Uj2`UzyUI}5P+|8W5b$AZ?z=%MWP zq{OKJngYWJOf)cRz_z91$M>#9Dr{CBvp+BwWL8)o9Do^q%KrRkPbjv082nM90@W2cox7=0EGao zp#_i{z&rpkBuL6h31BjSND?IFqzAAXzzq^4?&m?s4KFD2wMSFBtVGWIVfZdWT+t3xB}w%fLa`=*MM58 z0aCjKLhALiKurhKR6r;Mgt9<*3WQWZ$N+={a>%{;0(hPQk3;|jCupHScN!2=03enG z=>enyFcm;kU>Jdk21X4SHy~6Af=oGR+yaa4Sv_XQToZ!?>e*#Kw0DVcDcNsLx2%1#| zn*bw+CO9F@N&}z}fc4-cov;HX2Y^TtBq_N7qymr|KtGZaocB!@0F6kHq~rvULHM%Y zPgvv2lM5GK%tT(h91QEZ0ilfR!o|I2U}0{2i}0M8H5e8}{$eSQ3tGH6^I}HzNB z<89#MYj}AQtQiO$7M#7g#j8sPc}pq7exZKQgB3HhvgCxqdOSfoIuODE)e9B}8Eh$` z5Oxa4j8FqL9Z*XFH9b(L0(CVg;2H#}*T{g71_&8|5C()~Ko|ss#50h)>JsExya+tX z07`(s@v~5jGarDq0Afjy3_xB0S%EnR%q?K90Am1zeZbg)3Oc|DLXJ1wpfne#atG+f zfn?tws=`SH>azfkEKnbVF}Xlfo)-bU4&Wye1cP{90gzPH6y%5mP04_!c1c~R0jNrX zR?N`Kof8V%@`S3)(18$+ zMkquAWI%!%TojO*payC>pq2t^dZ11P>S|EHEeKL?kO3hL5HbKE3<$}9FbD{VXCQao zCCGDd5qOjVlmLN~XQ3ExJ^*b2#F8KxfV=>*0&@`8Km>po5+vp10Z

Bngsof`PWY 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¥ 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%0A^hI8-bHzWxLpCq|H%EG5m> zJ8)g-7JY?(zfM#n7>PwjkmlUsag2aoO4bN5@*n68mY+ciEB$M{eG@RZ0<}N|9iDc4 zI!(%q90mws9poPBMm9Izm+0=>C~{(FJP`IseVz!KM>}BPk(3nyd6pOOhwH?QmFFt* zQ#q)~N)xO69_B0h0=^?aUvg<6RKjzT1oh-}77QCoyehpF?%y5nWyh{}Ub z!DXPL8)Z6KCfqllz}rcLlt1>3bqNQr9JZD@rQ*?ld>&iWlUu{TLy1odQ~YduCf8MH z>(BuF|H&TQ$By;J0|}wLpZEzz#Awx{_&lN%L=L&XT+mTD=--zfx9F6}6m-+JwT=(y zMXotTpmY#@=w95RGAK36y|#?9bs5ho&B732s`ZV+`_rtlAY?vQW?)zrnETrG%r#=? zMOvrj_9^FB+{^nG-p@j!-%j5fKWd7dNq)Q;ML$nSL`t3K#5o`3d~F3bcGm6+A64FM z&`xyNmDWj>*5$|NZ=6gDtuWl)8B*uqX9P*=mVp@~7g@xJa3HFSXsD5;jXJ6#jOHYO zU6t}-!5Bf}_!;ZJFg(F&z{<1$uMtA!!b>o5h{@-f;cqnNCz!@aE)>GsI61C~^%aAc zHSA-2rNd!mR-El;l=ls64COX~IeAr8a%@EOc2?PA@S@E#*Hv|4d>jec26n>Qfba!3 zm*(lREmc5NR4;4a`{byXU@=-TF_pBes;h%lFw#M~4brlG%ky*Q+ZCvEAh7izl=>$A^o1yuiUP@vZsPAq3Y}VaVOTlr4awv?5tlNIyEL^ zjsm=jttuIe+HwD7NWGdII`1i-A+z{w8$u~0&sjo6!&k7~ByV_MuS3=0y&I!;ZKi?W#0e}0T z)IFZd6Rg%OI+-08E7ZYL?Jng#&N(YoLDAav7%Z<(e*mlq?i-B=w2JI))wL`sir0%; zhS_!sO^EPj5_`g5+A8|!>V+2;zlw1W}0>Ad$>EY(?AaVy{~tAS;~4i>t%Yd*}LD{C)b3{)+< zwGjX?#L{&)kh<#?u9L4&60f6{f^w{e7=p z{U4N|dH2KyFXJsnA~1wev~&Q1A+D>Wjlo#zuhlO%kEXqk$xG0N=!KBMTkTLMf58S< zf-W?E$7Q$W(@!%&SLDT|s#OvBZCtQ;$h7LdP`zLEs)i8gGdGfZ$9%O_u50U3WPw!k z{mhIR<*_~81d}vpowr(|oC1Q{jM4(LrrKIS-GJ3aS-PplnZol)lsV9kT-U|#iS$ZY z2L9QSmFqOUoE-WWF7;15ZUs4n!@FrutLm`|U=ul{h9_-?lr1yi`2?pEA%9Zf+E`^!o?x?nkNJgYy zS$4(OwDFysITs?61qN)}Tzr1dFB{1(leNMjyCr(x;21-R`8~y((h~E!Pxq<@(&Nt+ zm7jDS=@}IG#{T6fGQxOaU#_|T2IHWyMTxD13D&6gudL)<)fkbbLxcY;8$J7TV@yF# z>bMgrUR6unJGQ}Ewx(z5oC)+@Qs- z-<}m`9WM33)71MaBUyU?+psz%!F}9I`Xuy60|Y5vf)S(;4%aY|z0%;XwM=iS7XKSU0hE0Z~8P{q92vbDuM&r}LGOUgnL2A3E&lUV*hJr(v zfK?zHBwvcFk3vY4xtQ)_8xN`43q>+m*5pX;f>p1VZZHXe&R-%JYNXdPjajmUhPT@_ zB671u(VpjeW+ANyQq3Mv4f7CkHo0KQFwwqvtJ^O3?28WdDWzX{^IA7g*HH=PQ{&_> z4^|}$=d2H6s5eJu&8RnJwbz+47ez|XQR`^rx$Ql}(2Y#f>Z2*rFf7>6(- z0Ta#SnE4Yea6V+Z)xMFOfuLjQs*9{S;8;4LuPOsXKYM9J)f~62{D>veB=EF&@UxPq z%xNVyTLc*LCckr-D?1)fxS+13)p7WdqzG?H*?#1C+d2ay4+!0p2-p$y#zL(R@AVjs zCx<-yY1rM1D-WuAx$U;Dzd5|>uvOB1k7e7g73~h>1LlZR6F#$o!>gLe+!<2&H|iOC z=GpOEaziJnEEkb{ovfvuO~50osk%p+n{Qwa96>D@l5E4RCN1^mOM z^lUYet8~AZ4|6^{h`k0J#1Bo`;0(IcBt zS2RATu!ZFCL1$At4nfyjwUkFE(A1k$AaRvNiG98Xu-3%p@lwRYR$%1OScM{LMEIdv zRwR%(Zd#9VUZq={^WKUH3PvdCIR$Ziyp`foEN4K*b1F?WvJu^89mX7>9^V(~vbu^2 z8NVS@Al*v+evGL$eKw4F0mvE>(TEPhi+LUGLiOD%?W$Mv9y*3buz>j7P~`aaAgE-H zg`$6N2qi9m$QeeTTrGLO>TqqILRDiezQA}9v)$GZDlI1@(p6_yQb$X+@@3aA=LKR>R2)P@$&!1ztShiG0`cTFba zs}^4#8hzY+0udA#vmYij48)h+HW3C-?~euyS@i`hg2pK|G@0^#Nt0MKvl&dqZVs%R zJM@J%ADtxFG-{u#dZF~J%PBnfQhlt6gs>eH@1#}@a=>tu4r>*8=wfL#BG0>Oxhd<4 z=on%Ey$Q^*-jC1zF5E?XSua$ewD%~&gzDZ4YHvFwh+TF9?DQ)47A$TCSU|X z%{8DhSQ={nK5m?z1;*$p0TlPCfG38$kRq3KX?=Qw@~%GMG2W-1hYws?eI3`V&bbGo z0}DLFhL@lmDFmV&s||Eey|Lf0PLwVYA;2bJ8DFC+2+YX28BIwxS&8BoPL;Mpto`{q zsGh3F%=0RF2#ZD}u)~*twMs25G+;ajku$(AV9=T^!gy^x-w4DCkI$fO*V0va&XtJ| z&6r704mR;c_QYVD(#J3FOLAec(B06R1QO7wjhDVLQPr-B%zg$L#4#VJ>FHLw1qt?f z4nee)zLBi^3m9Rl$0G;A)pKs?4r3LREY+EOOu(uE|iD(@6WOJ&-_%)ta3;Dr@42&26YpIlOoeAS# zU7-M21dhetCTezmm&kRo3n3_3-tkb-yS_j-0V%tcpmDHn*y=0z8mg9wQi(KzWTA?W zOs{|)PDURH0_-REp;>XW;Zpmgo?-;}NkHA4*VaV0K;6XmD#`S(B0kO?Q$4q;BmjYd zRt;vrzr-E{^}fx9d4G^FLEnDXax*}qs{r>s<^9_Z?Um21Z}FklUeQ%nz>>jvopwYE zwNkKzVc=LShHO`D0sKLMB*3IvEc93ndaU;qxMFndry)|)>hx!9`Fwg)rByw|4s`WmQRLYNU5#Z)-TzD+qjW!*5j{LZSeFODH=a5HHbCkq zFIeiCHW&#;z=i_N_XV2ug9tE(fqd+Il|>0K>yrQIUrCXcTB}P*LkW;l&I@KJQP57( zfEL;L#Nugm%p8;gtt;b-ASN{hP|Px$>rIkjKCh){Ko6Ep!)1(n8PP%tT-;+N#M2* zu&x#bX3D#bWLy437Jb83B3=S}|01VRy$Cg^I)Bn1s??=`;HUx`E}RS`9enM{q3j8{ zU`5+)U`i<-GrvX#%iIKTp0`7=1+c{P9wC1|p2CD?HUtWay1 z+=ijV2KEFXRq3d%EU=0J-h3mm{2B`0Q~V=w{NLsMoH#=&sxqDnU?fc6G+I{3Xw-Qw zmmM0RdYKLyL1T{r3i6B`3X%^M=8)!>1_kMt0Igo-DuW#I%*>mD^D>~<kj&z9> zbd6*b_H~T_4h?~!z`$m=RkNY-IZ=cipv*V}-4xoM?-C81r+LRU19PDYSj~W@Lx!!x z^NKE2A97DUU~C3dP^M%-^~=jc%QuBvAFDztKqVMIEAl#@n{8q7y{ho_faDmDHeceJ zHLZnhzQfK8_7!zefn`_knE6WvG}W479?^Z{)@&6VP+tu&FwC`PY%{Wf9)X&Cgqg?y zCSzs_PWLNRrFsz)SBHn( zlq&2hx0t4$LqsQ@KNo$94&5#4n$g*2t^Gs|El*f$VQ703h3D@_^pJ(Sn!Y zOSsfgDby~*g$Rmq+f3z9w#G}m5woL#YKRLds*Vnt<|EXk^gA)s#M*BwW8P>I+G5NA zC^<%eQ3!;-@`sj%AzX0|e8mQwPh4=pz);abBRqr2gjVVf^;*r1T{D*T6VABS9L6V# zBjj%k&{x*thIw=+Kuet2Vsj}Czhhfxd2UQziXtz^Ya)PQ$i5p^ht`M-tAHK~=8gr5 zpBff?Bo+XmrpyWRlz>*-9s|RO2D4%GNsd7%VS_KH(;Bw~j7W@XzJtD`ybAuX6hx~- z3QMuwBMo)q#)ncg0ZlLu+@nJ47qlFL<*vtrs{X=qqd*mOkgoFZ=KI%dwK z{f7RyV*=H?Q34Gk@jbv|$qZaGMP_UPYX;O`A6Q#CfGH#D{WsW}fiGWxXh(D~X$6z`fK1+P2i6h* z(pzMhWQ5ALj{ugm6`4GO`!Q1msQkwOjamnbT?YeS#|X3-r~sG7046U5XsCHy%|c)d zLeFiX3F>5_uGo0c20>T@G-4y4!!yQ9Xf@ohB|1 zg+~ReDG3_GO9|FP*05Y@FzLCq%Kz=@cKwOu>8j&9=lW&+2lJDTU44_5uIl3E;>Pk5 z%qK;Ad;8xxM{f5|-@bkO@U-6QSLOHWx$fhU>xN8josyDyqhX4vs|?`h9#iZ6Yy*2FHOa}1 zCGVy?{ah<&%xkf8X7t#7jZNd%j4Lt^tV3QHw8Q6r|Bq|VDN40?XZ}pkUB6I|L)T}Q z0?}+1^Iv&<*+Qwmd50!>dKIC++AhReVBNfSHzBHjfUB!a(!_1l`PO;9Kd@5kJMN-H zZCh8s+g6{5^!h&+nQUgf>whzr>P?|4np_+Wh5Jsj>cRQCR1j zzO!|&o!PJBTk_NH=|FRDhZen`f_)i^|n|FfJzn0U>>n^7Lu-hP zH$6T+$b;Xi1ylv=dD)(*>#+0^N*~|rr}v9xai>>jnBJ_FewFS?smH>-^cSp***9^F zu-Gb6I7oz8lUjEkVG}vo^$?$xs!mg!vMFTOoLXi_L*n~8^{Gz|Ze*t>NDjQ+8`=)X zW)q#%5V3S7%rvjQN*Ce@MnlQpW)rS@hK0QtUFGe5 zIQoa`EU7GMpL5PO5?7Z!HBQr+*Mg}KKE}!H*NS#k@tFEVr0Gfp5u0~}%T52L*exkb z%LGOG2aW}daPfdCf`?Mco2Mu*3(^{Lb+!w^XlJwFq3U_y2i)F0<}B(9lIm5UhvLjv z4O@1B&HvP9#D6(PCi`So>W2CToBul@rM2~8C^^SF)!fCd9@%b7Hn4`jbdqc%4@2|v zN`zxv@ICXN*$-Tlvl0F4nDp}y-mJ{w0}prlUJ7l|_$Xx8o1TLW%~msvoT65;U8Rd@ z)phAwBXoaod^F#N+6<`QifFR3{~-3hhan-{5AkdG+$D|iY!7H~5-j*vw^0DXhC?!r z0w!TXQucRBq|MU1Z$o5KlzHV#ynEhq5a!n`5!kd@B zVm%n1{l)kVnRC960C?rq_wnTfLPI@{x_n#j_g=V!2qa%ASaoCm?oQt;R~jvJ=5?d} z+0N0YIlU!+nV{QR=3eU;Wafx;W>v8_{}*9DqEw8D{Y6CCaD^83_+gM@T!L9p1;a-5 zZfj{qrqAvjW-0lC^If!RYnT?QPEr@jBSbFr3kyx1-|(g+>x4xmtzd=UR@;SO5xZBR zoe=@!;(zCvP8W(jW-I}Pm|=^gy`1jT(<`(3)O8crpWU1JS<#yuiJU=aKxcb6Vh;3fAL{`qs zb<}xu1JlmcvwZ=HAk|CBiCBao)h$_swp2AO-@x7CMNVmrMdu_q0BN3lKClvBFQZnm9s#XFsFugg)KQ=))jbX?U7cP1OjTxlc@Nab7 z1t|-ChB3uZd)d+_Ze-d`Ad1Zr6%$+GCx(?r-_|uNkG}HJZCCzSKXw9MQWL(Od=t)U zQL<8sZEJ32g1lXKu^gwv^G#>)FGa;@lP>j?ewSpu8TXu`lr<2ydFaRR97^2Nq&6(eyi36&nnx#%-a|Ezc5s9I{pZu-k9X~TmN z^?%*_v_l5IIGc5gnfyIFW%OLMW!7v?neVLgqc?M%>nU?Y5Ehj@-8HwEk61{DhgXvR z#Em`hlxjOFBx4g!A=SLflYEeKvH#DOqGazPBU<&-M%OoTV_xy|@M(Iv#W%7oZ@hJi z{NC2Cc|`oiM&BZ~xe!R=Op?`H%3;13;Bntq6hDtBMs6lapnNIc`=r79>)rQwyCZ;7 zA%dQh0{sfy#qcd_eFIMG-^QrzZPeIkihHP-M1~W{UhEf;?y#xCt|xxQro*j9esnGT ziL%8&LJwjFnlFVQgZ`C^$jZHk1CKE`IHPLH2ZyKjx1ugH0ebh~dOw)Mx#*WIh1To`+ zfqxFt`%PVUP>&Pf9cnhKIeQa^y=C}Yxj5cD58HwLI-3fIR7T{16`RMR;XFk&-Wlf8B6K-8vmzF01J) z&9d~dRx@MY;$0Izls0A7;}SX{JoLLank=AV*snF^oSbTCb4nmNXKAzMnc@&B@;VMN zzyBclmwO6cZ`dd4)sO>4qH9Wz1<#Xq=u~;Q?H_8?2D0lp|E?xAl)Gg`PxC4E4>naK z2lE(q2_KcV?y-tp$`UqL7Q5~}igmdDMbXf4>XDr&Mmz+U@;G#s9AT4GXH3gDCdN{@ z$LKoasXpA?@@P)DQK=<*VM;1~itX$9cwlrnU1s?7mUD}7_AbjpY|+-9Eu?Nm%dldx zI*2i}3s`X=Tc${LEe-p2H*(_RV_oYO1+s{vpINpvP6<8H*$JnDY zlFb%))Hix>6NIg%2i+tw?B>ZZ8${lcbLgr@3`V?M|5~YL=`hMZcW9{TyTzDRsyVnw zZ;y8wvnT8wutdh?HZx~d_zQGQS*44rMzr4-?mE&tl913FyIlq0X~W3q3I3vz!6huI z=H8*%(LY;jCqYTMKvJLY>dqzMwxau1XcJwHjB7LYkcn;`C+O12e9ZaXUU%1F=PicZ z&98n)&(S<)Q0i9Hh;e&oY>yJ2yrsykzTZE$dJ_8-&RGmZhTB7_L5McnE~MevvJc zof}KO=9zNSGS@A$^7!RaKM+1&I4t)*nw)E~6#IN`<`d{LX-~gy3U~2t&f1{E%lk+E z;KiRQ9dmjQqoD{2*7Q=<&f4zacD*W+2yDZ#UlT26V&s$#Y`0Q_OUL11PX8I=?@OCYapPC{e%+K^Feh5=Z)<1=cP8%suCH@gRjWgG&5EDgSYG3$ zU#sedOg05vz!9ffkME1kC3mm#K}6aU^{Tm_d61&WWiF?2w%*)iv@Q=ljT{0!-F zRjZb%>Bc+a@tN6UgwDqQjp1wu@7@<8> z*E4l$nKKEY#L?f`tk7LLhdOcT$#4V{W6`_&&wDM)qg=(V;{nIXeW3-r7E_q&M6g(r{7Kx0)cl|M^cz5G$@SX5ZPer~f!lsdLi6$3q zjdlB$?vKx;zxNVr|H{#Ok?Qf(a+eN>!&M@nUov7el|6>zD!l&juq+2Y#<-1f-lJZ6 zH$#leETW5>{GPXBa6BiRE_OJ&4hdEMvagRT=H;T(rnkv8-K;dJd+OzWS_Xv8lCoRF z8F;ygmMUwtILP>yUL{I3Jn=|@crmJgZ>L?+!LjmnPi#y~kfNi0=`uEDYjeGOf#wPk zC1TLHvGJa%KqzVw;?_9b%eB9PJ`-<}eMZZpm6zI#x&(h`N0D>U@Qxz>uLeSZ`tTWp5> z7&1QHuzc7S%t2m0zjeFJk3_iDeBamC=)^W)FY~hkxY0lNVf1Q`Zl?OkC6?lj^o^6Ee-7$wsZGA7GYcO zbm{-MGV~==bEdRzxy!B(paG_BAzvD}RQE!$L?z_9cW)W7`%e{$s!#md3ItcC)A8!;X zT4icZd`7Z^_JsV#{++(RCZUMRxljKoWzM=qH2dw|pF-$ zw;he==}0<8S*)CjxSGRzxn<=A%qee{#q=B5zf`Ko%iM1=!{dqCJq3gb>bwvh1bO$B8nW`F3h7#j%qRyTtqg%Nm)AzeBH&<6IY4J zOWTBQaM6lXReqY>BzLA7q@hF?7*YDYP?X_3-TYiSjoaq>h6N{i#38L!w@T5CgMhk- zEVZ#^@0L`d;qq&!Jz-Z)!s2JC8r5lKr$YL|sEh@5aB)D!LWEGU-uy4~S~Bm-k_+{B zNjgUSk?*K=)b-HlH|ETo<`TuU?;6f6?zS94KEFj_bj|#f(YiWHSJ?ftZ6Zc}Awo+u zp59`Pg{Y8mh2rJB}3gt}`Ny^5=0`6zQ}=+J8xM-7#tYda%@rsw?i7*1nxXYc9E< z{94hNWfp&dvflBlP~?Miaol@!;U>i+B!1#5hJR7x71Pwbrl0`eCg8B(!%SUURa zs&|n{KN-2`rLZD}PjSlpPom|}x4p#nW@SIQCkSm*(D ztjv=Q^|=U=yP7U7VkZ1Uzq5JNCR1{AV_u08rq#9;QZ5<=Qwo?gO%@8sC3ov!p6z*9Fkw@~ zZeS38ooNTab~rm!*eW!Pn>hJo6X->mQzIWB(HNMuYImJ0{TCu-UoK#uIzS;xmNaVV(E!HeMME^i7O(|!}wpC z?<&2FVg5X-IoiaVfuu&yt!-NNbl=q#oYL?qf|GXKH;m-&BmKT4+Kxz!q}&BDd0Ja1 zO^fJ!N^v9H^ODrP)0c z|Fe0UCIPUe$I+rWxwg;ksy+E0a}4~BQqYY!FvfDNwoYi4zGbDPh=!-X+(NJW7LLwO zshUN>zlDAlLGtp?jHYM)>>w>0zDE0Sp$=$D z?Zu|giQQ&1fkr!b&2*&Fg?NmylfdR!fnvS9^P8E%%QZyZE%b7mOq+qMSmv&JZmZhq zp-8zMJdHe1PFW;PzKHns)KIC1I^A;15W(PwY~QHbtD%pbS3F-X;}(G}&G7RO0fi;z zt1boe9x0dpxGNNQe*u{F*T#SZ|sVJV{f2 z{c`66_5_3QR<1@4#fP^L-yL2@>lW!WE*zu48C{%K+|h86{hx4n%oo=6gf_SM8dW0c z7^gvT%#Qr(Vj!Wx5>yx9fHe3buB@JV)=*;KFXsKFUcB!N`j@}i=bw8--vlxRIT%~M zr%CtsGS)m8BZG@U-v@tsF;-a8?E-wRx9>52vf5mV59fFu?B8#Ig{KKa57KL#hg?s7TFX}IBJEP`V6Iw;I#fpZrXRJvgSTliQiq2xo zO)S}8?22)03|ks{l%0zcj_jhJq(}b?V-+rLeThSMl5UI`Vm0199j?N@w8FT>n(Umb zAzJr8M^_ydMfbK+rq`MmghHmMGMLL&mK7QZ1 zt`jq7uK8om%$(@jd+uxb&AkZ_QBsvE- za*GO+3&Ec>Rl~F(3!#4mG6id_RK=az%Z_U=MBnB+#RPaP1CyD~N9lHBV*ky2phwt2 zP)m;ZFT(OOJXuLm$q2KE8)diEurh^h6jhC~_!^ojMt381Z_1QH zH7?y=Ra{ef_>E#|28=e%9@4M)5*@; zAmPXUEU;U-gLr|Qxa)My;O&BllC|^Q=EDrh*_=yzg~#^c*x}t^zYrZHNkIh!8DC&V z;`}q;j2bs@_u=wxl4B$qlNM?WaBolhpP%-KEmB9n3E^#f7QfHAMuE(F)0}E!lj)MSV}0 z#qm?oQxe(4LhYI>atmzl*~6T7o`&BG|2G4BfgmS#>>f*&%3rs6TZbpL@hfpF6KXfN z#8-|Z$tO3CUu6dH{o?!FJJRV4={1=t$b`Nip5J;P9&41ko+18giU=GN4o>{jIfE;4 zk^)xk7^!^TRE=rN5FBaKik3d7F1{fbfmp+$%Y-g?o_K%q+Qg-k9P4={W})I@Dp}a) zonbC9x*s{UAwIvbNacb!tKTQ^q5fu6D17WAwl_+dz^2tG^B9mzLznJVBG<$`^Ad3u z+!?rH*_kut9r5Lf@)QKh@*2*m4Ob`3x>7mG&{C&!U-30$k0tT9?y5f?W?QG=b5oq_ z;v+-n6tCe}=;E6dn_3ZDqRaFylCx`zVaaTgcyXRmeMrvw-gl&Qjxs03_m^46z-!N~ zj0IM{W9NDCkya@xZ9W3D+|OIc9p6m6^x+hicL9$2n8@K-YL$g+aYPF3+&uq~oneMG zQ!sj_fJC*%$RK40>Jk=EBbvJ1Us@(ZJiI{Y7dRuJPl!I^^r!S!+3H)g1_NJ)&CI&7 zoXcjG4&pJ|XdIyCsLr2vDBbyT9{FxRTW(5Sd|$c7E%icsT%abiD$u+0z{0xC@yY)c zix}AL6|(e);dg@EsM*rViSX2nDurYTIV$uq8k~_)N(@WSFU-UEN3zxsC+FLFvRq9o zmEm^LJMW1f=-Eg@Z_&lY%XwG3!1z(sAunpW_$@LkX6`;h>q zKS}cybKTaJF}hP9CNHgDa-%edGBc8RPf_X#Pp`~4Oiv^8oK+}uW?wQ&3%+rF7I#GC)O-xPw8`CHR zXQ}L7gVXV`+1C7QcE6mn2 zyC33Q&Xk&;vbnj+U6$;#yWL2~n!r!zn@zOV&^yzT7+IFw{+n-RLP=t!!Sp7|P4QJ_ zvfGc(&Ve2L^XWz*SF48~x?CWju_mE8>=AE9Dr`5JhL#^9dpE=0DkW0eA`$~BXV~TD zmBl0864!sk)LY6#e5iP5v7~r}tc+ksB!_>R_V@nyxY>>hfRozj{h zdtxiokvvy&5f(zQ6%f+cjDj}kGjK-KX~75iHcy=967S7d7qrd!gLFlXVAROc+-XJ7 zsoFb9KFx9E@^kR$K3?W@VzSVe-r^BnhRlY(`kB@i!(i5}W#TD|%z8lFDbl;o5dER` z8F6^f`eQ;y>UeoeDl-;;_2wmLIBWiV>b_|tBp|?RvVse1k3X=W{{DX7y?v}h^3Bv4 zCH`irz9xKob>{>7nj|?`9XZ21~h=>-ng#F3ecLhT*d z!Sno^&b)Xca{Lql=@)1II)WqT*7wt zjcYNlA^x34>rs+e#wlS=&m!&QF`o^EnckS-*lfV@M3?{^GW0yd#{A7g9HIS1vZMGt zy!C3k^*SHtnh$-CU5eKSF}x^*U8=1ox<+?lS91@YU3XJO`q!VI3)nlDHV<@N%l!DQ z-{|FN7qR(+Y1DJwkk|GvGA?+&?!=wZ&>^9XN1s0@?^jg5?K&Cf^iZ$DGCmXT7ZCSC z=}%L4?|0W^Ce!~yxc=r@OvKAh{*tKIjk-juGjtbot{*Nmt~E>SjjsrXO`r%nQ3Cpg z?u_?Ge7C`5MjR*h`axHDymp9S}#Ah?EKs+>v4R%vj7p1ZV}#Gd9)T#~jeK2@d}oRSm< zRnL^?hFmR3;|8{`GhjX_w z;Pg99=%;xfp0kEpCHg5{MvTUQB@vaPFw%mH%V%!Wl$O z83R;l@K#P4gQ*kH)LZ3WhtZLx!Ui}RSMm6MMJDZtbP_3QrPaD2@~{^Fs1{&ozRf6; zv)%2=zE>6N=G^>CvxLPyjfec(j~xH&P}<$$PA9&pZ-^yXBjnRub#5*1IjC>eYw#(OfZE#y1_Fo>0Q8_ZP-8=&L8yBpkA>=WErtzT% zhj|`i`YyL9imP9#c_+9$k*oQ$gBzKNi_S^ney)jo=LfClgR^9==Cz~zlS&*K;y-+3 z4P;ae-G{;3hog7FNt>JDb@1z8J*RzB7xp(zWUaIJZE?MR5QBG1Nt^0vI>7@~jyYU$ zLxSkJ7V|yo8`cIcLiGpDGo6*CQdGD@&b$q2Lr0ZgTMx=VTXVG(^wb%62L3RsKKL+I zXK<-@Myn~G@jRjmf2!lsvYum@X`36rIt(R+3KvgLMjQHks`w`S zT;QY+ZvNcr{$7M}3FJiNeK-h(+<#cBgU_Nk4{l;aA|t z5bVHmipWJZD;QK_H}e*mZpLd+^$2$jd{mfuh#u4 z*frr0#AvHUs4SLpcJ5 zFX8{*Mg9k5%swjz8@$$Q)1^P6`lwWMmj5D43_{SLn-N5|HQ7?@t|qQ zEjUAy4>u}*ix|~23>g;FL^~_}5#m*$X1lHzJ9%23PLm?Uv5ihMFsQNkj>9T4>YXED z#ggN?>!yy(P(^FLReRZ6#ig*HzG)|Zn}_&JPVK_T!MoZ?T^d|dKm8%U;T(N4nVFWK zGPdJ`WYI&-r$1lEL9BL=Wqz8i@4UDBF3neSeya~L9l6#%nh?`p9H-_W-N>4N2c zG?s8gQ|~QMOf~PHjuY=JnCr@^jwvj8n5h1ipM8HW=aqUGuU9x7*>Z%#tgSbWY7(K= z)Do*mQN6EhR8qd3Fcq{`Ri0GVJ%7=RWi2#p4wyjD0-@^=FJZ1D@t#J! zPtbD`+^#9%A_$);<_K{%tg8`u@vOyLU!g0|^`cbAw_DLT@1tx<*GZ+$)qIctba(z~ z3BDpqrLM#Z#n-yMMmcSI(~IJ4m3|||);$4eI|?%xp+g&vk+6&v@jY=My3zMLeVF*1 zL<5%aGwFGa>&gO>CUQlQ?1ko(uS{9H`1kNCA0-EGT?}u+k}Jim7LmPw{sW?mZ<5d!T zHr<7lxVn?D!khE&rh_ErJ4?JF#A^_kutJ^RYiogAUCzfzX)@llMZk8UZZR$5e4(Tp z+*WV#+-REsw_R@SJog0-$D7_|JB8Kt1wWr+O5-%{z-KcRnK84=ZGy=aCHO|(?G1>LU?@>T$Nbz6Xb_pB{ZYO?sYXTHi0mid za{L$V1q~PQ_U+q0Ob7F1A_}`ra+-`jM|cZ0Eawis_@X2jP-5uVy6s!HxE0Tf+RVMH z^yo~~i<lwi4O72M^9#_(C)+gHqzwKuCy!wy}Ijw0OT>WUAhk6WOflQaGp7dh~54 z@{g#&j9$61dTaUWXom;sL;mMQmkii)%t+>7v;QYTw%ulw`k@(#><*u~9JTkUimgXH zEu&?=qQ>zv65AijBgekMma)VJX8p4b-t9}${Ag@ksbVsblACS5xT&0&<&F`&y%l&( zJY%*LjkV7W=?cA=MYFW^TE#@eTK>Dy?s`Vio@1Wo z-hH@E(Y{{pg14G2)`+)0e;D59H0dmCpMMj+VeWVyUXW&)E7Up{sz$kDFPo1?i*~%4 zY^#_bvmyIsL3nmFDu(*wmxVcMh5Q(@7@7PSF-J4UQq=z1D)Vox$le)+FB>BX)+;cG zd)4wad^a`56KxSToMTL!3r6;CjEr<3>#}cz_5`MT;~0jv6l1y4(w1gU9aHTjn~N6x z+_f~_=a)#*=ONAFu)F-j1-Z0T=Q1I*hMBZ;uE5Ea*ZT9d+}IpxM=@Q4`AVFnj-vMF zR+GpVx`GnKVL#QmU+6YR3boPvr#XfYY;$<-iWsS^-u?01kI^8QCh*>X|xXE@gotbbYISDWb`1C z4M8=_(`yi`GyQRKOsr@cPy zQsck9?P9}c;*?@QhMlD$@4B3gzT=EumHl#tt%stN{ni&d8{1Ew8T80*@vUU@)eue^{7;sP{1Lqk zmDWTMBU_I8!zb(gyNzP@A5Yu-HJ( zFB7oU^EIc3Xr4M$DaIo{rwUW^()k_OOJ_pIJB7)_==_#E|I{Yh7DkDFwvO+5iDR@s z{`K3?jL%mKB!)-uh z&UYM$UGt9pH&-8q`+dXEzbA2tt0xqFB0Ju=W2L?M-@{L!liXgwJSWVEus*&-(Nzv-t!1j8y1(yema$tV#g|RSFv-z`u!iF3kRcB5ftDz z-X;EC-8v7+bHt3Iv(j=P{2i*fo*&vk`-#HvW#@m-l%q}g>2|)AEMeU~f~>)7xU;dL zxZjvzi`tMd+&#j80ZCTQ->f0kSoK@j0r4_9vymZP$~)QQGLIM|*dK*$HHMI1Wj1r9 zxUtTJZM_|6Fmwb1KhUr@Vw2bMG@gXmhtT#5`Nqk31qb)bI>tZ_!4#>vR0|^kY$;dFrQafex

#n0fIs!7xKuUVM~;hCC$4$Qse{NkeXeheMbyd;Va!6_bHOZ>qU zvY7ss+^_XUynF4e>@2dAEM$dugz#@azuC}0aBbo1L$!U9U;Jf#RW*uD>2j@kYDBc|A;!-zmyGcl$E0XTcW?J4! z;rcIAS7Ep*)Q`wtuMHFH_2=SsdX3gTFPrtp3(}h6&#zPq%3Y%U^zZK+*Y2AVRLLLv ziYqc<{nWE|Xl%RZt_RyY_w1Y{-Q@u*s2=}b;5Xp;;4>>&pS03amrzg;+TcFf4N3Xi z7cs)u_QAJgrfA@<>(_}_(UH9^6+>W*c* zazBh-Lv20ZPs#N)yqz2W(3FtFWF8xySkLTgYtX+GUhfwo;%=3er5({D?9SIoSR92* z-po*VEVths;ItF8)%~#dH(W5BHbA#C?PCKO@40M=Hcz)}%GHQ1nc5_8bM5V$x4BAD z&@bl>p6295sF1YV!T9Jkn_coSY@uk(6dtBh6LLN|Ftg>6)m<_9Sx8AjRq+UUWOQ-8 z4I{5$gCs-3M@k~!-pQ(1axxYXd<*TTRS(E;~JxtC(rqB;=nch`0{F}LI^s$nTVYhCr?cd7c z@lW`RE-6Md^-PVQySu*H&OHk9*WPeh&82`8s0^dkw4&&3n!D_i$)|7GQmE4yRISJ8 ze1;FGt2>9=M~;Ql9Cl@Se+1iSrA(ey-U||>k?=PSr}Rd=QY^B1zjd%SXvIYjTb#-Z z|H5Ubuz5QqE3-B8Av3|CAdV~O3yrPFx1ZjO{{ne6i5x79MfW8K{8%}Oa=r{Qe;`fg5EsFXUTWRaCfM8s$s9ygw_`E4l=Em5FC(=3;=eGdaxbopuUCt$p9gcQ@A z+H!>ue(*nzQOyCl)xwO6#M&hXCs(`k)L6Q?uJ0IIRO5#aRyzA^u5_?dOXB3J?;@Zc zp4Q2i2d%obHWBz))?^L&627`;^Wg_K>uCL^Q$8=NlT1uySz1KZ5SO3Zu+Vg4CqC8y?fP4sDY@ptdvb?o*<3RLi*zcE8}Vv9iT@ThKg>m7RVeqcA%EI^aOVGA&^emy%9cA+642zTkGDdYOY;>;iRkc`ij4 zE|s$)OKxm~{!!uh_D!zgpjK@2lp#q|;`ne=0w?8p6OT;T$lf z&QEKn|F(=hLxqH-O7og}!1Zo65z{;krFgzgQARaMEuy$^H=)os!+1`_TSty{>d7rE z{T9x0?_Ha6s6&=Ez!?J)%k=*(<0^&TDwaxK_)m>W`!VGc zSV@sz+*KC!P;$?VIL3F#lMZKMGoOV!dC{OF0;k|yy}FeWsC^U zT!Q+X6WRTd{?_rF{no-E-M8G#tOKprmDT_1*pw5J&I31Rz1Q_*ynA|W>N=b6;#)sG z40Yf3_l&f#cn?iogt8;$PIXaptXFOY_u^+27tcH+zPGf7*PEejQ``BAd(bmh6is7D zSyIU?i8HgyBa)K^!-bg354YBnL+NU%e#{_ldcTAVHTC|B7&VGZnX*@M9j=WhjY&~= zX(+xWAlG_b`^dwws9`d1FBCAGADZBxl1j_1;zfV* zxZ;O)?(^*XeqC<;Gb2f%VS>K;`$T)ko1Ev&<`irk;DaML#*MkEPr`+oUXdU%=l0^e zR7=m=DOp&VNT9bZw^#@7eY6LvP2*Q7#tx^Ci2LO-9kA57pwQEoe&^FMK}auuLDdb} zf}~R^C#-wUHrQ(L{4QUvH+=kIuG}e~VzK5z+wzAY<E%-X4Z8y^h}4NyccZmojJN*p$RCOp}i04Jx@Hsjt~Bx9YgvS z7i~KD8(j?A(9hftvuN)-i?g>m=bmBwMwNLts68QyH$}nJojvS@4tMQ!+2H#e(@wjM zR<%kgl;3N9FqFV_hHHWKHiAUy-Z~u1U?}IJ*+w(kp{23xP{)M>Lq3$PtcRaV2$*f` zqBGmD4pqSsqGfs`#Mihk=$zy8?fZA~cql3Ala&N5-G(k`crxlZBzjQ=wCL|Q)7E7l zoUA7|JbkOlM^~Q$M6`P@VZyEQKGvtw-t{eC?N`3GC}IfU-`e~ny~ILy#0ThTQa7W* zA(B8tawF?WN5xk=R`7~{_tp>TY^opyAd&3u>J=b9!b&?@r^W3!-s1U20hBVEwSo$_ zd0q$1fZ12H&`x(8gbVVCYt}ARE`29IQ@6E zxtaCWv@EdftA66M8rH=(@2_)%;Ccn%2>ell7|;NAFC`j!FiMhi4$UEeuP zHWyv<(rq~+u4cbzq5;0R2nm_{e-d67+AlA{ukVP2@EopM9ZII3nVb#%4Y|I8c|=e&F|CY z6y zs0oA^*rvmGzkYx;=aV;=1OAqMj=C~Blwqtlb)L8`62H#1b!qhZ?6DtgpQc}>QJ!zLG+%CzKUq+2AlD0)N^V9cKx~(W6t~9c` zh~7%(Z4)r0nAcj!&nRq)XI4q3n5H^3UFoY0|=3 z5@3D{6I|>CZ{T^vP;bSoTxPf>8St@$-Q^|X3!+;U5~Ce16tNK2usme-i+@@sFA zjbjzlzK+*+0Q`&&deIP7zc|wPZYT5VMF+0SEFDv<7ZCy=6n~CX;0)U!f z9mrlhn1;A2SFZ=HO$ZM$#`t(S!{X*4vJcKj0Tw^SUW|J?M4P_$Ta{>#vsZ_$v9Nf`70-3(y|X$h*x}_u*I#?j?wvD&XEKnlQF4$K)=@&Gi%M zsCJePbJfL#j?vS29tN{qlpDhvzFy-SoJQc!%C)A!I|3*Ur?KQ^9C-k0>lwe|Zfv*{ zInoISg~G&L0U}El{Pur zO4(8qx)~Y@h_zhl*?BNn@P~>IGazXcgFpq`!mrP(N^~aD=Rr0!(AXR0pTDKB5pm!n z-R3okx&%i!Q{0>)go!mR0$i_XF&pvYqVGrtVNhs&)S1wFvrIS^p`q{KR}X# z4?j0lq-o)t35~}iN;CQ&zx^?;yRrn;^qNEwSVT@mFv>a(G$U}p<=6-_*MdTeyeb3uuAQmX`b1r>pEHBy59N(Zx)L9%k+p?d%uumB(Nxc0CN+H(P)vi~K@zIBU? zvymtyd}%{xOHUJMx7m z@{mC9#8wTm&mlqj^~AIWe!i*Yqx5hOEM#0qd!y{UIebXI_42qrL^>NQC<@r$evpH* zUCLBu!TvxnNYqkoWQN_~v&*ghUo{LsMqJRT#Ew;)VBsjR1{!bqs3ObD$FiXY3Ql7V zy7Flt;%R;blb{G>hK{Tw!!PN)<^w-cA(W&Hi^t>xF+ahxye|fZW#jD#*|gF1=>Nv6qxqfgMsf!_V)gxj?-3!IRH}_WHDIFo z01d;}n$95%ygqG>*&Ei7J+O&{-0s>|u`h_g?_MDzCOpv~D;Bv^;(_1Kl~F)*5q|;@ zMrR$ipV)L|Dr2vUGKAu0#U{Z=ZxQ#GffFvfY@x7x!sB}`9@2h!eCQL8?~?s%Rl595 z;Hu8dteC?P6RM#_V@X%80c_A~a(|L|uQROfS8BiH#a@U5!XaKg8J4UI@TCAUmG3>) zTa-w@D87+UfZficx6Ll2Ld_VD#vyag*~HBtsleiLmUqN8k;fT+IVFD~L4OqP^D0Vw zKJWX%J$R5xvjmT7EVjXO+(ZN>mx!OmW)a|WMT90*Qsyh>UvSu9FxgZGJxZ`6A}qqE zUaMO3jsN$?;@PY~6xWZ^R5z<0-#*_T(mmn>MoE6ztmA(%ER-2n&h{K=cTRADzw+YN z?=fO3XC6TNGKduN4!=CnCRz)z_pJ`2Y`)p3 z?OVe=(nJT_Kt^rW;GyXZ;toHH$h~i6=oX9b9U-d~Y4-jo090R~%fg*xT}P_j`E$qv z=t>5W%rQe*xokzUxUJREdd~a-ZU+e2e4#>rwMaOpa6h;^Ys31%2tDZKe2a`4(uarA zB2~$6wee@%t{X4iqa)&QLq%inRj=HzKir{j`8=CTzI?(XGRybw#GU%JbSZJ<@i+A$ z?ai{U!U6{FOmfC{K=+nk$#@qv0rU#|crv)1|1wAsRf98e>7xrld96*k0@}t0bn*CF>J%>W{JNNBmfmwfe(D~aaceJ&3(fjng!jC{QY_F z9qH2@FI~GMBKP>%9@U4#uifUu(gz%1f!yLSf2EwnV!F}3ZE8tO<$y_%jKTC`)KlT* z5jp5e4RKnKcDeuRw@hgYV5WnAYfL@G1doGz1&FA9tSHKuaEvWEmb|Jdw_?eCNofP| zyQk2Zgb9ctdZ%LueIP_Ynu_tURB6zpS<%;s>zJJcArzj$-lC$Ra=mg_I(y5CR-QdJ zlXDS}O$wKfI4~V??X3ljG5352`H}@+Bf#yFKws?P_?IbDlqv{gWTMMJplDk#A#_>jwe^vwIl6N+c-G(YX;Oa8J4U)zAZjy+;jBTDEV*)6s!@`2yIbXuHBlO2TOx+|!L?@mqL#>cG-A?sO?MP{ z0oUaNf%wzYP;v?P>&Wkti~pU%;0**wGN?pc3MkUnBt8YS`s{9%3{L8N+f*ErdNkkR zuy;rt0SyTv_C-623kN$uhzh!Tu07ulEQ@ATo)V7~V!EvWfL3tknere}=71wIE6rXc zyPFzx=ZqNLmh4c?Yk7^(*YtCNW+>#9h(Z`N-cTULL31&GOc9p5fdkqf<=;HKy-Dez zwQc>Qg2^6PB6eQ!(Y_k|D2_1dXxsPS^ydWHG8>Qojzm5)lfw%VVaIqK4xdk{LSeCl zPan^hUkfzYfovi*ma!0fvgsR0XFZ8s9OMN{z`MshKROrGpbfx3qsFJ?-LL8I@P;Yj zOx=Qn(%2AT^OKJZKXzV1ub5XZ4-C;>nbHE3%2e}qwX(c{B0vXxF0GDVvnL&kXWQ1= zGiMG17L=+?Ky~8vwrfN% zWM4Vgo5t&{L^g6P;T7~Zan@tI;?thvxO+HEt$SO__JvVJZ?Px^8nQ6br^Oyyy0xyh z!9q}r4fx&v*srAMYKqM>#uP9ouIeVN$q8sF`K@goeRCj5xpf3ueARW!kVm1gD^SPz zz;EuKSCRJf0E3`{lTKTOtuqOG{wRf1q}lb=gu|5Q9{+%@il|Jh30(8a=W|`LX6eLe ztd##%<>_W|SmPd?Tio?d==Q__^hAX)v-m-R(fo<7+#OLuaonP}OGSWGqo;BC7d!jk z=qosc9_l|bCc+Gt!ad@fsPLkA;Q*sqHi|#Y z6m2iPzXtxdj_(#7Yj8iZyu~wkLy}uYl(i?op|HK5OBVrCQ~dtx#SiJ>*9i3*hjY^* zT(}i8(rawVAP+|uQX9M>dDW34Gi!u~EN58p*%KMb^J7YVPn`AbiC$-Z1r-TlI;z^$ zVBmB5nv72@6|mE|&?Z4?F~-pTR1lT5vj7PaZXmvzzZpIp>>@<-1(uI}zkGibSg-~6 zndw+B=hE+^BHh86_dY#LOu1>dc!(s(<61JlrgWeOo`5gBFGK6 zp-sKun#6+d;v!R|O4<1}sewspKi?h-kLi4T#Xj8?x6G%4^XKU!k$6?uJOZ6+j1g{w zjqJNf*!z@$LrPeb$IMPoU+%iSYv@Bkm)Q+WGC2SJd09Qd_ieji`LeY6n>!U;8GPVW#K)YISbcgr(&x7lvnt zU#nGYlBt8vOyLGOB?Yv=4|(yn4c9osQ!MxeF4W?JZ$%5eA_yOn6W>G-7iiy6(6x61uAKH!mx8&iu@as=EtQ#XkK5#2yGJ1Xf$qu6dIt9K`McoRZGa|(HM%LiWz?Ez%yS#78MAG+F;m05Bp%?ss zPwe&nn0V^md@kMP8^of@AW4$QFS^(_2xVGh?FSd`kVZWssf7|bZn~Eba4CNeX>yQ$ z@E=#iuaa#cRt!6kDl^o5=|#+oOe#1_R^vkhMvTP38+ZpXbXT3}8;^P#INu3~Tb`1W z`0*U*;thi(i+nu8U!;PUMPJ9Z{9XNYN>7SQ*!O6&OGP~+d*A`Aa&uBRD}Kg##cukn zw8^QvDUOEVVm{K#(kUJy#QW$?`f&A9fiGVk&X#hWw7SLq$^GzaqbISHp68g1$zUeP z>=kr-(%EBlOA&s<2%Rm$nYwI zbfu!02?KBf#p@*hcuk3 zMB*&i8pB46xe#0;^EwwyN`XzK3{ql8Hl>DPx0K?;rhMov=5Nmftzui;9hM}r1#>zaAvtCaLHk^7!YEaOMZJgbC}v!@>pC7x21+CJ2|zYd zUMC_ZiT3b@@atlwXN0{bel8P-o)qr_+~zF0x3IOp%}i&YuHQCeV4_ZQB|kXsFAxh; zzrSQP$)kd^Wx-ay3rS9!^8ox&Foy`zr)i~WyH}d6zAJj<_GN@1FB0hepU?;9=lzL5 z#&6J&+g#=W}I;w*f6)yO&Mw~o)?1F?z+eIDdMq`>KZ$PuC7WS z;8%3W6CHs8_RB{_Gug+T2oC;%%WcYsYyDqYAFu5zLg!|QI>h&PlSV*&f^f?M$yOyd zBRyzlnD7{J#nZTr9+-6-A8}BNhwY_~4lM!?$Bv~{^6altnq|xKou*_vLSbhhEo+E9v;WY3LYGiF( zuRXt~T8OX;+{>%%PBE;J8u1~_^D) zu=zKTrtht*wj+Zbj}GS~bd@MU%K+rzm}lfn-H0y#5bzq4Y&ISc#i~kY8in61oP6LZ z)&LqzjB>yBdAvY~%HH3!YbtUa^MJfqEcR>hzV)?wEBb2C#J4EQ1Q*}{lOfk9e5a?KbXb&fhz(bsX#-6rM-fRXk096X}&&E>A zUJo?4kLzi^DXEurTLbP!fSmYPK_SK&31TF^YJMU^`FH2B5UBJLc z{!jCgSUed_kJec|!Wz6}7Hlj5$WG$o&7%;-E5paVJ$HpM8d`u@Ih}?_v&Lf;28R$K zm*kkffvDQRvF$(*OQP*>SH{9xI4uRAerK(j8wdlsgb`us@rwwa_aE$3ik2sS(>1q9 z7(#w}j=ota1!T(l6&7`@IK)Kg-+{b3)(yIw>&ex_Z%!_C*r_yAnx!nvF2Cuy|3b|b zVO^a$_Y+EX1dM0nZRFP8yy`WNvxPV1Hs1w|WK8tz+aF1CNMZmszrCO!Gd;x12`^_J zj`pv~f3?Y8%Ti&FW%$yK`UB9bM0-WVxlDQj5UA1qDdLFYc^w0p_Ut|Z{eQ_Vb`|~H zZrqAVW^_Ofq{za1O@XE=h>%a%*}%k%e2gX(RKi~2@fr|S;^vYq{ng(1#v)7MK-kbE zdu;wil{53`$>X7yNi-YCj0bt1zDt4jphdy~lDc?ICHpE({R$6QH1%DOuD$tY1}D%g znPKeLE)XHDYJ0dO9vo(e*L;I*skfEcSMsF(CVDy&FT6eG{0d_s(v6yA~vJDaYc3_L_ZvJiFnPfJB#jiQ0h&1W*Wl z=IVn|PsXD-JWw2|O6nz168Rvjek4$JTsRy z%|CySBnC9AjDY-@^_XU>o(=&W2QZitCg0HmoWNDZ^#es+Bp1kt08zoqaQ<=hC&-2g z`87{&8mmQA+PDfJjVpgrnSM`)j|1(!Zy<4P(s(0L=e-2nO@9?v2aPEpRtv{)#I45*#6fX_ zHn)ZYBNNT|ZZhFYqKq*|WCi7YNEKES5u%)t>;59A;_DxB)KqwfgBia%`66~FJ|Z1l z<8J%>syZ^S@LOoatTgHH*&+tKW;iU)e#?rJ1DmAWe%X717zl2L6+ep$Gi_ER$cPpp z_BgK@=%^YoR}JqIlq{!NtyicaL#Pgw__7lifn%vve1zb9rre{_>FR(-Zm(Z?sDeF> zf_Q%YAIcf8&NYA_ zw|Yg^t+CAT4SMM31H(GmRdO8~1ai6BqfU(s%nS~I1T1@4;9b24Y3&;PF~QJyx6yOap#glP{v)38n#_qK*q!s)&N>09r{*uJ(De=OTF21kjT> zkJutA*UoK|g80}rQY4BIA!3=^&6gGi_7b^d)PC1jksu6Ys6Lt$w2%CI7JQFnNnC!+ zZ5|i_oe5g>6^R{vYAOqzV~<>IWj90C=Arfr*E=__w#QOPB8ofHQZ|I0yJ3kDh#t^VXp2K`3fsf2&Ha&+0 zX5JYW{tVMjMHRfz17p5yA4W=FAt+ zO9q-f${b`D6R08Vx;O8MXGKj5C6XWSTrM+o$!Z=7S-I`XpW23}xlCqD0q zYau3c@44OATLd}-$38Eggd7DDVrnydkTZ4=+(jh&J_ku7iOm{3{+i52c`t8Hww{2DAmk24c^8 zALZWy#7b0EU>}sVak>+y)vN!b=(@w%eA{S?)+V$@QM0Js7PX~zOYtj3%otTgQF}}6 zps1?7T6>GCJ)#7)qP43?#fVMB3Xy#I{(1g-uj{?8cRbIz&wcK5c&}58vVe35@EbSi zJYcrbtXSr<+6N1!6xh$KG8Y%A5V6rw{+9 z-zp$FELi^VK)XMjSLc($ijNj=G|sS2eBdhkwcrgvE9!RrOaFVb>d_vVLrIVcKl8r! zQ9?*zgM^xhT)CX-S9%iw^&sLe4#XBjmR?q`*zC}gL)HN)xh+QKoGs~}y z5xw-x1~Mg(MMoa$)nV1M&1<;FuOUm1CM}-DU>6?HIvNS5Ze{j z`YQ@&kH5MpB)s_eyHF=R|z0Hk9bewAM+vDpLOjOMmS|`tBx;0M<0hPn0Idq zLVXh)qlf?tI`2O-=wD@qQ6Q59plY{MK?hnFdU6k&(4oBg;ZPjfO?KT_gZP_&J$-*3 za%*lm8$gNpDuE>wnAObCkt0O0h>3MX$|H?27yb>AD3A@nfC?L~mozP|HY89uMOHW1 zo_($V;|L8D!`29&aWP47pk?^&zVCkiS}ZHD@dr_~lwB#|rbgXp$FH87aoYGzg~L%o zbpLVp^UvSw0bpZvu=Rx7_wUmhl8lIk6!nMJ2V_x87K_Yb-DM4%qY8avfkk(6{QPC5 z(+uhD1-u!63CS>(MwmTO#e1z*A7{z}@_b$$&^C%zl3}XrZ|iCSBv-dEHF`w!v3~>c ziB~&SBli%1Rp9j1RT(wQiV{|;d4t*a~42=(VsiDM*Xmz#PdE^J8^BxnHzPd~f^;^CPy?pSnSYgZO{8S_CGQrF1 z(Q;L8wLm!+I$pG{pj_Hd74i64>_>WUc7S!YZq1{PPK`w@g3Vf)RMpYW>ez6PHwU(_ zwqC}IR(fJ{b+}snarq6jRR}wFr+cnilQ%M(u`-_lTgq~PU)P!mG`Njm)gq)`_gbv$ zzXFVEpuuPG+S#r8_%>!h;GJV4%gls7fOHc*Zv1?!JjsVAY6@Z5U1ZMbZq3l>+P2j4 zNb_Ki*}DR8*0|`l`#wK9NE%RNrEdJ=a{~aKryCZbRVKnq#B2+NRS)0D0zWi8d3+*lz>i!P>V zkI6fGWPG+L0FwLIVsCnq(s9c$-*w3$KXUh4;~;Bbn`d;Npo=&nN5f`meL(8T7v4xp zM8$qG;pK_qb;s?B5F4h4Qi2i0wNLx6p<--~lQtuboM=#WHH-sYJ11G4g?(Mkjo>iu z;@{$cC(5v*Q$-3@+h0a@)G(pl_0C2BWCO*5ut zua3RToWn-24t(?Wp4~5e?M*)8-10XFXb8@U*Jbk;25kR~B!S_YLCCC!wj>aAu0g0-9ZcQ-8Q`@?@ah zZ#nO0dGVaPw=Jae!o`eLL&y4ae=TzI8F@;t9+V-mOugqgGI7HLU0@Ps@hlu^5mq zwBl_t#LS{h2!YCJTWSEi4WbVLaG=<36g zxZ{+kd;}UfF|=H&ZDew&M>zJ+DwNZxZ3fhMkGDeQuTp=rN-&I1G}f^zRB3A`zm*lMuQ8-X|cYx`)i>421!vV%YfQp(e8u zcFi$1#MueKG&;kH57AgOzZ0yXgI=lye4O{*J0E%vLa>0tg0SHss7Eup=x>8R@?P%q zLhJ5gvz1VY&3BIxk5d&ZuCAV4yktiFPC4%_@!i;bz>0>7M9g$*VOvXB(IA7avw&5G zQrTPRF@eXJD_eABytpBHw8&CAH^26(AqeK*j|pMQ?$mH>u;CiTP7YC6BwuvK%Ryi*Qph=}*+ zC-I?bbYs2G(JnQRuF8-}jwm8RX^MDKDvh`fU8iaEh1&WrT$MxD2E73;q-1#G#=Xm__AY@44;kUI;$ccCA5u>k5;%} z_yQc&$|-Uvv96E)sa(U}74U?ggbP95x$0{WW-7QzU#SA$&pRcY1;BM>m&<5s`H8ij ziG#N3jE+ZugKmG~Q~&yIf%2a1{t^E2SVXi)Ps8Rckc-4;Kii$ zsEL#O9trf&BJ$YP0!>cd$s?=`7oArvTZuu;2r_8w z{dV*2#SwoG7BR|Ateag?r10huE&T2l97POLK{O?ue|_k>eV1?pK+;CD45Yi6xiK_m zLygC;)-4L|-*p@p?D>4YAe0z4q4Abu+VVJVK0~iU@NT?aZM34o{l($vw!vF2s>)|Y zBd@D&(x9nO_Nz@56wpvX?^ev{%ojodKT#S1X1u^iy{BhEWEg}eBHmF%$s(fnxl7QE zcVp&LSQM6y!M038ZqSlk#Q+Uzp#l!*kY?8ecB82}G$AoM!I|3X8wts8UrG+m~sO`{KS!#{U<~+!uh(9j`>Q3`Lqo zKA}RDt-WyZSTR6_$aH-Qz=BM;x`<2a{|$qNKE$Rsggb@Z4W>e?8@;`Jd-_DUT!^Y5 z!F0KxBq=%vFeYMTLpr@vHcr*32xT7cT>mJ&Bn-`hx{M`<8aSKWY?QiJxKK4UC!THz z7~(+>%jcPi%+dnf1+WD&2a|6w`?TJo$j;a3KY~8NC`&l)Vzm(9PJzuizn%PT zb``MWie9M83)$kbi)o8#n^41jkY)M(Z82`@0&7U&f(O1Baln(h#<6U^KFj5P=^9dQPh}rohLIz1tQ3d6v&X(7` zWrR{{vYoh3GU%TE zi>g#phdaQ%Ma1bG69tI;b*Hq#fy{`O)bp_4^xGeI({I8bBo5t$d z9PgC!$yrIoD_XF?iQNq^{Y$j3D7~F0HtG0bcOpFy^06Erw(|Jfo-X2(Wa#|Kjg-H1 zXdp7s+-qO)OGI)T_%wP@56~pAAB+fO!q<2&sxqPX^uvge>vWXe^a9ItXf3j*_>a&V z=qA7f93XEln)~&&UYPUVYC?4!J9I!N?A~Sisq*tk&}2ejeZ<6*Ab)^6C3e`N*ni!2 zhrgZ?fi?D+)}BtUiO6pw9t_Fp9gf8XZLmPR&)&;9Yjh_i1--hA9DEn;NP+&GSVxy` zi{Y=QCz}|Sb0usVWjw^rWK#L(ooYhExx7)ldndywtmDXp(Ya%Vp7Yz#VNHVl?+1nj z&t3S-MbP^@ul>!I#A325SON+EELNj4(*Zb3^aRoRDF0Cqm!py%VeMDHuID$+5_;@7 zs)hUOtI{WLw-9G_cdC|0%&vP&38i$r8;#)qFRoV;?FCjM6tJezYA|6@`qf!ma^AT{ z0KUsHa%{#DV8RalO{UX*`9LZ@h=avqfpp(|{u>qAWd1-R`kb8=1!#XcH+YK~do1Aj z{1jD^$wrSIU{O&fn^&KQJ|T1`P%ja?2Q7S=q3sHdq{E$?|1B^z?wVYCq&;PTk%am( zVY$zj0TcRY6+Mq>#84J3b{!B%61QetWTEu-6O1@(^c)mbSmLh_Len;!ecyuJ zL@zw;I{mC>kRd~dP7zo>LkFjSo8?0r3PfC;C1>4U*fqab`D^1IA~Z8-vAIWGc{Kuh zz>nQkQrP^EP5mPb%`zd0&)SH&D=>?68xaP$SJ{yZBYB}l;$fBLB>}_*PK;e5LJ~O3i z*;FKCwTFsOU^lgFxS>x^_+d1W!ZFvh>`nAcDIa=FC+R}BN*!PEA$Y1@oyLMLcXZeg z9Y*2*DL|#{Wb~&;t4jV*d3y;%U4#%#I?l2zXeq(^ZjUoo=i-}=OHT=#X<~zo=o~i# z#6f4zqvalUt*|C&Xl75f!#wI1+L*uR3bWWV;wXpsopz41sT>U90i>oXVhYA=lEoiG zXG##yBj*zn4wAci#VZ&Am#@*@Te7$7IwmCKM0(UzPJr9ZmrtH2j2whPT_1W+X2r`D zW(x^yyg_eA_83%q*9c^~p{G3_H(#^%g4W4k|E-s?Y~R9YU7qS1>`hr3y*EZKY{EJxjpPLUup{V3#`}`vPSkNOfjO95hp%b&3i8;p)>7uH6 zUTW;_kS{23?j0_mqfcm(g_~CeG2a&y^+Y+r%8Ppv0ALm@yyxoF^ww(!CIJ{-q&PYd zSQ|b=_3$7r+ss{!7GMlS!!wEN9%TaTjtN5hS7Ud#?~X6=Zv>%h3Ue#dCc>B;d!7(R z3@64c)+RX|U)aK0O|Kb-#q<=`M^#15&$57<$C@m~P!x?`q5)&11E(j<$08B-KU+MX zh(Cg&!p|#B_ndOkis<6dGj6?2vM^W?%{^Op`LunH8CwcKg>9;@%FfV06%vC`rZTQv ztDAJ*$M<;e%ov(l4lzKTL>j%q3ybf}`9R6-lH>;7x&n?FNvNRUy6S6!$m=0e&)(ZOzr6wNdz2F$Qj=hBD@j`ZO3+^*IBJW9eVv9GJ zGNl0q%;?&B>cOpdG6)mn#g&1Fz#0oZ`Z6G37wPoTvRke8bmegn~CB@>{v8=7zy z;iJ3mL>B+ML*ZVDf9okMX}!%@FXJ!#HV>*F>n_R#uJ=FDyHPWGs&>f(sC;672P*$5& zi~EHogF{+>r`e&Y$z9(y%WSBz@&LU>kn1hgC`Ym3|8M>CG08)7PiV{H#v;iMp>+1e9OD(*3~9@-R+U z`$JV)TCtOM>C;!b(72H=ce=Yz&lD&8amxlf!G*!E3lI2;R&iLxjqL7*$L>ozc4y(s z@cNw-s|~{Tl$XTAL6ILm97l@>=5`uNeBE2j?(JH)?K5(5*z&3l4LNpm)ginAFTR}X zeoKF%N&(Od@n|1f)@fgMf@FqV@&$XC{hg4o#Ee4TuJmMdW>p&+&8mGtCfmV+;|(I1L|F^!tJ0AJ<3hO8Ebox_^Jsn zf)seu2o#Zwv*z7V&f)W-tPN_w#Y^7}lL1a>g7%a#%wcDmHx0gB%arsZZl*F`KA5|p zg!v`mjO}D=={F%fSDghYzu+s2V9w0GcM{C3{q{6XJfeLkdZFVgp1`1p_xiBFRNUpz`>pX;wSXqWjAJA?FA&$0^;XvOfPx+38o z11>Y!s<$(l0+&(P*t921Y?vV(V4;;ZDS8t%5{reYrvAadAg>O;OJGm?twj4iu^=Iy z+x&JWSt9-Vrun2k^#bwf)aV)OeE924yz2Ej$#^q!Mc~Tbgj!y-Sz(k}(7%Qm`(~kh z6n-hYHD)HozXyW5bE{3EA$lfTV@sr72UEdFT=BM9V(xRZE`S`bw(g?? zeQ!uY5^6&Qt8AbFPQBLt zY6-k0GJZxxg|xP$H!jhq-_Wb?=D@=!k-83^wVx3>@3)1C8^3Wgb!g5(LU1d$vgg*X zU`HAlNM8LpMb@Dah&<_51t$KAk7RYkz}w|W*T0bTk7ay_zs7;>berI0VrM?;aM<-= zZD^j};7o;-_Qx2vnYJHYCZk9S^m=b)KltNlwSfF=1?&)O3cW{X$`F2w;M^T=pd{qu z&cisi6u$^}QX;!9Mojgo3dDZs10Qxy4c6z2gzwD-dfbe2Y{N<1l*$=b6OUcFj{&O4 ztPg$!rn&q@!q*ALSf84f)GQe!B!WD8Ap2Vt zJbuJ=%5-^mZ?)RCX*^rexy#c0T?z^BEPTb5Y|s<6JLY%S!_Iy*ASe2LR_)udgp|x) zaRr}PuShdKe|4b4qP%K%D8PK}HMob>+-@ywLFLpSRDTFqwf{SArW_= z*pwF^DLC=R9hn+*$-3(>S?w3{8`e-wFKk3CBzt(or4R@QhzK zS0*LVgSRl;b$Tk7C$lld{=hK5j3IraOJ?=mJh?_`(fZjJn!xjZF;BmFT zBUi8PNkXb|9DHXP>E|njaT#Yy5JKQ!^CJm`esR^I`W}j!TpUn&mFwhH4?|5brs%s; z(M?C5Ekelz!{m-({JKg3IG3kEwy4G-b^yr-yfCG2Qy%OUcTs_#eMRANm96NLw2wQf zGM@)V41U;YGZanj`?QCI95 zS7xj6kRODl!YC}yhYR^SOGv_#F;AWBv44;gZO-g6^lq{a&C-~I`oa^oo>fhdPXP|D zzVpzNc#`hmZ)a_HGN-EdgkjaC>$JrTj&9)at?(mGI{e-6PDaMAvnv9Rx>oVFGnsvE zt;+EAIY^CfDLY7R8eh}uG3PgUA0#)32Y2Cjb!;fD9auPI?$8;;sXz_~8*nCK!AzMv z?}$zt_b{6Gs^ggc!US2Ucd3CJQsS||P>QN@117C9$<-U&Wjl762dvk`fG6Vx$=hjaM} zn3kyLOU&X~WR?TSca{cWT`^$7)V+Q4W+(e*4J3FHFNczEX1AGgn8ADdM`+AH4)PRoFBWuh>I zbzs7r51$I7`HJux)gnDXOhx!nQQOK(zId}h70AWer=d1Y=~$hn0&w8^v#yV+fxT#3 zBOX0m|& z5??1BL0dO5fjnmqQoXh`K_LaW3DS(rz@p_1gE?i$ek{r-tYpYx*b_qv*cZ{@vx^ko zAf$Ns;(u=&*q?A09MtWz-a1tWt!Q8xR8JP*>z4sP62p;jzik`dpKgIiQGIw(=C>Ou z)`~^(k{ILAt;B@I%)tJ{(6;0QM@c2p=v8RYfYr){loEtk&mvgNbHgCTH{w?khYXOe z-}{>u{73JOP;H#X*?Zl7A65DhsmS%9|B!X$^(rltEA#JA`h<`@-s!ww926nd(4>pg zj0V=muvz%Fa$T257<|ZKZq+M0Qw4h?0%@aW_gHHUx-F@m0<4W5SiF;NdWS%8P?p?U zW3F)+wnaj&qQJB*?euXK1(4Ow(S_WGm~{>%l1wZlIEDL<8tjOig>%r65&v;y0H&XZ zQ@GlQMB(m*J+4*Gs_@maZ+1Y!zrqSQq=&;mK4mz1$U7OC#Yr}TNC8RXk`=MTMNbXpH(4pw3%fTPbr zlLOsX`k;=V_$ktB8sj{AHjsdS4`!=%C-UqmX#FJycpTZP{u4a0zVa7OTL5S8*m?>& z0b$Zlk>QK8cq3s1;SatQix&MuWx)H6 ztdKbaBTnq1%k&gUWmU0xZ4E%0n!~k*5E^q|q}RAiXQ5Z)b@R?S`~aWgp*itFv9{$e z9?cCr8Rw~m0nFP{B*IxGdw$`mIVMOHfoWzi!Pe{AZnagp z!|yESJrnr9J*U=%*It_Uir3^rRxeQ}JP+uc^1<+(Kcnx}#{!A_$*p0@5@&Rr^#R0+ z1I`QQh-z=xt1jFvPY8#Fr;oa1&Mx7+ex_J)EKbrSREw8`IX_#L)scVH~{n*t+AExz#FxJ8sPWZDwIq#;G#t*Cz8J2yhTJU`*c2 zk)1lh9n9?HGnoLi=^IEgfGGwLdzYV~B#TJ_$G8qjh3lDlh@Vz;HHVX(7o4>n{Xe!v z`?iJh;oHQs?U4;JkV6B`E3cG(@F-Rl>qj(n8S5zEBievY!Z46|hq0Jr6Oi&>d?@@V z)O+CEM;LRK1%JT2iHai*70A@3lBkY>$;5D^G0DQPdF}Lv4;f!#`7)M~jP5L{DT@hN zeV@qi8Ut)ODls$f6R#;C4QD=tI}O^<)<`=J=2O%ZY!GC%HW=5r6xrDs1BlK7+W25o56{5M}?CNqSu*=LbF#+u2Fsn9TH=BfB_!OD&RiX zzk>Pvz&mXl(`Y~9Ft`0jxD?@A8gee8PhwYuEZm50!FKERelpGHYmK;0SsB4m+p~=C z^s)+-f50GA0AI^IMO`<2IE7DN4ow4$2mYYjDFFVp!&A;pHo~^;Bl^$!s`Cm+E=ysz-iZtq4x+g(C`>ey}X z^QR!6THI9~b?`|#552)n6;$WRw9yxc%0-|uX+9-2>_b-HszZCi;;C1RSIt=c zpu+$zL{T=|f)gpzeImv8PqQw5T|tR-J_=kL5&ICwHmFQm$~yo?MmF-9t8NnN;6Z;; zSky98O@kk?%$7d5IoiVh0Vc2rtfspaoeoxW>peo!L70y`XS|OeR-F@>eYPU6(&7)bSv5nBTH)(Go!1>#~}kISH}LE9QG$hg_hWO zTh%6XLVuNNDjL}y=c0`~h#=h}yYkW3s!roYAFH)w3=LGl=!{FmE&9Zh@?})R`gw1@ zps#&2jmH(vcSaV4anzoE$JOxeVzS88vq7qFPse^zFtLLxb9tSBM_Ee-?Ulg@Z!reI zg@NQcx$EY+YXl7VqTjmhTI$iapLjlS#9HS$ypU0%V25zV!Mw8nGML6Zcnp8GL^8G0 zw3v8Jp+X`wD|9Ej6BI#<=rGqU{Wu*}W_Iujp{v1@HLiksaO(5^4WMegdzhf)kbCop z6l}x?Q`EVg4(U%0=9LVL#eo%1{w}5!tApfF_?n^R0Y(Y&-s0TQldjbUv~JKf^PmCz zI`ErIJBxHIo0mV4%n5o?%#FMT?FnGuri%&*q@Cx5t}3M7JoSiMSywcm6HZJ6VSH<< zt=}_N_-{TCZ6P}?0AY~4yGGb5x{sBVf~ZNtr}61=q#+;O9VSpj*6PX~bI?A)LUcaZ zrjXh`RtgE`WNY~Mx+_gjt1x~yR_C$+5`+tk7-GiWHb9d4d&(A7(6O*{Wen-`kLdZ5 z2pi~=GSDlVH?bUNzr}_$z8W+zh$K31!pHIT?tz7tF>G=DbfUh#%Gb?R(|}{KY{3+E zVRy`Lj|V)iRh`45A{?es9QFe%uwve=Bhs2pHnRkH*wC9#GU5kbEuMF6|8oz8!8jfT zhjd8N%JhCBBh2%x?J^1m(ca#`v4($T*GYH)Nc98txRd=bKV~BQ)s%U}fs=#c5dNUZ zpN{z-mJN39h5=%SCZuHg^e^qpINCUc?49kjUaHoP*w%MYn6FFBiTrTmP=!Wl z%V9kq=VX^0iz=irC|8Eyeiz*xJ=k~(B7*88#bD@{n2D=7GmgW~l{qt?h@lEpzr?yD zcWqD=P9}`V!9X5eGFR=xH#`r%)$n=L)L}gb2|vDyrLbg-H!}(#;)Pni zKMj0fe=a!p!);Cl0-k97+xD8dPk&pP^M*v~@Ar(gT)237n0UjH8%MvJ2hv!TXjzz% z)exVNrA&(c6J*wRNrbG!YkVT@6_?@1kI@^C9N!_g&(5JVD=w z@P8*}X(QBPXHtD4rUN^2gz!e7o*{hr0sg~B5tlx?)qMEH8a}LKasXzMha)a?&k(V4 zwXg}iZ7YGC#*@n=;jawb|Flh=-E7fcoz#9MY~68U~AVJ{uMw-KeGaG zWp;7vT{u!tm4TD@S>I7!0ptjs8WzXBxC$e9dfK-3(Y30OqL<;Uf^Ru%RVVS6g~4xl zIlR>e@(d0p$lMw%<3<=B|AQc zZZpDya&X)eAzsXZzvvy>5ct5w0Fu}u+v6ksVf=n85oG#Xrgua}g)~ucVApTxt6Ho4 z8y^i;A#o5+96`hkdL%MuLwG`9+S?oC{4@@HaRaE4gL9<4qje=?VGh zbsM)kj^_XZ6ZPtjwL!{#_yr4Q+7}OFFmy5D3yl!%k5 z#s3Ab2bD7z7&%eZM+v(ZKu)9rKWxCQs7F2C5p6MRGc*2xOyC*;*v5RQ3H#1q-jS@b z?FkBIhF1x|-eluYn{}l8Q8=6V!Un-Vpr6vlzDHviuRuDo7A!8JtTBEUv9{2Jc+x{< zUbIheEm|BAt~HLIQ7M2pBJ|o|ia8t%T_6y1zX%4Xx;5xII}sb{V$)6`Y2n+0V-!vK zH~5aWR&fbGdJxo>;o{lpz$WcbM^RHoSg`@^g<*;=`|}Wr3v@}XN~9mBqeYmJu4|cg zyMzzMyyLjmi?^WgdK?hw-2HDaun#s!etqH(!9Jr7?QF=R)45dKQ5THQTyc{icBwuw z!NwS^BUEq@cJ}N>eav6`;k(F#f>4Etp-Cr)Eqjbi6Q23{)#Y!AEtdl4CQF-o&!NIyP~szyllWYZ{K)5z4?wW@mQ#y z$c3w9JZx9OU)g{Y%bwMlYn2Ij<$!7%f+1|vR ze7?|-2#&zMVc7O<4C!jr>vdSUasOmEG7xxGeKDa{Tj(2s-Z$*xs*_o7hvD>I&S87w z@egda!u*e2eS_<~=^1jRxvr05-{p5wWOgp#{nHz4hDyfiKt}PGVz8iU+!Sv|JlMlk zxc2)3e&QtrxzyZ6Z61Nd!}Ewjp4g19s!(N8q?dAgqOk97^C5pNYz7axBqsQ_C$je^ zD!i)*(Y(g1_IeH{tkyA8+G;g-QmcFaZ5riq*MGHkYTnbOIh)X^XYO4(dvX+$?f{Dk zn*pC+&W-zR)dKn;DgU*ET&c0I`_c)kV$G?g3LO-g^%_Lh$n|O6G9!023&8M`YY_q> z@*PsIy8azcp3tn+iSY^`{A{HMyZ2RS>gv_ymsCI7Kc|%Fh^*wcMQ_*CJIPK6|pOQkc@oRAynRICFaLJ9n)4ztqE{tGEs=} z^QbSpeG>E3O@yLR(GcCeW0zK6T6T}s&+I+h`iDcyBl|ap&nLx_zbMpkcrc(sk2bxM zCCKi>N2&%7jBLcP27-pi1X z>K57?aD*P$z?`8_vS`AYFjbBXm$EfSu(r0IfA7w}FP(r#_bRPHtGXRClBFGkp?-n_ z<>`e~Zf~rD^wp~7x;d~4atRfKe9bqjldLV`b5DQq#Kt|!Fx;k@^su-yF#T2{_0!X3 zpKO}Q>GLkE=n%R2(pb(iGbiN!-p4S|Cbr3Qp|T+yMG4O&X=a1&e!6{}+^}1`2P7uv zgB?w1zAt}QE(+@}vo(27%OJr0{*?&@#}?kFBmiBCGWz`_lS-_3t=d|{xM^M3J&Z4K z;sP0wc6Pj`^O3gKUY zA>VytuEj<9)7i-=Cowqn9njm=Y+e5mO|q`JDmORJo*R0 z^~-dPTmuW~3(t2A3{|%qoA))LgIADKr8v?h-v)G7P(E>yi*?-9&7xi%3U ztL+b#QxLZ__M18>^>c7;nbnz6se;J1ugOnlnNBN?bFa4lWpHRx(sxXohoTYZfP=C8Eqk(@JNqNs3Bdyy;6IaMamMu z!H7vBiYP=)dvaYjp@!a6_MaUG=7|$ra>G2-{60JD8bKx`Tp6$zWoYL~8AIdao<(UMrm&o~QrqMwTnD^p7 zO9=1%tAemlM?d;MrJXh;S75 zsLDu}0IjHKG?Xc8<-u*9I{634NH+o4e2C9<_#2Buw${%8LmD3A#S+z>*0{M21yQ-^ z%Ga!!m9ECEyrm2#>D`{CH7r&NI*4c%PqS46E*`)&>$~>JWg$ns8x`w6K06!kz4eK9 zWiTe&5=qR=*LJ)w=Az80o@OYfcV@xfU|^#+mGY#Jlear|3N38cx@Rq*bTVeP zWDxRHr2gxhxNVW&Ps(i?LW0C9XLjHy(FpV4&L`Hn?QbN1iB^Pdd*;L=Xg=zjv&;V& zjjfr|5|*zRP7%<{>22$fo9z9_`PQxOS2)N&f2;Zl(pG*UNnGY}G8JE6^5$}?Zj<~_ z!(V_VqnoE)DxbfWzEq|l(rsTqQ`EMkI(dBtmjc&6=lD|>bL}JIKW4zRsf<82gWa~` zv|e9838~Id> z|1Z+u1`i?WchCO`(Kmw{jB7q`pO%UAXRE5^ie#$2SiI?PH9S~3`=%-*=BL-%DF?i} z$-0$EZn!$M&XHr2H*EC{;j2_xYZX>!s+g2xeC!2=U|Qt|Wc*sb_&*BYGBM6n_AgD8 zzc-UtNc~j067wfFHT~Fd&6Lp*9-*_Tzw%=M2mhiZV(UWhC4Q@9;b&U*)mRplg)h`GWR#(tH{3tbwZ0o`_8|z{GBvX)#QRw{ zq)haqhxUi7LF#@#&KK%#MYM0Zy@q`S+ENkVY z>agRrEN!b>_0|P&R-vTZ7Z?5^#5(R-8t$qp@%GA6r`zBr@8=L(@`T}$5ULD2F!;y$ zxPOSG|K*ul&8KN&X$?l%nlsyOmfVpULyje5_Q9v0ng3|{aackFhlRL0QN0d_{-a$N zvI?ocKn>@&CvVaO&49lAv0%by-kyC#s5X8+_DBHw>in~pZXr)<988lv-*7#Zr1O3(9CBOPxbOWS`|p`D(3>&-1iC2OtTIp8BniQS8N_pwF4 z++x`ExbkIj{ou*qn7}2ZIOo|?5C@(_di!jyC~(gzp>TTq{?GV#bF8-$H$;zPv*&WJ zr5)zrCF z`VZ$;%&KhFCr0b9Q|Z<97k2c8zHH{>{_~%9Y7XqOWsP^kPSo5dUiR00VesivC^l9> z$`(ab8II3&l-wV1o@&J8F&Din;{ER@_I^nV=NhXYZLx4eZZ^X0<88d9mT6RrK_UNk zQ?G0k)3YaHoDG|@KAAMy)!3KG90qSoTn>{n)PkM%YB~nQT2fxKpZxq!wsZS1eM-~D z=l9PUV*O1Ehs7D9)KLZlTL|a9^p`@O>i_R0RI)>8=Vz80^n87GlTz;6q(P(mLaRAU z{sqYce$tfarBWEuv&}s{sOJki^3AQ9rb*YGlK&#a8_Vg#<@zS1DkBTx7^|%wLURFb zvns+b9c;*_-D846)wjD$y)q=7KcS&5lGkefV|Lu$iR;eQqtauy1r6T3Lyg#5l9z49+%VT#z&TvYKYkfw`UhR`TisgNcDnW4L@lrwS)F58 zM-oh@dHJ=`(NJe}wfNa{SGt+!UpC%|-KQ$d^w!tnan!23d?uUgb4Gh1QBl76LG$wG zcR}Zhmtx!XnRhL(UTGE&-{NnJc|zQ7{5AGv@JLQW@**KbD`sGl=5wW1!~`L!$kep( zaK_Cp3#eykBdFq*tCI_$UA~9Na3R|s3Jk<<{-;;>TF2R&Me_-zc9ez!@^+8!g~ZUC zX+z`08xk3JO^)wbhFvk=Tovj$DLhD-{+{-|V3MUH>Q*Ci?(q6 z8#wv=RBx85oo0qX{6>-=rJysdz~M#BNGuS(L2FnmXZu2mG-p_GA=99|bMvI5>biw* zcGN?mWh*u{ZRF$82%)_suY?9thw|yYg7*dmTKQ)&p&8`BE^CpJj z4eW^)kd~q8pQ}S*ur8BF#;#Vcn9_nYo8C0QRWDXI&&DzyKauiuJIRVR?nWJP*1&BR zLpAORkN*14Vimb#@R!(b&H5(IbtYVTAPGh4%qZe;F}Tv+{ygOrMB36Islu_IkkB2< zGw7Hkf4dy!TTBu`pymsK4ZVsF#i~x8t5cM>D6`iPv84inaA5jweZoeMe2eH|E)^@@&->7i3Yb^D~?(rco_;e+=GdYR7#_(Q5*QTH5;)q5v9X&I;nIIo&7dTSv&%nt=!(Okx?>ft!b zIsHDdCkfh&Thv`{T(X z%~!RXe6t4UWk&ZR54gB58A}35)!6eba7v<+VO5o$Uft3p^Eq%lEbJ>}J@TQooQOnr zOI*zi4}U+FL@>_)H+dDHE*113x*up9uyR%6eu+Haqu6QdMcu1mC^vGZhbheQ1+(z? z>0jA4%{@EAD?@HyG;ZE!{6U+0#UV3#eBbfqO1H~X_en)du-`;H^5Z`Zgu*j!DkF=z z6wnunf~pGRy24}?exTjiO!T)oy7$GNKFROoAJ-FSqfxhCShD61vOmV95r(+ujt*1~ z>SXgyr92w%qS{tI=AK<)=jz)um>m5@<;{zE?Nry}h#JwYj{6DW_flIPOy|D+T^d<* z^!Dss4#f?JnGZ?7#7#P%G4BD7=87(BW31c;Kj&g(HsX4^{x732_#=+`68DO5mMQ_S z@viK4I+6#b^_r$zMJZM`j2~EGGmKq%%yt=HR3c1n2|lmaTp61IiRwA7-aL81cRo*- ztdn@RwnbpYah;we7lgF1JSqM7#>&uTJ{dAe^>tS>R||l7xzFhRL8p7}ZTcYV+CR2- zquu+B53hPIbduk=ZCFmlA5|Ir5_ije`y=8U69>GwpmrNNXeSBgbPVif#T%X8ZcZZu z=q0lwUj0Uq%()%#x`%{%XiEr2JBowfsx2f(hP%~u`NdU#1D6!*1lgTQ@mY~P_i9m_ zJMqQQal!*h&TnBN5g23CVWnm_d76a!{}Bqmbp2Hwm@vYJf`0#iZ=;DZr`^`yN3ve?H!AQeeBpk@rCEjwugO}8!;ZoBB|eo<(m+Go zMuJwZB8yGsmib3dSxM#aRchhb!&H>QnyDlGsJjR2i^3yF8D-`|baX3bq#9(Z1TeR|$7eLD`b5vY;P`vr` zQZzB=c2n|1AjS)LaW?rH-x~4u;-JitwFb2JiZwpbNgyQlm14v?scnmq3zqis8HoGg z*BK@0>(G#idvw3=XHL5l$KguBk*`;%^pB!b?3(`5)M#e7Jln(nR)$O;Sa`6!Tr@^P zPUpVu(76fzskvzylf)kN()2LuOisFbo6ktWwbbf^lE9!`%RW$L?@DO>ReH6-@v}QU zgz*}QA-aXltnjc!!*A1q`n5k&g}|cT+?bg`sZDim(X>tT?gE9DL7EI@I?eao z+1ntC*S;@yoa5)h8pCAWcy8-hB}WwNKUFKn|Bs}r42Y_UqI8FJqjYz-NGOs5(%{nF zNOwy~cS@HmE#1;x(ujgcNq2nj?e}MQ=FYw6oO|cJH^aa#BmslZCk&W-x)|N=O)qlv z1tPXpDSW3TfL~SnH7UpYJ^kYfIMoRL7pYQITN8f2Jfiyhtx7ui30bIQ0*lSG@ z{7lNw629%8?^ZD%Nki&$7>Brt{|INty5{s(^~QhFtZ4Dg2y~KU6l2LOmh3T8a{dNK zB4!Y&NLd1@AVAi~P#JG5z)lk#KQv}+%@%ef@026C%?_L-@1D*xf(QmXqEYca(-fiKuu5F?SyW-5T~*3lzF zPJ*tND!0kbs(7jkIM6mIxgRe3pqu25QYE64XJa)z6+m*k*cNk}z$1xko51H}ZF&v= zkTvxbIBJ$d)#u*cFh;}nx8jopp?x`YY4-`Ed6(_I_p;pbx!sRAgL-xbfFzkFgl;^yjn zGC%i8TQZ#rKtmCNQ=ufyb==elp8RA^dKK9heDop_^Too;5j0`yRO3|*9NcYWGCk;d z9oDa0*B=7oyfHrU#@sPJ)5aLiv$84+b<}|`*!#X&QssKvI<(jyzt8;nwm|Nlko4+X z-)Zj7yIGVU;y+%6^d|%8{e7-dJ*LEz)5->GQ|{Cjlsxd?JI=Y2_yfoLAY!B3M~x8$ zTgIU@qzs7Bz>!!mvzSvzFTWKu82R)UZ8C5 zaT*K+zHc=-I62FlRIBC11a9nY0dglgO^^V0)h}FI<8On=J|v^ucBI`O!wN!P(3_Ek z-x;Xc)?)QpJUTtc!fnkD!s-Vq^kd|CQ}=Nh<~JXp{rx$0m~k7XL0LDB30Zg!BEhV* zFH!qokOUroqx9{wcD^82YUpqFzGH*{Pn>W>P6(22_)l|^-67!X$qtH)Rhou#QE^AN z4K|S?T1vW$aOf!DEuI74;Ltb0%RYENeDA~F=Q5VJngFFdWAY#bO`g;Lo18(D5L&9~ z<8PEc7a5d>LS>1&78;n9FqLB64hh}2W7SFL==b6n84|{;cs69xfT=m8bX(FzY^0=c z|2%V@xElhLxL^Sx?xElfMh{N*(%Q5>z9o32c(LaIZm9HpH)O2gFN{yAYXGLmDk>;> zh?iZcKI4LFr-g69B;Ox7$rCDFk2T5@z^mwU?20s{o}Ob)1_~qYcELpbE{tGC`>ir~ z|AkH<0-KPM4DjLGuMyknQW;(G<~l0tX~ocN=BQDK$j)S7<&Kt)N>%g<&`}jUAh4A!$G5xv*plxYeg1B(|n&E*T1Qmk(DTjW+ zUw;SjhwakY`%Vk9q_fHX@jq+Q2?yi&jJKbn%Qka#Erq$@5uBVV)%0XPdH!# z<8lPmWN0>8f05|I2L-JzF`{Vs3xJtLDgc=QaE2gF7Y;a@xY9j^7Ox6}@FxJBN}^#} z;D6%}t>2)6xxi^|KL@K9w4bJ69MU5Nk<0v16=eF%BK=GZ9DjDX?a_C7IxmGhib=Y$ z*#J|{%O!n$&5zEE*u{?+157_(Kpl?`jOLLD%ti`{jXQw16nhjJY;jHDdM^#dZ@}$w zrY6;w4j|htXYa!p%j?C1BAi)5;?9_Lf^L!&&~?L!(xt+FL6CP;jh|I@-w#{u!TiQ{ zNnR}WG(S(@=oy=rbr|~X*W)+N3pzZjG1kd32cij%56Hq9@*DcB{J5j*ut07a`R?g@ zSgX@&mfJQw$COM9@<_5@s3HT9R_eq8lBk6l z1J5*oL}NDy9FhdpO6!JbrGv(#4A=j4vl#=r^CQgJCm0VjEcS78AG_aTjnJfm=J3B5 z7=HrAaXjM#Q6QiUvx>hEYFLX08jZ{fQ7|MS#Z!q8EGsQ_phudo`zUdUpibil!*)jdIKFke6e zBhaQyVWSqZ#$;OYaLqh&)Q}{2@>w%mj&@kRT%V6ZY0sFB19;gb!B%N{2vLR<*~@Rk zYVWGLqk!_U_3~B?-48cZOAC`GCrW!f7fzPmCJV(2+FG{D#cECH4kSZh;|++CF_zm= zJ(1N(xZ#5vmx>8ui3-TMXn`kska5 zzFQPL_MF)Vay2`lAKA+4mGJYH$8AWv6XGCuHZBN@2^k2hsU2f=dGDVV(aC1+pu=R z<{$#Xu%kNN_jWArMKjuJi8_v!$)lM|1>~a{8Q5a%hpb_xo^Bf8rnlwa0+*!8V{%+r z3X0I^5bvo0q=Fy)N|CAit%)H2%VTyBW#$tU|E!cBON;!5yk70)px_uS%&yei$6M8Z z&k`G)k}g#|3$j}C!wf;7fzPA^$Dg*+%RDV z3=qB<<~aGhTN2)uoKhx;1^>EGniv)`Od8%ZOw7)te44Ga0X#hb5c@zdu~@Ji4d`Iq zj=}&##`jorP}nj|M~KnpC*XPl$h2@_nf#LfU()Fk-*SPu=MSRo-N!T%mld%0jck1vSVbKV?!~Vf zyJyjcnD3~zps?`;jPQW{QYi0PsV`EM?^vKQaNA|vXh@=HSv;EUXr&sP4?jcg85zqv zg#h*>JOY4MmC~shiUmaTrszRjfTHKE#^kVl4o%6B+DP_D6etXAprW0>Wu+NNR12PwQ-IDQkas)Ver9YV$ZhuSYftO zUr^~VJ9d!uATQV&`z-yAG&HBjh&uUW5Zw@HW4VF}HPG>ruJ>f&29_c)&l?P#n?3lB z*YR3FjRE>-m{AlYHNs+x-kNjL$#e`?fA?hC>^alp{# zKClo}pv2i)k5|0HP_KaIgS7Yd9i^>z08$XUHgrTy&N*;`powmFmI~ZQ`=ejW*ODo-?$Ne ze=^tcdJ6Oi0_P~{uPegqH~=C1J_K3^7sk~$V)7oiofRit(X@;olO?Kp?^!5-mto;6 z_CD6z>Yv>vWWazXD-`3bR6XQ9a2aZgdv5E71FaM~VZ4z?9js|j|I*gZga$7@A}hz5ucyU`Fq1_M-J0RqLtv1(-4mB7Lpf;I}W@Dgj` zIo0$K1J^Iv#@N(|(^=08;0Zv>?IA-;z#I?Aa*0<4`7;=RtuO$WfdEERN`cXqf#xeH zV3(W`2Ij&7BvbCz%Q}|#mITaeE}*B0NU5TSg@}IyfEvpi8v?*xF5nb^&6S*NZ6%n~ z_Y1pMgj&RXtU~3Y7c8OcD{W`BXB>40sD)VU>vcbL&QkQ z&F}x${a^Po(< zCB(|1yG9bNgzGzKA3Jj*Up?mk#ef4P;ef>$0S!#oeZeoqyRFzzDtQAc5Xw8{^Na%D z+t&Q7)Pl^P3%J*kYMDQ3YUrfgB%MTr`~t3^lp75R6u^j;Kl?f4eTLM$G?ewMR21f? z51B8h;W5SydLPjdZc8e>(g%6Jqxw;}YUI8=E)aB10Gyc!JdhcHxdFp4w1^Zg`9V-B z?8=eC1#TW>UO{k(sZbWRiUZc_yF#t9nsThg0wod{gNXP5;;?4~dtb#^-d-3C2^r92 z2ARo!4XiVOlfV=5`&wdHUmR+P_{=esFW29HN>u5pO3-+`ZetRKWpN@?-zS2wrmCOfekk30z+Rz z17orv^Qb87@PHjxuuYB+0xVa13-A$?u*$U(X{`x%&pF~NYBu*&B&Ik-fb>+LWLJ#; zO9jjHqYzjsq%#2J4#lYe{=+0MSQAN9kl_x@>;f57B>`92$=iKt4pzcUur^;B*uW8B ztw02Ja6?M8$hoWQuqp*cpnCV@qP8+8q;RwBeKuox%XrXb9>mr`#w_2GY~V3r`ZyN{ zd>&Y;Q5s5qRw_se8uS1R)k7qm!+!W*IHSnZa zx8D+I^Pz^0{g0giUH%4t2V5v16b=YA5j4+;HD#+C4pN{)my6(C=>ZgEL{gVjV~_(ru%GITT4A_ROz*+5P}I(!wPK=R;P&yG`M#I z9!hq=4;|m{hm&!DlwWa5Ay*EsEIW1luj|}v$_vHTBK{r*$r~dEQ(aH|KSKlr54d=2 zpjgpBO+tVL9oR!VY@l0UJp6Vg?4pj{rs_KqGGmazNK<7FZJlq$~n{7Vp3RBo7kCU&vba zg2ZXYAaQUsizq7izDrMz3;LQy!+aS*AAWQYa~J?h60y<&`K&P5O&(=QKp+cVN3A-l zoo-9-s!cRZUWrs=K zjyJj*CKnrUM6$GWBLM^UA=BX&s78!Q<{&8wAq}=6`6#H;s{xkW*b;D@1NiBKYP`|F zstEIa`%*Xv_Lot>qPl}qSM>o_@dg571*>LEz>T*?2AYb*E;QK> z%)-xKUJbpxEfk{~F7@d+|wDsTw^*qv}-FsAVd1EQwq{}v?B zQVzm3_n3Gwm%zjl07hO*0+>FJ9#B37Xi+4ASti54)PxC>fxR*?R+59RvY)>OT(W@6 zoiNOWD;#ub=;38I5`8fZAtP3N_(ljanFCBoOS&O>v}NNupwqQGsP|tW&{U!r=LHm- z&78nZ0N37zz~*NYShj7DlUs{v3n%sO`(PI9aA2PDV4M&r&cfFM=7tKXm37GiJ^Y`6 zTpUoH;IRm>rUWm6`x}Tc1@m--6OeGj089h8)O2^f5jMkKza}=5fcKSwmbt9AR`=w7TLcn0A>ULv4{Si zS@g8TZPVjxtY=>>6c!QfF~(FPJ}0hSg(hf?+bAkmOd4M~e& zTpcMG#Q^#kfO;}s0u^={4XjE8)epN(!Aer144fANek)+EEr?)~2n?wLll!frQ)kg_ zOQ6&N^R>_eP7VQPN4im{tjg*I=w}C(*^CY>nE#J_kN>5jf+;S6wHgkAIR$}WG$5_G zLr)5|>?;^v9TiAN1$r!H>4I69k${D01GNw|!HPXh4W@kwrd_RVat0V{K3 zNU5Ywp>BBbSYCgh`i`mzH2J1aM;ZkH8rW&)HF)4#D z5(wZp9oU>jLAf!6?g4BWQh#6QjNB`rf>6r{U>_X-Ou`8Q@ZFf%f$fV50}O)-2OLBL zonQ9?&fdJhU{Pr|*klEpg%FSg8zA9r23C2^x;Z|OiwYBrTLMAjLW*5}<|2aq7O3Wz z;c(Jya}aMb0wkjaL6SfajX0DJyiqVh1(b1a0y=TQ6v3G6!J&*_Kn+~vgzg*JVcL;F zSUb?u2gEoG0Wmqj1irq6C13~#dJsX+_u#2M9%t0UlBWd&YCzwy65v!DP_WoHQ;diY z{7M4=F~k5vctIaWm=Y~m69z2;Iyd*tq#&lQZ2ra(<$*;ceMK#07=^m61#SR`j;;PL zssBga2jSL01sRH;VM+fB15=X(0iOqgTKPagT(GpQ$ly#xfN8A36cmC9OQL{c1i^r2 zFymH4u+(?J!xR`i3I-vBKnT?yU~tC+IE4m4I$(pK;Byf$@(PT!=mpOGfx!@PuoJ99 z#%Y4NPR>oza3Qd11G*Z(nSIWU23Pl<0146}d*9wzo;S9Z<>Q=`qpF6fLu z?x;R6gPu|-;OOTt(EJMmnEjqrP23M30M9%i_7)u~dR8il1o}ku?)9N21N#@y?gYj@ zhp*%d*!v&M3lw&X+6^ih0AQKUdVsw?;A0PVT>Jj-r1gT?Gl7I2JwS78 z4LH&R$U^`9PbLn-#s%Xr!OR~pVA%Kow%H!A9|zUpfzcmOL7!-t0Uc%lgLq|t{RlwE zm-RngGbl&taTMez=ZXMlqXM{;fUy}!eXl`zBcUEZgX4HlMXXP4&}r`K0z zW&zsL>Oxz2#f`Dc#dgT0mVK=1+O$}8eWNL{)Z6{JxQV#VQT-B+tA>Wg37edPw7)sC zOM__{>$4J-#f3G^<|>Xp*Q>sVqpd!Y1KYN?dF#{j>kGV%9rbs-oc5lDB8K*d61TvY z0_5s;7#}{|=%w>D0_k{OSkGE`G`U^f-?RxBwb%IRJ>U3u3f7qG-`{kedeyx0w$kD@ zM++ZS#r=b&9I9EpQun6)N{7Q%1I(J{Nu%@c^v%I56Y$*XDFnV-IHX)85H>AE)Rpxs~6SKU9_vz>4La<#u}QruivEwMt> zT6*^3+zfMiSwPvg)MKI{W68&*w&bHn<43Dmdy(=J4$H2_CZ+wO1G~JEe`?PiwR|e~ zZsoZ88kc$7I!X)Ms!jE5Efrro{-Zp4?#I_A)@Erik+QrlaCmB+vsS;dBC6LCnKpi~ zc^ARerkG{uqy6Evs?Wyuy`Rcr)lpO2U#dgpQQ+Q}~@_5K_4pgmQPP80$ za8yeia#VM89M+e(H=WhowSH(uuyFTidj5Fe$ESaXvR?VXRb4qMDk_#jrm@o3+}lwn zC$b=V91+mu=#09(mmyJV>F(ipm*+^P@pK?ybT*)5f4EI7+16HR{d(8SP}(O^Yx5xY zGWF7nszc8_R)Ft#{_>*1{X#IY+I%6~$Zzm%0oh^wH^vojy$rE4iU6JtQ}U+(+dn^h ztB&LuKPv5K&Cag#Hg}Y!bzRx)|Fh0pSQ~;aP^0V~yTUv96 z@pM2Te&5wRad>1U*8ZXC<7CG2qDzMR_71xpwynS3Rn^j32UUdjz`i!!)4PA$hO-uz zZXQ&RD4DbI6uzk1{XawIfBM;IT^T&y;ZPHj*W}v=6p^lQ`Rht?zlIM zTOZmX$v*$AsQ0usTiSeej>CTXbnpW|Zj571f{IVH^_wp1+LOmWm!+|z1Lk$XW6qkT zXdP@+1S&&vpQ-Z$D!0%@mq)HR;Oqai%q-h17e5#kmGr$$-4FP=+rOQ=t@h!&%km-@&D|UyX>)$E#57L!f}`Jlb~yz?`fb$=_DR868%M z@_CN;l-1lF^EN+mrGBgK@VI>X+~E-v$6JXnKl!ynlQm_ekS5ekG&H`1rYHypXrleQ zVr%ccn=Yp(Qg5`2x?9Yc@2LAXYeG!Db3T0WA0 z0BI4u+Kxj0T9HS6^&`JCzviNzB9t9x&UR;D z&>nmJ4EHy7X3ZirKO_58?LMLVCzr4@D=-SQDOV0;p7!D$Hmo#KWvrD%=1*;vSTP$R zD$+~%D4iBm^X&5*sK%9LB=CjZW>pEdgU2$c~ zllRbC9>-dz7BqP>>V|k{yn8Zhz051`BI|N)x_;H3TOH<1Z4y1&&Hx(}^!(U^P?;#j zqRJO*jd~1kr2i@nylTY8@zy|Bcne8+u#!g$4r?nOeXQ4UJre8LRx0-Bfd^36euq z(84r+MT#f$aFVo+f)R5~KQrseka{T%V$6lL(TA`Hr)ccmfu7cQL+7a}a!R5%b3y`w zf*eHQ{gV1>3`hxDf7O+N(GGniLK=5pO0b%HLsXRF$?w=xF2j;21{hgz~it znt4hP+Azja(C@QQ=_g>|b<4{%aQ5stn`u_nXkhXZ*B3J$oIT}j3jM9e;9nG!Wga8! zJlRr%77JALki0Y2D2(*g4|VyhiX9&}rcW6Y&%u;JVU6D0FYEN?*AtaW3A2$bV`?g) z1>bKaWO11!DJr#iJ-os!EDiqigas%D+|~w;phmvgJx@!Fj$&D@kvY-U`~HX;T6QXp zoJnsRRy_8%;qe6cy|G{U*^742I0({h<4|l(NBkngi3u#QpsLjjb=ej*n1iRGPb^v- z^%AktU*0PiRr}-H;E7K3=*m;dieD=wL<)T3$}QHW+v1b+>*1zdA~2$i38zTY$6;d0 z0WMubVb-K~wI#(pR))D8Tx3=H_%Z#=4z!m1y_g``R48zNy*SN`t@H19hbF&h9Gdmg^an}^LDEK~GK*#?y zMU2-_{>J^ChAsb>UQ8cWDau+#J1>m1)F|~O&&+mtOE0_KhAr1vmY;r-$WS$(pE{=5 zy`N>0G(0k_Q^n?fJdLrTD?Spl_UoCrmZefRGq+$iHSo`ehY@ireXXO2HOuK|)hje^ zBjR2VI_K}idN6CZ+kT`HXOVx;swIc^b6`BS*PX>jmZl!NL!C-bRALRS-^bg*i|6M@00mz!eu zB8sg&Q*Hb$nE(dkhgUxnTpfr)fdph~x77{wZ9>Mq1fu)AI0{lB)!5=}ADAvp4t|kR zS!2aMuwb|GYtkiFIGZq#_CFp4gz#WToDoM1si5`l_Nx}D{C=)ysyw~jB=G` z;cCpR&PGlCUXSUKhf!_eS&V$zpLrpUSuRlp=`WDadUh%qvy+wfwD0E7-5Q%q4?kp& zzK*o9x1*s<=dXI}wZJ~PKPy$!SiEp8>vwxTdv4dbZ&BwPr9C8~k8fARkRj~%&X#{w zy_9YYx@;A-A(!Ia4SySe=ordhxU63B{5$zmR^|)I?Z*wa1rzsQ)P7}ZPyZtSJ@GBD z+|-!nbRpgaAda3BkPWCQGJl!vX^LFvOycD20>0kV=xS>ry{Iq}TUk)Pjqc~0^%*PS z9Z1@>AC4DXAR}+v!wH;#+#xs1;OzxeiF`5q3tk5@eKWr%ZJv^(mpJi1F$5I0KDk^4 z4coC){Lfh`-kPB+D7UZuGG9(5=1GqkYS!7M1Q@s%q?Lh@z1)Ga*e7;f?u)yQ_v` z^bVap`+56=oaVE*H?k;s3E{UsBHTe-5`j+eSwnKE!&V6^FXrZCWqOuTUUj@QdDs|D zBmKB$;(ip#_8Vn6F}^Y6QnS_QhjZp8nUC4>fFQ-FNtKQaGi9T}>-sp+Q6Z9Vx7_(( z3I=+hk*$0B6vd0nq{Nw;Vb7Hp$nuEUKCHdYu4WzI=Q`GB46?C~U(~Du<&M(r*{7Xq9VU9UB`L&ioZ^;Gg7T*nov& ze-i;C@KJFqj@lB7tPRt}9_bb~GE6QUzc-o;NSanD@=3_=vR}Xzp<8i$oZg%%HJijJ ztfF+}wosrz-fx=AjFA)QeA33hbp8wc%|?Qb@C-R``}+-9c%BZ*3a0An*uq%LY6)qD z(7N`4pQ+1grl#EZHZ}~UZ{HMjs~Z^o3HXRgdmH09S8G~5ZlAg7ka-xb%D8J*zLi3&y`g zN+G4A)Ud3Xdm%qOa*^a;mXvYVHHomyR^}Kx5^FzP>`WcE&Ion+#mi$#%mzN2NG znM1CDj%bcUbr-tu_(dRIHhxox!rx|CeTKHE@XDB3P;Cw`*=#NBd&xAd@-jKvud-ol z)v3tl!qfD8&jIquou8kC>Dsxs+z`{){#M$f$&>8yPesI#GkIJRDD*l%L*2G3`-(o0 zn)q!6{j|VRa<1&{#z>4kH>oRl3xL96DY;<(B7z`>HWD?(yF ztqzl1^eUdRWMh(yQR)bFc`}jLbv0h&nq7uA>OzB~7QqOgCAt6?W+wq>TfSZlB|(TX z1KvWDQ$KO?3T}O->G$wXRdm(+p0#Z+MT+3sRK|iQDf%0ZkcaEx1Juba1F005c#)~D zU%-blM&NrloFD&Yg%!MECb#oV#VsdW_?B>jQ|RhG|?~B1;wo^6koRnBSD`tX2RjnfOM#6@$)TzlX0!h}Py@aQo+e&3KeKO_hYYu+L ziG$ds{5t6geb0s&?jSP7$}E~Z8V4Qw#H-h@jP+5BrrO`P(A8Q&IU9tp+1J(1i7ap5 z*k%Z2eesG_#?0y$9GS&3AAaS^uT)!%k6ay|dy%rqUw6Rs^OaRizC4wLduxWOAC+zX zPyNE)l)7#^`vNpSW7}_>bEI*hp&#Gh*fjRN#0wE;Xy@0Q#g7Zi=BfH|fyId)PElM- ze`RD(Q9)1MLM%&g`(#O3^Wm%esEKsKn-|YniR)EP^dpU~pDx2bJ$-&433w`{`7v|+ zL1J*D<4I$+IpE!f|H)OrZ5r{z(^bHu*kji6CA!ednFcj(y%lZ_LV}KNiOp&oZwW$c zyz%Z1(_jwl0^(^zacfVRvdfFqg#nH)B%T$IA_AnkZ))ryF(0jb`jF%BmKS(a7cUir zz5xxVpiIWY%pY|xtKE_5>JS@MH@XrH zOFK@9Qx8a~pc?~;hWQ-gpB~3hG`_UdscuXpN+b$+Hj~k>2x^;Snvy)wh&~X|e}#LP zru9K32$n0|L~{PD*o4xge8AeEdQbt0e?cj`0~CkyLJ2_x%k6~Q;kyh8nEg&MeI znoAjTRB??%O@&8VU-H|!Ra89^!snEe85Un(-Vt8As1|?vT}`so$tO)on#v)J%(%ug z=(5U2N{<$xAlRd6>S!7N;*0iDxB7AV9fyqUl`$&%>fj;0(+9|Aie%=&nN`T69}4y9 zu-P9u5}LtZja@&{tw_a1Ec|l6VtA@LqA2X(WZ4<-R_Jny;V@=2q}cH>m;WxGK4UkD zf6-2{bTH{S@KE7XS)a;xQS zQihmI-BtGYmOlm3HVE}}v^_PODnss^95kvSnQC9A64iRT9oNc}I;N3~@FUNvqo36| zW*8W~iV4#8-mUwb&bB}=7CcPEXeY>~^y6qVBUA!Q{P)!;wZYN0a&=u#s*zRc(o($?-4AxW?y)A5L0+-5Mj43p_s0Vi+yho+Yy^N z6zz}C$!tH>={l&Rr@356zam*u`x%SjTS*aESCF7r?ZHMPPTPiAEPRAC()0?yI|)mC zG)u3ruJH3lD+6=e*yLn_zXPgX=CBYooE=-oB#y=vF3U{G)^=v?h>kLaA%63y&WL?214{w>~zhCu#8}>Q^G>jSkW>0majJkF0HR$6OFNfx3f6MB;$CVDkJWBYDYkqS-G8|nGn-v@9iHRuo-5ubz#p|gz9zoANeF7o`0-*% zb+yJJX(aP|W^`g3`Lr^px{eZO8iWbgINq+!mNgogslrveF59v0aJ`&;ENknVA1mf= z$>4@`N{W5QDPu(yV^-Nw;m8*B)1Fxr`$^^$ZKLlgYVXavKjLQaT0$-NUm!N!{`&71 zUSH^YXqg|*1U~FkR0*)EQI<`oa!f%AxTowIq#?!l&E2Ak4@fbS1W;0OXjYJqvr`Lu zB+EBZr*x&zZ+EQw28=5X-6Jz8_!y@ibM`vAZ)eyv4C<(h659yVid5frk7Xn}NQ}p& zjSv?9)Yua6jRM{*NXwPV7t}NA-t^?*$0m&=o7)U2J15514UoHZ5w|4wkt?$}5)>2< z4bytR+EQo7mD;W_+){VQ;Gs_E$&FW^WePDX7vXtp!x)0({Ps<1u%ZqtwxdnZBY$K6 z%QU@$)x5cPE-d8)2kkkcx{&E?_T=Ijqy+UeU961Ok>U9A@9=Ne23~L+t=F)VGa5^n z8i_mhxapqgu-%bJk^QPM!5@vX>l? zWwMCo6!!`BJnO~rO%Jl`>e!Fn4Y-6nGadAFTlstt@9sC!-hzlVs}Llme-)^2xdfx% za5dlWp5yI=4X28wNGfvBc1*C-`X%_`{pCSXLrw2Y4N`r+hobaBb-n6%34Yc?hwbf# zwHw^Q{l-`O~zYa7m6O z>Cqk6^CylQ&iiMBdsUv8E#l3WsK0q_)Dd6*IIy@$T>S|D`iGknVod_Q**QGr@LbVl z`Rq>Q9=IGkL+U6L64VxiWzvSMN7qzIQk&TM7yAciZ+GcGAH*g;E34-5S2Ase7}$q6 zI`z~pW4BESd+vWo=_{1QyWP{?&&?h+kuACSE=#ECSPcry9U7AFUHTUY|3)Y6z64hH ziVm{wOT%LQuMQmuO)Wtx~1WyC1$UsJGDpxgd#VRp{6@eZHoU2)z$c}TVJAxh2M|u)g5E|y9`-D zlkaF(L<(w<67w1>(O&2eyx2EQiz=C>63Ym2U`eE8heRMy*ikh+t@KQF^_f{-=J&B@ zI$4J@9!yzHxAfJ0yIR;|mx(yUSiouH&=EU`R?K%39_yYZHF&F*Z4T!LFJ@3jP}WC; zf=-Kudhjw+Eyot&;P_<%^K5a!#JTR5w2ZHYzs9n^#S7P0>N#4p7)OuMT}e?)>4 z%N6>y-tfJna>M@xt(j{90rZ#YgMX?ya($iBkF1o*?lr=KKN3Wi77080tFpN!T3*=^ z*#f;7DRnzmS|b(OXO?o=Qx+LYP7B_)m*W_ix?-eA2aBrk_3mu<<{kE(;$*mex)fMK zW=NSIRb`y=R{33pF}e3?5NoP(;jY_N5GC^lUO;M!;I4hYZl(PB1V2Y5(ftSYQ@&2_ zKLp>-#8pwRCd}g-n?HRPu?c?`g^gA=eeEMg#wDIo&6o3}s!FA3bT@Bi5wM(dv5vj; z8p+Y^ZS!t+JTQ;>@*4Johp;snMl2u`=mv}6)JF@`58}P z&2H*@VSR*8dLNnLK6qwHCyJP(T=z0aOj1SQd;j!9BwBtsdBS?XW2Pg>$h6Yyq#_ji zGuuQg+;xQPo2{N{pvW)aBI?5o6wzpWHCX^HrFnBb@~MofAlv+MNt*@YDo9@R+wK!) zu8X^#Qi`jNtMml=ov>vC_<614&!TdO>8?4_UqmO+($9htOH{^;b40xag2l|24m3-} z|E5JQlLh8@iZN zyIW<2NLh6Fz@mC9LIsudB|4<^7q82nn|e~oto6n3_81dUL(ML(=&`u>B8br0_lU!Y zZ6|x@{c&XmT?jNnS(M@NZ!x!b6j13F8PQw3x#&G22`*X+k(3qaUH<%7i!+E#Sxq;3 zd4wUh?6SzryX`RDz2jgRZ&ncmw{zrgW8U(*h;JGtFNIgMQ9W*OWPh*&@tiD@~IYh zU8%yIE$D69EvOwp;_djl1HHU0`6qw-pQ(^G?Bq;WPPUQ0zHG0=$=qIRPU^sP6+cLH zV1lIiA}gnv{Lwd8sq-NFb8QoZQmiO@W|GFBr|YIGC)(VZtF~aCLmhw#+=?9tKg`>3 z!degNbqYqMiE`X{a#hokEN%=ZGL=-)6iq1Pbs9MrFOWQ_rnN|taE2`x2yZ0Ae%@or zbl=;F!JoBNoSZ6-!Tm>r}zm=HkucUzsz0e|Hn*1XoO75aefkn5k$`Hw)9k>tYHl}AL z;W3}Ko#RPdv4TGwC=g51GhdsOtJ`wn@G<*1$55GbsmvqXn#B4qLbe7hhAa2fsW+oX z37d>o2|XgW2CBV@xX6{-t+-FNR-BcdwpdUHJ3Z$o&biiIC4EgSH@@oOxs5xw&kJk} zpBpMteu$m6-4h*!blNs1Tz!q^*YJqtdE>0v0e{e%7^J$`3B0epXxoQ({vkcr1ApKx zYwy!MrC%zLpXP>;zyCh0^Q#cHum`)-5gX#-MeSUO;V@g`)d~Cu7nV}(#VL4SmbLDu z#HAzu^8Up1G&hXRVxI7OuJ_BsPc!VmLIn}rRQ%4^-Y`>F%2jP1U$*xTuCqaxXGF1W zeDrRN)kw5Vygw}t_#g0HZm+73iz{8ixYi=i7Cy9^W1s7^@va%5+&cKX2AAuH?|gM= zp&elSx(VmLUsABAMK0vsENyY_@V=qlqIPM{K4^Hwjjw%!!=j@tkzOs^6Xl>urMh!P zi|D!Aig9+7L))Q>Tr=YB`$B@YoQAU5!>TVT&7%vqUzf^f4+VcluX~miSFRAOSXUp} z4CecIufA%tB;9Ny$sGTF#DLYVZVu=E+>Ch5FWBPoh>udz%EOekRfuAK&M!mn{gr_C zd*DACu&YZMDh)i_5Pec1#`{FYkru=YZJ0#A?y9c3q z5@SzbkVu%I1X+-BtZK^_6*#Gv5je11<8O10#nXxxd@Q zs|`hUn@#=~hKso7M6G;CCjYRX=G=pU$w*g{1(P9l890X>LX z&W}Ew5$Z+citUfS-PFxQ!9L==j!u1SVbs_G#uY?j#1>KGQX0R}pxhf#8yKTReS~p! zGh|@|bNpfT2i7sK3Rrsk=fd#5e6GSp*7>Hy(csjl)jL&ST%y-czpc9mK&W`VuS4RXUikyKTVq$%yk^VY~Qul`m;* zRP^3nJsR}hElbWg2j)@4CN2?|+c{BdM(Z`N4$^REHtURtHb-9*x_^+Y7P;DXow(tY zkjS&RN_)4({w1uibnr({E~C(TePxKF_ob%BB_-h`mV~`RPwrWf|L#&gzvHAlM}|b9 zv!v1_5e{n6AB#5JS=Y~JKaJajW;EJRB)G&jT6fNky*nMBD$+zS7Dq?IE=OjLFGhq| zTeS;LsC`m?v=17EG+h0#4d%05tsFU0zOGkkL*Ho~gpGWprBE+rm>l5-1pWLmW^%GQCAFgRtLEhuP z!Py@YsM9&%3aQ7XRe1F`95>)WHmwnAFIKNc;cZc(9^^S%onll3NIw~!@ zA#%p6#tb<5@W_Vyz@kaluFhJ-&1!h5&1z<`lY))~q1j|hDi%7yI0>$hMY$efPcT*= zRE7Is4cTn2NQCdKn`tt=!{7<6Py+@X#$VS^Mu`P~uA$V}x*w4ntTSrqg+ps?Q^E1u z_RBg`H^an?KG&V1%^<;N`VAj_I`<_yD%qclwNdHSJ2}cq;@DbYs8vvj+B9w7d%1TK zu_-hhdZsijR)x8aZB)Z@ZDTs912pmJ>4#<1V?SEH)XR59ak6T$wC+G^zGP)GMV)i% zP7^%%J-0aPxxGFZ)yMh4#JA3}Z#pr4L1sKzc%HF21iX->z5Yw^uKPl_@}ox{_V?-C z`T^-NNij0|jJNiIemJb(?sgG_{U#FaGM0fpC#m`R-~q;Yi(~w3gaM_OIVm)qOpmZs zJ(&m_k=QbWv_M!@e|75>8!IQLmKq`M3<2S1Cl~z_B#LID{lZrRc+O=X-iINw#|>=Y zG8@&1bpAkkJ#dG8JP^U|xzQw2KTz8ES+{E3|3rX%rGf!f$5%r^>BKbl#w5n{SEo@H z;t!!gG8eqW(>H@*=N3#8;zaLGj3TftBZOfWg`F z&+T6~YpIo`7XPMt*M}H|1IwJ8{nE*a3k_gMWMbmNXYatE%f{OOj)Sh+geU>wpgFOZ z#gGpZx}n7uvFa!lBKy7`7rKF0$kHEON)=VOL1dd1lDjSdk#at&NNcTnsG3n?SS-Gw zWup@&gf?_{o@nVY&fseqb9bvB!Y2cpK`wMuctr|&#^@N@GF`%D6lvJ*uxS>z$>b%$v(3|UqDFBb^cO$o>=1im#SlH=B|l?zxeak z&%giPbze=^b}UM5P&b`(dGA%y;LknQ)0aK`!HYBd%iH}p9~FBmWXpWZ#d9zdkWvTt zut-5P6ELg6XQ!<+{}j*n`ygNrZ}MEKG;Q^RWysxzdq3a9zoo5=M{&+vmNT(m8NBva zqi+vRlyqC@I+-c1G=1L*s(RU&E0SJUw?+h-v)R*g@ktsjIq*8P{w9Ge`7`m1#);{) z9()NY9(AyuOO;E2h|`cTcF;Rnd2){l_}hzfr#KyfS)d zmgXmluYigEQYG7)vnYh9z?!d%h;{@%d98c2o0Vb%4AcdCMiT5xyYmEzu|^UDFQhe1 zk$f*=UL5dtYjZ83cJB1gRC)+JeAw3ON%PtA&>le)WoG_o^B(|!K!3kWfR*<&$)xgf zjnDEChE>ZaFh~$3$^gq}*pH!?*Jv`9$H#T$E9^9*DuzyY~V zPh~(?S_nZppiGf$z!3A*C>I-19XTpV2ioHG+_Hv zcTNZB%WwmZ8(TNvl!f#G=j})za8>Dq0e77`VZeQdPN;Bco~X!BYpTd`=!A-Vn@*@G ziPH%c!<;&yVwN7I(XJCJq7I!0usP;Gc%xD)gSR@>%HSPZtqeY> z2sZer`RaI_S{Zy=sg=RkEVVND=F@6r@cT-w4DlJYG9=YTfgxFT3JmEMPk|w&iqD5s zI#tM!Du)UgVp3Q`Rw(#~tZ}H2A?s}_WXO&<6*6SMQ-usUp+~u7S0O{LI#kGzyHBZ* zAx}gd0UVmaAT6%K6X4LSxP8>2Wm=aEt&H1z9Xi7n`3`M#=9!1CAV5@&RKTH|gvpJD zXr)7UD_$9TP*ZT|5qpwi=y659p`@-=l`X)bmmF$h=q=kFjG+(pP{Uk?#fSM-n{GV0+kjXR`M*Q3@cZ-9yTWqJHxbNI?U|23|q;-^LkiJu~sIARh?GA zVVew)do3W}vLBouc9cP)szeGn?2J=?54)lvx#vXpun(N)u7-OEakAbI;Bca&g@(^zkQP__6>vC7v#J0KIDDPv>*3p^)*QZzf#0eL3pjj_{p!x} zV+_*b>cavKKdTlt+(cHx?^9?jOTGdQf205$;bq{J)nfri=*{;L*_ND-$dk7;L$#!( zNAzUi(^X{wM^xx9D)mGos^ql*HPeWBdZvgSfDtkM&ubZYW&K&e5gY90WrRMBK4QPl z^NctseH2rd7I4H-a!r~R)1McgR!JkSF>uv20giZN2I1n2ia63d(xc%XnQmD_BI?L2 z1>wk^b{-m897pSsJ;>K#w380ZHH54P)iY@A9lIM{dmAM$XT|2@f zcQJrcz>)jnm~G?%brfghNoNg;k!Nfd5Jz6qBN`4EdEb^o9Qnwxtvbr1bjYa8xMcXK z9DO-pRIyScqsob}^ak=1(vN9z;VqjTh;U|Go*aCE-Cs>kS3`@N9SqZqh_Vi-L`vCQZNX3Kwco!!ch zj_3(iX|jx7tIv;&-l#t}$MHt*Fp6#T9tIvlHsI*Dl$jlU)Pd>I$MtQZ(H9taYC_`W zE8>=_I$J#Yrk>*iGlxhzSapN}N27XaOr~M!F*$Y&jOoSz`U8$B6{mwuON@h6 zsRjjOX4p|Mrdr#KF(&;m#(qS1%xe24`j}15Gg)JH89p0xm_d@Mk_tHHID-^NonpW- z7tQ&IG3KPfm`4n}vQ{PF7*wo3)&!wr+o|=BHT#WY^Q=a{C&`j*ztg zbZKG0u~mxjV;fa%1F1d6M)g&&v1`rI<*^$bcfrPPi_6H4-EVDajy+*w0xny5 zxv|$RAn!VWd|*!)k8>Hkj%%lN)VLf2)3~m312|0Y_I4!q#+5VhTh(d-$4zi#rpMJ7 zE*ck$N6ffY3NhohIS?~$r#w{>B#krfpi({KM3JRd0p%&>Ps@UNfaA`at%Y&71hB$F zj(gt;>|@6X=kco2#`qk0TWx%v^ykKRmFjnVfn@aYJvG;kFJb^?faA*y!p2t!-(OUD z1{^<1^V#?r@zODVfnuHUOAJ-Uue4KT{5p9;W&AdKJTZQU(w5^*RhsdKtg|BHk6GL~ z-kixDe=+V3)p&Cfd;ERJoR91hH^FO)piIbAj^2bk=k2Bm-L(3hU=lMEhB=|-~>wpPS_)S9Y@tmzzJ`eSI=7*nQ+;m87JIy#K03w zihZKTig_mn6p|-qi4$j{k~QE&a}#%BZv)H3QcJ=n4iWqMs=_tk#0hrfPOP?QGqG7Q z`$S!XXW|-?jaXAN;KcQg{0psZqB)H|@hxlWBWk;1;t9=Y6HgO2g~Oia7PKtm1Sxfl_MDVbd_zu%5jFf zE9cpfQCY7LP-#5;%9WO{S-IBn@@4~V87G|6QVY?5Cw@uW<%qDeV+ASapIDw9gBR|Yv=8Dr2mX%+*Yt^f`= zsYdbpq?plblUB%k8KlxCtu=#hCg)95s0N(0-4-fN+83vNCmm5?+N5)~dwi2FTEa2u zhE!pb?lDMlR1ycAq)zEi_LI9IEac==!(Efjd6dcdae39r`WV9GA&yfolSesEy-c2E zKlL)XQKNnGO2grk*Xp4*DPZC&)J(PtcuY1?@8n|+nV)>p7SK-Cmy{-(v$>P+$h4U} zI}SKmt$d2hPP{2PlQYF+a;8|-%BFNxF6)%u=4pwz`b*fFQekn@lu??LQ>MnLa5`oI8~Q2nQFLU zs^kV$)g5r^ef7#Tb5nVm?WXdybp1HTU}##t9YfQM$1ttJo;{d0f&zY73m$M(szx~hs+!CoL9tF%oyJ#HGlOIY z=Tt3|=k}^LtH`rTlqv|32C3SiC|$KTZtw$&L{%pYvZ_woNmO;g!bjB&g^#Lx47{?s zJz&)b47{?&Jzy1T2&V@W9Mdywk;HUay-(G?2b^A@kTJc&rmv?DGw7H;S&tqCoIXdb zV|s(UbkHI&JUwE;IDM6Zary>jH>Pj4XY{6TGXU-*)h}x315Q7v*lPN5P15P7tfNiS z&uK8P=;5yu1hURP;PhL@ub%$Ef}Pu7pW#)o&&aUDJ|kP6ZJ1GL2r$D@$zeuWeD$Ll z<|fCCYIX389MKsKP9~p0`cYNw2b^K9v(MOJ7nd1(4CFHo+v{}9(8q9Rm<#JOE*Ygh z<^!u@ z9!o0B1FtAa~Y!ZS-bsF>2j5s%J6n3HSRaZWeK^5zuTmp5maafs(k)eD@X(}Z*CY-z$d z`V#w`Wg2sHbjDzgsoFAUqlJ_?Ta`;TXSaF0&&ndsIcUow&Usshv2)IvmoM5AU30F+ zp=8co=hna+v@_7$c5&I-x%qnBxn<1}}yc~M6v%P2nzzHhVue(AyszQ09=r33EYC-Mw%Ct z>svLB}o%^lT%gi0i>W$*OjOs)JSiQ|8@T(7~i=d&F7-01g;}cX{ z>96VwN-_opd# z04DBc{6G4Cbpic64w!g~@#k{p)B|AJ3c$40j1Tzzta1SKH30e|jIaJ>>`nT)M$|gy zc`L5c$iA(Bz8#EzZ$sCC0GO05Y7z7Ab^L4upzRj4-DQ09m!fk4(3=nFEnxiM_fiu9 zFnKay@(jjLycW9)fbL>IcNyb92;=*-o@0QiCm4VIw~v273-AK^1B}1dL_Cjf1mplvJT-}^}V zHvkYu0Kz!N%f8k03VqoK=#Dae^`om+(c)@E0cidaHu9_+(7O%LyORO>dIS1O7+`V~ zFnJl{3t!v$F~ZzVz_dM#C+#WpxB#I@wp~Ct3JAv;|L5Pg(m1dK5Oy;_R}r9#UU01j zbgg52&4rFGT2BRFU>M`?&ivAg1mqwBl<}YZaV|Y|?FMx1WBl~0_j=RvZUK7lGJgHU zt{8oL2{3S#@s>rC2+3FunG_?g0s|Lz7%3IHax zV}MDk0F%}drw;=3k6`@%tb~pLm~sX%))T*Kr;0JF!3?tCHFo} zPm`AcCa+@r)g>p66Ii1}Sz5k)`JV1XU_T(F6WjIsHi1L}?L<>J)Vmjl0-FdEtxH$_jDVOp0 z|NQ*B^l}bhN zRx|G1y6+yX>kMGvJmX&;9j+s^)&T->0#5uaJ-r4PxXE}z;%_lLv^4Zi$WxJoLiXJCKY#0Zd{fSB5PUEER z15AC3@#9~9a~Z)fPc(z!Rg-^C<{-5jU}{gsyZ!skE&$n($M~t;-~KvHco8t+3gi6X zy(5HIuP9{AA53cZ7lQ7QXzsy>t{k6AFSi3s$YOla?>_QPQd5HfT_YH;Y2#h!+be)6 z*BP(*;@F7*UI;MWJ^ao?fVQ2`wukZgzeymZ22ue78H|4`cNv+clytz9OvWcidN$L~ z`+zAA89#bw_j9C(iUGZ4jMp`%eT9&h4d}~b{JX#EAPfPiX)ojNj9X2p_4F29MEIYB z-}x7Mxk|JL;N9-^B+-C&fRM%bZzudDg@Atu=z79<%G9mILGHl)@vS>+CjtFu7@xQK;&L~jI}^~I!vIsK z0;bNQKO%ssF~+}@eJDWK9wQpX@ErOCM0bSVA_7h-z)y{7ywLn z0jB#H|L&a?i2w!AoAF^TH=!2lNi8z|{DxOM(9eB<@D}4czw$qbXM7I;eUBN>7&(0} z@#<~BlzWU{d1DRH5J~`{oN?c~`^Z5{I0Tq*l<~rI!~fudwu8`igaNuY1G={{e(u+= zev9ZH0ZfiD{(~)d$i$@N1Ev%(UcMu@fVjUL&^v_jF7-br%BI|)IT`=vg->jtMcoEW zyT`b%@8(DJb30(#F2)zm@9=Z_c>*x)G~=H;)%nH&L$3=4}{;%IF zAf`>&AR5i^-@f;QV&b%OfUb*-_nnwSYjJx3-G0XZ@aNS;pyX7*ydo~tLvg@#l&xH|H~f2Pd%Wwk@1iHbMSTIfpdVK zi;S;%`~E-B&x?SbD~x|U=@;Z7`$_Q49!Wq(F`V!U@J#^A48?&N+bY zYR3EY{NpaN6jx>6BlK(s^z35%-7kKesO#MT=-tft#^lSS`~24c{WlqJJ2SA-1(;0# z^D)4*0AN}>#(Vbo%g1Te6@baZ81H>#FganaD}b)+jBh)>lY}vO6JYXI#uvW3D2d2j z446{JczyUM-3Uc10aMp7p82TXWq`J|(6)i`w(lG!Q|dYe=sL^z2z>l!lG}Q+7$mo; zfc^}|e>(N^+cjBYE@O z7tN9Q;`{HB7EdMd^)kLUXCtY6NCgBk2ut6kWkUoIVvPSG`x|7S+}8o!w-~?o$K!-S zhylV1#!oMwRN(?lm@4}sp|1?kH;D0mi~gerKsD4e{!bYJT4mriVBj9(umAYdWMO^x z0eue{f3NE@!fJB8=##uy zBz=1TFy#>AZ@>51rG(v6fT?F0|J&}4KPAf40D2o3|I_Dw+(L|c4A6gq@#IS{=aQRx z5-{-$;jch++u`qht>`9!mq!Yk@omXPg8+)5jPb_y1r)g?R0Af|Gybn%?M3!4VKrdF zI>x{G>q|2UL&bo}WsGn9_`F*L_%1-tUdAsr+$Og0mI8V!7=O6ss}#|umII~^VLXtq zd}{)2Cg%J zuJeo^KK*boO>_a!bD8n%SH4G1N#Y&A#P=Dm&HVw{%H&MIMX^PLiUdK@s}6yvD}=e$gW zz9Tx(@RMKq-5Pqi5-_cb@t-A5AuR_5fMoW@9QSUc6_toaTReC(JxoAm0Vd`${_rE) zNlm3(CELUJw?5XB*w4QL(7&4Ts+P*hlq|JJi-0=*YxuoVCqH2fB2tYA=z}F0Cb;be9hwD zboBxz3<69TLHux?9A%2+ZvrOYVSp(fz!X3IaTGA+IO&%QqJanh!>7y0MNeHq3Y75` zpDMfqkV@+2S8o(X0NSoW+fByjZ0Je`K5-mi;$+6F@yw42OAVxs7++TNt$9SOcI2or z?*H-=VGX+iLLuWb0x2hGiuHi0n;8G-jYf*K0;d53=NSL=Kh30YCSep{!UV?GhU>_% z`Z581IgF2a{!S6SyZ|sz$M|pFJNgb0>j7ZeW5!QEKa(^`(gM-*i4Pi`xR1bi2$=kY z@!V_e@6)_J0aJ?^uedaI1woY!NdEnMAN><47GDvduaxmMzj))9^zBi=>d+_>``IDTR!`^QGZy0ot}e+jhpge)oDV z0T-jNjPWn`J2Zp>{;q(&LJFKJL=P?A48Qz2S;mWiNms}+t_AdOV7w!Ifx^qc2*AKN z#&=xqN0OH62TV<8{Ks93Zn_`?vWcTk6N57T*>7BLB7!cUn4j@3-M-Y9R&*6G?FQrS z%298ST{;VxKmlgrD$#t6k8jvT4t5|DFp$Ieri*8G5wUuc+sJs~;!hFJcrpMz*^IBb z`$Y;hyz2qIn;1`i{?CVqlv4qHvlt&XzYal zt1cDIdH8_MU!_&MvP92L{!aV8M4*IJz=RCO5B8cwPJ#anp#MDMKkPBcPftGpOnAh2 zyEnHIi2@e@1D6?}9NM;!a6Ak!bqwQy!2>T4Jo`jfO8%<_KO?>2`2f)Ki1DvKKkq!P zy&lll$oQkOK356abW)v+H~iF1RwpF_m=a^W>FA#4Y2>|tsRtOp^w#fZxB%03%f>gD zc1Se3;rzlU7P(-h=mCqc3lR1)-ecrPNygoUqA%y)`h4XRG}1%B)F+JhUA$RP?>b=M z7UMUE{*pYE#9Yy@j}NPz{e1$;BYJ!BaCimzPszEWpBF#-kpGd0xdqU>o$)PahSGu( zFOzO$yxdzzzO!#7pl=Q1KU&_7Oqq8Cpm!YOr=s7eO91pf0Q5d4ZYq_X0WqlxFli3` z!2$g)V(7O3{f8M}ko~1TG+;6LM2vsr-qx=Xe2?hTA5)+JIz zCl?|ik2qVLq+qTLi9wC~gZL32g{-OCvN;qPLfr8(~r!!cg}W)u0RiAMkv z-)8*#zv*y_7IuJGhw)+8T@yUy<^p=}5$Z<)CQYC}?gJ)0Bn0gO^zUVVyI=4r8fFV% z;&#TntUS7wejcQe8Go4e+s*WIKm8NqLEmpbAkkR{=wHS7_j6$qfxiYYc|GHM-}vPd z0{;qN>UGA?bU%6*pluzrZDjnqXFJ&)*Hv_quRt_KNnfeDdSra|nlL0eu%3|IV0y>`qUw0eWsSUf#Ps z8EfAudV}$0Up^sH22ns*#&~+t5%R2H1t6?u{N|#2zaSv90n_prKl;Mg66xnUz_g8w zFaM{}cPJ)32?*qk!&yMM!1!xF>P))PHA}QP=E=Km6L=}dXaS7R{A2?uQtvL&u#{&W z`^rKR*OP!rG>AV&z8d3K23;cu*y9x)dHKMh6NDq$j{H2vGds_lPH>h2LIvZ$ee()w z1o!|D9x*;Vd+;$gplbx6YaE3MR{?z#4*N3!{W*+JPB7>#0 zZ9CC1n)iME51*l*5z*n9cRz4-Eb&hvU{Vp|m%g%{(CdEy=zq-kqVJC;qn2_LFy#*8 zeJU%j1GJrhw$qF+-uRUlXjVU1Y{ zj{;??%WBkdl{P-US&M1 zV$vCad?;Xi+tf&@nC5dk(pr?ufdWQje$1pzgjX#pAO*;jcc9!wGFLj{cImHK< zlFE3WHQyn>K5@P1|H`{myiW1IZzG^@3*)f?KPOWk=mr?*$@nL~{O=Uy1bT{=jr{7u zHTwYC_CnhM#$Os;K9L~wQUt~LrO&URpMePZe~kZAUhU^-);*&8AYZfdJwk)uFM5IU z?ipL>)61(x6Gy%tH=m}LD*;og7=QAQKmG(j+gs3fnDKLET^A5~?-64%zW+x<$;1H% zbh#Lx^X^;MNwZV~rq(llzv3!|(5d9b_!$5GD_<4~raZvZZj3h{Z~r6uSxB0a@o%qb z6ba2ifJq}5zt?HTPD0EXz{K;6Z<{%a{O`2QqJD*YDb1N-qWgQ`#{;<=irI1bpj=(2Rd!*_&T*119+alhVnCtprRW zf5=|}=pV-TKe*C=?*dHB15E5jj^Jv*)OCz!y?xt5vm62p9A$j&%HrRUzgq>EK>moY z9MCs}@w?}L7j*$9BVfQol5!9*_OLLfSQP6JX+2g0We22Ii%yV}(t83o!XG<1c>nU&$6EUjR(L%=qYqbKj)d zt^#^*FkbrI&(0v??;wYg@oR4s7tqg>qGuxS_w}riw2nfGxEP-ntv^S+zyUoj#uGZe z{?9Hz&l*6_dh*Hl00#CmexT3Bf1)X-0(xgL{(`4ecn0;Noik5tU(u8Fc~??%M4738 z{#lGacjDno1m`WlTe_BB_KgDcObF&)Nvkb`{!gF#dSyCNfm+ZGi5bjQ{e% z5OM_)iUAYK7~ebl3nB&6RkZ!)Kly3H>%_O!fGH%-A8*`5jOqnU3J{|%158>)=qLm9 z4`Te6e>?vJfON=YeA|B(kqhJ=0q7pb`0qV^-y>OHLEOvu)TS?zaHqZxnEHV6yIuBV zk!jlj=o0(-Cjeci>5m6wu^6A!e4A*RRtA_hi1CkO`=1chJ4MrUKKPw~+e19IMYL1q z8-M;+dYXD0F!dhe+b(?OvjAbie>Le}RuL<&284Btr|-K+k(DbI(3Qcs>zj?)#1qE=lTHv48b!Nf{(j%>kIA1q z59q!`9JT>4u$l42Z$6$w?~edXBKz&%DViShrCWYZmN@khU@B*PZsoAMGz$W{J&ZqG z^f~&OSO=K6i1C+G|3D7D&kN`aFurGNDp@JG0|@UkzIXa~MiPAjFmRgj8$TRPwl6sk zFu5D!n+sjvBx)jHs)zCQz5a6r;dDO*9gG)`EWJ!xVgngqQZn}`=3;z?`;!!-rquza zEnMfN(2dU~SRkCKLiD6fwYrRe%X==??_-in9Sr025b|_AeFvj`ag6`t zcUDm(m;9Iv1>?TX)gJ@Mg|3X(d`(EQ{|R6+V|?2?tzV`Wuanwiyi?JP0kp~w08<_@ z-seBsk!|&k0`yK`{I3tYku#Rm4KS%Er0H~Pbcq|@fWAp|Bi6i6ELlq@$&f>h$qsH0H(do_@4{@gW@#*T|obR z#s_>iOZob=~+Neb5h zrmkl^waZn~e7;6NUzG9cYyTH({~oSm)xC}5&wKnn@8|vgq2s<< z_kCUSnsdxC$C&dR=XvA?Acl-+!A~6qxyhA)1i&vHQzZ^Mqe?)ROP- z_2=w>#rODgCc+X^L_;q$zQ&EDA1pXX^p#e|8m~LtrWQ zu<1V3n%2KEPx&wfE5L$zqNi$1Xzt!&Dl9rv^nsdZ-SfrE!{U`h5B<2no0`ajC8~-Z ztNy*utYiyVvbE^GHV^qvirItn{{u zzE*3cXMurySfHb5-;%Fgn8fz z)*7{ZWDda6M?_y~`_1n_M|2Y%QkBTL%sPrd>+tH6Jxxf=fF)*&Hh=v>H^}q~>SXJ% z&wjZ92q7VQc4dpcL0C+SrT#764;CNfy^s$(hItS?q6H^skv3Kmt-{r~#N*Pv)sShS|-oakR3RVDVo5B%5fZUgn zmYgGcB2;8!Wk7^qDTb+~l(@Vc9mKLw1dM z*DnvivPVRB_1-ui$n8h&uxNh2FKMOQV4>ZjZBI1a;LfN$EYd}EL;Yw8{cu)5giYUP7?j=^AY(z8K%RMKC0OOEE^MT(Dor8i)0aX{B_{dlicGcx4JJC z-T6(-mxs_ySZI!D=GjNx#>4JfVxo`qDD3A$(*+jk;f6gA7GEH`X3$H={0+~*q9WS2 z@2G7)Gg`pXtwkftQhx!teaIaW?Of`R=PtqKuwX0EyGFF|@IKiSmh2~bYvaE>xsD%z z#gB+SHf^m3+^Gdr=-2wkV}2Q!2Ma6^ePZW6&n=^EV9|D><*!0jpVo(AvE!oqR_*ff zijRiHCy4%X@&(W06D?qg)}kYBZs`GMRAI4z=%OW4e5@18VTo0u1+QM=Nq8#HjYIVK z6Oa2?2V1~`twrzuw)QDE#M-cUJvYRTutYb}Z$3?Z@AoX_Gh6hL5!2rC_RNCC=8BfD z_pyiaXaGYK(Gy*FUFnZl1xu|HoxXY^k98-(LQ_SD&Fl4uU)F?$>WJ3=e6HUrG!_<` zDB5JzM;`$#&{`A=u3GI)8w3j$h#pDK@UaTch6U&OIz0du87%tq10#G=1eP9tZcQ)XQ3 z4kWk?7F;P>c>QA^`D=EEg?ful?T{YrH>w0nRuNq{{ng1nJ*QK% zSa71~L-F05No!!C^`hZPm)_&QjlrTB(JT7j;%$h}_DLjqar;JonTWv>8PSoG-|*x$ zFc20PB6|0ykt;m#8x0Fh@Kt!PFIS@X-I8~E2o|mk3s>_fs{j@r?jO#;BJQc917Xo2 zqR+H0@OUVC1QtCZdPk2>IaLP1Vg;gWOJDBRA5Ou-B}I>n>(1SVv9RPs(GSKYOS>bP z?9Rkj7i(RsX~`zAWOLE$L#1W{ zDU=k=dwMUC+N1qJ{*dziAkqJf>*OvHD`8kG+WF$0mwPvO&qPEYJA5B|WfLsARdn3y z>u>Sfm-Adj^tE9|F-x2?K7}+DbaPi6Fjb71j{TH ztyVCOyT)zZJ&WEnb!*c9S_sQ56n&@i1nm@<4A7C!DByb=~! zD_Wvzy_){M2iy`wZ@u|4_j0l6?xaLlZFz)S`5{;|A^PR^?VkiN1j7WmS;);5%`SfO zQ}2*nFzgk5dgU3Oajk);jq|f(ZUIRJ-tO+7}|?={4nT)8`uvE z92R|LY}1`SUcF(V0iq|Wj;H@v3CnnxIeeT?<3FUfeQm#qZLRuSF!)U?OFRYN>K6@C7KL8tt3iHA9&_$`YHNoC{0N7Y*FGaIimO1uVNpbVK!v-7!u< zZieXi0X60Txkbn=742Phi+kq4U|3+NXtf1h-|(020}BllZTLk4kJ%zEVUaeXf$H-< z2*V<$VG;8Q(*PE2;%>1$EZ)VN<8h~FPKm{^#4^!e%QWBXZ&Mx?t0Y?Crpmsi#hSxn ztwgUs{#-Q#BBIZ3zqTIG8w2F*H~YUHVQ40L?Y#Np+$~LT*W_;LC@gbI^r2zzwQ^@R85W){`t>J-!$r%$qUA*| z%>UWf%g7p7WW8vox0n4p2n#fU1)94D+6s&9@>ePaOO*4#06tZNi(tW}qLn}Y+5_Cf(W1I8_gpYAiY>eJOYP zM!`bkMW3tnR9g?#Ho(H0eauF}qGLsS=l=6G&<}$|m%Tru&|5JChGC-B;#a!0Mo+_{ zCi>OFl5Y5kwy;Ed(V87*6V*8%hDD;44<*0y&e#hJ9uOV6uw5m0JQZN!Joh&PVc{YE z;W#YJ!|C3z=m62yGnOy(m#7Jg)bYGwwQ^FZ%VVdp%*!o`IDR(HD+4 z@x(vW1s3WdI`8I;&-&18SZJQ;h)=F_hZfok3mp(`_if)xefTE9GE+tSoF3s(PBssg zttwi-&YUtpE3_3|z2i-Fhg}I4_mwPB5|$|IA6mQj7G2x3^Jm_TM_`E)qSc-oUES|A z0G1sry1(7++|pj*(Shi?IXUxgtN{zV`;T~p?b9k+0E_x^p04NdljxB$RXqZV%!5T1 zh%W!Rzei8W&7P!))_Q93d^e4G9x#i(8$Q(5=Rr?cxS!~U6({C=GMV#Ot?)rSnDq-2Q{FyXnoa^fuAL@7^o|ax;*dEn5BYu66uICt$HNqO1Ds z_qaN>AC@{Sdh)}O+^{Hc&nr4}>zM6sUaer!wxXB+xOg2<+2ez*cMkMLELag1tSs7L z*mvdq)rNXFAo|Z>BRBKNFj!=i=(x&9xWhFamYOAc_To7W+>b4R1(u6Geq{|`T|+(G zmxFqqSNC?9`qTr1QuTIoxdIy z*(iGca;{gA1T0cQ^yifmzx7}3g9Q(X=Ks5OJO5S0gC_q~A6R6d=oeR3e#!f7iZ5-V zKi;&tuaEn1Sa!5%%Q`Q*`;G5|#Se+zx!`TjDiQ`uhD0A8dUr$rawAx_sc4|f&?f#; zn>~*dt#bAB{y|uH2Q0kDz1;>+^*ybt49iv%JuzbIz24J@VbSBFnTMKqB9*KMOEwlQ zSM=odK9S47P+qjwqoe=fUv3JEwh#@(WVZIJF)Xu8wD(10J?ag$ zfQ4F%?#gel!bf-pEH+zoV{oeH^2r!1nGwBe(7dVMQF*XnRnhM|{qqUWM|Qx1-t5o} zpM9ctw+^}E%r1jvSBgG<@w4t9Qj1}!Wuo7o-@Bi;b~y~IM8CYX)Ctc@>Ujp@!QFUR zV3KHff73g>ot0pjDxz=Q^oA$*p)Ih`4$&nOo;~39KN}YIxqhH?)SKND7Hc88zo64$ zZ+3H7vXyAR<~wTpx)|U@ZWZXrMih;@$wHWI#~frtr0zVY}%VZPxKR=-}94sKF5}M zL@Ti50a)^g==pgMtn>Tr@sv&UKOb)5`RqPe^pNPd%>2tdYB>yxc<39g35(Y8sHGJw z-qt^yg2mOH^*mT&f#`*g&6(ownh%S06uqVU`yP{IH^Q=8MEeh2-P{MK4J<%Z`F>dJ zu;}?gB6>oTVWH`wSN1LK;cjF!EHXi~dfnFsd*cVd!h^jTJz>#)qBFj`+)Xxn1eQG^ z`st=VHN58{us}-A-gfB-zvXdQ=(OmEFOFR7?WzNdH4t68?ypM%$elp$j9bniR*B+V{$euIZt$Rh0bGA$c;yCk|1{m22a5Q^I?HS{$Y>j8v+Za zV8N2!hjn4$M*d+AEL`XdNmY-M{KG(4#A7L6UQ!YNkHOMBH(vxxFBNU^)k=R&G=ZVH zXw`!2Siw;WmMte*w0wyhMzR?!*;2IBZ}Z(-WV^t!Jw#W0(s6qL!;l;0srhUe=7}z- zKhtB6KwDUV2loeHu_K}r?>|U5X&qRyf#}hN*Z&ZJrANZjp0%e>!_p@D`Xkpo1`NPp z(b_ftG0X>f5iGh?^ra8#va)FtEV)(mA14b;a+4@++pEmuP>1?qWjF!-ivF93}_&3U)~BR)ZbOJKp}qVIfn&n@2Q zEimj5&GuGq=5~Z7yNQ0)6qZ;ay7b8;OD-0`B8x?z|5)8+ zh4#Qg`$d~2KkF7oZas1v-B=YQU3EYd&lmqnN=Y9A(hUblhctI|=Yi4<0@B@G(x5a) zgTNtO(n{kYB`GCGch~Rm#~(LucHaBE&zqguU1n!y0cYD(UvO~R5=z;-wW$A=VfIbR zg5_!QTyrJcIf1{8-DkLK-4d$MlywOmbss35qR%3&FrsH#&oR4HUPLg-$6ibv9-54E zMOo>`$SsQnB`k~xLfo4XC5M8$JB2}Pkd7R`9cvg!89t_epmHVtrk8gKgpV6I!B?(= z4=GJV^ier2tzW*!8~Gcj*SZ;Sz?O6IK;XD&)`=MtG6d^(hqqtQoRLcKlK?2#<{v_D z#Ux@aO_Q~t+Z@~;II1(jOb&4v)&YMU^j@#I>7Rw1k^#I=GkVuJI($0KVxB>Tbm!L{ zY|UwaE(&K;$Nm|8D&Y}j(Z=F828oBg^`@(>(Dg_;1CctMj5&@QoBXK78osxSCtz-; zds@D`Hkc&?ypQ4F+?(??8sH`KeESF;KCbz`X`LGMUcE!>kK%hiNI}WO0u}5f{_Sut z5hgBIWL{R-lCymzm6#pWYDL6olk2*)Dg6d|YL9 zGS2DUG$ClMmfv;@$AF&-PSL&Z3Ac*^`}Ap zLIQvRYunvOxO{5`Dr|}n?lSFsN=~(ii{nI$_gK_WyRlsXJ5zyos@7lnkX?pYVZ>hC z@BcE8k`RqO7}~!T41Y)Hn!QL)*4v9Cz6QZn=5qVBf~UMsd=I_*InfLI1B862d9xh| z8>Dr}v&$wZU{4;E4||99347edc4JS#u)`eB#UA zHB3<1M_-kDo^`WrMQF9P$$5gwcxcI1to8i(5iZjk>vC~H74DQ;v_E6;y zDKA2(qwhR3w8sNB8oLkhMdSsQyy=}>0`=Vkju*cXWEis=UiJuy5h~DJT7er@J{cwS z!88OQF05M= zo+y+_@7E^?$vK+Eg7sU%H5;+>Jc#$v;@ruqSDLOTmU%qPo_Q68)WNzz@FG8J@4J`V zcyYJ{c$U<5hn-Ut8N*~oCr4Dkn0*Z83zE*qy~*|El&`S&=x{;ZW*;TW`9If%h)|Z& zWGTyNmQkpu`@NL24I88&2Z8Ts=)V_4bpWqGhzmXJC|jPP0e$7pQg%uL9My3nnB-yu zn>I*Ix+eF{wz;6%#!(1}CJv2Jt}l{qkfaBQGaX7u7yREQi>|xqn0MeF$ z_-U4T>))^N@_Q`Cf|qAA@fSWPe^}%fuxPiVwS$9{R${plmrrR0N#~R+& zv;`YgNXtjWZb0BsgZLsgz=^}x`lci6K-mK3{XJLf8Bk)8vz{6Vhny`_ii)A|OA*8W zO3rlr#FKo6lR@Cfx7oyfCn8|BEeb`h&Z0GL`tpMvdOPvOX272h(o|x*T9r&Cbs+3o z1}=MWiMmwz*>~~@kw9wLaG_X730T=m%)?byA?y6}z3K(32VCK7U|=HPFGI`kSwHyM zeZY%W!p0K?8TZ4kCVvFg&sQ1tOrixnT)k$zFcmhqjZ#eq&-s?k|QY*6)`Dd!cVZ ziTBepoIv=J1sZ(fOAIDjOuED}v}kbPwkPRgX6^J*=~HN2#p|u z;yW4Latmc2!{!*_q(VkpZm;&u5cD_aId7kvIlUNZAX=)a(!2eT5mv$xo53b3*z;Bw zEzXIk)BoWvu_KP9S4$hz?th-K^=q{ncEklA*^(GqkCTR}gxJo;opzmL3WQx#2nOsn ze|z{|)w9+JdfO1RATOzno>4(JzfqM-&5o(u6S@idG3wmV=l8X)j1D>`=O0l0*vJ5! zQ+2nA+PCV^RW^f@LRp)`e-(=X-zuI}woc5RZ|Ox8mLl5q<4>-D87DfLXSZd}pLWN} zpU3F~9L239E@`8Bw2D9`4;G7=PKgd?J@h7V^1WIXU}ZdN*JQsaBA5a>-0$I)5C?AD zt6=cQmNA_$a6o!YbMV01+o*Nem0j~^5g4e@Ho<}~pb`5pGU75uFR&)mhGvx-_JIbT z+Ae=X|MA!BPl%Jy`LjNBSoa6GSHrzv^KcWa+(!Si5p2{L&J#yt=_^W{@tNVqao-@YMH>QQFQ?vyZaCT>?2OJDj@SghJ7-=q&A zJ+MC-aCu2}PV8=T3$wZy39((XiUg?cdln9i=5C@lAd`IElD4iL1&H?-#3$tmG4i7i z&jA;#oT9G)RGhx1GQQD%IfgKABbv$!7>Eqs{CMh(b$D+D>sEqy)XaLEe0vQMX1v*+ z#1yNFA26+pM|=sYb#KmohoxLY+PTv+`Gp`GcSMDZ3gSc)*S6sI0K6HF#}P}CH+ab& zZEUpp20!HkS|l-4GE($$wb>q1*^_8V?_h)}uu2s+st4cO|C}CJMF-n^4Il5)%lac& zHxlM{sb^(YhYd|n4D>7#IwS#>LS=WBwzm~Juz<_&+$R>t4`4E7rgWtDUvCX*;^x>P z?{g7tLiV}t47M1`jU9&n;gjxqIXZm<4!6TW*gIY(Pu=gzR_WTJs znb$g@J-OB&xPXI}-n2l0{?x7mn7cDPP@Jr7Hab0YU^qt5cRg2ix%V1&MGvRYPb=Td z4ke&^tG)vdxI8YI6T;N*Xe$A%Q)sY?Nmjjkz%l#G1kEJP*?M@R z^9(RdTz$Jsp)Q$vYBmIh`WgPnzB!=`9Uu;D?t!&LmB)y}K&bGP%lqzN)@RC@1ovlC zEZkRL5HD~p08|&db{Q+AJ)ur36?F$taHjf0cV?P~5u`jBG1bm}e$La0ld;Uob^LR7OUp4M-GVg z>pNyf0)OLYP%#=x-?|#GZdPR@O2anWZ^C@LLjypKmtqqNP;FBm1&^|RK2TxGPB5*1=7%t=>Ennv6JZ#phy%@Hz7cM^24TktsXqm??(jd zA^^OjpI=)!UAV4B1H?uL&b$z6f40%5MFoB|5E&m!_Jo#MEMB(hX@N(3P+l9J3fED9xU;oJkulz=-W;v&~DqSYbN6WG6cCeg_vCi_wBgS{3=Vjkq2{^gzuj(`;iQ)$~$Esu5tx@R_uhicWN14T}L-9?L)a3eWnPkd{V&aJ5;(oI()MbMX5mQI*QY&$gib7=;;sn(N&?w%Bk91FNf-$Ls7$y!y zNCC7)YpxTt;N2!WmGJ>i*q;~hqtYgcd~;=SK7#%0hg<0`F|;@;QqD{-VzVSSvx;kI zw#m|ZSSovHiD1k}pN`y1k(pi%M$t=+eU|%iV$+@>D0k3lmb~9Fo5TQUW$v=7ee{S9 za#fCas~swY+PXTJ0H9jjX{HH<9ce+lBWiEJP6pq04llo$xGzjkOL_#&VQ1KJ#PZeN z(o-0`i2Fj6dnYx;U1Vd*L%0OHIa&`CAqM0!v^~s4od(cn9^Yy5Hy*0tGorpR4H1W~ zc2%AxnZ5+_E4h0#J1l+dt2SHphi~jqSq3^hi)#QFQN1}O`AO9Y_RI6Xa-j8k*}4uL z;g&d1R5j%UYB09Fg*3eUj1xCX)*1MdHL=!WX^AfOqY>XMC&N!_0D|6k%}3oH_!;XD$Zxu+h>TEZY%iPhK6Vgf|r0+cXzH_V+mP)vPeIwTHd*~NWW z!n+{>7D9ilI3K>CH$qc(CRz$yO8qvEF4%{%0NQVG1tex*ZK+GEun5o}8slx|G*Xf!^o>AjpliB-1xe8l( zh9tMC?T7xu!T@ZK7Y=HF^X(KX2|w;;C;K zLHjc=Di5=x4=4+!bDW|rqf1^s@_Hcy4$*qMlEZh6k=?v~paqt`J`|@fFdZzRIZ>Dn zD*TWoaJ@#f^I66+@Fp>|^57RV!3=HPH=y_5YV~G< z-jZh2u(dh9KdqN?l5mX!(bR?FNgX_QWdW_U9&sM=JGVFkld3c%8|j=CXw^&1CeW4K47%P6G-6YU($v)+H>bXb3^d%Mc?}+-Do& z^XPzmy7|A8CU34b(ID<$5iRQ@03T(5pCS9rjqGpddrrY_`fRX`(0zYb&i?ZePvQWV z6Mj9&c*p=YxZVF<`%gd9dcWt$cZ&h*zkQJ}YtuK(%ZA{_=P=W8+{hVmd~EJ!3p+bo0@EDx39?LKE*!K5+;C z9)s-(!sRjbx~5G;@Bx+VH`@z}UMht>u%8<6{QQaq5i}hAun321@%#Ko7Ev^S6_$Y! zq%GODiZ6aMC|0I+(+~>Bkp4KjSQ_DHPBGE;rr*rA&Yj@jAaHxYi74dTRuob38KW}ui8o1 z3%4!KEH&}2(Zg4vRz%QxO5h0{&TM4FZVaHw82on?3wC7*7ZH*ePubQlW#r~ zOuRrSpS7ZSBuX~d&HdW8)5MK9li#Z4wtwM~b}58${NcrnPm(j8=jl1pLkIPh(TNp(!q z&%7{P1FhYg9lD!`$kgoMMXrsDSiP32*;)y2QnSKgXvtxvZ+oJ97+ z@U8sW_=L&HJHD?o46^X-(!~SjPl#vAXM_m}_xmmd81`|?zFW09<_V@frBEg%q5CqE znqc(V=m+wZRfj;|XTVNKL!s)!2sdd4Rx}sFCst+thnXn3geg-9=#v=%agaS6R|=W&0XtOB-q+&z&oEDP zYti4_AA20c%2b;b`ol{YZgfub<}mx{;91Q^JEfU(ILfaGa<%Ih8EKnIT1lapw`%uM zK>{?9AE6xICRo-q&4!R;x(i!?|CluO8fGDryz+Y8^bR1&Hpj_lmprMabrr~!bpkg7 zOW)-n{&5T23J~)zw)IxB_|N|0D8wKK{%(~6)~w(D2;&r5fK$JZQG40m+2)sd4(pbK z_cdlMA-LNo>ha)K6K7}XY)#~V1?Ks!?8FreSNY^OOumSD7XJt=fyjugm=`;u5-UHB zS%JPv4IAs9t)*yiNv2ibF32Y>guQa%-!$!sJus!{rl;;KS?HO}U7SBPBd@tc4GcyqWe>mKLfTBesebh}&MSc(G zdeLtg>fvUwUZ&JQ4c)VwqU6gkn5h8-7TVm&3GAz0dj=adg%6tD!t=XGBaNUFcOpq0 zw(Vwx0Z^8%jxzkDw-Jk?aOd^x#rd!}vmPsGy@WtMVwDYcgbSCXS(2(D#22TB3hg~k ziCZ=i0~d_WJ~Z=D*JEb(g;s$M+b>1dbgH_E1VBMzdCimD_&&8Uf&2yV`iGf%vpOHB zE~Qh~&|_QAEIXVDKkd+2s8@a=v}j&uY*K&Uu+6b#h2S2ZHlF$h{AHCK%lz&R9}HUS^yeHuxT{ zXR+c*tUeRTv>VeD;2G5{7|@IA1}7c6m^xbFI?5yJtXbds(HXSW``V--$k*gM4gYfh zD}lK8F=tr^{)l%At>Nwg z*o1~_1qvb;9?Df_#E7#5=`YT9C-CV#kK-hv60lpak|59(M*upD5FF}QDLCSDBt|ox zb(B&tPT-vJ*-6uv-uR|4@S7Nk$9;Sffr`BEtYZv;eNm) zz)+J0;#z>1nz0gl9h~i{;(io7ACWh85Q%>2vnN8Hk;RoIWH)EAtjS^eSpZ7P?a#S6 zMvWVXM;d^bng2G&#NJ0V4T^JR$|_4jUhXWV)$R`@%mCgbn=}`_D42_+mZs7ZMZM>y ztKT2YYJSWfysGS>#|2~b(4#LC;m3TgzLvySn~XEtwt_xZ=pOsf3SqX&z`v!l`^=NP z#f)<#NXYAQ?aDqegWRdLxbcV5=HLSFzEq|QuN)2Y8$E%bif2mksdDkCAVCiA9 z=I~y+I)II2f3cmZ&4R3q`$V3u zdMnjf2p9+4wM*fy{>k`-axKx4kA3ezpwI9+3!JJ<&##!s{y!W6LaNtdhmOvttPsl% zgxl(0$Br>0(>iKs)Fbxg@rqt>$th^|-DQYh@18frGX>Ga88)QajGD2;a5E=hRr_qG zAOulf+w8;mk?ZvtK|tVr_Pe&sKA9>|5Wdmo{+M8-Rd&pbg1a%s6o?A0HIa~ovmr>^ zY~UX7SXs2B8h@_)bIS$Y1Rac{e+QpET}yz$-sB-zA?_WBdWMR@q)K$i@*qly~1GcL6J0&rQVa3y&Oivh#> zwcv`X7%MpZ(r%ia&D(Agm@Iv-ml6uFff{{%xw5cPO?YOM5XDA<<1?Iwi|+@K1JUek z_{us&V_l94l0mIt*iS9^w1vbUb3^P5AWK$zbCNFS`64yAin`6A8sCKw_-)9U7dPW2 zlPJq0+XUd3gV{DcdzKS9-t zza;RWzs%qUP>)$Lqm?LUGT>Kzcb(J$_eV$5Ay4S#rRe52V!D?^P!HKz9v6p=p=`uK zD|hOiJp-^4eD+!Nuw%2!2vxa;tn+R=VfS8o%nYsvt)`}Yh~UoLHH%4rg7v4^@HYx8 z5gq%)&sFlC;fw=1gG>vvRot5vIuPew2WJDoTzq9Ok^tYq!@M<{zumkM&~tWoQ-B*v zhB$-oRtoP(K$BXiStY)X6{H{wAsOX(`J7ecRmLk$QTq`+>iC36CYI>GOD2DQt9CE| zmsJ}sho~j5Hv>&%z#Q=$3kx>x%8<$g#CY=T!Py0WRLR>IiH5q5QD5ICFEGtl7|=|d zK$lG6c~Hu-&VKCqBG?=oTrhE;_VUCQ;vI_MuvtFcS+CULxXi!NxFDb=8#TIg+;ewySD9lJy z?2Cfs@3YriB&oLzi_L5$uTqYAV5v+jo7dJWBhOXUoKAqy z_JiFqqf{d+@rs8&qGDY}hUfb*?uFbG=NMj#->%EJ)Z;-_YOO7D?XO!bOy2-%S0Xqfw+BOjiz-IY~{1WqMm8 z_d$q%4BELMYkNiBeFR(zs?FU4dD zI6WN8orZ2SwO9eoe`YgGO4;b7Yizkz2dG=08?SsF&cVP@OXdgWST#b95mbJ_U#%Yr!8~g)NZDcNfLs^nX)Y|KphQ&XJ*Dq$WKkh_}2ItEY7%9E!!Fru$y*4e$7}zApJS z_M?AwzdjGlk{o};Y*2WBvB{fIap~s=hL|_8n5N)*ae?RC^vM`rOa}1pe9V)QF3rg{ zXj9&1PV)Pdz22=c(lK%<8w&PH>Dn@wkRw@EJY`w7p93jw>|htnO5wY5f7WYKhbt^U zb9T8b6?*PLfAui~Y*a#R`9@icYn7?NW#w?eXLjKLqC!<>59*YBHx7xfPXnWh!^k-! zy(Z;0-9{FAS_JBY3@-s9N2UpH#J<=U^kd_gmRl*vy$0|n35WY?_hY1xrd3GV1+`|X z^>X^Au$##^3NWd%pDFW*c;-TPenT1JpXvOuH4 zqr|s2T`@+|U^XpZ5+TI$NBnQ{H5P#56qnpRc-nzw&EV-vnaUv`_(JQzG$|!)Bc-1! zr9Cd^Q!#(36bb1j#7CB#g?%`=IHUs=m`;C4!}N@GW%S-h&mhG%+>mVXrYMj-g1LML zq{ttelhe6BNw~4h*q>>yl%}$w$VoS6bB;G3)LRJ22Oy`a?D~0sQ}V-0SS;=SCL@Bj=jAW%*%I#-K`}=i z`C9U6@da5FA;_2NbiHx0j>R}ztFK0CTdIxsn)3r}^n;Y*H8r#mdC>m_>WrMps1g&lh!BY(LpR- z_(DVF)5E7A-m9@`pm_5?Q?%mj>G!Z2_r{IVMe zr#zw2jM6n}{3BuDYz-K&OaKBmz38Qg882%hB%E3_U_>Ra0LRRhj`EY=#X8zfXUI#G z6{A#;RuHPXVkrSgYh&@8-(L$Fhzy~~vAxkcB$AOEVz#FsDWecS{phdupMZd)Lj7&f z?4(t5f&qw?RI^}Xj&3g8&oeEx=oObpvI3JLiuMdTVd;16mbK46F!3pXL-j51FCvV&mwe$V%@^+u^mv9j@ zllmz15OW_?YL7+pqJZ+XcB8`yrliXXh#b12{cPxxow^Ph)zI3t!ctCDzYrB%VKjd? z=+pBLbI$+5lQ)|1g|XNhKz^-2FO?vjF^$On<&-z(s+rN1$`TnHXDQ977oMY7{GD+l zIOXt5BGV>s1^l@^vjH&Vp%|wuR?KQwF>Jz+UTF}fl;B&2+`-`TXhRy9R@iUiQq_h( z_)RHKZ1P&;ZT(!1Nvo%(#SSgmWly7XMrZ4skJ}E7|DL7Sj<;r8#?x?VBB{J|W6_t|=TuaV2vzMfm=LnZjPJz^wibv_PDr}6!j7G@K~8fUJfCcicql>QFx z-S>&s?|3-7MJ&58ezD{v)y*j%8)ran@T=*!m-BYa?<}u1ydkOXZxC$d=jr`rm?g0E zIj2w~8=I=Hz)VnbT|(vI1~E%%MldLa8MYX$^zzGXiFaI0RonI(YAZq|=~0|k{=pLY z-~RU>{EcN#>g(e}BGQWMiyEH$oM5q)d?Kn6A5v4oL(iB`zWX#ywkRw4!*hl5_ZC}k zA*4p`bIfDK#6)}7A2W6%qFcGbS6_p)M?bOf>o7jhxR0|;oO=hC+4U==GGx(Pg%=Sm z|A++)4`@t;ofD@qTX14kr9+nGD4Zv+Qp)0p;s@ZN)WQ#xIBU_a%;K%aMuFNvp=Pl~ z5t!p95UJG{RLkqR2|Ck7^#7r^H#{_76B4bQ2ImjxignU2X0dYG>uafnzA8lXPe}^) zf1I+nK~^M{0)h022z76gMfTVIaQ-{>ABgs&!(V4TChE1!UOeeJ9rNw@AV&- zDqIjh(8Ho1XqTgp(jU1K9y3$9M`;5ih{(1+-Ra{fV?4YO4BV@2Dv9yAb51m!ovW2+ zOHxjWc-($YUGiS<5- zPu?m(^Gc3KKEn1h*4sCGKPDevhHqpj4>|U^a#a!&v?;j0!Y0&a31j8W@J{APeJ#e` zlw6a{gzfvM#5Ga#JSI4v9Bcsj2zV7mdb6;!v{%PnZu`P z-3-S>c_X4?5@1D~6=Gx%L`7 z8XH7qrHP#|(`J(VDkd+qfA&mmYJmc6Z1Rp(kowWX`w#o3*ywdXLks*nFUyYJ zPkL+kCp2Q|+-wfm9R93|N!XRW!K--Yg`(eIyGx(I%d{pZLuYFQ*ip{}|-D8j#xQRSPRog06x3Rd+ zIz)htf=yQSA=7Ofma(XJ!*w4pijzrp+dWjJHd@r3A1Gcn7BFzzMV5cP#=%=fa%hq6 z$LXD2b5(k5;L5M@=kRgj+rj4PRuIUpbZviu2i-)qB1j0JGh?NsdbH?V!i!+E_))WDZ0g(H!~TY2{N~&XK)se=@_gUF#pfq(EiR+S{*7s zXj_snUYciF(igNXB1$n7FS7<*%x5Tncrmkvwjt^a9 zP|Wg}(x0BNZ_Y7RvI?AOOJb1X-aj7mAra?XHs|&@HF7ifpxVlyHTU(-;O%9VVDOH? z#xlKBR!gs2TLtpE?Q@eF@f7aq|tHLc_&#rGAl=?zRZv>BA#tRcI=Ovldt)S!|XPyq^Ip5 zilWif#h!0$OueZ>Elr0jdaKJIiFA|a%a)ONaz^c!9w3j0n|Dll zuaZ9`g%?^1F%~Ya9J*dFvSjbnmF-fSvr(U8G|JaeEVx_UCDO!7Q)AYW zPpX`1Z>MjlFa?Nhq7H)807Uz`tE*IPyK$#MMR!<)wU+UPa(Rm!$NC?vNCFST8Xk_Y?Nuexu?^K>wA^r{Iv~TcA=VjsHcm`OnFu%Ke>W9#CJ; zFUh?6#*XU6OyyXMcF9|@GYqB*1AxlOxSMA~%h>Cu$rG%R3f91YK(ih9W2~U;2ktR3 zmLufG#+BnXwSgXJ>Cf3#Wi;-C$RkyZaxPzd78x?CW~sg1%UgrN$`32RmW-A>#EO~~ zT+-MAN?fUS(M+Yj`$P6NtUsk{F4rzO?ykqjNrsB%DY3*2o)1vG9kwM*Q(;q(!DVw( zyl{e=C=w{mu%1{a2Y=Miz*g9<%nYJbELA!QCHy%GrQ@wjvWtue1`g5MRef}D1uCD* zRyu0w1i#1ol1J-+dA)f)&LU~|g)*?E(7;72y;HniYl36t8|J`VMY^uYE01*nyD9fP0^d-aXWd)lG3g&&wsaV=U8uJrS#b8((kROuhAUW zZKULoob)-o=jK;WNj|~#;8&c&WL?GG-Eh z1kE%I@-(8#q_0=V(H=Doj7@YaO=*o6q!H&*X+n%a!s$6!D~$3Il?9On?Dk47b$)nL zfY1s}9FK^bhc3eVK$L|U&l&-P$uie=CuUkP zDY}DcJw<7++X|vIdh`2n7$0fXg*?O{x!?e-lgE_V!~yPN4OT!h8&?2L?4rW8Nq^r! z1My=OFGj28U_$0&iDlv_^^m|Z0@;5qqP!5Frvt*$E`c&{+ z*ei1Px@ER-|FPut#YpNU z1jgZC1B?-Tq~@Ni^*Ydvdrj7dO-c7k)A(~NQX?agD^tH>9%Gf2_D&RJs-l$a~>HTNz;}Iv>GD`yOC8!@>^)l)RUa3n3*ud@q#5FDpEc zj{01_!<4XB^H9LrHu6u1)O3q3oe?-epvhV-O>Lm#jE^wEqSoB}2Cu|eZFU0dhy-oo zghpNV=v@+VOMg8<2Z3!gOBS6sPh3PzKF9WKFu&}PQbFCd4jBts09vigkz9f1fL-LD zF{v)KGV;*o>qH?sZx)S09Hb4mMh|Zm-4*R%K;_2Tovko7G9x^Qp5anArAsCyi`d1y zppbbd$uj+k2#M-Zpk=}yD#wSma!j)#b(AP2siAjngEZmM@CYRJnr8JuDmfIG_*PLw z2CCJDkht|0sjZkW2;22rCP=98S$?4?uMEY=*OcbTqO;gYB!=rz8U2&u@~ddFCUME% z<_|Gdj^+e*7h~gye13E3Q5z_jeEZYtJ&tAk9r*$_`GN>zXB!o-+=HcIJUc#=#@Io{ zOji#6M+lP^37GnRRPkK`Rb+g!Bn9_71`-bx0F|K|FKeV#euygJA62NiE8G>^Dpo}H)ocsV|XeNN}RrEK<_}{ff{wXHsy)Z3( zugqt;x2m$EHLZWv?uqyNOE2H`oQz;)v^|bPu+M!sJI$>!s(5+#o!b+{KrWP=*BYhv zmerD7;g6-dU1WTxC?jVfO~3t@qS+_Lae`2L#mbKbbvy#BpXCY$IaU^IXZdBn57Lks z$5{`)yk7ryRYr~^FMMwOR8tdkEKk7bfJs)yC$;=K?td`YrGyzs^khkPXkq??y$(y+ zW?7HVzatisQb@Qm%_6OR_I-7}r;5BKMIy%EV<4kFJEhYFfB1Su(W%cs`wN%67K5Fv zK(vCwNu=yQ=nAI|UB#VO3s)@HSdz<$JSwW~AJqHz(^xK5c>v@Q;=W%>JjhC83HmN1 z`+X??m=me>1NqgDT7-ZW{ga7}KN0UY?%POq7Q9uIh<~c@_VCmF^|lSN=+-wTt_TN( zuh$!bbxrlt-`PgSr%J91Nk1WFBTEx+J&j~7?OrN8sV2q=e36dU`4esZWP$R*{=M=v z#;*x#WQ?hjYTQQaJjnLL5|o2h`@MDA`L!+;sPA_yLqfsYDdrNIDj~g5jQnu#I=PbH|yqNY})cqY>(E&q(;+ zmtiy8qhag5hPTMD-&Q3v^ULA>GYwcrHjG98%Kbjk-KhQbpfDsU3Nep61|(U&2Oi6u zI~TgYIdpE-44Ibs zSNGiNvZh)qgxtCCxcn=-+#%Q|uUr1z~QcNQMm--+c9Zynz zFXof;E6S(nB*LHSVpRGcj06&fh6PbB8o^#G^Y6&FaFY0UYx+;X=6B_Wsj(T8PYk(o zp8pHriu$SIC8e;LzakR;fplh-J>LwychIx<%k92FT+yNIQi;j3B5yvQ5 z`-i*CE`^U_`gglXl}|049JIt66a7kq;W4u24C)TuRR0uH-~NOJ_~04hL7`ea?5<_J z+w9iO=)BSowk@KhW*!uj{IW=FGSrXOgZ&S5*MfMWMP?v;Ddxfan6M-)WOEpu`Y-xP zCqJeLnYUT<9Ynicr_Zfyii+$lAx8qKETViywigiJbT#}Fh+-td8mYnO!eSYE_xV$( zN|Ge8>R`Ag9L9^mPM-a1deEK0@y|@oS2O0DDoqESYbg3;KzR3{S_(bB*IEauRMN0+Q&;KcasU{snuC|5OB3*-Aqg@zedQ zcYCk{j3M1!i)T0{NG5h8F;-3Oc`;=0N2boSB@4e2U$O0!k7GDc_q2puixGJ%$&L;E ziOZHEsg@jUt>9v0j4o?s9lJ{lMxFs$WQSx7ilszm%327Yw5=KMBkTu zMYhSI{58g6g$EKZS){LDXl3MDVxREC%T~jUo?B(nAq~A>K4Hi|VR(}u#dpDu)4}>N zPX90DL)r?DfpsYdG5=f>BQq@oUn?V#T>}YO_GB{`{^SDpsl+ys{bR|^u*g8;npknm zC$izGBV!8KZ!B|U*F*9*HjF6I1;kk^B;UClr|68NKS^v7*vK+2Z1J%qdSpj{Bl`eS zl>yl$ky>zneqpMo0&Rb4E&dc&!QM0sp2@3C_S@1Qr&f?f$81QfA!!j6)U%P zQ=0^hIdob-azOLK!&Ur8bR~jhh^FjQ?Xjc)TARJ~7RvYbPfe`^u4;wIDn)V##9#~j z9FhC4!edRIP6|$e?7zr=oBXSWE6%5QyTXt#x@Yj`W9*n;>VD~B6kk0lm0N~I^07Z) zAc+qI$tWS)V|)R*7JZP?U6;ABOQlY5TIF|Kwq(f?-eS;0T4fT^_4<^vU1Zu|{v@_S z%pF^G_>;)~PyBb3;-46i7C)Mv5TeTWWJQ6r(w_ehiNb|jQz?UN5J)`Eq{)kpv*gIH zdP|mgytTe;B}++@4;@Vr-vik9qn<#YA(32oN(30c#eQ@^Gsd$9{X=sKPD5UdUa9{- zgY-#5sx>*c%;irv_T;CH3dug_B0AD~=7S8stkQ@jrkZ-J~g-#*Cp2pu*{+> z@jDS6ECDNQfAb%-AU*N2UqF`QBfr6kOcE`5CT#x&!|;UYOM*mv2eLyNmGQDY%c5gC z`C(W8FA6SE(kG|u{p3&jG-R|&vg3BRvI*&O|JXgCAS12h*6<~L;&jISkDxE=Q)Vrb zJ+C~TD;_}%G?2;GDW>A zC0$QC#MC-Gy1LZJ4uU*&kHKm2&`$}VFO_#l0J-)ajAmr(KpN3Aj3uRDm0eI4TlTk9 z7h{YieI;CKa^>Tf9R?F;VQUFK>ISD(ATH*7Zi>N)au!`60x$c^t9r7`I z)8q3~%)Hmy#+XlPX~@RzqiyV6+d-(s95kFwYjslALH;DZ{U?$>i3|TksweRc9a2FI z>&cWL_sIj>VOSdS;iUOr#)ZBD>23qLxofe?Lt3KLupIX#>;G7~@<6ECFH9=QRtedX zY?ZC7A*T2$vQ z5~ct;K}o3fL$Jzl(EFQP2NWd+%7uU&#e;K$tY8Mz`ZR!=ex_IQNQ2Rpa6u5?a}&f{ zGVoxVX2Eo=zfKQ-qyAT)B-mRqum40g{U_2MY=rbUaF!d=t|y9c5`pU<7?~M^%36zx z|5Hx|caFUQ4k(aEl%Y!;%!2@R$zQ2H{>?l#lu^sUvHSz-*B9tF??!r~1iw7kO79>t z@S1wNQHB`Xtq9;u11g9IEBHbBkKP_QRINqb|Lq`jt^j4g^db-1-)lV*yd{}s##DBq zC;^gj(Ute17~+apz7Eahn-S+;>FIj2LtK?0Xmr28yIxqu2M(8jVQciYA_gQu%rXH< z>b|XBnY^n6j2^|^1dW&SeWw#v^G`+toD+%?Yk6(~n44D+f)DvN9;nG6UIEw)5URis+XHe1 zpJo_t0TA{}CB9L`4!|r8)MFO`YTdh0c)GlPEk#WXXx=&>=$HgG{?=r~@`JGyAl76S z4(57_G7D7TAAfW#SUD9j%LAB-!cKzq^#C2e>!kDOcm28~NYV&)f_F2Z|IZaQV=!M` zZ_a<3LqVQfXhtV~n*dqz1WSrDOn1Qp`>5+)q<~D5Zt;wX)WxEV?9+e3^ zltdIe>7^VLnTr7?K^*|0^6HV%HzIFBF`GuynTIMTnM*))z2HOJwDyIP7g5JQ4y|I< z0}d9CgK=K39|4#9fQ|Tq`}4p|kffgTVRq;1q(`oIc-PEKlAQInZc42J>-&4ON8C4y zqtG{71P$#|fI0F}J8JO($YIA_1l)Fi0E_Y~yQU3npe8j?>lPpAojeJ6hsG}qX)1D> zXNnCK8RnRsScx7ckSr#l`1Isg zR&YqwDZaxt{yWQk)!wZ1VI{D*2NdsJ1*1e?J`(Nm_kXkmOkF@)ZRR5F?8|l~j}sT` zdO1LDC<7}DVo_0`c=m)vgN&Ik_w@QWiW-xmaYe?LyAl?cG79ortP2>e^}Y#~Q32Kk z=K=G315)F8u%@wYVCGhRi=s#BVA;UmoRU6DXzsEC<~+%DHXzCMW8y=*W*N6rw1N8t z5Ndy`_>N-hTb+K6qRbaV<|iTaL3IBo(1mE22Unf4W)~ztQVRCR+JU*Lve(g80fgD7kf}t z_5v{C?*T)fr=_kS0xzi7_4#T=BuJqTT3q1lh z%LL><`Oi=eqcSCigAa7{+ycc1gBlvZ<`|E?WC&_F3hoHne~JeiDq5(J#A8s}z*W?c z;W`1FNPspqu^O17nNP}$g(R@@1w}-Ke+S$%zp`Jz%2++-Uz@%3j<270QY22St!VK$WX@f3RLD(bqe&v^WcFK4tQ~- z^Zw*QKL=a8=(?or+-)PpfZrD-lo1NLI_uH{%+>Wi%HYU`nXMi5Tv7s9?`NIwN=N|a zpdr^cuV+l^xXvU&rb6`eXsZm^SUy9{yMWVw zs?qRg0>iZrMyx~uF4J=#1wb}2Fd_8x_c(w;%wW#Ok&&bcEj5RY$D6gx= z02Q%OUIMCv6hJgX(Th#3sz*7MI~qePOhS4Nbb$WNHI3aly7o37tI{r47Q^}1Req}tTutP8oQ?P7XsD`8;<~% zMHw-0coKBJS7kWu*#UyBfQ0%)a;2i`6&c{9Hl_`#=`7BezvP9}hBEwTezc#)pf8 zyxy+{fd&}?s}%rtIzDU9_Rs`W+r(gp-2^F&^|B9ql2jRd@Z+FryBiGE-e86XmLhIN z{i|StLhTno)q58~V#>?G*cnm-gNqxCnJ6e$0%muJqD1b&RS+Ti5(MXg2m}XMOFUR( z@;q>T0y`$Rz|^il>LLgWC>jbTpb3MKs3<^m;gTMsN%pV73QhvcQout$0zi#BfhGWP zO~;GqD#?5uGCFi#kkT7yXZ(O4@CXa+P#C4z>K#TH2HlBt17;RL3=wEdtLycWFBQdY z|Fz15kyQZXh5%Vnd;Eaj>HLSlZ!th@&DDIWvqr2iT)=q$lt*exK7 z8<=YG=Eqx7(M3m441OyB9&h@+fI$Ff5JUk4n@pe(R#2-JSkU}akR%>ZARTfR%;f+= z&oiJ$L8vqXdMx_gP09f1%6SR!@|5N=csD?c9nj18foK0oHDFkP!(g(>4=`V!RnG(o z8jgdx0zgZV-+vZ1&>{y~9spMqhyj|9n%4sLP{4Zjm_R*5u-EVtpi3Ndi85SAL02J| z3;1(KAeTBQRe=Fz@XF|I8cB^ay3Uw00AM2n$gQ{OASLnN0Tu6E(+GlQLYG`bzN;|vgAKdr|L zEHgnu6hq~p89o(s{4@pQk>Caj7TBW$Fg3CRK;zv102`n$6x^_a8-7qBkp(2S1LLW; zzyMK@nFaKVz6L5fI0Z_J0-=y2pxEyJ#I`al%wVuS7;FLthcjBG1O}rb!C+x9m;^$b zfJ#w2J)p~;!FvXDF?vrw2Bwr@xEN7_plgH?#Yj*Ax`>P@KG20>xER81!Q2!^Zcw=K zu`EU_M8Vo=CqUj-AlPT`;}r)JMmKxFSOh>TDjmu=DgHKr2ZF{>t_CJ*0yM;%l0Shh zHa-VTm_P;ygO3g5155C63%x=GE?YngLdQG-vPMbZoiULGHt{^O1p-wcg%2?FLj)Z$ zV&m7IOQ%b!+4;4{Mk$Qdc<$GJ*NQ+;VIIUr`2I?}{stZ6P1IheOT%nxp-~vi{WuYv zG>kQtOkYt~Z>RI^Mdb5)(0js1T&8ID>rD%GnH*Lzt`7B@Y9r)LA@b(qelJ59(p6l5 zBc!Y-@>a>XtAD+ScH(w{wLY$IL3O~+y^=UOG&=csz7rN2Q9brJb=V)HMkGs0y)*PYpx=ryIR8)eJ!OH*P3As z@6##F*zQC}RI81Q;H~Z0*-gpA)dkvGT0}4Z&<>(Ak0?;)QW2mU7G5->p{jY+X>nVS z@ZAINF0rve9`;upGBz@m&X!CL-Uvxcf?TxVctS*Txdw~8+&E%Y=`^;o*6 zQH_muf9R;peyMz8=Z!IMj{33vYGdaCJN)BCdF7;q1^-Fs8|uRbrrO#mss;7zBFS^> zZUc*777C~wqfKvU%4xFK5*NG*iEafA)e8@eTm(0h7GCZa!M~2X3p-#IkO#dhirrA2 zfdVN^S)5e*&Vw(5w)5DF64|b%n8U~g%QOc*xB79{TEkZF=x*KNDEMTw)J1*FR@S&sa9~ZGd&!AEx0z&2jQe`9&!Ox=LKpe` z5jG$_P9|iuOz1SJWH0HFU&^3eBlG*b`g*N_&vJQxgPFK%lc2cll}bBBC{3K4k=y$F zX{vSh!uAo?J^zyAZb=sH>yYuxZl`kZhh$l7+6Jj~e;O@kUaHXK{?|?;dy};`Jxo#M zkSLM5hpDu)5=qY2FHJLs#RphXrA*0^);z8Qaoz=!P1ra`qG!`X_WS7n4wL0@tAG8 zpmH42E4}dMGwUm^xW1H<<=i)ay!Q;U7sl+;X1mX=Brhr-mmAJ5^q&rLzuGZ_iz(RF z(?z~oaFm@#7>gCI56$g|cMoQ(2k>`$)ZC7U8p$18l1*o4hx(wx6TB2NQ`K*lsUoWF-Q&^qfrz2|Kai@H-zBU$~ z`qDI5tZ`!Z;yK8-hH+J>gGS}_PW&IbXj<1a+LolC8a0O<=73{uG-!7XVi)q8hrKE> zW0R$2y=n~|{%v>qt4+P~YHm=2?+A7qbJsV7M;II6m#lMYAA7M7?I4i8f(GroN0p5E ze_Yq-swP+&0<(#maC=Lb<~8v+abOxWV8xHNS|1KJ(c)KI{!S_p4ff%Xsc!#q7)D*& zT3V*})GR5KF!#eB?{4^Ma<^toH7?(0!Pd6wtWudBqBq@@kc^M(FB}=Nw|juMC$JRc zq(P-v%`_$ABsB=>#;*1IHXVnyqTZc#>b9CV^LRg(yICCDWXSVUcv^P>BB>mA)ur0n zPtN2`cT$PmxS2+?!iovTLmCWk3D-QS+n=68-hQ~%b`WGZmb`ERxllahs?0xEAb2>ovX(`^M#x4| zwyiTLy=2!-Nw~F|RpQyIx6W=M%JsZLfNq zzXxkKIq#1QY4Z02pyP@TYvbv&IZVC zc?1*wH81{%w$#9=&oX6fD=6=Tz?w|hp!=yZE^pT)0M z7u4dU4S;*50jXgAMBSPC)^@o3!M^j4#ljV8f&Q5|Gt3{An7jKZOMZ8S#G1qE>A>rA z>nTX=JKbGPv!V3gIYxdpo(1E%#Jy6|l0(p8TFIoT#mBMR?O%GQLayz58+l$TwCq0| zt~9o{eV1eVXj`c4jzWN4$G||c!x#(Lv4huQTiFM-=D6NdJZ-#{4kameBs)JbOU5rB(|ly#jyV) zG^5(@=%PO>+Uu^v=-7e~3O!Jbvuzk0{9JUpF+a`sfs)qh_>1LYSGRrl+Ok$wvU^g_ zY)94gPMIn|7fEd4U^2B^jzAgirZekE@0T7XlwIZtI{-m%{K! zldhzR3MnLeL#}O#O{1S=hpIepKbG8L4t0TGAy?5+1T#I4L1X5q9g}~y4Si)-SFfR85R@|lwNT-P z@!1|BsacZ0G%pJn(*F*|x`nQ<-!PGzY2XWN8gopvmBaXWK}#owUCNs&o}KCVwz@y? z*R@N7!>E2*cPCC8nEPD4eO#j6k3AK1F13C$^SjT4wR7i*YSWU+n2V}ZiY)$(uC9L& z$|J3WW)4Xk!RBYovA5h?$3B;4QX&N6+{1QrF_Obk2C3@}4-Q`>2efz&Cm=s86H7%E;)ZhD8AlH^&*BuhIl*(s&>8 zY3}_~x6k7)OBpOx8K%k?5k88Gc#clV>^QC7=j>adXptX#;}W^osGlzm2e!UuK3D4Xn5|3{Relgc`nZ72S=e^Wl@#X z$N=_lM2Sl2r@N9E>p$}X5o-;ht`1Lo-7qUEB|;lE(isEtN+BBGe^3V^oiS+T*7|nr zL|Mii#CJ-;nB zF4b%(rzX_tD1_)JzJu(Me~XUM);;Vy7<{E>LP*?o$1A8?`E7Xm-B>Cp>F&QTXZ^xC z&9c6=%kqWf;ykm_d3wa1{&e>MD?fIxY2s{qmXp-RhU>F>x4-0qrS!hJct`9zML5P= zJrOCq>prkEH#*RnQtP_kxD3}4+i-ef@X1-Nb$PVAM#F=Yk1F}%;TV6Oo3y^pI>L9b z>169o3OXpMz246G>fnn{%JRwYzw}{G|2Sjwl|lsCC;HX50_Xp=9`-WA94AY{xJY!F z1?s@$H!Q&u$EkA9hxM4>8+X-2B*BiDvyKbsyo9K#$JXQ3zoq)=g%mEi}? z^%onQ)ann+(;NK%a4iN<>P8mv8~L~J?Gy>rt4ez6vI_k(+1i;j6Vz|zA1daz!A=gx zVDeLls2n5GL(Km7)JFH*kwvw`litAh>X!G~Vql@l+nwX*E6|pE5sqK3&f|^fP8G_? zz`0MrDsVdN_*^fU+a-e_h^0tFF}rA49%o^wdWH`sZO{~HRmBl8dz?1e7Cc9rnF#kLJq_G@2TOXM5PMz*#h-vmFy}%C3tLCO=%eTQN}{ zky$1%06E@Hm=tm;XjrNIxjFTZ_rrOW9|x*0$~LD7k%7sQD9R_8oU(O60l^_}z@+Kg zIC)fX>C*=LiX%zUl-m_T-ZAQ%NHwNCgyA=|oyRc46Mn-W zuW58r(0}K=n#ALog~-7EfxfPQg-xi*Nc4Dc*BD}9}LmkNhr1;+)KI>XC&2`_TiW`?Tigs0~(Noz1 zev_}hiJJ>d68Pk-5ND<|q(r?R1$}8s*!x{B5;v))EG--I>0-P#;i6W%&EFAN$n>Cu zgEzSzx@UPhbL>a&qk*FJ0fR21D)Yi?=-yhj&v?0MZCrql+J65({C5sp;((=+Q!F7? ztH6zlH{9Y6i7ETFEc;EZWj$s@9G4f^?%(e>kSsF0Q&vv@$fVD|1ebYxG%HDwcP&JsXW*d0NZ07qJqyB2;iAoF`OD+okJM;p2W}rR$5T z<(10z4_KaI!A{lC_BE$w`TeA)Z7O{)oewWZ#t7#V>^isVS~hTKk=MSo6yCYHMfauf6)31&T(kwU^_% zk3~!b`adf{VijHIMO@O_+H!?n_EsBjiDIx+CTG5o?VO+0O`AznXW;XmYXP0_ykIOf zUsUtvlmub)ZtvcDtt)CWv$mzQ5TK@@A}$Lq8^Lb~-T)wBL~Q^BjYDt$mRWE9O6Ej?I2dP4$RU zMTC45o%DIU6SL{B6}EvjweX{Nc|NZ9E6Zhf8B3g=j|yJ7y?5(gcUkbhkaNvwen8vMK+T4zJ$F;029S)m57g39T2f~Lnn z?Hmrf5YTJD6O$~GX5Xk8`fPp@rJm8=7%8|LTTva!wU2dx(>$X}0oa%F4K)mN-P zfOxpK@#=i5?udo})^6GA0c_82l3hf>LIEpU*E#pxJG(TWJThN^@yVCc;=?(?+)XCc zO+s#U%1TbKCSfbna8nzsn&-DC7pv?m%Y`2w`nYUok5-`%CaR&e%~4)w=j25`M<^xJ z2dViyf2(@32;aLDapCFZE_SMv*zm;$N9~{Uu-J;gw|-{LO->3O2rbnr9ke!5Q)xe9 zHq)NY;WT9*=Hn|%&Tq(vSAEJsx%=0s)t3v&6J55lI#D?b+x-r<8}_ZZ*lbRv2*H!p z&Z!n`w*AZI<}2bd7})!F%ZkqK*SCT@e_VoH?(#@5uCZ>d(yZR|!?bM=ZmKoEZANk;x=Qwc}OnTh28r6}+QM3O4dz z$UAiUpRBgc8CeIcLAYhim;(3aBPB|VT>OctCc3D^HqZN84uMzGd!ETV8U-!W7ru$E zAoAAios((HO;kRAz?%h5XMB6QsDPx^JPM>O5c%>pQ0SL0hW zE6dsYUq6My@C(yFo0;FeUCIzX-wB(dein?{c3Tg!C{yeesv>?OcH3x_=e2Pds_^rGiq$mCV6K zY1+uOciBP8-=gondU6;|kBq+Y;~yzn^M!@A!gEcv1IqfP+G|bm%(L{BCVSxZ91eJw z#uxF2{!^3Q8qFFTese7TCzGVwxk|-vuQOaL#cn>WA2+O&yD0}-eAmFds9UI9clqYn z-S4+FnF6P1Oru_l70bGR)BBe+eg0-lxSJeE-jw4PW0jsfd3AVk`ez|?izb2DIP5eN zn{k-PldsvrtPe|4%Xd%alRrg{!j4{2pTBi=iFm2*uKn(l7atpjPJGW}ZaE{h zZTO-pzK!MkMp)a=*_VH6n4W5Da37`2EZtkZU0!vR$a-l%NbA&rDO!#1_~%)#KQ~*< z(WeetRnw9y^=T2@6m)>B11pPRdYg7arMRxbd7L`^Z>94KwrM7vmgCGV8n$htEX>7Y z!w}#Pj+l63X)FSv^51rzq!u;Q%7%J7-*(k$(f0AY>_9yF*~Q~R+bEU!O2`c+0SBHQ z|ImcB6y|%~4J+9yJLesJHFBWSTBx7S#}Z682K=dbnw$R;%}hx(KwR zzvkt;9^9T_Q<_3mF2{vw?l1lQfz<1c2W%F}(>KMd+PNOEl?AwR60Vq z>&r;5AcE+<+@fq(wbNuRx4e**{6L|aKg`p|rD(N?8Lf!Wymz+Sr}Ii>YeRR5Ebk9> zTJBl!lcA30f%swTqIs0UZS3*OWvXQ>&kQUhp%$c14IbNZDc0rOw~9x|kwA zt?2aJ6ShF_n3}hYYHzx{&_O&68Gg&YUoWqKBk9iPHW7YkgYPZ9)qq`$j8$$V(8>Kt6*G3AXuXKkL>PusqO z#Ql~lXdcV{M~2rm85_fc8-G+?6(_Ho!g?s~&lk|#b43;p`Fi$4>bPLF#=o_0G8EwI zE4w74cP{?5_m|>VH509_<|94%wzg!;N49Ca)xUGPM=W377#JwoAJs<7sovZA;7xHG zo*c41I8{D5)dCH8)7<_Kt?I9Djm?2V2|v_t&GAK2%rWP!@hkPW90Eo?_$G%t8`GRt zb*K595`UD=ShoLSM_W01c~!jaft3k=SgxpiZ29FQf%GNGF6-uT^PHG2tMS5Lr6O&# zkinh2kj5uw=*|sT#IZnm@yo<(P zQ!TMyiXb{E?DcKstg7|bIEC0gst=B$rP4E(roudS%r=V;MDt6>j-yWPUL$^yEG@ zH$8vLcpMtYyetWCb6p(EQguiz7PRE{wUSxWMUX2nviHrF1?JC~ zvgI^}oS4lUNiXXjk}xSKKl1cnCLQxVHm_Nedp}c}=Awf_PB9H63|RD@9%R1?{B-)~ z20X^vII9s!kia4lL~rL?7!xk_!+#NTCfZ7c#0+aIly=G7FR`e(mkOKmAz`^XbmQNRN#*L z;Dn_LACpmA@sO^2u9-W!_;Jk;$$4m!X=wSPu;b9J@#e#>>utr>3o;oBqzfe)^3akM zKk>1ZmC}&=n)u?vbdo@FyIBt_6a9c6K2>6MV20=#o++6eV%7f5ce_N}&&g)1ruLwi zvM$%OSjeO&20g0V<#Xqyj02h$l~t)BvnwD(IHl!)Lre)Qa}BVWYBp2I**=3@u}WUT znc_WlV=1(EbG^dBcaAqJtqk~!o-e{Hofj>`E7^6Lkp;Z>e?o+d@k-ikSHr_<+100! zOp^Q=r+r(fdj*KaC5w3MKju-g^Bj&__b}p^kS@J&^L+utmZQ8-3H8`H)ZBAB_+aeL zklI>W$nptGcnM-_Q5CKxN;+K?@~8Ft;$0h~ittwfvvEygB`B^Je2z8Lb&IBt(GBHt zm3wj{XG(||V9@-4?o+e=tcJiU;2#QaTNG7S8ULJ^FeEH2sCmZM*`@ZF(NX=j3{KRz z5(dgb?rhj>^)LhsQSdF4YXP&yY3O8ku3N!dCFC0qsbPtk&bVC#v=*EC28}6lS2ax! zs=abAw7_<`?%ewXB@`_7`P`Cl3+*Vk?;KK=LUSZzRx(oyt(19w81j!`qEA9#3eXN zeMz-mrL-Kq;y)CS+RY6OsIKp}+N^*-`5CRX^b~%81(uoe(le#}yhYFko(~_dX^24& zjSy6`7jLE5)R(N6Ugc~dFHV&bl@7{=vMXw2qBI8aHI0wlG4+CvHPr`ehMf)m)~EsV z;bT-n4aWJLy=LA5RqhDJ3shG3|c{Tf`rz!K`Gq#t9@>ZLH(|* z_5nYLD=hR@z#d#-;pqHTy-WJ4k4=gDIx*uCrf!IX2T!;fRi+YV=aw`H1D ze78d-VmRxV)b}@JD=Gd)f!ikC1dVae-7@wgXA9~HII*S2Y}#)wJKD~4d@WB5*bG2g zlDD0u90~abvsaP7j~Bcy)pXnTGR!hWo_zJylhD}oBVRV(O&#^!p2Bjun=%D?*@ zKlASO;sn1ckv>1wy4O8pZmDQ&8(;{m*AD28Wj@&ziM`yW{_`m!)!?h&%JYhI`2FjJ zo(G<>jVIMf+O}V_Hr^u$8@qAg-7$Q`nND@@x<^E6^;J6yB=vKm9=um2foIkz>P6-)J7w-*kqX9776YkF#6SM}Twa{1wMTVx7cx;#0Au zrl&3Nu*YqC_O`J()|~e{e!Y#%!u@cbp6Fu!5jOF-4Qs6eC54R8Cy-TcH>l?Ju_WVI z^Jy&1X((tVqIoE&+j!UlHR_=)c<&a&oQ>fW{&iCNJo&fxhz=E0kvi9a^vR%kBg%^f@*b{9tZ6nm(u<6 zTe6wmu<5l4cWN;sL3*%}x_tK=EB6M1#BSbpAm|7x_*j;n_7;o9q}KRN^U${`3$0`4 z>JnN^Y6ZL5??9I~POc~{y@CGN5bV}gUq)tOM#j9KPormH$9iz>LrcMPOb~(9qBxn3 zU}}(KHVm=yV(A8Yh6Ks+MP49jX@=Q_OtN$RCSjT3lh)3f7x@GDeJ3@oGDz@+D}TOv z6E=uY#D1dde)`vhjc`ALM}+mB_hW$%Gaol~R7(T(Jx7146h)7+k9|=|J3+7O;q{5w z3lZ{a=k;kOm;WoY;(L4IDn;#>sw|ggnb3;pn9%5Ie#dBsuHWh#i?HrVflMDY$H(K} z;t(8FQ|<^4j2P^5%@pg%FSP^Js^YOf@fzLsDH{Sk_L{zzLTPgo?ZjPHMgF-1p~1WA z^xCiSzO?r+%^nIcpF1IQ5ET{C8=}f_|HdnFsMGtHoJ8Hv`O?@MeR~jE8}GWQ9a$TY zw#hxo@c63VW2#ylit!0|@q0S0rL7d7sjI#3dEIfE2WvH%j-!5AQ<0;z zU^Zq6J1;G7Wn6Ddh>Z&uYEtSrVU0_OC9-~Yadd2JA+kK-^ZkAj?c)duer5CJO4IB5 zC#J)2`BCzE==a>*yK!^dA@X&=n*x3o0pIWM+{@Tks9Vp!>srn7-A*K$s4NHY3d)Z%+UpDpvFCG|@uV za_pxdw|5_TDT~B%O!~*r7eqFLZIz*I16rak2E{}qs! zC&s_xFBg)V<6@sqVd0;gX*gh~Jcr3WKF!}fS{7K_9~oieb-p*(cgjJY$AmTg>eB)- z{zUuhAE(;CZxO2FaYLlx*@n7)Pp4S|n6SwT}ZtSZ$n1jp$dz$bm;Qyf`Hng0J zJK*6*#|~Z~aCS`N2c&~>`rk~)4dfmbmb#VKCAw3%$?@DT@Oa&B>y&ZhSWhy4Bv#F~ zT9Ig};Px(rkKYrf-Y`G^#oebbw(&E+QO1J|`nat&gkS6PE_VI_omLnYYq#lPp2vR} zd>zN%Ao%3RKeKOaHtoD9Qx}^Q!ul+j-^#(TSuM?A(#j*a^E@;>Rf7cL%G9tNo(-mjlrp8= zh0vw18>cbaPr8qgE$$_hapP#1Edjqx*U)+M+NK48gtAG=iM@g~^O&t< zrpRM{64hJmELP=)wc&Z4guUj~nufA)qab}1i+ls~=R<>j;eRBTwn%9nN;0ijkGBnu z6()bArnUFx7ZVJ;h6HAlYVF1Cs;>J(DM|Z>eZ!I_bs@MJfhAGc!Gm$ho{~^lwB50W znd~WFoAsB38NvAq;1ixj2H}FiJ1~TW&-lr-eNXqQ?n=+YHkD3K>mz6J?Q7bOr+?|nb1tZje_l&45W)w@ z6TH4sxn}y|&W9_n9B#>LIgaS5rXHE;w}zYA6^Aud^M6>*lesCsh0IFRE-<;F{%|Bs zTXVuZtua+${SyVZ_;nL4CcXFY7~vCSW^e6NQ=M^*t@JM0>C@mguh$qh`#t9L(F@~3 zV_mPw;~oK?)TJge>l;!$Ib<5T?`c^N+bg6f7Fr5wpR2MZ9g^c6dmy<{qvNP8>Fsf? zB}~&t;HSM>W7Tom3y%?N?s3S5!l9c)3~^ot(PekJd|vZ+OXBZ~!n%R~l=lbD$Bu}M z-?9JdfI+Oq36af^BA9xP<(+{xwhgX;&_G!(Iqkp+6zpfPL1zkY}B>e)22(9Bw@`*t4vL9!e~kxOo6f3T0C!23EDlSoGY-5`@U#D z_lsrx@|EzBr#*b`jZ-xWqiF+He^Lj z>;oAm-;Q~ezV`MTlhWR+O;|0aZ5^q?<*ELecNDQ?*etPc11Xlw?KqxWTCXq9PT=oP zXeVXutL^?iH7#vVO@Zu&$89HzS|Yy9U%V;RBz#^u8M3p8m0hJYm3q`^K)vVeYk#Cn zD>e|r#tLj26~_6Vd_}Fp_E`+isT^x_qR|GN)MhCmwt?<;N=0mk-6kd2VP4C747*dsjm~{O*4mA&U+$RNYgl$4_$3{gZ;7Ux zV+3?2Z|%2Z<2hTw`O9M-2DQ+N-Coadwkl|o0j%e=MS_;v4wZsczuE3;d~^Gtefv?~ z4dyXF3mX0?0%reWEz*v?ilk35Sq?T=!jXD(GvK$inzg)v`<(BI1T9fVf&D?~vP@Tx zniVYcELUi_fNP>w6YkZrt@_}_(2*HyM+zV6+a$cvhkAZp*MqV(CWmUES#?foc2*7A zITFS<sXPL*_z*Ns)B}bvM`P+hp3-8pgM%fmHm2(rOhO3hA(z zo^0Cxdia^``M>kh4xtE`zRmePR(X5ZuN?fFCwzCU=xwTS$A=qXyWwgr@(@L3ZkzIk znRQLyYHXMkWKThKM--AT*>upCI08utIP9nqlt+k{yy+lr3k=3Ery;T`B0C^d&){8H zqnrZ04>LR41Uxlqh$eJwEr$`W$dMWYv}55&|IOubz7Nk~ncceEWT$B)H%@GyYxnXq zqEX;6SIFlH7?RJAC`(!%-24F7vf$ib83~-A-fuj*f1b)TPW_57rwo!qe{DbKw>?uu z;j|Fj*B0L8@F7ZTly1Y*I7{G=g)exL=1<-b%fD~$yHC9}Yve0`3{fmCADyYk^X^Bz z8RFFq?X;NqQSCgyHS@NhU`W8I!@I(6ZS=X73D>7jYO@tV;vG}tnTxEAWfeQ4m@Qru z>CHSZf~vcDQa;;^a@6;i0`RMwV(Em#Sth3n_>r-uzSx;V99({zGGem~DdlXSx8x>% zwTBc=AS}W!tWdBaMEVD(RodM*t>0;_2P`3}RrF8Gkrj(N;dEr<@$Dwk-ftRrRLdOA zL^;yi*TIiY-L1sZ)u_`l9agC_c~duRu~I@vi^a1cvy&bkcEP=~d-rC)r>K!aw^I=P z@`zd6VE#Y9Uk1pPhqVp2ro_+tD4^h-BxCA>iUag;OA5m0JUPW%*7}~!0w$&Wpi}Z- zw(Zy-8TtymSO(FqNX3N@hkcmG4ZP%?GyMItEkgM5G}`ychF%hD?Ld5n8fkzv&c#%u z&Jy8+bEe%)h7bN!eJQ*u{e^YKPbQ6pyBOp5C-Ez=(WlR&REE;fsn=IC-J@B&-E+CV zrg^_*5ycuLvu+A?un=b&$F)}*%D%8P#ip*n4pmo*Q<&eT!V*e`UG*#Qe_Qcp$+}(? zv;9L{dHn-yNQ(V)yMRK4-)2f!-LVo4W;gXB);2S0Mr@7x^kuuPN85H~F(q~a?OSHv zE~(nppFC>Qw+qWDzBI4kW*3O5LZxJSo z<2gQuv_I^-2clu^A$V4LW-y-h@Ra(_%SM{`#*|)Rb8h&mlH`x?-dU#MtE}k0CFRfy ztcde?=7#!t+s2Z^_KBfbCMSgu7HnqB85uYWHl)H;Hn!k`g(%zo2Li%vLzw+Xb6wZo zCH{PA)1arP87$N`#Epy>QcMH}dsBTw70BY+Mb(6o!>5}=ds^fn)Z&M)dj?%}%-E6b zMbS>L*KhycEboR#__;(bU5graiaHjhS~nt$PbCg%E4%8beUTB>=-jRh(MiyyeO>4k zY3?BEb^-Ubucv1cj$2*dOlba@+j?i^qVRgq_01~8%uueB#^xJ^zq#B8nvnBuA9Yc) zne)9caU=ivv?;0jg2jheXLw_D`PlWre?|=D-9Ng=ad=AD`xR<=Nj$4q6CJnlYqBQU z>q6QWgl?4w4-T!U^z7w?cCj~8LW6hr!(dHw=)}VX_bP6$^4)goTX&lJpf}gP!f&n$ zK{7|wh;#PTs&PkDGpn#8x9Ga~#%kYbDrwcIe2%M!0}F{752lj7oNpElx7lBqDm*l? zKS#Kvd63k&Dk4dq;s#!OOx$amGLikmO(z(+7X{A`I%|-!(iH?xq7PX+AiF{+6KS_^tNL%n;dhJK znx^B=bYyR zPH|qE-c>9QNc>xV<0LoeyuqXWC%E9-h_cV+$CXD$Mh%4CR%z81eTqlzCl5Kactw8t zE?5%I?2GiaI%jarFg30;S^9tKdhENz*F0hA&(M*Y)(~Oo-!VrtF>+b$hF{?nWSYFo z{BtRy{b2h6dwJ;NwgZ)w(CT1&XnNAMjeBT#NW$jD-HF`h+FI_Xwg2q~wTy=*C$)yO zri`YH*zS2-|9^wBva&`ZCbhJO1}7))JBIE@-8Um+V{IX0Q9~9(QR61GX?M-;T4279 z&gsqjnLzJhpOu-=rNiBso7MLG#WVSENh*~kUu7Gae*Io%JGZt25hyLmBE*9=qzJO~ zjejn=8;>xCm=vk;?2yy}5r_*%WVt)Q6lXVxxjdtPLyT=-k(#*<|4yEwo{jk;-Z5ua zg+n&SoF4@V9=s)0A@%vGzbXZQ-0+=#ejhExp!8ZyhfJz=@sz)b!}IIuGK09~2*Y$Q zhAeP&eT8ukxp>|Lpq!(U&Wu)m!iOVdL`#|`&Qg6@jw)S!Jhm%?8ti!ve;WSc^Dy$p z3H0OqSmQ$F(zjm^E4zrf4XOZ~%J;>PG%1-!29=M0T$h?e{d-8~s0FT^sxl-hN|}FH*2~!5CQT5h zl{Tt!d?73HbF?|;CCUEl;l)w8s#>|X3Q-JF&v^!PY0Y5>QHm1f7!!+6a+95z_a4_6 z`u6$u0^!Nj#6k=6)WOmHsz=d<(g~{?$_Y_y%1M-V36_(|g`8FD%t2g{Zpt+lXRz31 z!y7scO=5K)+9%o~Ib_(9#S_lW{nG&(84w5%_EE1g|$Tv?aDn!3jS&=jCt=@3%)gE8=6nk5@}f* z{~#f??+z@MSP2HC`^mmd;(9CfY(IUjyfK&Xb>%J|-G*Q{tyA=9@4T9y^p}SIG}~$K zU$wWkr4sIc@7}n)RE5UIq?wbvG<_N?s>&Hb>r`D!ya3X9BsBOhJ7)j6qKtb@lc4;d z#@zEkLWY>UxXcmT&0+`VSy5%bm^yapUXPFUA~MS*Z(G+Ti4UJriLj|SL2Bt<)VIOT#AISr&t}n?|(kWQ<)e!L&$@p}(P8+m!`5+p7J~CmuPhV5X z)61W;&KuH`Z*wI`usC|CT8d;ze_M=%`8Vc&eXCnSqI2l-L^VkF#sA2UW+XUw=%%gR{*#abYo{o5hy;M^Xbc%S-tLbW>xORyA8}>cyAQv9jDt zw5Jt|KW&q^Yxn+E47iYfK#2$mx<*T0>bn)0%&U3`z6hSwG0aun7t#|NXwR45c@y=G z!B@t+-(&Kk_L9MO$soM=K-G?Q!s&c6>-O0*$L81Hv4hq6H6(~AgR($UArX1v(!rv; zXalFxi{5qHXO7jv_@CM!gA;>%c)B9~D*vAQcs*wmNm5nfnwVGU?<6NF)jHby zNH|qde*Jdy$+LuJ&y^%GuazX7r2ocTb~kRezCB}1;7|BA=Hm9+;W*BPF~ORW`Dn}I zN2b~#lJRKkhB{G|C5icVON1j))kZv4?$YmRqH04#F>ejB_{-<}%_TdYP7TzsOGj#c|8cwk`KwD$G@Z+tAq~~mk3ZrnD zS|*M?p30@F{kR1tPUwQqZQK5fmZp7N@fEY7?Kf5F+F@vd8D0LZkXynwOM|5MWuJR| z{*llXD@1-HO7hU2UsXA5(D=QkeJj;kgU49%h$rR4i#^W`Q2kYQA^cP!a)Dcmpg&RS zV|E@*C2{?)!8*qoHRKCF!&I1q#qRQ)MX$`y<=20~!QoJ{dNP$G@RiY;P|F_r&PSQ; zs#@s0E=+m-LzB!!-M)ob_EZG@!d%?I4|5I=_nv3p`bdTUJ{LnjPO$e;-i1#PH6GPn z;C<;!r&}>miIN#ut`i+7NRP`)uKU$1TTPaCUhf*N^urVBbUceQCL(%j1V#5*v(KW- zT?_oHRDGV+w=gC(9i>i8ztGSrfA)1yNPzAhCl-A%47S&koaTS6qZ(DQvG&3hk&CGf zS(|)G&&s(2DCh(%O74=xY`6M2YO|-sr{&m?_8GmEEXbK{UVwK4=#EmF>DmPI>_`D?mU?6xcInNCZS^- zwYxi}Jjh<0v-k@Acz&^YL;b!8XpHd4zWpQCmMPn{#jjP(PrQAIG2T2y_a|t!mM7jB znfAY|>;o^`7*b;mEgU5M(dsMt2&>J-8>ijA4~3igjV1)%L#b|U8Cp@B)*fAR$-xth z0|6OLbArpxctNWRF=9PRX_k;xX$ngxS<|2A`GpQq(T4FG3O~q%VRQwBU?Qd^#sa3q z>pq%B2YFFcm(q`nrjlNQKQ1A~_iPcSs-+5yJwHZ+SF7Ipulm1ar0?M*zQp1y2TL?) z5J6Ux7#iem-CelGQBR5J!pGeIR!@C?5iK4#jQGn@qy5VOZtbk3RgujLtw9TocPg!-00* zNvT;fmmu(u(Jp1&2a^8?((dHTv?_!$C2h5N4zvVkt~g#^-BF%WFiw=kv`fs^8@)2> zjn=A7_vMJvrO|1nrhBa0s*Moc=~DW~G!~{9Hu@Rbqxrn!s6&lqeTapYE@IQUsa-7H zX3`aW;rm13pJ|Ng`q9k&6B*A&uX(Wo^uB(OdnQAXWG~*O^@16fB~&L-e-G_zntzA? z8}uhy>$wQ8_MUsai(Sj;$FeLwGa`;t;U~Egh~Ms&V?Ah*OSAb2uzegJ1SXtTO|{ma zV}ms3aL|_m4j7MwZMCsQj`prm?MxBo)z+fEi|m)*6@^8FUsjVJ zZxU>gaJ4QHx<58enDBT^VP*F!h3(q|U03@?iGHR3N<7IeBt8YHRE6r$yKE(^XH~iX zDPf$T)zsiek?=N(>)EG+m-6YO)N5o$V%j*5haABeY2x_Du> zEy+mF%8$fcjCSB^!SZ!d4b3hGm~EKDSj;!n&-kF|gbim&$3u8N+#I5KmVzw1JU3{Ex7LoRhdEZDtyPhY$^Br)ZvfPaKj*r!Cc{4BQ3*mKBY2;SdlXwuG-qNC|xeLfNxXpAcoX0JT9~e+<7J77^j&V%3t8XTXGyJCM`JJf< z!FNDy&Luu)y4b_c=M4|~m9UB#q~@%a=up|D-faHdG25pJvtX9RE)fYvN`SSIqyC`p^Se8keM+PtPakS@9D?#6cV{5Gx)PR}%{{ z3z;c-iz=QhEG|roV>fAR94zhp`xHfCtQeRkS0qJ*z=#VP!+?A38PL$k*ohs0!LRE@aG9@cJox z@Py1qB{{xa*FbaeqxIKaeAwJ+8^_W4^n5WO^1PAJkW-5&&&5bpsVt4YH`9bt)3CT`NBhUjYR2^Iey>W_sSkly!J1$ z%zEvfY`PV2=>Ls1CmWtZ#LbtMyY4eZ?>1Nvf?VGB#)d_s_t?YcK?96Sms%fdRO}Yl5 zE^gN<`yh`s^S-w{5}Dn@O2=;vdCM4xtS9`Nq`*Q;?S9fX0jaNa<(bG)Iz6s~XUEdh zBa)Z=FS0%&tG;Nj5vMhYSo1dMNT!`M{^Z$plPGqac08&#;$e3%Q>Ep1Y}*J)qiPxN za&+RW7T(n{Gn-8KRbRo7;pjwKR&T}8_vr)V~zh=}R;jW;!g4j-HpePG``HJwcv6Y{6y3~ggf zEJcs4zwam8J@@%%yeQJ1X&ZEq0#9MV*Z*|yqA)PC{ZL#l*Z7Ij70+Ofwye%OO??%wSHj3M(Grbr+~GAoFualT z)u^ymT!-M8q?rIO135y18pka!zI1wug==y>%YP}!etc>5D=>e%-lbqW>2s))^!w8+ zE4J4KbH(epeS;6DaR(WnNxYw#AK(^V;~ng+n_1MOmFRB{()O%q1R z##gMv0JRc|G~5 z-#1-(HiLYt)kA%4f5p7?tvoSM0sg7_YM1oacoJF+?@XE4PZRv!srpE6doqlmSDd=n zDai{TI2cq^QR4kV*Sx$&cQg0*?C9}lgI+mFTZ}W(ME}g(kMD*EEoi`mIx?t+(=*a_ zvv9IJs!4~28^cm52bK-Z$_j|gb3ePLy~)GOIXcZsEX?l}bbT?#RLpIR&+S#|U%Yfa z6bux;dS#?EJ*U=76W~-JzW8O%l%S5XoS~)6X+_Yob&djMZlv$%ZZuPYKiWW6QbzI> z`plWMb071CgwYC@bA^Nj>NrqLOHS`+Na|-6P$DlR@vHKFNOH197E3ylY>l+JlI*Ge zYR0VXj4qW+`ai*b48}<|&%hdZ^!+Wft4a&2Y&I>~nmi@yKs3EBi>Mg#RF9;!Gp@>t zKuv3P+Av6+O<)e6D!IBD_h<=w<0-ig<%~C_XQ7uE$3LdIG7KbqPn_Ss7wlDSdX{c{ z?~3*!)eFwMQfpNF!7T~CNV)ne_oV{*^;`w($1IM2H%;YXRVGO#YU(vzIO(&CFjfx zGyd*O)SuDV%!)4GIEmMY5**3C3e;Cy*vMKp-bl+93$=CxXg8-~B*nbc(R0}?1G#yD z7R7|BBMWq9f;N*%m)--(4TmjYdie&V|{*IUGUg^||P>jTitrX;Fh@t!FX2WR6i_&S} znlz?4->d4$@FCr@YtD+e9opme)kN6HNMl$oLmR{Mo?0r+4O5lFf)N|~?f4;^6<1B4 zTR-%YGIzwMUmT_}KP9N!3dQe2&?H?KGYLZcwKs>u%a2T<(L_=z2eW*FA_IK1ldeCg zOXzbgLBnkAVD6-?$hft-8^I8q`CX4nWSyl2%C6dj1Q$|UdV zZLS@CS!(u@l9ZKt+9F4ZC?h+gfVw&kbQ_(1W8IntGPTx|@{Oar;C=3YMZ=tMaQOmA zKl!G~F-&bv(@wLTFi0@1@KKG0K18*cgz1CU6}{235e6xShS^sa`y@DQ|9Hep%*Qm} zH}%edtT(*`cL|;wseF$oA-}BpYChrq(tfJWYZfH>p2UL9xz@J8x2^V1Cf6uQ`4qe0 z?pI~{FID+578~7fdS%&^EF9t`n45o6QE#en;qg$Ll^@gizOEcJk_fzf!8B3CtY5-M z|5SaR^~i6ah}DpSCau{$wviVqfO4J6Hj{DrNZQ>Pq9N(nE!(H>M*am}Z zQynl$oIq72M$drevs!NDZQq>Im-VVUz>3BUSC63F=fJKqv_s#1d?GB%Dhwe`FnyBG z)lf#Q!=Gnf_TcsNnpM8$YG;1277^<57e>uIQM{hcTmQbx4i;(02lL=?(hL$yn#T|E zyo`@kWAQQ1eeFp2(vmT6Ck$TN?tu4ADzyP<2t3|D`mT8nIS6s(i~ZlgJ)jO zmNWigIJ^D}X|^|8TCk!1{=xi}#te|5rLl40 zVe}4^E+NLkkV?;5^6~iFJn#X*^-t|hH$T{*FKm!65|`UNE>PnY9kezj;0VYmcu3)c zPtgl_&C6fQfw5f4=YBvE-{ognFhL8Lz#rLj_FJUx-FdrWh%7SLk)sO-Rx4q|^=Z`( zy@H2}2EWw2-l6Q43AM!ks*0J6FqFpy!szYfbvp}J5}Dq$E+{PSBW-pBw`ty;pDAC* zB0O*mueLgNA+s+Q526oA^o3Dif+isEDE#U%7%2uTiVtYNi)NVxcguoS!XlyN(XOW6 zm#8YYhwA2J>hmvT99P)Me!q~xwuRkinPXt@C4>Vc@;^*2dL&Q9v#v-^%}s!8T7c)QDmsNH)N1`xjA~&c@ja zeJ5G+tab8iH^4dZ&-x+Iz=Dx{!PuIghdiF11|C`8`BTkHKfxA(Ks zihEWB7~UueO~mHy{<4hY7zJ$48)IlsdNSIwqeS&8&`7$^|Dk#{>6GF+U-;dU{^vlP zY;j6~yMF`E*2~B+8j$Yr{cbw3w8C_Xb<9v?fDe)em+acYLgoPhGlyJo?Zk7BI!v^{%U`{3oH~*eIPAIV@MgfB0grAsoJ7oCQkpJ# z@l2`4C^KdO6Jd2-TKK*c6yY)Fzsvhv->SANge)PCGzDmO>`4GqU741p8n?7_Etml* zJmZg>E{`{!Vs2$z?mlRfAG1KDn=~UPn;gJWcXu{1`3hS74qDA|8z-`x+Mku2$%r{x zvA$-KhW;UhDv}iYg8+0@AemC98e(BN>_~IJks`%N`Fb0P&+!Z4A`xBaeVx1GugYSQ*YM*I@T!gZdGL zcA>WYQKX*A6bIzu-B(>TRNUgqqJ4pzg$qfQ)Y4DjOc3k#6CdMPp);@!>+RUC{Nb0; zeSA16RPL->({{t05MBk&Hx>6olTd8F0|Ha|l)>;`WK9XN&yJ;KG<0#4i~|UK$}UR<(iII2Esp0dXw6G*l?D90?rh`Z)OBHY zEErCTzNhFdrkL|Y^6>Wc`|1(>4B-A86BlTx&_LiSkY90!N);lWR!w+9FEA%-lbik5E3 zn#m0-QwNc7(uOVrzxxx1i9@ zhwx>NTc>IHmC-UCB^hS~PF@+~bYBi=gb8ytF;XFR>ZH&)2biL5_CME;J|N(Q9Gv|M z?lB2iiGT{i4@+VvB0`>$x2R{Hk*R3m;A$drx<=$b+sl&GS+O4c>uAB>erc-2=!WPB z?>^8M4ebLTd;%6W?ob^h7&AQV7o$p#cL5oo!<+R1PG8n(1 z)3+0a>jwGy80hf2V{uEO16hb+kA2T`ii9;uNU)Qd{7v5Kxa!^%;XB^wq%8>?xFz`Z zA`}^#ru+*sYz&0wXO$fOIEesGIB(1SCqxMQpCWpgu(9$%iko}~GSCAGEQ{gYX=A;E zEYy|~+a2yunSIt2doD$ONS`fZe&rDf0^MC{+}o86$`elCaLRT$!8|4d~;~K zmD&U~#h${ocX_#zNc$rSOYObe;ZU+l+S~}J4fwXwf43#gmKfPk`Ht)zK*GVlG_G!? zx2B}0(7E=h{5gQEi~uGnSIlmB@-z=U5&kS#tj%)sc5SoLwKSp!dwy1fb0dUkOd0C|u2&IVVLGYz=)OZx#ozyY8+t~*}DO6q;pw5e$?D}&7967aL#{^w6`RBUJ;Lzy z_~t*(J}fdrB$;rc4tiCeG=oM^3`h1i+Xk?Igct#N&qRGzLWmGMK(yMU$2s0ag_&0j z*~b@oD+6Bw!)1~F&xiD8qzfOW)V?r2_JnPchf0{J^W)!NuhO`-cV=BP z#m_S|u0>BCBLcS*o~I$3LC*LX{QTvTo68xcYX*c>e)z~#I=-^qID$uR-&d<21gn1^ zuv=gWu_>p7w(($pFngFj7`hq_Nj~r097Y$_?#IlYl5bW^2=$R7+whS3{sMY<1V-Dj zrOE#hGTjBcdfCT=>q-GLEP=+`SCr7&v~y?Cf=V5dy;xjQ^1I`2l1x3tH9N)_v8jb+ zqornY%$$;?L58$}uaW@F&IVJ}byfk!pHYltK#s^u^O@+^Fn46nX67en$^ri2a)$OS zo7RY<2iV+%L#@faPoPaYOzcYBSmtyZ8JvoIh5sTNwcpAOv*g1ze5LV6|8!L9lmv>K z@4cl9OyKTeASnd>DnTlg3BqM{|DE0*-iSS4dH*i;ApD_ zJ5dfLOhZ>=Au#<8!jxJQruZY!3Oi&n^D6c0$#z8*~Ta0 z_~x~)hF90%WS@Nwl*a})7);V=55_{N$qQIc>&6dQNU_coeX09;(rfa#SQhr`S(+y* zLhm6F&oP5EVV5NA)wmQkir2SjuUjs>NcSiICbcby>b&$mFGc~2`l5>ukcM+7n=Y@^ zL%1`GCz3dxq?6xq2aYMI%u>O$T=+cR4L`;vu5^{}C3%!r%V5>^lfpjJnv)adC&59`t!cU zNMMouK(c&WTFNjhxs?&KdzUbVm|9`Mu)GMdo$zYpx)V)^M)dsL@;ChM@(|jFlnD0k zaFn|I1G3=2PRC|+m8?FC2^c_F6$N8*nk!)t%cRYy+(!3a|bInxVtgh=(Xs#g)@z zD%oy%x0QVZQ}7j243V*?zizt6+i>kHbV35J9aY@+RA75lnBf`B@zSitPBdk>!G<9h z_HFb%4aD8KQZ#)&K$Hyp0?0grLGhGVUQ#SX^vC zaPKd9y=7`8J*7_9{m_AhS+?ZaRlxoy`e7xL?O70Dt03JOM@Y3RD%hx^jMtDxf@-Jq#4M56(Bh+(*3{JAHMB2_~J3*Oh|%6p zH-6^dp*Z^Ke5vKGXjsMo0^{sH{?ns_VwNO>TeHgfyS*D<)rn|bAot3bwFwmtX9Idt zTeqb04A(rPCHz3TS;xf%3*c%rXolqRo+DzD9$VjPh?=3G!!(eeF@;;&Cp;B^vcqyQ z{3dSn9V`^Vh}jGomnb>r_dq^$IU~?wD$q_8T9u z{2`)+AZHV|BZq_-O!C?Ptc&L>1koZm9*Dm`*Wj9h!8SfwgH zc6>S?JhL&panOvNtw+qH`CT`q(7&i;g^ZMgD3Sn4*CZC>hLC^z_^r=g};{5&KW!nD=)kBmH4Cb~G4q z*H{xCy$mHg6HwAf9`!#V6D3PGgn#F8vMK|T0fMwZ6wJ!o$X+RU!9KHK7fo{xwpW>8 z?~oZ?h8Yzi%eY7@)$7286&|{}8RHgEjr^yHihtuoDU%rzhiS6mZxr5;*%=B5LY}C* zpjl3pDJH*bsK=H#kcThYF1l&hmZ}B-1axR`qabf^-NlaFvJoMIMRE9O-s&;5IlHy9 zm)`j3zz}q1hC$MVqTE*76)^3THX+x!7Azggm>}}-^RKrf#I(6_9&ykD#6g~o8y zkIBP>4{W-t_PPkLOAzL(xk@Fb69U-p=h(CIP*F9<@`sq0O4sFX_|2|8oZy2AKwO}D zD(l~*vP=SSG-74)3ZPQJ#35M%b|`PexR_JcIIGRVbkf|wEELaJ`B%EIIhO$n_Rley zxf}A82J$58a=MGn(y|YT|9gcIl2(nTri_OS3u7K53F2x1v1H&B5Zx>=ah7oeLmi)B zgZ+P?19d8+N+v;^+QBcFI2K4rj1hOEj*fc$WJ-%3NOX=`-sr1+C{(d-d;cN!l*2Dv zAKktXu5j`UTWM93hGt}pnoR-$V|18%sq=GuBRQj<1T&|edtp+L9Cu%_r$_60YnK33 z6ygl&jt9Kb!kz1ci-}W=R67KlDOgegHDUk4Z7N7K zVgniwYPT*E@dFzVlT*I}JvSxJxjJJ)2^EO5r=)r(G&%T4zLFZ6vd70${2(uX%*wv!MnvLz;EHE>f8{Tl1kpwfc?)>$Uc8yzXx8Y$Ip$9_M4T;0S_!vh_ zW>{<0;L<~a1CFrGUb2>@a9GdL+Woo_*jLK>8G^QXr6^nGRWD=GMy_!2iWmmExk z5c?IiX(Zbh2!_jHu9*t9XjiY4G5F;2>1kgQ>kkP5|Ga?71FuSpwUPJdL`Y4>;wdk` z5+%lMK&^abu8>rP4k-Mn?@bDoEI6M|*a+Vq@q6|cDZm?U6g_D5xe$uY$mg8OP=EPI z{iV+J%{S*MuD?`DA?$#ab#*Adi*@uy6VUUerpoyHTVgvyMfu;MFG^1cp>Og67PouC z>|$r}6x}OJ^4XxTD+e&#h;TmaL9cjNaeXVk-HNWv$qHE|Dz1kB*`s{@ZTmpBNfaOY z8{+vBkyY`+>%D{@Mc?zT>W}Hcl0a8nz+e_%XsVkP1TKr7)t_)vFgZpCb1|DK3D?o0{0E4 zItg%$e;~cQ0*y=gDmkH*WZ3@L;pppQdYD3?a$e75+Z-;|i@n=d^vDrETfEpz*&>J1 zE`Ek=0n%(GC5aE|S3@Kv4O`s8YYN&w1F%h!jICd&(MGUVrl6 zM;W3H+Z8)ykzRnDAs(e7Cu;5YV`Bq<2 zR63ujLI@f;BOBgBZ+$0+xC3Jo!kkl{{@RB`=m1PBTk_TT-b%$egb8ZhWTzw!Q_{s;jh9D@k^6wVLof`7Wa_3}rl?yw?5^Q2 zQEGTzWa}_R&)LRshHpt81ipmuFPRkETGfCp(qlXiV&DG8dO)yD2z>wCL*vIC)G4hI z0fj@$nsX@x1REe58;M(K!V_kYg%@UxrL)Gm=jIU*mKE^Axy5yI_7Tio2#YP`QIfN@ zK?Fa5FQ1LC=rcD*1k6*0|HNO`<3EW$#|P=&2A%P#SVEv}QRf-!EG7>{D>!e1wv$9* z{%7x7@hJ)ndAvVw=)$L_J~yRP3pOP zmfP{zGL_w-;(aZZK9{J~pZYzqvlkujP@ApN$r2p-*Iyg`2n!5Bhh}!0sG%7nWvd9N z6{nvyO@g34p<*d_0V9I1p!I62$*W>PgchU0hCtI|xY?{tf@+sfd!&TOGvUo{>A> zUhj=iIm*Gn(dP{|Orx)f%kB|9MEJ_Z;g=8>GX3zTm40GTu`L|Ma16FUdVgp^kZ!D1eYcEa%?a5aQHV`CEYbx4g=LqIccFkCEY zt@ew&n+$NR4-xixviB?=nz#U2kR&<;6~?mtSqumay6 z0A6{|_N#kW9)9)2g!23{b#(}MND*vyG9(5Y*TG~I+%u50>^=c}bI;2s8m#s9#FgAN zkql+w<6L+cIh0~fx1*tUY2H0}+OZS+3Dl!1-|qqGXF~X-`)TNvtt(*uA;bS2*N@ga zFd%wl;n3Xa2Kw}WB_TxEFzMq;oYYy9cgy}lpYZOZ(L-Meml1b3b z8*4|L&y%-Y$#{i=WDDu3>G{wL@eA}~JVy9R?yepCiU=!v=U@WBy70&n7oJK1-4KRy zI1HUB*^xcVkycpDJ5eS9ssypT(E%p+(@TMwh~V&zf%;C6ktCOlYJ{sfc7)A7z`D`? zk$;FSFnLn0@M!<}D}k7jRB{%NQxc@|k;d~HeQ)FT)PhqxM3)wlCraWu4B3W@Y(tea z#Y7MMXe=D6N-=Len)iU?62 zBBQffrXU7QR+Hgaf@`Ifv!sm2oKK8|pGbcuHU?I1VoZDA1AfUsBA^-W&C}@jkq}!- zS+LS$EgC$|2OGD-WXvaq(QYC50aH2a9fNN-$x&j!A#q;O?FUmZk`z;N(=ufZl?1CZ zV|LG~@~blsNC-~Z_;;|k-i|Nn0Be+!y^g>g)h!kgUI>RZL8nPvvif(It8AlJI6sDm0auMpz77|X@YR}O*S>%j7R zkc4ImA29L)unNB}l(IsKgOM#rwXX7^c42#xvm5yu^mkkck5*4sntZXyk)uDXd zg%FpU^G76BkU?h)B;c8*n=%(5=*2VmdR2zh_JaxVDKVz1hRl?8Ng8q>3wX`Mit)L- zL7GVb5o@!ml^@3uz%gg@`V7e=gfXTykz7E+v=pv)?FYN&$2fZ3TFE8@1~5BzZ2y%2 znkY`{2|dD#^VVi-?JqfO5svAOa2jJVRiHp48QhoZjktJY!B4NnmG)5lOmiT$e8O2~ z*kBmO+3T2~D!nmwR*Jmf5U%y!+LRAydUr1Es7Zz3Cj-{mbb|Su6XZzscGVXBk3o;^ z7WH9^1Q@kx=J~3IEE4qrwgcJ0Gv3h<;vr6?Za$rmc?VpV%!&14(14( zx`|R%zug7h@nNFnZ`Yi;NkSo9_i%x*)6Ai9ZMAZ43xY*XT!nqoh6pPFUasGS(~O3I zhSU%XK zMs_=jSXCDVo2}tYGPnfXm&44Lbid!l1`PXjkXFdal0>xsY|a5KFku|SgDm+{JZOOC zjPoq20xsNrV^A<3_Pq+jWR=z;iTa}2^@41hl(u4y>LY;i;LJ5Q(-Kd;nl;R?kBgm= z6C$A;g8ir_XYfs2$*vg`PUn9t#~$(kkj#{5bzShe%p`?7k+Uq%^45Vi@eqa{QD||X z^dM$|4Bj$Eb_Qmi>VOl0;o7L?3?+)G%ku_NSI)4#{=0j?=RQneR^fVy+ze$Ixd8r} z2kbjRD{8-!MggRd{I{+*OunlAN;1KSnL94*eVD-#G1gTpE0a)Ni}UvC#g)YO|6U{R zWUx2>!?B5x%h6CG_*qA#%`?3PB}OJhcuz>JGK&u+@exLHF0seur2(0`i_uDG`DH2K z#!P?8SL%ZUwH3j3iRJ`9^Q%_wY(dyuyKc%dKu2*XwyI2om7Bz|^=EhJWgl-cn70>( z-@DqZe1jDF5!usOQ_gJ?Obz5~UQZ8y7`+b+eoTSAxMRGlk+Y7Ots$2mWq)I7reAu1 z3m+6O>)MNIq(yo- zV2U78yCPi*0;5GnIO@;;&3$v<+!xPt@AEz9bI(aQR14^*1dOahgKu*jUSKau2P4xy z$b@?SfRs}|QcVP-Si8V3PRRfCZCW)o$Ay~pw*I~{%1je%tZ6WN2v7ec`kt3#(qL93 z;-^Q^Zt}%L0><>h#_@@fb4Opf_6XpC8y=Xc#PJo&SB*JnwM zCg7^%{G;=r$SoYLSc~HB55fLriY-mz1vKz@p`G4}iy|CwqbKl;yGuV7=d^C_Jz*na ztePOi->7JFW0r~Gs_@z8-RD&xON#z|5c|^pGv*f@Od^TmJ@b9Rl_bf!|HSGqUV~;UVrxF(bvnx zaXp2SXPz|yw)LVV^(I-JFUF|3nC?Gp!MN00vbbYnF zVWiDqtgZhM>MEljt)7ahCcIdQzlT)cJGJnEZAGB!C5>R{XY|6w}O`Gry=S6-VKJ}XiExH^noF)E&M{zG* zs2I38Sx;;>t9AFBm4t+~1Id}RcU)By$|QH=F)l^4O7(_&5{se>#}C$?)*-Tr$^r1ROLR_1w8jqM-Z6Ya&Mh}AJ`dR*0<$b8sB zt-semb+h7Puwq1Ip+zUPai`hr8ZzhV`klh)pD{R&R^gV89y3EZe6<_zy9SNj&DF@O z>T%7C99`LJ-aT*Bi#iRAKHXpBJ1$?i!Er~}n5##NXXgP@dkreK2H7cJ+(9`5yH>-*7@x3N^KG`gb~M-dMQ&#gSNm#2DQ5w7fCuM!!&cfejh>Jzi<+cL$2s1Eyy$;sp z2;y7_l`$N8eV&AC>Jgx`Up7SfO1WxGBruM96mshhScrzt#=obDV(k@tumFtJw^HQr1kh?4$3NCxo5E%GRsdi^g5=Qu=QCj3Y1uMlxkM}r{X^=O{>$+j^5$W)C8mCd+ zAZng){@i|0H~zd280(&T@N{Q?c4w!)J^1DCFB@6^Nf^I;W9n8Qy6xB-2r#m)Z)s}zdt;y zaUr*IoyF8EK977kaLCbXLCsGs4Q;jh>NfG~ffrp9eTouBpOd@)+y~Mo znuAdL=FmnP^l@!#q-)pKC2Tc`G8SKWYd}(O#1rUT&ElClYN4YQfXn6m+ddtCKnJPg z#%wmrxW_4K5m5esn-I5Jt5s+;(21>e*acO;m?2F10Vc9tb3~o@m%ueIB0JR|8HigV zJ|vPp^mR7h&-SGAm`-BRd_N4m(V>xBB&9A*Cf0f^i4CX%PUlJi?~sAS1$*+_85Z7Y zI>T7PH6S?tWJ6{tp9@hl{R18e)xO&_MgRSiV;irjKi6rka4youht^{{dEVw(*@bQw zO6;&B@2-W_lyzPr4RF`0EefHcHTg|nCHP&}_&w`9OlOIK$<;jT^_JP89o@%vSkx=G zJ(ZzyN`}|-{{9g$!AP_cxBvTx7#gV00J+Y2`aAm7*gN7~sM39Mzn#Xky`=yFjRcxq z{HEN_ido}$lFmN#st&8!+=94>h5r6t+56%{c8nbtw%T9Ak50#lwVXA1SQc}jwfB%8 z+JPs1>th-N1#yxpIq`@uah(#ND=Fq8xieKSPjcN={KO{}b&eG7gmJV(WOeG7`~0lO_Wt~=K<(=J!k+7XNx++xK07|Wf z>u8(@>nlY@5_Rr2%?OS97RJnU|1<|wtA~H^zuJ*6a>s1As+*996F(QaBlZz1?@3>G z=9U~0kFP=sAK`8?$K@x@&(|B*Hn*^Y{n+P12`VzfmM@NK7x* zSucen$W##JM9#hFh6DjJl^cE&aRnmP6x)pODHFJQ$;}Xcs6F0qpw)3BckXu6a-!#W zq%?KIZSvPHo=&$42eX~zv~87Bef~tj(uy2X-i^J%;4`k$t~*U0TqzRA6R~GQSY+78 zlc+32%)|7opN`O3L-dZQzr8cEh^mnf)>rG({uR|5z$U@$G^cB00hHI)E9;v0(PTcw zigM5HE8dL?z^?jDdn34KX+ej{^9|cblhemHAhJA8&-No#ZA<-Vmo(s#E zvl3Js_gqZ0g5`*FHso)z`*EBZ7{nWAa#yg{pX$68pe>K|EqGpg!Td1VZXa8qgZX@? z!kdPaFO6H7d(IUU%7zx;^8HR>9+2=CBn|N_e-AQP#+;@~B?z{^9pKm-q9W=TH974r zgB0@E5gtt_&+XqDQQBWQ@%vM4BeYn_gn5JO*3l7$n%U9)bTs82w!yGS-;?QYuY*}g zMUvA`rq}IO;(QU$Do{&ILVUlUZxH@G1o%r%KNN+yUxSp~q)fqmQw}P;x_@{9Q}qYv zpv-qv_hdp3{$>p4H(Qrh*OC_K(z-0=p;_Gc)nYpkxDr5A8IcoLCF>O=1uiwFB~fhV zj+$>hgOCKpDdPgMX_ISrh%<6*bN!SobV|Tc zk5{^CsYf?pv<~Z6FVBO@gOkpVvw^PM%<`DLHSEaMsbX4F{UuYtrCi5-C@w$xwKZ1A zFKhs&*Tw;!NNDN$Qy*VD52ocTgB{N`?(mjo2y0^FThA1LkK;6^>go3D-9LhW{Bhsf z|J=h764xk(IsN0cFit4oh#op~vy5_88fH5!by<5TN0J52^?J{4=pIT?n|VJ=@eIT9 zeYy;>V=_=l+U_qx-XEUfBp-0&8}`*K&*wRa4ice{{xx}NIDtcR5}nn~B}G4tgm&Kl5%zAvY~@T4VJ!z(Dsr1qPeTH3S$^odY;=NIY}w$DB-4elV_JzpK3UE(gSPbEzjo233d z4vOi-V=dCQ-p?|F)(KI8@xIi#jy|1*wB;*_EQJd@igJ*v2tA)Gf7l>s>;6KTSfsRB zdCaf1gG_3K*9#Jzh2M;;z8VC~%88d(-wNc(y_oHWm3WW$5+e>TKF-px-sm-BY(cVQ ze#%!8&V!(U|7I1S_is>^c2{dJ8`dV!!Ai9Bk}n7rsFm>aYW&sAwE5H0!%|Y} zx%Q5@qA*RICAL*)<2^u{aE1oyl690VWyF`t2+uM|%*!K1Zo`|b5}+grTwN1irhBNS zaOmF(`Wb%iB5FNg%YQX*aIYDJ*@DFjd0V-zg>$DQd@)jmez!!AGY88ld-p{H#@NGp z%?UN98fJ*M+(lIFGJh(QG_{*l3KN-T2?OsKa+&+AKE`1BlneheKC9ruE*HaLw*tMR zdbLoqa+H;iANXY+ej^aC-79pOA2HwPCI$f&^PxQ?<7Xle=WDnC6T-P&uzHML5xmRE zuCQg45n65EWYeg?`MY?i6j_aGeLhr6i37#FCSc{9$-l39SJ6TIMDqhj{u4EL#S#OQ zSvLj}Y=tyzS$kEI1>2T4Z}SswLlyPNe`n{%y(dsaD=~Yh&!lghM5A7CB5AgRQKLiG zMT^wfy%(k%Y1Fjo*Y#BLJ2<6@(})KmzzM7iJ~apqE+ zmBf;iB7u07X{jCY;Q{({y2$FhqYA`dB9!pK&`k4DR*c;;cFpBxYPfq<_uw4>$&&LF z8e7!wgk61lI(Rc5DMz{`yx#RBpk4eE8x%!`+R}l{V9z&4kmo+M`Wnn*^s&H0>_QNK z=ge(y(cH;vxTP#wA>Ldex=cxU$=S*WzwS$>+*>v(U$0$ZXS)H&ovLoVADtJbB-gDS zK1)s27laJ+Y(1Va&RhTz5$Gz^t`v`bi+EUceFi8L)i z+0`Nqr+eJQDjys4*;Er7EMWe%&H`F7t81L%>Fr)BWg<+gpfStjrySCRVP zt=HqV!w75vYCUp6!{@y~?l*b4aTmWFlJBDjO+yp(_B1j?1M;C{T;BX`?F135e&@fo zZqou5oJXRc?cex*?L%#%FWF?R zpi-{B@zvukIwyMALI>taqEjmk*(!Nh^TaiBk9Zr}1Vayg`CK~~H=Lg{sIN6>f?Z;) zQgvVprWT!ps~+b>xPyASVfJLgDO_tPDwdlGOOGGP4MGpmIlaXeZ!ADHpG-t;k70Ad zm0ObC=NO>Vi2iY*6y~N_b<0;++5?@F=LD2^ZXNs9X|KJTCcuqoN+o^iP;XMGxk2xi z4EDxF?-pabw9jVgJU(BA-m*adXjGPD)-8ydU%~QAb}D}}n1850UO(R(2diF4zcql6 zh)Jx(*70=Rv0WNN41Sl>W=mn^J`E=glnuTCBxc}F(ePo+?{KIhjQs6HTc=&G@KV6^ zlUjO`f*soy*q|e^j!(%gDW9mcKiGqCLv5Fz3AaD)0Kt{<` z&$+!Q;00-+L|fr2orD*mC$zdWWaXaQc#(i!C!MJeC;sv8P|22{n0`Fg#x%cqXfuz_ zU?s_1)_b>UN|7feE2%SZWJXe2L^3Mwc1Le2zBeX}3sS|kKlBgzzIhh7??j$2+sknn zkR<%}1h!huKYkNFW+SPpv*pr(R`_JIV+c=TKc^wyHIlNktsO@ z?$m&co-hGta1?dJYyf$;q*R=EXiVZfmibV&ZQ*4jwP_KTlXC4hyI55)IE4d4sl_ZY zcRnE?gaDn3rrL4!4w{q)iGsc#26UA#LZl{=wV!!rnnZ7Z<-*ik7VqW0hM@| z29r*#IM(DKfyvRjHJ!_p^rU&7*`3X&jnk+`5~ZZ@X=H;UA_e<8^SO;fbRMV|nbeuR zuwD9PSPbeUJ^kU>Hj^Pnh8jW$tTsg$!x! zdMG7rCgt6~{HV?qteqcnAio<7g*uRzHSM=pYp7{AV25%?1GW#|LBK<70*`Il1N|RC za+U9p3tz7~Xks~Fsi-9lIc<;2)|W#i6FOB;d4$qP1yYFw&gai^Ha%eq@g9aQ=$H-9 zMbS$q>TMhPveLkeQQ*|FV^sQ z=lupQIBHu9tK)0u3SQu+!7~75dETiHkC0JkQ&=5M`31Z1F?KS#CA-3&=bDrZ45m{( zd6=emY7F)2h78cUmCw665GGlG-NfW=1=bW$V-l>ScwYxu*6|!M&H*I%c@%CbR1s>d zu!CW1QLjn5M6Jm;Lz+Y_m!{*1WR?O#pWfjOpig09n(fFT_AChdSunSSNC)DHCAeqz z%n|O^kpd3|6n+~WP-lj4-*Qpk2sw<6j>UGBpkKKvfec2m^@X#K-?Hz!LcOYP+A|y2 zByw+3{xLEQGeVtZrdLnAof}7=BEmCCN1PqCKO_vJ`T^`#xV{Ze^rC340 zrL*gk-GkAq;AZY3dos>R)Bdu7WI||%GeSg2hOTTG`!!oDJMN>u zsERjp^JJBF8Jw+6{AJ(RrG`E>A`_O*JEl&;Xuzro&L7_58<9vEh?5-UbLF_iCI@?9 zJ1N0Mw&BiZ(WTI2xD-x{q&ajD_4);AjlQl4HsnX`(aJ7B8E`5eyGP|(NLuKsd(uKR zKsSeh^=X~vzc#k^hE^AmxN^|*?lS3A_%e9R^%K^ zg--KMFg?B z-eHA~nvfSq0#jv<_;eTSfcWilf?hWrhz3g#r!QpKLlWL3P_&CZJ_%^)k~w@&=e21m z-A2&6!jy5})l@~XIp*Gj#Iu7(6J_I53Q+H8QtpqSfglS-;^>`=@vZJ=%SI3l#tGi4 z&HaHuR;4~2f@`?k$Bn#rs{`S^Zcjn%=LFebGLT5Jj=bl3TXKn7Q3MD|=FZPeljugZ zkj_uvFIhL<5;6s|KgFvItCe^QlJezn8@j~BPc!u7l|=2o=@VkH{sN>KF?F%cqHUVY zEy5#7lTtmzlXs-)iks5W_bmxO(177hCvNXGK?E)b6>!i3U&(G3R!IuN?G~-djH$*F zYOxuIFCWGxrXs?VNr44Oo!>Ngc47esafX(Bz~R(YF(%*mNRFf-O!@1sZ1CSTOt(=n zD$?J=vSgP7>MSuG?w>7RQlpKqE+!dFufKM~9#u@b=dOSoQsTT16p&7MP1>p+QTDlP9Yyd0jGxP}@+Q}TJ{x3+zD2xo zB=7Ttiy6M7f`y1Gz)ITtD7gf+P#A1ft8liW>&0ZiZbcA$?OX(VhC<{z(kAu|pQ zpm=!GdYWR6{iIL}vGx6q>udi6|35-(TMHi(+25n2pwrgmvl8ck;vyfKrKea+LEg3* zx<#r4{e!*6QU_T4>H|Bmu=3bqJM5uH`oEc_VRck8+UiS%-4?i1^n3_jr8`Cn|KVcLK_&#CKT zBgiZ|2qA2Up3~oHX^<157p;IT`CHre;V%erJgGFGM90fzo)Hw3AgCSg*+Ug53z6k= zI<^{#^wH&s?thEr*WU5Ec8!xtQ63PrJaZTOj_wcCFDLn}b?B&I{w&oO?*H|X%o*orWnVue=)%)NJDWx-s$-^3-N68o{w z^UBP}ggljXo3OtHSN#lRNcM8-e*3hbqivCL7I?|@N5VR;ONz83653Z6sNJ%0KqpEI z<5zXbTBX*yIQe0t&MuQwdyJY?E*flj!5(pmXMY3t7JN&?qB@T5q3Sn4%}xyc-=J$ZX6ls<#ZpMGjZ@d2e)xy-|0NOKblNAJQF>N1aYW zt}1oR`*_iUrjyNid7+xjH8ix%*uy(-$KE_V=rK+}PPl>II#vX?(O7Yi5mj=HlEsy-TwfFm`o_{LIy?(RtYJym|Q46U?!{p*9 zcn}SQE?uANwzU8%KH-_?7U>Y-g`~A+8G(!@niQKv7NJa}U;iMzA`@Kb8DfoYe6&Sa zJ;@pR(KY24ps;j6Q|^ekDV*PYjB!iet}E?`M}3*r*^$3)#{^PkggArZq~MW%z^%7) zuY))hVQvB*B}%0>&@GPT&V+}pNE%X}H09vv#_+cWv(hee@>mXyD0t~MLi*v{4Jx-K z*x{^JARW;*v6l~!tiO8K!^{+hOmO=7=?p;{) zv^6$k4%?@l{DAM>h_crW+-89v2)cV4s;x&(^gO$*A)fmuVR$wuZ9v!cdhXR5l>Gux z7CY)S=JMm@ppHl9)y_)8x=TJLnVF>vzYR-yAt-k~1RI3UD>stcG~u1p-vlR(7c{hH zFo%VZcF*GO0O;d8=`jg2CUs0Tr5^JPMbsBB4InAr)iE-t3hV#cHp`B9PECP%XF z#C-rMh#R8ObYzN~NOsQOukSqYq$5>vJF#iXkGHJ~LVs&A`ZM<0PZAzLRpxM0pp;e~ zyl_{2;CTlXIGq#!D?5N!apiih+6~IV@l&}x>q%zHA@7(SNJ0u8?=msw!(v9OuLzfu zTJy9?_qinM0Mij_?tk|LMtEm}CN=DC)rQv5STxNx$1U{GQXw#;Qa66sp50XMo zgdsXNab^Gh^p&Bc;co3w?{!M#n}E^|Bi#`rq9sC5lPWYdj;-XzsJ z|2Q<}^?VSNADm^o>JV*=YKAT@xxN&s~evIYZlGtaVyx!r}ZJkly|hW zGw`l_U?|U2NeC=+#kZ1PhVj04_YZZz-?Ex##y>2&xDz|zomBW&hj6o%^bkLC!RPXl zs;>wf{d8WHSh@>UyHDOL(I0u%ZOaMucy(QcH^ofx2a35j)k>@&wtpP!Qalma^kqN^ zddspY=Qu_Lbl^*q$a9a?sbSJC6np$Sc#|WP?uG zAf^eja+EV(jUnn-C)n!wL5F>KD@b$;w&P_-dF0s`b`6q$Q+@4QeIbt+ z8I*YnS50}Xr$25E^{yxNwOWJ$oAb2ghsou#Hx%9&l~9c`W9vj^mpFgfm2<cEMCY|*9bEo>`}?Dnp1j4Q z#qaEDCGwF0Jdt?j$ep`RBg#Zbh%NV#Mc)4-R!q1o{fm7^nv`Q$Zt z6KX9**%}<^Y;NGCD`$lB*B69W>|bLpFGxCDZ=bYFzDMI>>bLN|27-!N!Qwxcq<~)s z@bd-dpSQ-&&(Tn>m5zK3K?_3!d=kePQ+Uh2c;wncP1Iv{hqE7Qb-!s8zss9zFN_G4 z%AFUnx9M2FUk%V9E~cjG84YPwMeCS6W$c8@+1zcW&N1Qf3tME4sg^tJj-Ew3Ds*ry zUWU6`_xuiUptv9}&Y{TwvPgE`9hOw_(u)yEM~&<+8*FM;gB{?_kH2{BZQU#rz~*$3 zgNxnWEuh~W&_7yqsy4|l`r&}0+bXZP(L~JJJ{CTeEJGUIBam<3JGAOpXFl+Vt>XYR z{EJbQBws2#5*{fO-radskTK3M$skx~y}>d+n-hOj`^vNWD-^15r)gk+p+Ln{8pJsO z8}V7cht$uevYf)^oC5QCp7xJ$=H#*(lUhS+x>#92vTN2~jnk9PU^*$SKJv?D_eY$N zN=}()TK5nEZQvA}q~TMQzPyzueB^4>`tCn#wM@zGN3o<_%hg+|AMAN4iOxsg4;hZp zLb)|Or+>ff)#yGdclenk2s!A`x3-Th4#J+-Y8XyJ>>;hY4s&^R-#}2?pIV9RI$7Ci|e}^5HFGS?XFct9>_dnTyR1^ z68hch?AE_B>f0Y#QVM>1P0UUumnr6snW0@rV=eM|rMgYCP(NKn1!?Tdibts49i zZ}gP7FdYtW|Mgn>W=Mpd5-U=AkHezQoUshOg+n`(*yw0%i4}J~)GVE5^f@-P{Ov+S zhalO9+lk`zJ+IFJOz}wQe7eoQYHvwb8d->1PnX*q{i+02ute|GTj`BHMGoz)>=RZ( zfSj}N#X!-^8hTxd$6+^eYuHYIea!afV{SdF+inN?aYM5#U60iffrQ6Hi$+k@w{IC|Sl;&@a1xbPnazWWFZ>BDls*OkBh zoCo28lY%1tR!IlGh|aJeR}`<>zGiHu*Drz@&W}z{nLJ^FEJ#qCtY0U}gQ?_=&?C$G z-b4Go-RLmjR$1@`;Ln-6eRKNeljugLWqV@dJ#ycId)xE-Qc%+$z$Tw+O;B{@P`4gs>RvL_N~V5KF8usymy*^2tM?>PcHvrHQbYZ2U=}_o~}Gr z@6a8wBYH2b`m%;``U}rG^yOw-7k~Bbb_V4qjby zGK4Dj79-tcd%ExuUs5CsavFf?MDF}MS4{Ax4xLHRJ|jV6nRbLlkFgom^-r=>>p-X8 z@SP6#tVRt3E{N?7^|FB_n_R`cZbWCs?^wj2cci@?bDf6`V^>UD*lJHSebw@`S;{RE zJC)XCO}2fg8!^}&O&dj~uX;RylwwI<_@6Xdd?w6)PIc(_$1oOBv84U8F?r^Vjm!_P#O@VRd%2k=*YS?Cou{0VjeneTQG)qje$d2Xog(7;NoUj|z$ zh-m(PB{d3og<87sqz$|za`Qz)hj(P8BS#GhWMe?8UiL9J3;2>^EZjzE&C^P@4AEjj zKASmq_SQa#o?-_^{WXhy(*(ew@rm==wWH}Ck9eSyPGnx2MVnaQDs)p?$N7?n3>QW% z7YgKL(R(Z>p9QV+t6`;}|xm5jpJq7*$Q8RmZ~@i0c@1&G!R&a)LUOLbjy z@LlOe)r_1VI(l~raq}QE;J^f??Q2|&`4@b_MT!~Ih#8#Rh^Az@*XtaFc^!o)~&p2(tpzOrXvp-C5m4qRm>fn9&@z zp9w%9UXs=^ys_U=JkV(;@))m$+D@w%W4V2TY}*@cUl(T(=qB9TdMMboUmNNy7y6~E zs<6Ws(+w*|%@?XNV>x2Gd+q{nBM+KjU$^Nz4!LAbmYr!u3PG>2W1K1uWE@Y__807$ zMz!?roP*vW3*ex0;6zfOB}5tTT_H%PqYh7w1>c)orRS`GsmeWjJGl6eE7wZOetZo< z{HV%7=1xfaw@HnxAG-s6AUb{e51Fd)pDKR=8)kFDZ}?O66^Q>e-1=ET%3Vp1=)`vH z66@L0Y}<8u#bj8YBYw$_DQXPyq?QyGpLD8gh~_Q|R6l0f+ZH4?yC@xEO;*}bo#x(v}#^#yy6n&e0V!s{EV53`szuMt}xkb#`8plrw?eI_m3NiKX{+CrPT+^XrU z%gxNw>UF?dQuJ9r^-6DAsZ%FrtcY7AS_Fak50x|1YuX$)9A%sobadofwpw?eXeEoQ z-s4+k@uxu}lOxDT22DhhV2Yp$$9K+@{g&9L2%k)Wt2AzXaJfVaw8YUcwc8#{=N#KT z1z_?;a!84U`M}L4K~n*4Grv3P4mDZ!Ey)M{d1~_skFu7d*!!sw;V)2oVfI@}@rNMJ zQ@G^(B<|%^xTFj>5=<&&NLUk ztMH_d*)gZHuR(qpQ;0V(@<7nj?7t1Z2%id4?1=vp>uMjmObuADQ(*d-g9|@#!WsQz z^WMhL$M({$2jtg#B`S7Bvk$HGnwpNOkzUQun=Qy6g*0xdzU7I{bH~~UQ6}4|Z5ceg zU_u?ALz)ti=rzO*YBbbD!QPSDbGw)?6+?3CrepdhD1uvxy6TyM$hjl|}A# z|D-mg#dAY8leGUGsGBtWQG;q4lVg)zwB2$x{4UGdlgHxy zX;LeIci0K%hBHf+HoP0YhIbrt=H%4hj(}I)oeKy=Yv8beQsj#`u=}0l{N+Q} zP@4q8IuM|z_wf0+q>Kn}M!6FVrF<^yBNRj^uxg0p7Kaj*l+(S0v5cv~T*bFk*d)76J9x$K-^_Donzv zNkTc1u3xSzULFKk>KVf`l;-t+Lyo{mkCjA_ox^w*OGp zU8-T}b#$GwJ+9M2o4SwEl%8(+=&hrgpf8-}KtzL_=A^ARMwf!fnz~XxoN*9-(;CKFKL7q05PND@~zkTSB?6?phygEtkf%VYw z#kA<{Ce*Kxz#xZ$xo%wxpxyTehqU9RILRcCTtr!Q$Qx#er=0r9#+Zxkpee{{6t-c) zVta|61|cjFsu7pZn6O3V76#KA@Kd~ZwZx0Yw!7yVwBZ4IzUg22_M%4jksy$0kMm%yv1AQv_~N3@wz0uQhoQZH z@(_b=D9tM=sZFt`h`}kq@4~$o!|fkehs`9^&?^?e_iVuYK4-RcIB)oQfI#5<>=HFb z1c+D=RFTR0O3V2VJ0e&0fsfC@txXR1%(JNB`42Uyva!;}a^3K8nn(0}J2p^O_5+2V zAu1!6)Lt8U>p0|4{sGt6R!961@a%G`3VEKhbb=`IiZu?bw&+bbGWd))MtoZj9fv`^ zs{{sV8&{Ig7TgTf__+QvK_AZqLxc`|=`kJfovqdutrzj(zy_;@3z8v^Dsu|!8$9$? zRgouVUL4ye=k&Oj@sl>u#Xq9zQl>JttE&r>k+<_fHeuVzUaRkpB~41+gTz!?w@ld1 zj(mR}YXc{GhpXsAW379KKR2mBit+&6*4Rg2gWkGLp2|38$=_*>&MU$ucj;&oW%2XQl&_%xPRwP3A%#c_>6nAe~qTM=3NgXVe%4CvV$4Ti?ySdXi45a zB@cUV+Akvz8KmT)WQLv>++)7!S7=fd0X0J<@?SeQwy$)6A$l}pS8M2vcB!NVTF+y2 zY-JTFZ8ajtH!n>)bhCg?Kf_8ivb@E$UeJU7!gum*w0PzpvC7Cs_UZ(kz(ydH3Dh=GuN=}c{)9q}Z|Tg$`MQ3HA- z*8mSzv^5V&;}S)>@`Rcw#JLr)3Umz7vJ;CqoX&eLA>-dea?O*qUAR!Lc(qF&Y02Z` zE&(~rqjsWTY->^5<97ZOLAo-@pR?V%E$3X@ZvkZ8xH`1WSP8nC6CX89 zk_a_EUf>DSJ%31y{A4uf1HJ1CD+hyRFAA@y^_^g zYRPlB*gQu7Qf15FE}o}!NwOCcrPmw1;D?P%z2$2 zev(sS0COeJYoBg-1lcpjeY<$;SNu?Vbf56bggjXJtGD;VaFpE@yiMKAA}u>j2DGOD z6pEZCC=eYyi{4S`j~Uzp*|WF2lov9UzA~qDYGl|!ya7cUpm#?G1n&0JWny6d=)?D; zck?oC0Gh!O7#8x^2C7|tfL_;Z}SA05ji4w(Z zEKAxFrR=VE6fL`KbsMFThDN}Ttx;RFiu+jpZF?PdQhGF2U?F10{mGN73C1*`+_A;( zSVd=kudQ|rHwIfR#O&}gew-`lP~gl@l`%Slya95pYOlfWYGzm6s;W%B7>^N(R_GB&BNOZQNR565YUTUx*AF=Z=(+%iO z&;W8Sli)RgDy!%zo(pB1IQ`Ji-S10yWC(l@l0{-3SwgFylLEUi&E4dH zJmW~kQqkN^X>~2{;=NF;CNW3Oe(%)DS_MrzYNy!8%4 z0c9o)+amHHjaDH1e7{#QD+otJevoMHu&M}b_|k>WB$?ZO_^Q3%ryFVCG&&swAJ3^o zpm3xr-W;{)@BF6wJifsroYto_wcWZ7z~m^a+Hq3hCE5yj!4E;D{G3@9iQr_=vslI0 z^BPYLpzy?{umFbFvxo$eLKh5Ier1+#z(;}wIBqol~hW1Ye+{Vy)s)Lv~pOx_K>!NqlXWuiM4Za2+!uNW%DI9tQj;m@aJydu%Gm+xJPYcShkBz zANSjxA}Z6*)zXoRs4-XYe^p%S?AjpY0&y$W=cf|d-KCy|2yKYc0gomlsCNF6MXa8( zo;)*HW5#6!v=nz%84gv3q5tN(;5}@$Ah)C`-q>MATeQqYdpM5rQ);-W&Jy$myR+@G zFi025cOi!8FQ}BZ;!(exG>X2U_rOo#JN_q>s~dB=P%T^Z&m*2xCJ$Upo*=fQW%$<5 z+m=o5^IuXaPGMEEJ3Vhp23<)hy5bwLVFB{kB_P6cN#u$N-_`?7gt{2+*Q%51OvU&` zOi+n$m%NL_ZNxQ^(7*ll12X90DC#82cS`hgCno3*gCAT4i#|woYEyG=eAQ5@^?*Vj zVekf!6Iblbezlk?PBJ+yVrS6y_yen{0jwIAqM)8pM>RTzZQsy2qJl)}VMCP9gWfrM zvu(kWy)^KTO6PhLGE-f6h!b-x2C<#jG;FCURhtMIk|MUaQrSub7ycDlmNG3(<<_gU zG)H(=NBWpk*lb)mhVZH-ZD=_|53cyJ#5p97KXUSgNl){nu&@<12e$6b&oW9aU^gzd zRnx-%H-*wh0e(2>Q8i)E9_Wad3;k+t5zEVk*_^W}q2miK3n(E42J3iy9MB=Yt9Zw4 z7V?!21d5J+-79`4btS2#{@wfC^cs560{BAMwL=!6ed76N1N8%bInX!~Nx4jH z<4E;}Wy}rOp@SgkBDNx(w+pJ=)W_Yrc+^Cyg}Nd!ou8h~Df8lQ8!6+=?oC%fQk|@L z_3s2foI~cD*9`C|Kn^-Np@5QuXbR)JeY*QyXlY7NXV2YgBquMsCX@c0ae^f>MG23h zN&V|mox#zSUl3k-#&u1E52%l8Z8vGF^h;OUNLyx)OPZ&s42F}OCpHa{7EwhAbp6;1 zb3{!w$-86hzbBgXDZ%Xc&3eb!$|EDFvv8<>#MCoU)-mCfx9wHB6L)}>OgYTLi!dlj zP$G1A+vVyz!ONkbWP_3?&dKb#44{>S1O5p_o8UV-+6_4Vt&B|gCo}187=3ul-n|Z2 zniOQRIZE-%`&-Toz1}dFO^t_f%SJz zpX$(C&;~SYx(eJ9Khl^!NYw6pQqw59!Uy%fz_>qq%OQLL-T;~8YXn^qZn&@B=;e}NVQ5*U|&OWT~yzs4(B4O|Km9rMq zo7bcpHr;lThR~n#M&67d`-HP2GbY-}7p!17Y(fb4{hA1x3M{}e)N$;?IWSg>K*uk8 zX+X0@ao#^*t7{>=xfg3QQhzpt?E?+iCeiuI$>@~$6Zza`Q}Q&VL`6uJHa6|QemZ>& zjLGmSW)gRcE5($j_L=zVjka)X2+x(ly_k0j_7B%A8E}PT&S8XidyKhth?@9@7yXFP zd=kY%P`(%9No_ElpdGo_{BR>oh2$j>I+Pn(nDfelE^`#VAtc}qmeJxg9bqr}OEf#5 z%%P91dx%y3A4%68PSqdADu;$e5u&mnnBF5X62v7nNEkeSETB zY(FnlWbm6ho`L-5uk`2G?Fj)qqfFcvVM!<^&X0xX^QxqzY|x2jsoeB)*8T4VqYt^L zIdq^HR!tg@f1Z4C`C*TGeI|7e43%)_We$ew^kXy^4dtxLha~ii6Cjd?V za!BOF;hwOr6y^DbIwN7D#~|;^W4Oksrg{$U=gsBxrsR;IQsp}DMvC-igekfvG08(| znSl8kSfx*6!7rD>4VBvkyu#rr{a*~a_G}|s$4SQ|>nz=JgLTqeFpE$U$?``V%3o=$ zUr|)>BzO-!Nrx@$@)kZ}zMEm3&Z@4bZDFp1OM?@*cYE%PN3ls@P%C#Fp#kGyYj=87 zCp93-F*m zXtBx6mmfPw3u&I>zHHq1D!Sb6_}9#|*|8LivrZ;k1O zEOj%fBb?~Ry?7^xxn|cux5q@WbZ$pEtd(WiPTpw^=~Xu;zdul2ng05IG(5a#z^8G1 zTDm_zJ;;QT5tZJyA8PC5oqVU3Hc;4Z!*+#OW{zv=IMSZE31>&+;Sea6k zmlyM2hc2E-V_;866XD@wV>fPE@@}xA-mE$e4H-;MzRxC)?RudvppI~?VxL_V&2%LbL%Vjl1}tqlS$c7MF|KN zl6h|Mf;xa0u4~3_^Q8ByS?Sax)s?tD1CxRcT|=dWn8AlHwTHU(DeWpnEYbY5zwunH zd9AnI6$~E!rhe^ERu=E@Uo8C-?DDPAVWp~1aUaun8>`3f;EOzZJcL@8q+xr7=F|8- zeZuRyA*|u=e<<=puFmAp0*J6^{Jx!@7caQdM1JJZDnD4?XX+f0Y(9Q9G?t>XZ&l1S z%;2+;Hy{|F9g_j7 z%x@FB=Cg;tAeL1jmi;e0Oo6KFl}cQ=8i#Z^)_ zUivc;#OTbTLt#D(xU1vNl4ic`Av;Y?>o=#%OlH0{Ay)A9ioR1{Pn_}(sxnHA+*jTW zQe~+ZH6itH7M}~^AHgJ#3dm~y{2}p)h1ckY2$p{M==1RuO}!$tBWy;b0PcO0?=%r5jL$wPNotiH?WGVO9c;%CE8w*SM<2)F!^r}FXbT^@H zcxF(pfXsET-&AHs-|9i(>||ILxzlL5k39|-??RYh8Op9<{^WhFk{T*no*gS*v8WGb zSpgwJbMY6`Z%rf$dTotHg>`pm2zApo7CZ4I6J{!0+QrrcOZPta?4)`qoW`Wc;Rc?T%ZC@iCU9zl|+{}rdtFGm9Ez2nOE{+`rm)A@f z&sB2mVE^ah)aGY0hze6Ojo*Y4t<)iE+K$C@xXWa8@d9?uQoH)4RgF)$^0zyEB-dx; z^BnNCrfiK~$7C2SJu_RS3JDT|A5foOlZX{0E_a64b;FZ=KM>+y?Uc&yk~BBkk%(u| zgsAB{1?u)0if!hUf7z}? zT8s1G!=+Br!u}G;qw3<+4syGdpo&5|jsny|or$o4y#i;_*OMVF)-oo+(>C!9w@0ZL zz9Gl_S4nNKvS*_j7- z+Uhpn;gx~0lzR(zYLum5xL`%Vv^YDimTejpik9#tZz}e*V5xXR(|KGld*MUr2YA`oqvk zo37J6N$OGwPWekWLt6bddbR4>po?_RUwb-KFf~p%1PgXkquXb~D_%B3#@{e2-uTur z%@#$*>81dc_uY(Sfs@0^La>F%J$#dNwvI5`#+npP`H{3eCYj`$xjHA~HC(^TR&xHU z(!T3P*Xbf{^0>oQItC7pT%-K?Sai%5nm>$|6wl`m{@$Am&l>!# zl$cMR_O_1ia5-n53T+Ex&@N(^$`Xrtp*O6jiaQm}`a${90~x2v+>6MYn$_3NSyVAA zlKnSIzH8b1cEhKEXVc9>_qT#=R^spC*J|wH6wZ!>33^>o*0pz^d|tccSApG71+^EW zoNNi&xmweI#Bw!zBxt9;;c~icW5zZe_K{bqqKOptrCpmm&uLq`J=ukmYku$5uFn9G zReq3Wpavio;7n8N@+dU{e)d12_II*~NP4QE@q?zXbbm7|l9!&RGsU*FsBJ zMatZ7?msxMizBE$cI%t&my4or4LE1+Q5R1ci;Xo7=A)2lI^AVv=$aWcilPc!*gBXlv>7f>a{=)Tv#Bdc%5@hj|-(i65WR>{DnJr|aN&icX2>uoM{ z_ey!Trkmv*K|JS^RT2sNU~*SygsPMCJKHly>CiBFEKIA)~v;#=NbzxOCR#q~4c< z9#pLdI%eg+!o&rOD_P$&d4I^Gy5VUuI18LIKUE<&uf1_yt7QICD^Iq0-PhyvhM47( zUm$tSWesdcrM3ln%efe0m0WQyaAk{8-ZB$1%l|np;H{QKLAhh5TNHm#aSBc$M^6}` za@`rqRo!md#>Q8jk<0h)$%3gruYLxJm7Q`FaQUg5uf3{4hqskvAYMCvry{(jwp@s9 zCae2qZ`8fNR{{(B%VRdV5XRXr!d`yX6#UE=!$)U2HT_dIbB*~y$oCRl2ZF)4mOTt< z%#yP}44Kl^jpYVNc!PnwXo7&g-iT9O0(~8bGMu;GEmTvtH z)!Bm!>Q)zSendKFQ~G9#2__B`9wI2xM1;M{W{SSG@J{j&S@-wV6mD2g8g4Ci-hWF3 zL0lqxKYH@)K6sHZ|LR?cHbx9xRYxeLJw4*eWBKEhCFHz5VgzZF@o)It3AS(1hpcT6YwK?_O!hD0r1Iy*o&Wn7sIXzRIzWiHlYzV{FfRg-v8ExBZ9^`rl67 zc{D7{-B(nh2~?D$g0(*3n3wNeR|gVI_8z=h{H5@qD7x!-%kZkSAlAuEj>IKQhFdha z^l&AGH?hUbYmJe;EYVZqI>aEBq4oDl>)GuA#ejOzw2hy?lM7me-8UT(uaiPv7h6_O zlksHrAH*)P^3U!4np}7ciHTI(YA_$VP6hqqlA8ZHG%S{eNsCYSDvcq`zT!GR9538m z#IW7}NAaxV-6jpbtnNzn{Qovn7Jchp&VM?~5$?|jK2?Mvd1yTL z>5!8+=^5uj!v>RdF6Xn*?UdR5RIg~kAH&xOc;fH(ukzRoKYspWgoa0mGey!^;^RHM0x@9!T-VJ|MHKW88h%u=4nXC7e)ljo(%&0>d7UxTo{R z+L~KcqVKi$?F{SUR`C8_kL-esL5r4`1fA_mGZ$8l$o;Yt(I@MVYAbS zR$q9nTQpPQ@!wcWB5#y@f}>!BczL3`(Hddh(Uf*G59b!l>^M~{GLDpNWhs$}voq^9 z^u%)Hu(>yw!=FMlW7(R&7{%Eq7aplhxo}DB8;y0bNc3P%ytH}@cEv6eV8O!jh@<_T z5^2<}G=j%y@act1SAnZu)(BDiSM@y%+u6^L8&&AeM!R%|v#Y;N{B?No%GUt#!rH6! zTgu}HqtyspoIgE#R)5h*LtZpG{Mp7oC_M@$Zz3~I&24mHn{*_H!HLQSb_GwFY_e2~ zU>7%WhfA3@kI$O3+GGiuvUn03z9=lk$PaktqoVT#bnMM;Z|QWsCd)tNqw4B;ePI%7 zkLh!i8}q2%{+e=fqi+_i_I)1u_dHJv;r7T^TSuFAD`<48(JPmj>nZY{_m*Aq2Cgn9 zp6ibb9tl*YzKPkcKmIzrPT%7fnlIMID|zbba~l}DJ=SnV$!~fVIIsmn7foi`m6>xO zJ~1Hcp_g!To@lTn!f&r;(%ZEi`nveBzJ2vHpq>a;8_P(7rJjA)8@qESG8~ohRJ7SE zDMfVT)s2+eGP}t%I6Z!}(MP(QTKXj`_slnzAdbGn=tpQ&nw%hr^^- zwSFgx*n^% z*5}UXt_Q6<lFRZ~OgxwNp;+hlcB6R+!~H@w#=1H#P@9%XxUz8+Gb#AheCFBd!1^6WjsSN`h08Qb`P*dgV8TK|LU*4`|dN<-C+ffLjI%uYQ~ zqV_*-MdB*bEm$I2t+}lqM1AiM@Vcod&p53La{M?tbSCb8xkv!}J6ZC(@No^I=j4cA zk*O@k;nv$ZrSxP`Tj=2?-)SGVr{4qitLTFuyAj&Dj&6GyM6F85?O2p^ciB`M`V>`P zqU~P5QOFw$W=k*Z4)_$>ndtelb3IpASlEnAQ@_=~66M0E-E628<0_l~`Qn5#XGOTA z^{hh%xqpaZdr}wfusK^t2!B?$6n#7P8`I9nH~o8EXZrYdJM1w>1)grARQ@%m&3W(V zk9!EYi@k!s<>6zxNeAsr~9#NP1J(j^i9tl^5h7QqN(k4%ru@vI%?ksDZHJi|r z_4|nHBF6DohznUl+s24{Y({A~v#_Y$OwRgT$F+GF`_&BR zXv7T*ekR+e2q#>e9^1aUbMBsk+m=0hr4P=+h8pzs3|`9cBi-4EK*htE3CjG|r{V%R zt6{Rr!cQFq6{hG~ifO1MisZ0(NLEwTkFB@&m;J%JONR@+DYfgs33QFV zhV+nfxAYUPJsO*tICkmLyBt!%nqLmzSM=5ed3~47Ss>||ee3Kg7uH1P0W-3-`-0h= zc>JDL;O)ZU;J4KTyVv0lr7OwoCE`*39(E+16|H~GP4rs-6jE+xe;C>&+qQmoIfl}1 z$GW!;`~Bk$sgmIp)7j$}O~;)Q{D*@nmISx3Rg+*IVQC)ub(cSZtwgS0Z)ge3i4!{Xr zESJ{uOuZ>2%tlArghn81%1-4lCBkS2-KVE#ZlAot-#(A*&=B#T^JSbn^mN*u%Hggt z{|YfJo4qf%u6KI+L_<|+(`kTk*mN%Q3klz}Ch_||HA=S+vDVVhRBe5qHvaYI#;TzE zU~ZeRi=AmP$f#_aX!T%Rug&F^8}yqVk$9|YAt7qH!-G#fUi96=r?qMPa&Tq$bGnC>t+%L}<*ljyahgYs(JY$D z)~mjWrn%M&B9{2l{d|}FIs1tDj(2u6N_H%-l^Q{YkBuxhKhA!3%Bp+uA786Q&?W_1uPF@^lIGqxhiwnxIRg^#>FOHlXV;sr#1h`#=wtynOPP25lWWwY!Sj_A(< z%C+XiGGeAwoaRRFu6H$i85jLfZYap;jCB|r{^O$f85U{6BWDz6z;rY(;_)nIje5k; zM&7k#>}Z00Ii$HIXf~rqgW@`E0pswpuL>4US#N$qEUhSc|H_qkvRT=&BTCrax+uf2O% zpEW;!tCq%|w8oFNU^^YKq>uKsvlo*$D1tjCq?k!Gq~?#Zf-$3>zR>aE_{>x^6P&{4 z=Abu;CH&aA;4p`s%kM)OhqChxy|ROW%L^%Gg_{W6p0O+31Owxl>Z6%1XMcevg^v7d z*Ukd+$-b^{1{R#F*{r-jjDPhH=#x&EYlILVKP6~W2w$QhibCU3?VJ-VF4pq!5~{JM z(ieTb_J?e6aeH9u8w25~=q1w#S5{ARD6Y!*>$P30w@Q@Z-4Rz+rVsd+cLQ11yqk=w zy01|)B;!up{6FjygR2tIakCn@YmOO8YvF{RN?d5jHmUY|6JGa=jYn%>7QY^ z{>=XRHdG{FJ={mb{!v^RJJ)B=>9e~fpyDv zrdjIWHBEy(lkYxO2v|=J)2Td|eT?;dr8o8Z{P=*<&f_ZyLH2O>=Uvr3*5tX4#z%0c zpZ$pK3~WB}wl|VEm+T4=G}@Qr&zxf+}XFk;MkPN zoBbChA+Q<+IxFx)K{vnZyB%xTadyK2lzcg~+tbc)*>2~HOkOJdmEl6xh30qnH*Fop zlkn%d`Z88mmYxmTFBg`rY9ux3v{$~|+u)q3>NP#?^czq%!Yjqvu=$(8F%xIdWvYVi8vlDhnD))49@l{vMtiJU)y+h}4fV6n@Ea!P>S*(PZeJ<1f z?YVe9dR)fSiR9|l@}*}L4mU~rB@;oM_qZa;7{4FUmG6`&`?4n-4rw3hMQ&GWRBIMZ zbCrGD5xfe?F}{-0z9;>HfbePPZf5<(`tp3loO8YF!R-{MuFGa_jontNTWhA?Zcn^y zMxAuBoGM>m@UWx8?iYTaAmMPSbCZl~$DX2|Zk?#4@w~Z>r2;Zl88psUK89jDEK#iu zlv7kqPNbo?`YHYO6Fob9KeB2SDK@GuL`+sVYjxs1OD-4iH@j!^ef&mlm{KO*Rfs>i z`Pf3uMW(Wlr!|LB7`cjZrG2O~2_I-CR?L&x2IaP_M^ESK~u+aPIqvIHC(z<=f?bP zWmnhRxp@o56vXM&-smRh%h*fpsS@ko6qhYTyXx1s*40(bMAK?3C9b$l@-S>#j~BNR zS*si{u|m9!SR+fmRtkRA*3>&D=c;_|lPLT`R?FO0YR0U%5!0)Kh&^5YReG4QsBlEd zjfyB=12=OZ$IjB}%+yZ*PZ{Yh4li$J=EUDwM4vdN$;_A=uQ&A-H2zw;9&ssWdOk?EKc?44+Z0)o@>8%KqH> zJ+U z?riF8Mo0JZ8W9Pi8ybzwN%{>2x08|c-zKmq^3Sy>c=c!EhsMd(F?c?A7IAFWio0%| z9t+|#u+Hz*(o+r;qs`MJncZ+Dk>7l3xWQ%o-*Aoo1k89N8j&&iR%tO}_C!x8W}0QI z*{d;88@{Fxnzk4;8`**(n%EVI=2`|j@;AF)?POj4vl=b4HruYpTsib=SCzHlGdUNR ztbC4he7R9O9FpY2JIAaTYl;%SXMC!O(McQevC@*Yz^Y%g#DV>Ds|#{ za*v;st(zHUrG}uG?kq&PuUXl|QOc0wXK|EX1+pUss`eRloMuHBqE<(+<#C2JUP)p^ zbifZhMQ*b!Lk2hBnM8bS9%pdPD_K8PIvft)>QdQEHGcGP9i*#QqW}TgQiKz*NNl~mS~f5h7_Am;?YH&xlaC!NVG8UrmlFSRv2aekdIrx%16hgtI6=<95L&7c;>Vp z9Nv|qe`<+iT(+C6@^Y%_qe~&jr%QbiANQ1nL+n+>M1z|P^okvChAK{xh|dGZ!uDTe z)c4{Wbp2L~5Nc@nMelkZ3%QC`FBX^g5<1^V>+sGq&VL`fRxO+%T9tzTuo7NvR5f-U z>p2W^{VozbUl$)B-#xI>;?6sIZoAY;m^rl&B0@u}sOf>8@oIC!bRO%-U<%HZv2ZJS zvIL{#EIq?@;AOM?vczPP^D3)Y!14Y5bD2KkIo-AY((G4j7#8~D>oZ)4xU>bEa)iYkG z?ZpW#DhH7m1(kd7ZVtsOoL*4YJ5r8mk11J94EMx(y?{^K$UDZDWiEeS+}?C!IieX4 z((XUMSa8|6DjKkJ(h5;Z9{P@u$c~e%SyOF(#bNH^m^5SVmdOy=P)Gn!XW$5VeVrYc+4WG1pw9u_& z9YGM{=HOSqe*jyO-6D0*%9LA@WVQwSt#@-VSy~v3(sh3zC@m7R@}#iufdUQ25c;!F zTFsQ!hH0A9hG@D`yY+E;)w`$hOKW zH|lAPO?wHF)03^|IENO!$Eg^0quWl7s~2aeeCN!}d|tYKVBy?zGQi#2vos)}Ms zwYh)Ts$0;oRO;A6ia5_^TBvh-iW+CvZjS3#{>$#Zf3|vUO57eJ@8~;q#reytaT#Lx zGs3sY4bi9SThaU)?O0OTHr=s-xJeQt0?Q3A_-|GgI?u-xt+T8`x)RCs!|_;~vIuX2 z@NYR+W8HsHU`jb)FK=z0wF$i0bLqJwTVsq@#^~%)EZ{*^g>-$W%jl`qSiW z*J~0@_UjCs!|mx{X-;KTlf4sx?)hnyZMGDNdEK&|PzB@fZ}k(;oNNBhv^NB5>kr~HG*KR!<5im4|BYq8N2U@kO~|V^AokSnhU4oORfJvN zmEuB-Hlv6;PhsORZrN&NSaZ2wPfnrfScLj&@s?CGYint2A471@jkQozrl`ISN#kN8 zvmIi)tCoWhOS!Q$lU;^tYLSJ|sc1N5jlb3^R=wMRk$-g$p7=bpX?|tDbfag6be2?Q5lfJQ+cv9mSD&CqPBo6hYfgioPgUE90EP`mjb(5uBI*G)pgH} zQIe`%ORg)rLSIH0p_5PF@s(C-$7jpeQ5Ra+(4MmGxa2i5aJs}K>kD(X7CjMJGkjIi z3WMGQht$uY651=o;$a?tdNrfJYfXoj(n@VC(7L9twJH}-9oWN;7fq4;Y#YI|!Es@x z)j=ANfKN-|c`Lc)5x`hImfWW&=bES^VmprScK4Py0XL^F{)C41Fwh+<1I?4~n|XF7D+YEMFRrX#~x0@BNd{XFk+nEf(^v*G? zJ&N$xEEL?8_m+L&H7UPC%;U;njXV4m-THauIUm&5lHi+`3a=uv@d&xr%hN`as-RzK zjrCxVk6~YsYrIr03e}l%880ZcYT0Wmf6h@Tqn>gq=@;Q!T07Oo+cVzNn0wiz`DAhJ zmH^XhPGgVM!&Ao9sL4xd#&6bb`>P_>!^5_Is8f#A8Ruw|(E0`#-pnAXcoKN$ps+D-^;5g*r;g!)}^h3m^BgMMH zBTo$lx_+H{PjGri8Sj~3CbXRUF&pt0kD@;!P zAT90T(jFT5W{9_+ULww6tP9rJ#p~rk=F8K@oYhUJ&#%kC6?c{|R97NS6{5#}qsG!y z=%ufOHT;GuiDLTt(WK@+~0F?wHi z!9-g$hQM?ovGXvhK`(6GE7nZ>J(}aO1a{itw4aOI*92 z>LN>G36|a3#+6qKZBg@Cn`(OQl_Q0AUcOg{SZXmH{cfJ_ar$m9EoDtn360g4_bx8e zNnuenNnSd#Q?8g8wwXj(JPc4`{a;|I3O&|aJ(S(LTD=`c)={UU|EP=Dz!%2fq6#W z`D<}fyWxSo~5g8S(&o?(8a=vO1_E$=FON!8*6?uWFz31H@(IPWo;y7bB_ zj_YLZT5(L_Ab81AZ=qN9A>|SUr74fOiZ%9>v1Uct*|W9l&Baa+=U$}x42w&E^)t;9 z=4)@&^1}|;_*rB_gg-2OT1Mc7DdOo_z3!13&QW*0#;w{|iFJ-EX!56$ZG zS=Xf|j}93H9uu`RD~eN7-!!t_TFyvCc%5sF zP}$F!C@kltA3wRy7Z(W*uW`|NM^t+=r7rSsTnpn?Wtl@gjy8tv4qZ><%nzq_8tgOs ze!5@U8-xy_C2~jd!1{&5o?sI5yGtwJl1omke15#WWoHwuf{Etbr9rDy`!-v5xSScU zhA%=cgEd%z<6yejo$%HZ%CUlNgSFhSVT@7K?FEw0s(YGAuOx?;c zWuMu;Oj}PU?EKbZ;2oJ#zI{v3fk)}d7lNxzo-o{6;W5?zO@~?ZMDpmiD`%mnDZ(~u z|HaMaPx%J&XfLOq^SR$QeA{Ak+R^*clqnLRHfC7Kiu`xT0Jrc0Lq*KzO` zI@tPTZg;j4#rj5^mUSF4$Bjju7B54BSl%8#9QZ7+6dBlvxTcRAb9wI^P{H?;R*_-g z1|9pNH_>1=N~dwRn6ew@wcwg~eDm`{sEfPxJ@LUWDj6cScR~yZou&&6{JU>tJJg;K zYq@StL|%3O6~(D}ncuWInps-V>zUeQHn2M?k{nidPV7y)<~uDRqJ5>0g!VYG6Lg+u$z`>j zhv-l02ZQdJ$7$E?jj2s^&sWguGZy<&&dH?d**2OPG_WXUAqXr5>vWAsV-mare)z_agA9g05zbe72 zTiy*-X14z&+Djb_0eKdW?yTO`d&PHC`8O8K+ z#-mL_lgn#2rN`fj{Z()KUpq|+9vvUp9W*uS|N6`&=gXJfALNvGee&Zi*1eeiDfgyS z40(!K4cHx@-pui1m<7Ie(Uz#tAy&=Oe3cekR?TFdKBCl4KGvdH=;5W|W}Im(o4wr1 z9IQ^137e(p#%HDW$^7>}qj<_OJF=2)oFx$@1uB+3`};B5myVRIIq#+4`ZaQF$kFJI zt--LuB5(x}h0)iSBQaiotg5-ZZqoV{)FUDqXD)qyB-|*PYDv-c<&;ZFryLB3AFlN? z^lTD_`PpmFsa`J#*Y33AW^Hm?l9~Ti|I_t0rmkT1w7;t9X&mDk*7t;>yu%W!#^N`+ zmk;R2GhOxiuTD-Ph^y(TIz$fzqFn5*MOmw(9}~4z1h?AfkVi*s3)xm$X^9%3`0vC8 zFt)NxUVL(xZF~`}F^)w_1wY?CUN`zP{sx|-bhH4@YLokr=y6ISYcp$3oQo!jc&)x!ey zv(uIHe2?Qf?kcvdU=EXujZ1p&)oggM1$uD2=^+lsU-Ie)&9+~E>}IzumqJJ1wW(?SsbONl$@RUg zX_PmOvzC8UGL6xVZ^Lh!+=M(8-P*xM*o}YV+dPi-OG@+xn*^Wvjcqo2!m6|;pGKlT zsg!5}SUhcau$jIgocN+Sz6l?lg5>*b zpB4vv6Mnj0vG++PgubXs@qhhWJn*0Jn_u30i23H-QtHnKzF9aA z1K+&cOZ|D@w~8D;I{jyh_KgI~!{XC?i<&Zk8k--(aTO7eY7gfwwx+O@gGm~!)u z)Rk$xS4_50P6!V^PU_zzpO$C%A$;b~&GXH~79Tv^O0~g%*l|IhL5}L%!px|P%FK28 z%XgaiK($ecm|u~elbC(9|B)1bZW47z%ZAFPRM)sV4G%W0*lzC|H6M;LysBOI@<`?a7p zK~kzyd-ONToqH9WXE}EWKmvk3?q_eR^OkoNWWA9RISCoW-9%h&RLKn1(f;EU z35Oq86`XqPcPvbAl+oxJCD}(Qu>3w$tJt=t1xGozQ5Cj~sI*uU+~hAGYK2`$0*FryNbot6IJzBr zKYgeaj>Tvrb7#X0s8Na|t5-RtUXv*KMW3~&MI0cdBpYdNOc%|UwdlquSu#uS+Z&bm zJj+8FI_ReO@##Z_@H>n)68E1E11e4pxbe4lnn~!!1+%{MK!h&(RUvKSfWlJ)Jp7rR zW)r$fLF1O)pV$Gqrv`%fbx9l%=UFde!VxI$sgp3=Q*qm06dtH;&)k1f2DG03xr4vJ zZ~PyhEm1&*lI#;>W4ciaGG7z290fKRdg>mppRlDA74IKdeP5U)Ionf$aQleh9M8B6 zue*K^1|8617nE^82lVEHs*H;C>4V*%s8~}Die00hOoBw?;z3CjGoBrhnQhDnOcZp@ z+Rr2M&>^eg*>#nj(x^1zWo3pf7OJ;hTz)`912iM}kj5xp94PF~vQJ8MRR75>f!rJg zbn+1>v&lhPxj#_i0Hr-YC^&pEsg2}DF%|%sT**Vo-bS#2X)Ut!q{N7sDNA3A7?j+Q zIWSC%+)&sdF0@;#A;#yMFCR54W{_<8B&;Ug(AB$ z5eB|TCh`K@$hG#WoB1uqx1B2>kGOa{y9co%GMywjM{x;SW8|Ngga^zaqwMd1adE^s z74C>&^^plbSusb>%>S@Yz*tpAF7IvLA|(C+T^;pIUH?JX4hg*U8JFd?EH(wT`y1H- z6JxXS^9X1j68La$yh?pURGQ|pGKs1VO-e)LPHZ765LAE~J&KSvVLUg&Xj{AtT5jG4 zr1Ikfh#;p@x5Gckl%*65h?N+Se;1FhNw8?1d?o&r;XfhLhC@Nl`|;q-UY-7Nl;J*g@(s~;f`d$kPH;Sr~(Bp z=Mm)iGn9aXE(Vo$!~loE;^=y%>{5Vy^(^rUETwxLo83&~yNs9T%vs z8qQ=yD*=vP0G0(Ia&4umpyg9pQ1T>!6qy*J#x3{CI8&i=yscWmWCaJ9cVze9_K!fF zA)7&y3wf-PThtsgrUgE-{e9k z;o&HBOt3`)KOZ<>Hc2hg=b0YplhlQ-2qzO`h+u07ZhFLZmqWGhLbTa{*AwRvTCsA^ zG}ZlTp?@Gv0vS|~r4=1?6y9|V7BxRK?kdr;3(+P9t>g*5(!3WFj!Fl!)#_`{QzDwBms zzukMlPXqYXfu?83fgc6%)58UjGJs%TfHfg-X#id9qCn8z$Ja3*k{bc_6lytz>jHYQ zf(~#1+4&J5`v5XIh}e4#eEh+tEYwOkATYD04K$a+d3a8 z!LqAW)Aq^@lheXOJAiw{+GW%%%Rl%DfXl$Bjgu(38%QcLHi3jWNRFZEv5i110+fjADH4+NW8tCd5Tz_{jH7bpNS$U7ltZ0)Ry9s$vL=Vilk>+c_ zeBvHtp2<)Yejj@5gX1UQIQ@@`OU*yE9mv~$07cm)r9yW34y>BLs`p#sbX-`+^`_5X4IX=rm%0{u0pFjG$4W?DkHTM>+rcH3#(sw7x#30>_@dPe2=o z)M5gy322e)wEBew^XeX?)pqDjfL{3^iS~Vv8whf@?p1-aA*<>uAK#$jV&5fhjihuB z^*ms*vqZK=4q7Yp2lm0h-f=BDvhLqbK7!*aauDZ)Y?TH0&tUfr-K|9j)l+dWfX3i# zTB+OM>|KBg-tS{SK4jyPi5PJnBr{wNMGD`T&7Vg|>qj46L0dTz{8XK|<$&cf{|`|mU~ zA?f%h{?e;~0gmGt@2U`Jokh;3pq+^oR*BhptOBd^gS|q#UV= z&SX^gbAz5xUYQx^nqD6;NI9NYUk{u|#OD`c0hub0#fw7$6J($x?SCCvVgryAfYTs- z0tW)?Pl3`z9(oRkn77*W8&ln&Lh|jO7cZdKLM?<&paA+d$lM0q%?Crg96juhFe0T_g;3F$v?1N^1Iu6X|gx*?zo{tRtOZ5(>x zFopgqr(KT$I$D!J_E_Hq7>W>s62<^xDP)kbyx2g#3BbNj0Hgu2Wnh^JVDNb|khBH{ z=fwro3qWN?Ql9~8AfRf41lfO(ZaXv{({eC8dp zF(s&IuOL2!3K&JuLBy8K4=fb8NIB^0f1r<11K`Pl*6mSYC;S>No0-*jK z07?MRIN~3O0YG^qhy#Je3t1fVbgw?N9^9SHRH8~k-1!LU(?%rXREychuS z0cZk&cwGKy?J23KAcPt6S&tp4zy=2&fvFif=-AA6;z6V zje`%c5d>q7zd?>UhzCGYV6%Y=*-&Sh45EY53^3b3wkrxcx&&5i$aX&iD=crw%76_t zAql8N49O|!MGa7rf%=a* zxSK5wrFMNI?)?M|X@FrFFpR|pX|NV#TCWcp=4}skHL^Khkk5o{jvdhD0sS3luGtPa z&ier;g3NpPB*Y0Q4^#+pwev#h`d4FtI+Z}g>q z>w>Huq#-WXVBqVT^E9e24cF-Y)M*?rb z;^IPlVc}wm-js)4l%f02zzsXNSxtSvYB>CkQBrbQ`5iGNY{?%SJjYAEgB>jTp4-gq z8lwOSp#aaCD&R@`0~>(k0Nj=UI$WT;1UjBie(fngk@mrwpc4qM^KSEl7S5vA0bB0i&)$lkU4o5*!BR?&I2H#1tLKtgbJV{km%$C`~`tp zI2EGSQ-DsHqmZ5MpaLDt>{S+w5)#XzLLaCAof6P*fHN5wG;d*{8+hRW(B=UEC6OQw z1TH=Ru`*y#J`xbi4yYl%fJz3a%Yd2)d=_5v_O4@EQs%7OBiHz^Y zW=7ZFJiv_vxcLBXy2T+-?Jfy1JUw8r^BnK3pEUGRkf|A-s!a?PRc_2>8=<$MM$j|7 zhdRJ=aiD;gj%i^BwE5^z%o|U$m)oi+z>7p8qrIctgW9|z3cwbii#Mufqf4;`A*z6Bo_JJZ`+|?4G|>1f=z$q`^W;q&oy@ z0i_#}l9p~(R8qQAly0P@RisOhkp9vQ(hcv<{rltP@;aWGPt44@7xvyop>&&3^eQD4 zYSt2g0sz7SzK1J|r16}x9u0_wN~xDW#M0I05S(e;lU01^Vok{11P3a!)sjMi=9f{qWs zI%sVI1Fch$aq7T9zvF;TdOm?9(yu7=+iCKD{fYs23JT#Xps+&U{h;k=VVLck00uxU zVQOgO7PJu#C*;Nrm5re?Egn$$f!c=nASV_CRONR-MVeFv>L+M&I~pJ{m@{u0{Y3>G z^uc6q55Te<;Q_c!jkc5%+12m|5V=-(02aDWn%#D0c{Fct#4) zDe~C30yAKtzl@-DC~Ro!7VyF)i0719fB!lnX5s#lHE}_Kio)mSxVZO-8%Nv!0s78c z9Q}}dbtd-;md+<=vdYz@+o-5uv?N;1|H06O!cQH}bj|l@Zl)k8c|HeiGv?tahKR|r zfyh!4MA#sz1<@cv6-84sFT7X)9Jm3XBj_yfK}QU_BrBzIw$`Jx&r7Sjs_h>z)S?pYHk6~0C;;ab|w)( z)rhY;`U@U9I0qiZ6?D-Kaj?Jwkn=X^7(j>bht`?!1NAP9LIFq6@fxVDP>quesP;e& z2>|Lfpb~>?;&q^!05uz-k^+?xAa_dGT7c>qqQU|d7ox%hl{Kgq5fwR5-GSPTP_F_N z52)Hm0puFSiAPs=1qVbg0FTlMIg<`~Fwua4%8+_I02U$x(SXSsn2g?ldJllg3zw}7 z>Cy(M)<`{Upw_|cqXa;uMN^NP{+?3ZEXY5)B%j{0AG9AluU9rRW8~uEqH44EYVVeY z-TjlpExJzv=HZU(-2%HpOWn&)pI+LIjPJYLeR}8rf84usM*{r^{TKS8-7pc|N1(vq#1?w42S;U$4 z5w;1#arr;xc8MMH83AN9jPRT9``N_s0G+1`%oFWqy%~MRpz&;n@!Z;n@z=UWJQ^}~ zdGgHJnD5s;R5vCX=1>fjyGYPOHa&cf4mw91pk_hxBP{U< zLI?;ZAhD3tM3MxMB!DC>m^J`%N{=piAc=OHxB)O1z-)k2OF$9}l2_1`7YRWl1RZX^ zOPCL@p@Jl0E!G2Z?3erA^h4BFQ z1Y8WkkpYweM!6!o|0rSb+)UI9gcp6u9| z%@2?dfZzk-00;{pMMx4Cl9rIPg5rUG$Xoj#$d2`ZgmrMamW3vYaTDw$K}0Bljw#<}t3P<4Sig-{8B z>WWYiS8s5o1L_Gfy$n!Af$EH04MrqJ2BH9IA4t8gLczy|AZ>l&pt^=BPAX2 zj@=(kX#l4K6-Y|K(uE)afLsGa9+Cx+EJ5g4P=M&y1Jt?!Al~463Ki@=fQAAzWPs=* z$@l1_$Q5*Fp4gyC1-k1KbXQXZkVK3cAbAK$TJZ3`0v?F*7W8p`1(eueCw3hzI;Dr0 z0cw!K(hPDL=#UON)Q6J#AVfd(&?kZe3sMZ3=LJZ@#nHulNT7}}sOgY8*TI(&>d=A5 zISIsbfTw}+IX=YZfTzLXdjAJ{M+8Uo*8nF6yb0;k6iSsKrAUEl1yn<}w#kRk(>BREnD18_RPFOgE_VBG{=T_6M40TqQ%k*g^N)HLL*$U)k~K!}!N*tgT^ z(i0xf{WIKYTY1YrAN~i&zIMnoQ1XIb|7O6MeJz?c#|nV41oci^DTLnu@B#`ZEFVG7 z>W`+BU!RQ->s5iI6f9i`5&+0GK;$7=0Lemxj)hJt5&dF7r5FI>4ZbH(!TJMeC_qC7 zh%SAL!?Kv=STags-DT zOY{&kKn+q@nn5lN9a2Mws!&oDgj`r?b`B0KNHJud7a$22M;CJ^fjY*ZrbX&p2VX|0 zLk%9gBoNO5{t1kC@gX(`JOvKd@juWzA~>SI1~@t3^+=z{6)8bVkpk5Us0IiX3#fbu z6%$6Xfv&a?DmhR+fjWgyuL6|_s9uPxF;H`0T(4^&RfRYWPVbl+q~suNL=KV?VofAQ z1|R?{JH!ebq{u+!2#%D(0Gtl+Go+L`ST{je$H)M7K=nbW$kh}BY6@~z z*muy$&_6ns4E#19K7JJ)RTIy;6m;E;NB^@9bbii7Qg5eC|BC%k#)Dt?QF>IfQDVh- zXxc~sTA=$Dz0}=6=QdvjDqMV10L3FeKt2G14~PRGEPxavNnA);LedJ72jb`g8=x7- zhVpa(O9Pw?9oqVW5h)~jA&CKx@w9xhG4Jal9y^3N% z9ebcFBX#}*BMu~fg03S%2)G5reF#nlI1a>&h#u+F9b$F_zXiAg)HC#lQn*k`6R3?y zDWo$ygh~ulU7$`QR6?M-B2>iH8(istdX7vl15`1fdLkEu5s8t3C_vf=QXhCg94de` z2Z=Euwt{#Xu|fuL1t~I+2%P?*C*WcTjtrm-I11?s53CKr>H-T?x>pt^x4i*Ikq_grD%x zKwkiwqWKoRRNnx~E1)RQ(;m;U`2q3)5PU!!0AT^72ub2X(h`zZklYs+-f3F{%?LIW zqytzQ;A93gY~u??q>$u=BnG3vYc@yj;K}0Blj;Y>3$54n5ALQ2oHUc^iEY7eP13L+pF<2geFAa2kcms;bK(8WL zP{$tV%1E96z=#8hpP=gq5dv-jaUX({0geMPBcez8bcdK7!EXVs0QC&uiX7rXDNUd@ zAf=Gb><}t3P<4Sig-{8B>WWYiS8s5o1L`R&M*N`3@qvV${>0? zR|k=IAX2j@|!gKD-H>E>s{X1xpu#1ORdk5P3)zK(Yj(V?hBTC}04HH~5}H z1-lQRp#TjTAi7BMJvu3N1>G468#JjvcYWfu(>6^2NyMlDl82C_0}s>{@IZ{WppVNd zpu`3{vFm8jB|XFpP=gefW{}H3hjh@PA(S)(p%@mN2o5YrF=U<>APE;o7ekRi9b-__ zA$6{UFC)~U1CL7*i01%L1LI44h|K{{dy9@y|AF2S!4ds6z{vq`Li#j?QYA_)1brW=Ti40%|R1`u*uBI4J(~z?w z2Wb<-RkRcXr=8A_{^~I?`u3A?`R(<2<=;3s=-W?O@r&#F5pU0MYSA=eRsdc~T-#y% z3gI^ZynuoU%SX_&`lBgdum2Yz_Cp1dQm}L(NB|($0Fj4e0VE3%Iu<(lgyYV`~ z-r#!z6|6sih5|HXfaoI0_vqx~D>&_GFR?+B3Urqz=&t?}KoT)(faC!rZ-d91E8u|` zZ$cmcu7DC7?1ZnQMgOCRm;q{#!qNfu7Ok);xstD zBWjS6gR~JjNJ@w`kr)|(0Ici~D{PP=1C=8676Qs!XY1YI2=1K0u82caTY zQw*pn$XSttw21)|O~qEBM_uzJX{WoBA$~z3NRPRb^BafBsh}(3+Og{LJCgP^3BF7; zLMDzoul(Z!I(|pMl>1Xp*7uC*2sjS`FuH|sBw>pK+c*jI_R9^X2r)lXU}+J;mK53I zz*ZgE62O)Rw#(=q(j?eHdxA7U1W+hIfAL|>uI04@0Uxh4dZqbb#twaJR(+OGUJyE&U^52xSw}< zu($W@*v_!8mY}0@`DCo}+rg+H9B2ONPssu?;il*Y)}~ zgCF;$8zyek5F{^H=4ll2F&mW&zOd9}{Hak|@>jKRc-*MmV74Jkr*r~;$WBW1Pi}Sa zg0y2{znYlxW$766FxAGZJS`R)CPK~Rj24v!l|t^H%O_gp950GKwCK3ysFA#(<8Nsci5mQP zf9UXwO2Jr?!6w7~agPkQ%t7n8)eXzP%)HH#S!P)}V%(LD9kZ|VXm|y9w}<5I>kV*{ zTMlHkY{EP$%#RTj67 zV5ZIpWl7~|?Tnc*cd>gtDcLx|#S3cMlA)g(b+>74R2z*$H45a7LaL9to5Dt#raqHq zsaaPl?91nAGgbZMbvA0zutAHMxYlPI)8wuXF(#(J z{aM6zj7F9Rhp-M|+nvC2)r=vR51A8t6sCvl`5$HSi8P7P-%jIB`tv~HB9FqSJJ9|$ zr|y-e?wu58&!=0LtBH{K%)*0H-rA_M$n|7lL(6NSo{N%icjNjl``-y^xo zWaG)Qd2#=lk-C-i?A@$5X?ahTTT<#bU2V;@qqmA&Dm7RL7w9=tN-s$ghpoa;cQ`Jl zn8RXX)CYPL=|XfU-V3L?SiIL3pb30ks8IQe>&$M>=%dTadf}fqI+h~clo_9fEn9YE z^OTH*Nb(aYG_>^ZTgN63eTi6p9nRfK6#DD^zv|Q${!PF<0G_ud-Fi@^I`MHOu+7^xK^^lxiaQVadhI>Es)_JHRj8;?k`QOzw(`9J<4_XlIP z_=m04TDy!ErkSl3hr8~UN*ZKMIEiZstJs8p6$!;z=;Xj>Ce+tsj%=N`Gb-P8jkOBZ z&{8liPm#!S3Ebyv9oPPoLfZDc{6&6@LeYU!-dCf!p;`3d@a6?(xde6Qtc_sGTxBev z3(5#P!YWJGpv1L`q>NSA`1gFh-LUhfxqK(4u*d8^SwOJW#|F6shZm7?A7}nOrZd^Q z87H$Esxud%64C#4kkZayXEoAD;gNLt<0Q+hFB-RZtqMnPXRst4-TJ^t#X&;WHDu=Q z<#b0aBxLbPkyB>NZ}yWaP1CG`^~JDCp+Dp&Ase~W4x z54DIeSyC%t=E|S{$L$%<%g`8cyG`1<)Pdu-l((-%pz-+Nz4VtEoUxv+a#5-E+%?jR zyo8wS>-W~AX*!RxeCtyL9$`p$T$OLzn>YA zGTuf^gvuku3YEK((Jk`(&ntUW@++U;k07}-5JVj$A*HB|(^A8_@Q7zFH=kc4iCR6e zV+PMja3^_{<7upO=YA<=&ez!)n|n;<>-8Pj^~^h()vBL+u;w~s^JbURdCILGJ9DnM zWm8C-@o{Rr;EA=gD%42oe%cX)(`D++GNi#mT{JvLZEEb~RByl*&z+H)(6$8WM`wTjfj94wf*vzj9kC3#}8 zE&cZYa!|6-Hs;cV-76v1kjELno8=+BmVHk@Lt9eeTVB(*yxVckYt8mal`0MV8kWQP z_p@YhkDE&w`3%@Kt}k~ zkxusr1C#LIbMg6BDW*GrK+l`koK)nocWzP7aNF=c zP^dgGu}_$J-SEP^vOhz@A`m7C+88PpbJB4zQOmB zP4>88@0R|rDr|XC8JO=h=6PivmE&S`)uJkO=4AQrzgCVqhNckIvNZVt#73%p!^3+_HH}&p)OppnM?*OO6^5y+d#Nz<`Uf&LhM@$_%X zGrGpW452C8khn1tU)-d*l;?RqKRPdLUaQC~ioM%m@UW=yky$a>4=HY2xN8LQ@>|kMM>x`BU zD4Han;CqFdls$35&qvQA{|+U|eOQog7%Hx68}I)QmGVtZGkGpjDAG_WD97%e!q0@_ zWF>Rv3K`U;LZOX&YPj&kqlrrHY%5jT?p;?d3>wI-%CSKd*ib2jX*Nh zCyt_oTvw83ZO)6!dCx}gQ?PDWXV&yj&1&Tpi7dL5tKkggzkWdO5;UNHNEaPkCEF>K zJGA^#`q4{u^ZM8q!88e|X01DxKiTqOa~hdSyH! zWa*=CgbvfQKQ0}*=J>#)Hn1*1sUAOq+nH4ALa}p5BU>mVOP-&Hw|!$gH`5A_g0k>_ zoOX#<`*@hwh=V*NuCtZ%XquD0JrR$E;Qh<^H?QC0nFb^tg~xX?BfYDdeDw zBxln;A<9|4EHM73sHIF9Cr#1g>;fVqtFb#}!AwzEe>-NiSg1?5SEDmJ6S9WX3*?KO zGxh8$3KqUa?yB#StW#l=zA~fk%>3RwpTb;9Dk#9Lvyvqk{k+ z*Wg6s(e0K;-%&g68~f_&LQ#9K#;PdZP27kH$~NcXC(n`Yt-o|7n#UwzBdw9Frb;%wZ!|Ml5yM6{P4_ zFIg^HAH7FhR%Y%EiLz;Z%f&0cwm0mT?V3rj|C(5_EcZKJzwJK{$)3MoNr#=YpC9+g zHN84LeZ#|fec`Ki)4x{Ijp{brtYAlrUB}I87rXLPcJsfq5q6SwW7##h$qSJx4XNuZ z#Z_yCGBy-yHRG1a^05tHc$E%Gh^#H z$8vVLw1>$99%XV2)ymuEhD=0S7R70P`SP5}$|ONs>8=AwdREMVY!po%~Tf!rbEZn6BPyh+~KZH&+vak=|N#%I1NhjSzowuQ_~d0mgTEjRiqP46}eQf zX>E{nTW_)RWK@#!?p!-AX>DTLQ~t1TajGFBUo`vt_VCb0>Q3X}k@1*>yRp{zGNsc^ zyqp6;1DIdFO!FL*$F>WLX2{2|Z=M?B>jtT_5%jZJhQ_29<%~ACkFsg?U%TkWc9iFJ=v00`7Ny!Fsk7@~VzsFMl}uQIOutl|tIYB9#8zAAOvhdmjT{#mXtv91UAr zTB*c^d6jjss8bGFroJK6buxAwiY+4(&NogU3#^V-*KOJ1_nzS<{j0>Tf;;44udiI1 zKIIk2XJ~ov!IZO(L5B8vs0*>>pU8@5MxNO{?(wquHmfK?aP}L&5D(M&G4(^XsO7aZBk6aE5?-Z z)nmRay!t$mlXQ!TE2^;DBras9;7QD?l%m~URkBBUj)tH_1|LO(8Cg-Nm)|C#9NarRHG6M(yv!UQ^~zUj{m)pUTH+Dwi%pXXwb1(0M3UlXm0JT~Tt9nU#rHhBH0is}!m_<~rqFyBVQyO7Bm1 z*V&0}t4}M*XoFL;^6v!hr0&$j<>6UcgfX0cvZxgaN{VRJ3}{Op(#X;o9)7Gp-1JYO z-RYY8(9pr2=Cid>-Zq0jmf6+5j315IdJkk80u9NM^Z3y}>^E&J%*QtLb>iS0L06~A zNEh?xkN$>D)VCOYN)+xn=|Ad7y0^}LFkF}v7Mn12>}?;5rOsD3-88|qP<_;IDcSTb z{@?SGmX*&h*kq;o)(#ULlGo9%0`_>mqpYeZyRGL-eh>A|Gvtu}&Q@YqyN^0+7efY8&0@=QI}C>RuQ$1! z@i)6XH)UK+oTNGK7K`QW{L`CRTtll@OVD?Z|CL-%%0y!>DI1SMKvGs|q!YdaJ5zN| z1CvPezpP}OvHO+1V&&J)481phUg}>YdR(;0=JD(p>bFVtU20XkH2Y6kETOEmnl3Iy zF6U6c#NIDmUY5UgKW$bi7cLXCo;xGP669DCpPTtQ_4C*mYjK^q-(cqK57wd$9ZnZf zb*qdn|7FNk)k}d~1Fe?hIe(+;OP5Q8^YZ+cnMNdim&)b8?JwjoXqJU<(%KmN`U)K4 z6IK7@6&y0Y)MfnL(W$2HsAhrJcUeNS%#WJ*ew>4EymEZ$=O^4EVYX!#pX5bSZd;jDBnjt7B{8_ZOFW0xKFq+9MeTU-%QbGU+ISY#&QcD_!3YouKYJ9*3APiioE$+ppAl;_)AOrO^byHJNnvC$}EIL>MA(bI(A zPDs-p``|>)_n2Lq?yXb(Pu`t?Lwu*0BQd%il-6?I>)fn4E{yV_$j1?3?7KGSk4An?YbAhA;K&~ms{uf)towIS(4HzoJ)ECMc* zVT=`T()Pk6-_gzqNiz|%msNs`n4D|;mua^MO@%WPCG zS4r7lP-E&9Opg9p=%~%)qRxvYzu)OSs%zEShk0J=)`qd6Tdyda?Z+{Yk{+ zK&Cb*^a1La)qT0n$)k7idKhPQ#Ap*m0u@~?MxvryXxsw^N3z#H`nHXK^l86(S%rI> z-Z741c|c}Ie6f(@u`W$FMq)Xe?L~?RR_z~24|+!|XUD~m%$`K9IMp+OdChuPJkBKw z{bL2J#rt_S?J1hkWm8N1PnXoh7rj!Lj-9eI9D8pk#IN@TbRYYvrYQ#w=hUPoa-`IK z|32Y{&)`TNO=MJLf1T4+eMh{>*S%wyy?vqxtNTnFFQO)Ygk)@jLxg;hRy~`=@%c@Y z%{jGEH=!#gn;)?RsrJY2nQZFH;cQtc^_~9}cl8LlX=2Mc?AS-SoXbt`h?3vDh%GPZ zr}pd4%1XZ^Ok~-Xb#|sm7`kmIQQMue=t63?{Cq@yGPF3=vP|a1W7KGJ3|Gu8(~%jk zFEY-qwPENBV@EGht8@>uDZjF0O%a1eGCHEzm6Vinbrw6wj3eotlQ(67+z16mYCw#5 ztCw5?fE+d_8Gte)st6&%3e~WtfT8L*MJ~-SqDs zH~lOm(srG5>&Lg5-6Z#(R97{k!TOx?B%v*n{F+^Zp4Xf8)s<>X-Z8}U^~#m>OWq1z zId-&97QNHxlH5@g3B;)!*H;W)elDkoJ8JsqY*iaiwXAekUiQ$E?fa%L$f_t`Oc}y=(9pv>Gc(#w4Zj8 zwPJmTxu;H5GGdg=tV22kvWIl_#bNgEoGvp6{+w-w$S&2PFE`G!_On;nS9ebx2ol6T zw}@SeE1m5M{4BKh5xM&BEOTj>uIu6CnK71G?21SC(!+vDsfc6t2YgMRRKFeDwOw?a zsbbac8NG-&PFs+Ad|4NAV=;Pudm9~J-d?6=#QfU zx{0CA?_#9R^%Li)ZkhjZEhVo0A0ztHIR00<@<@RL872CW?e%QW+kGg_Phm&ZeufiQ zj^O0y1%+(&n`Eqkp8-2jhWyX|Q===Eo@TAip65yrk4FEFXdw?T$yblsA117{RdB>-eF~F%&bMl`C-<6%tA|Y|vB!6PuFf&ZW{R%np&72N zy6fckl-Emodm{7S7)Eb5d)eX|^k^E-B-6dFPoiTC_lf(1zw4xg(M>mC#CO@9Y}X|l zX>v>{r(us9RT!Ju_GT}2G*`(=rdV~D7UQ)Polg(X1ZA)>##-*D2gAnh)>>_QU$xkm z1GdUF+{`(2gisFt&Soyul}$M%MXmj{aqU^7*{krV=S=**s$k?Wu zT(RH9(}ML)9ec^f!D3+J{<2jpN9p?M{@1^?%?C!4MxLy}#;tRYe~3~RB%W80<#^vw zz&gb&GCZIXh%K8ons_=HBpPzNj`zR6~{On5= zqaBiy$Kt2Mz2r`r)eiW7FWtWqdp(9n; z@7&;e%;-T!f0CrRBpdW8QYeAE;Phpog0275=2PjgP2y7QdC>x)HPQIB)Kisv28SCd zZj-LgIg`q_v=!Vs6c6JN$cM#(CZFHu{-FkDSK0 z%OLTGAR*v)+8eD87GXSZ43Zqf<4aRnzHJ0q@a6^wTnXro^LD0gE|9 zfl6%?lR>jcDlVrN{pcIFd+%6vZV`>8U&Tm`4rcp!TO~W->&`+)tJ* z=`s}>tb)8!EMy|lXM6d!8|i$Gg$8@Jtqr;{dmjBGI1%Kj9S2K{lWAh+%YD=Ks_f?N zUx;pf&})3E>2sWlL0Y@c1IsbbsYdaT+;V_UP4{HAjTiFE>kbrm0I1mxxDDd=5Vyn^vt}- zn&SR;v~0D0nw$+MsU6%7h-gW>Ct+~rY)wU;7W&`Jsw>veobme3>~!S>`DJSKDJe}2 zpl(q79_-lIlS}Lw~(9AN=4x6-~*Fnpq~D z&7%mZcG5nogfs!mTMm9oUWWF}X(cu9A_IKFi5yxeCda1JZ`IE#XF2Z+@+<~7#ZXbx zb>7hCG?y>@YGR*npy1&|7jNA`G#*8x!>_Q}M>rn!KG8^5!ZQ3r$a1_e+4$T0%J-#2 zqmy|QKK;pd?O3Z>pNXoTJFcEryViL>%~ZT*zJT>%yjPmwZH1^W20O~OA;s(6q5ZLb zZXv~b6hZ5qJm^P7z*C9h^(@W)*P{3}4)hK?``aoJEQi0E9Zda--v0#1T>^6onOhU=?|N zMKU6*vObKJ=8s_6UPoaVtG8grT?NBuIAwdGOqliYB>&u5=d%nK0j) zy0d*-C7nzw_**{gM(RMyLDuvFt7cUd{Ys*TwOxJMTHwe*;w@_#CWlPpo% zclV})KURj3#GB$W6%V*HeTyuAAo!M8W$>z$eVXraVlzKO%jw=P)?r8Da{gP&-LtA4 zzgW$PAGR!&6PF+945S~Hv7J0jBVh8mWo5p7TKI+e!sJRr#B7c1XfR5~zu;m2eu0ov zTk)q1<4*-WXD9aBmO4}I5E7g1+fIQph5jNOm* zRL8#Tmc7F$(YEDbnHWFYEQTUOS9|3YZ97j$+KBDgAW=>0u(4;)tX6D^b{x&Tm4=e* za>=M{HTS4FR*k>W?JoYppG@ACr+TB(>qW@B1*;tggQ=V~ zokkXx_=Qu>&Ze`M=}BE{)WORO)a^SNwSRN|%keqps(s&;7B1s;+~x5rzA3K!S=V%@ zcJ=}t)s?LiX4DAZah;D6X5E>c{!XQ1Oa=+f3U1ACh?Kp}i&#>cE!-LxsaF*xlL;BC zl^7>M7bh$g9)7YNUefl}cOAPz_@ww$ z)UY=^4_D7sNwcb~S={v`Ou)p{HRi-nJH**@!2$i!+n9}k#bSR**q|ftbNHlR;Y8f6 zxy~OX8!Ue^e|74ZMQAFSjMwkTVchmD6c!NaDBC%%m|>Y7(y&-)L*Jvz97t&R#Od-H zx=Wu@vY`IZ2()!j(JkO<%kcyf?fL21F|#RJHTW?36%if!=}nW9J2nJ&&T`o?jBI7S z=uYv%tGW1Ge0n0|;M2RW{42@fyyNM^k*0`So%X3!*AF)rm|Q2l8h^unLm` zGb+@b{?5G*U?>PHP<+R|Q(*AF=6;4>5$Ywa1N!^6#oa^$Ukvx%soxi#nAL_A3KF;Q zuc}M6=QpKWW69Y|x}HrC__>*n5h&nyhY~&ZpZLm3wn)%Wkx*4`d+6#N;=wke&#DG#=g;2M?UifPNY9n`3pJ9~}&YI?y0^{MT z(WL*-ard898P3kHCoA`~t4{p*OTL|`SJH5byrn2R34O+=flA+#rfJ33K36};q09DH zDnO-G5%0A=!oYJ3;Fh%2%XV-`%t&J3vkhIapTj_ZT8G*APb63u*S|PrI5OeJ z%7@-1_Z3YZ1^dj4u%%OpbvwB2HA zYyG1niR^zo3YFwdX3i-NOY|jj|0!BwIfNRP3w5{`xjzo>AHkSNDDj&Swv~hfNNqORS^jaJfTPu3f{nDXSf0rX5^X*+(K)r*mONlhNC*!-PuO1iGG&nT+np)K`X^j@2KG z#za~f%3Gh0vCa%PCRgrTDc}FJFji90Tz&A2yKDF&_j{}WA$8e-xzu&%hy0n)rwWNrPG)Za<{ zr@u(VnhxCxO&Zu4|6BHEyX!ku?WlPCkm<53Wp3;=)K{S2Xg*>pjcbjgVQG)PWG%#_ z+SV8Sz6`@cgmaZ|&GrlQ-(5o_M8}e84)@j~oOKCUyJ-vvwX3;~ogW6rXT0xbSR+)P zRQtABYRx_@LjKWe(yH@F2Af-AxFOH8dNU(ss<3PIq}I-O!QfEU;k4v<{IWZ;PI+nV zgiPw%vTlAZS&k=zch}z0-hPg)jA7Y!j-6}qQRA8aX`}qar$!vo4?KTo8fE4Z2M%K{ z_7hD`t*7NSEDjpDCl%K`*_Mb7Q{@lp_q^VN_@1;Ev&C=nmB^9|6N!Uu(3P$X%EHVFr_PLyOMFCP(?ubGgQRRLdac z=}6`i>&sp(^%HF3!9B*)l#_rcfiV<6m(1z7_Qodaj=NCyICU{KZOyfJ@o zb!Cm7N~27{$dROsVYIUDi&(=q9Ti5YV8`UCmbWt|B*!kw`It{Ml(uX}75yH``@alSw|C|Z z!u_m|q}WdKn%~n?EiKd9vd%Bp*ju>hy5W_T$`Ex+7u}*dT-2)E7FQX56Glk2MxkNj zCA@jiYVOo)I@eKQMP)dsKYrvX?-rw%x{`9-#%F;S_jvTMD zn^$XU5)5C})SyoO>*}d3Oj~G=%Zkh!EqgHA9yb+uSNC<_P!18j zE^m%PJ?l&J;dz@HG4q|OklWuq+T&#KopR`IytQ_JW|RIWP3En&0L91=R>R?pk@_Fq zAZeRpaiX(0We2WTUE~5He;s%YFSoGF3i_DDZC3(^c`}$8suN1r?c}KUbu|`o>#`U% z|FXedwbEoZQ?65UuGJI!4tuR)(WIwQ8yVet2^f5c(Yf+09q3$Vh(cjwp8Siyn&79w?`L>&m z=>&1<>B?k>Yz)`RS7)ZZeQWKlqWWr0K~VqeK2K;)kzLl$u@i%kw4xmR?x5Z?U+eQ{ z8J25&YOC`x588*zPkhDH>1opbULQSi9Xr?Ecjzkmn6q~={EE6~D&M$Fw>tAtYY|56 zlF~qO>64nBw!!YkeJ5)Y zTM^=go9W8x;UM{S9wRO zH`q+)xwc0~yU~yP1YvJf5f*7wJGZd3SC2Ad6Qjg29CR6!ZcbEL%ExV2eRBJ3JD$i9 zUcJJ`SuOI}CG?@+H#U9C`l4*-lPa7B6{m6IlSJbcZ)L_u|7`j!$d9VxjYp^A3VEjw zG?c2U8{(rkY|>h2XKbdWCiB}A@T$Gj+)Ap?^Q_1hcv|VU-{L!|sLv|9i(`?s91;|E zK58bo>3T9p8{uoi&AUoW7vcLuOCKvL<=6K&VJ|V9^_S-o6}K?jZUoF*d$fP=&>F_D z%Po2ooD$(%onz}ubHq}%(^a^PED+KYeosZtMP>5h!oX-a#T^;Xz__~SiCc6{=I zcI;1&#y+_l8=Vex|N7g=?DOXCd6#r_`rpR;p3TMgn(NOSzlDwy=ULM!>E~_iyG2xs zrBg>8mEVil2)FVZ^-+<0bNaDnX8OW1cyD9tez~!yi;Hz%PuRwEUb@>QyWBPk{S67P zf$L@GcBD)BM9JbV31bh}wJ3?E!btP9Tnc+1g|Gj;ZTfTHT$x_T#Wb^Q?z2bevF!Za z_1_ocVJ6$|ZPAI7%|f4g8)zEuy1zG;@sU{%bLG0&3{#F?TNPo=q!D|qy?Las zd8uh8v2|0icAWg4q+4Cu%C8ND=pt10+QxMC;ab&XOF(TE9b7716H*S?<+9TA`dCkGPaKh?V zuUUGNP&vElrWbQTlTg}6vwun(xEo%Qht5mm6mpwhVmU%WVv3t5ynLcUO?}I~y<&TR zr;Rd+_ri+5j`4c_V}_WMzys1ISt){rO%$Ps|sg@AoZCzX0E9rEgN)h2x!q(xm_TfbI(y zDR%lbqW_7zh$Pgb(sfD;!a`B^uyw?TpF@4tJdC6 zeBKnyQpwy7@`=zlWVsYNaU(Pt>64qjPzpF!I)8VZYUYx#wMUFQQ6nri>ss6)6X8nu zyFH)paPyhjX)3m(vHOy2@5||9S?jM`UV`qS2ff4=u3KIl+HAF4?x>|+*K9_ttuuOZ z&Z%R?;q}R5M{bMFGZvxP%`@}h_&U!gv+vgp;{Nnc78uh^re>n0?fX`TpF+YmeI9NO zZR+^YyYQ)VX8v3XH+4LzOAGb;e-xc{R21JAz?Bf`Whv=hDQW4hrMsj{y1|u{6eM1Prb4H1-6?V$IiTV-kUWi7@Dn+~|d>*X9ztKthSu|K^VBlhZ?cyRLxHr;Kl7;Ka zf%E4Q7VPWp6e*Vtu61ZY>_^HOXLqKp&4eE)_&(J?zI(fYEUb3>RC0A;W#k$c2^C!Y zFzr6smIVtgPIU=7n*(B(ubh6|4%R`-D#LC)lI|NgjrdJH9Db}0Jjlf^EL zgqLSsl~cGPO4BOphys%5W84#OLeIkAJUP;6Uc(mk9?5I#Pt3V(%y;@3)pujfzNgQ( z-8#aQwt07D)7_VPc1dfo6mBiP_Rot36=VW1mNe-R1GR(L$x`o-X7ahS(8ZmI17N=K z;Obv%TJ!cU_Q}n;i(TMp1dG?#p5loLmo|>QA%?GE8}37)elam&+3V(g`%`|`OP$iT zgq^|pW(i?uz}!U`rMvmrGEs(P#{o-ThEBVrzy55u0f$eQWaq~5@?z0MSW9o%L0I+O z&a-dcW+%&I&sBmC+FtKO`W?3JboXu@_jhl&hnI~xDDUgNb@)}_=tM*+>_TMj#*)~# z{Ilc%Gpgd~&*;xT6x)05ufkedDOhvx*7}G<4OzV_4jRc7Sh?r!y(#2-#U0XcDfPhl zzqo(};Lna#{=F5`Wh;5(ffN9~%@uoVDSm{V zJ-@mewM`sAWQHsDj-a%7YkGQfn_aWcCi-o-F4xP|bv-Zlb;tiFuln2$)c=qB_iu+P zcXd}+SLb?$+}zy8+p8U}s`a@HxfkN1{v*TUqN4sOy8-9&ZaKj@4pC{8V@Exs*yXVO z3#{~6_gRsvt>!jcP=*%16TZ)Q`hS`k;}26@e-O;Sw^32jqNRG7Ik^j~q^lw16c9h= z@d%uSym`pv{6^xMQqS5Ez3gWAjNdBhjea~&@9c2l`=Jr5f&k8NA&1ix5eD0oPa1@8 zje5-Px;#mkz8xAiDKyBvt_?+aM=We4c-cddb5#X7-(AWEOCO(9eHXA_)KIHP)cBBO zv}Dxs+iy4Vw5jY=<5G@pVxxLiK}fA7-8*ShbV2X0}@H= z75=Gz@=`u>UjfC$BTD|8LWU1$$A8kQ9{)+(rL1U*gJp9Wpj zxfv~Y-JNVVHlM9O4t>x^YdS?H5=sCUv{@h%k>Qq`{!JB>T*S0|w2YJXZf>0R3s8lt z&j2X@=!?l` z_5O;tcES%07$%dOj5EF|uycx!d#g83SNwahtHVRuB*dBg-lWFrR*@scu*S(Btax6l z?eHu(<-9Sb|29J7)aNx={fyGhiA|C1I)bbP$P$)#^`G#yW*6JU=*Je}!ZIHp-Lsr~ z{i+5J(im8!Pu+9@gVcf4h>|bw-iai})Z8Z=vVLSiTk_PFjIgDVd_TG3U0)6*v;T1V zW{$}Z<80v#D**#$f1dcT>K~=2lc&F94EAW)&nHz?8jOj=@h2u7?p;)~KkQKy=k#3D z^K|7{(i0GodSkWBYgfVOw(`C{`Sf13_=ti+ph=UiNn5PAV4(H;l|lil{Lc%&+9vTG zB6Q@Tkw+n3w==^Bzv>^BBu?yncKw%*7GkX*FslFD2OH&`{t36HIn+BPsIxLK?BMk? z5+x)HxFe&TbRNQm=zGR(>Dld{3TYJlfps-j<%V zAflFK#+q+bY09vwZB2XS@lYTXqcNZ5&Q(4oE~KO>`-`_kPnKpqaDL8=*k_)wEF0Ns zwm{R*pmXm>V5+=xuuYq*9^*{$Q?GhiJO;_fK|dlE@5eNiKVf&a$wK~ds(O06c=2E) zIqALrsu}R78Y%vFQ{318AKJ(0i_2nt&Hx69WjA0+^VtyVo3`1d5)u653|pdOuM99q zMpp)tMeS=FkcGt_E8J@s$1?Sjr!EzwEASs`st@r@Y)St$0Jb;@{Ax>Iryn1FL{~I; zaux=#d+Db+k8H^jXLa$E2nI=FQ=csnYKA&voGzIvV)6U}FDZ4+X7U?PD z-JJZ7WBJ_d&EM4&`OVd`Qdave)y`;0}Ad}d6}Z$mb+wOHq+3Izh*)+WKbAGVRGP426V|1 ztw5Y0oFSs@EZB`B4n6pjq)=zME{x&F^Q+`fbo$Q2J_@xS#_l7CAC56gkI=*e7A{>> zmW>6!!(Rd%WtA*HsIgA>rQ9LUj58IV$Wdn?xvWqO+20!UQQjYl|M*&-Ny6Q6i;XW- z4Bmg?az?zR&VT&!Pajy}vTXaE8VI zC?o!Hkxwnbr0APehb;Q_NyPDMk(q+`*SqZUg%D}?klQGfm|~wrW44FLL&u74h9Z~C zln8=?zp7q5r)g(Eqd+;Tn*M>}+mFpqbA;ywQFKf?zzjm{P7c|(avsoaad1Ty~h zHN$UR)!hWeep;}WJaY-Dhxw;C{K?(1Zq0V~eK?z!ghGe}1Ny73`zaFj!%iQP`Ankq zb&y6sRZVh^s26^G-bS;Kt>)&q8wxiH^-bfHDMXM@kBLL6HDW9Od{uOfy_0E_Oe4}L z6|Q9Ro`c63EQKKa1a(Pr+Xav1Ic-e2k8u3hpuM1EcQ7*r|09lR-8hjVn%PfYZ-?5C_kOWb!(meovs{k zVItCUvG=6YIL)lG9PmaDhv^0-B*;pOh|6_Eyd^DIl>R}euTNHZSS3CDPx-gosV=Mj zGY$HZI9+{8gG&Q5_QxdS2(B@o?_C2!WORCVesyNQZkB0W$Nm+nkBf9DWEs6VQ~S0! z(4TLhkShD_}+u7y_DAj@%*c7&hvSVX3k2dx7`~7Nv&rE3cuYv|EW&P|5ME( zTz6LeJR)2n@%&*CtdgJZ$Ho)Jw`)%{zMU6L89i3uK7D04n)+*yS-h#>>Nj7?bBcs+ zjZqI35C2hdHk%B}fexB1WU6X;p$Y%%X8%ORuhBevWm1pJb;O7&juV~#Gr6ZWUe5Ea zY_l+9JcCDXz}KT$>htf!9Ci8xv+{(UGDJn)<;vQ36AAHz9UiRJ;_%yeI+E1ZVJ|&t zTGs8ir19oOQ0W&AiNG__8M@VE{{_Zt@iwNuIpcNujQm-Vx<&YJ-t7Fzy5}91BcI>q zQx}PijZlshGM2xDcYGh22hNA`B>&>CA=IW4}N+hBJJ5@{!!k(`=l|5!vqF*9>o?l@gq_4&_hy3%~2uohsM{XKMBlx z8lQ4RWvXv!y*Y$kcp;juM>yZYFJ7B;9|fzcW;Arz>lnFcM!piBH4(sKPR>zy#A7^D!ySAXbX&=OvuNlxK-8S!n%NOisnXI-8fHOwTqwJxZ59x~lrtzoTKt|#w+dv5u{+Sr01cTkv! z@sSumiocj=^MQ(i^2~!!lFRtEO?uUTc8^6qY4yUy=Z)x{Tk1T79uYTq2vsFJQxM)# z3TXM00+R{(*g?Lk6sUb)t2>5v*H?j{_KzV-=*Q@*81|9T%0J#ms)l_Ru7!f_nqS!9 zgxM)ipFE3usgRB^albIGx+DJn*R)IsT`TcW&qs~e`mc6I0ko%S6}8VSnzd*v#DlGK zR${hEldM$DEgaHK+N&~mNwURd=fD0eMSo2Z_B3lRCxp@NOSD^tz{oO5(wdolZ9?RB z^+?7TWB6_>DxB0DoGi=}o-Bx2F;pOM6B%@>I2*RT9->!vqq;Y592* z^B(i@CfS;pJ#neqpUO5Dmn|tJzxQ3Og`}%=5Q#`^g~~OmNyF9RrD+Pi0-ss^{yxj= zF!9iuyP_rSH`b$(=%@aU&$Hn9^#2}S{4!zxn%^&;p{pagj#shPZ?WB+@zZnM<2CV! z#}GnF!nlq}WJIda+se7ZZ@!i8hrt5vi$Ht6Q3Fvfjf$4K*Ew|E>W)^!jA%#e<`}v* zkJcDakifwEx1T05B(F&-=5A5~13=6D{qs-9GC4b>QBo4WV2a_BE?8nI$SF+oArZ(0 zQ|?tJwK3ugF3**2e5aBZk~r=<*W7vg?mR@Qltz+GaSmtNkV8CeXpEP;?|mK0I&Y1i z>&qWoxGe5TJ$}sk;emX&eMpVtrKSpZrG|vGfh66Hep-Rc<8GLGbw&1%M^ndYuP2=^ zYYbT#Yj{QFk6EN_J~N9%_=n_7?68vxR`%lmw%$!aBOJ01eC8~{Bcvo6gXvDfcnXD<$&A{g* zEq+_s#$OV%m(F1Q4L{e2P3PFIEU8SOtO)rv&myES7_4oru=ZA+zL6(I znx&`Nzu7AD)EFy4(yO9P#PBw|0&*)Yf8gcum)Yt;FW(B1y;yi=8KSwBK^JWH`Nzlo z@p&^dv(GII*_r#K2J%@Fs-H%To!B+EFzdEPBYw)-1`JDWkHV`}$pb6oL#sp=RGqnw=c$q$8IL*2BU)2b8Ot|J;kP6I&oWM;79-%q+7sW0hJ0sF<>N*@hmRNU@>yq|& zh2K6W&$5s#T%^`(m+Yvnh>AUrR`{jmH|zCEH%`fXq`z|H&${9NEL<}gopMc;pJ`-o zCJc*Y4UX2JmjV>MY;~7VmJ4M&>cb-X)%k&wsF)^wG0})=h8XcD<7^^31;YQSufDmd zb2oX^_Wi9P4<)qg1Ie|@U?%`ER*=d|KcrC+9`wIItu=z>8%+9om1W+nSrQ&?1g#DC z$Pr!RBl|RHuJNWtFpK{i#b9uM?8sq+1HDD$@azs9?+E`IH#s>^FLUe5=N{6_A+4Mo zb6X|j6cg~K2rBx=o&FY`ZVBv>RUcz`&vt)SyEY|2pRqfi{(L~2S4eYx@bj>DuH$t} zLsQB(O*eDZNL$Fa>A9q`IT_hJmL@N!S>Z4Zi_@mF1kWvJ23Xi>-{WFe4KwA@RKZ>; zY=-*y*Xoj~0on>WcS9=al@F!zeR4=g15LGn==8+>-+uAy(cCTkZuJkKBxxgr=Dg$N zFD+iPd9-kZ`rD|f9k=x-aypDYsY|uu{19s1DB(Cv+qkyHn>^k}n}AR|=ZfWcLS@=r z1L`&jKe0)4c&_Fo_GUw>EMBV8wwbTMNvcOW;;Vv>er@R+|9jP=Jkz|yDW3Y;vl?S) zvM_z5?uP%MlZ@XoQLdtk<4^w)OP1Rx(PG83Ncqa^8*@7MQM)q!Uj?F#dp4*o|9YO! zV;z0>KNl^`{m0}V)_h+0Jc3i?uVQdjwEG6*l)<{X!r{mWYKc=ylDl;^$9UF1JAO{O z?Z>k?|CyHeeg0n7EiFqS;fj5?Y2h6Zkr_>&b=IW4M-?A`FY5gM;!^benb46KQh>Lp zG-cGQVT`7Bkpy=1Swcv>h!rpR=n{~*dZFStuj55Kw!W6IG}J}-L4UiT?UBfDIU$kt z7fko}83=z9`42DPdP%P~82ZV^WLaJu*@PS)397}@*e+I%)2u$^O?hTEH{f3K$&0j? zFYMaj(q``9=8b|m7t_ewX6<6WA?pvVRW`1h+H04Ot1}xr=lPr@gP!aQ<5XRo8(r7X zv#OsClYi5+abz4>Lw3W{7)N43;x|d$G;2z?hQ{U@Za+S9?0}`ZSGG6mpVwUYs@U4a z>xUXgCZ!K#6xriTjz}Hf`bO$fRbC9GJdld=kqRI7t0yxu6e)R8dyN}$@Gt7c-nfk( zoiVJ--S8{#4uoGUd`f-U&IjM;1%cw;4|h2t2{;sT+p%nsxkRWoX7B@t!j1cMS*SG; zW*@$P6RF~-1f5ofN}~nPpe+Tao&)9g7?4ap?_2XX$Ah}R zB%q)=5XGpztG=t3fWl77o06a^$$^QY_TgTh0kS??6#Bj+Z%mFhv7_ysM!|=pvKM_O zFD*P_S%JXWNlPIiFvSXPt1i}dUdWUSk!Gap$npLMK=x*diO*5?zLMK!@9<@)dv7k@ zA?JsYs5KfSR$u55E%92(=a+I@xMN4s0G!ow!i;e*JfdwI75&v zQqmm;yB2`l1c7d5OXCJuIXq%!?#QkYr>L1MN(3|&!u|92%*o8Q;cMyZ?bc{=r3o1^ zACBukBNX{}`eg1)K;6>h-T~Hv%KYZ2gUe@!6WSB%s6bK7K@T4rG0KSwXnY%TK-Bv- zA2xalapR657>7smgGiS*%S1pkiKCSY4!5!?=yRl7#U+D{l-#_l1PUTRM)VEnwJ<=| zXdgSvL=0{cAOoh7>>wKUpwOsUFdp!N73@;AncfqmhxPcEzVmneCT< z6)3ttP@1-{abwAGN*!ht=mw7KnMB!no~tBystcfYm3n1;A#w-$Kv&LB+bYVm?jGs_ zf-&G;ZsMU9NGIUNOhoD4==o79K`E%QjGygD1Jo!%rJ$?Ic`Y{0@FEn6(DROLbByK9|6la(=o4 zwMP`3f5kApO_oSk3ImBHdzzSkY6xRSrk!TyV57E>4d0k{8HA1PeUJ(@gMb{kqJs1D ztW5n+^f7)3=fPB+QCH8CTIUs>sJ*sTu^G(yBco{;=vC#^47I=)ZeU-&+;l1})lO*t zgi`E~6Et8`pyS=|mu$OwN}Qf71}2B?%T@5!BqOOS^<|67=Edn9tu*Co>LOZ*9qlNE zXLyHBYwn}Njz9nUMu0qf)lLKjDDyS4- z54$C6$kbzbZJG|Q2~L>yzd_D~K}+!joaZ+(;vCe$_TiU<%)4{xPZcmLe&;}zf zi;SRK14T}N6gPZdRD1S^VYKdYko(x)WfnO!fV%j@g75=(8B_&35PTNm@tWc!<5B|5 z_G7gx8RvOLunx6m+mhGy=|o&HW2k3Bu%1!2FysOnaaGDDm{xQH7jk~oh298dRWBIq-8v^QIv+D1Ka6sM9D^f}K@l_G~`YvH_a zHV%I4Um|SqQEZWy+6=#%@9O2FHX@MQkxJf7@YWGvYsKbarWYq*saAlyMA1a}GXX7c z&U3B8tZB94N#007HcSdXUc#qaf#Ar0$J^h6P(vzRfj?eRdYxNQVrnigjp03HU>kjx zT|>A65yp}ejA)a`U)n5qJ(O^fTGVB7FN9A8M9`@XKnW`Q7QzkGPC3=F*D{DguzCy0E6YQ&q^P>i2zd#od3)it$&DY++fI& zpZpGY?dZCap%M<$F7NYXiRN-Hz|aT2P62%L8@8;m4UV<=453^)?sz^V4h6O0JvgiF zk$Kl(l;rF41Pyz$s%RL&9%@DQu>ei8jLNT+^R@zs`7)OlPZ|uSPnMQ&HdNU=0=;s0 zBKI!zHz~NUgBy!JlPe?Ri6h`eMaT})f=}fMT7am_?+jnX3Sk&q^qKYO^!DDflb66M z6E?E`fFh1S9m4J1QQrBvFi@W_URpro0=0w%sU>Kwy{dB4?-$usi}|1dT0m zvock5ZLiK{pkp1?35;1+kAcYK_L*V6xEgU%*r*y1?XpzAY0;|U-H8fzn|y@lUx6rK z0BYkSN`uxH$&kM6*H^#WXz|;Hlo!oWQHxEQEZH}o;+4UfsEcs=UjYPq{pex_=5W<= zFg7QgH**x?FA3)Ffb(8aE|3KqaC=9v(u=4YJ{k!a$l0H1v?Sd_Z9p)YwUI`u-~uIv zg~KlF@Q;(ygq4^NjCJmM2Lf%s)8_)x6AhbvapsN7;YDereb&;O>47>nz$5vjFW9?T zh#M;*M69GZ^L}A6kX0*ue_r*Zz38Z9`w*8cG`edz^)oIc31zUTpi4e*3vrlJFAzQ> zZSgN=0goU;VP`rcL3rKp=t#h6EDG11(MaVuue)1t@C)X0>i&T9y4-$_k9SN46-bFO z@80+Pm6{q)(sN|e&{fwn8%p3PuP^6s8XvDXb{Dnr7`bn|64&KsaPkhAuzRu2WLhAR zetrrpjU6-ydpvco-w-N#T>@T(*YKJU}rGxuZ}}_y(36Ix58r7 z(9Qx~RO`B^oS`Mk%~H|jL(2v;)y&gr#u8jY^66~5)#v=_9D9@sF4UG)MFHd;P^vD~ zmz~3*>1#O*SV?Uk3qBbP6H*E10{i3Hrj_>XDKRt9g&j5%+AoYP5?~2?XLY7k7J`2Y zuusLUg?7u6Hx{rLb$P$$itAZ}tZ0MqJ#*f06&V6cporVmO!Zc@wa`68fr^-h1sPIc;#Tr@((P^ zcmGUiPdX_j0jJNm>`0Mb?kNW(=z|h^Sr{fT&ru3)Cm!lYiE7Kfe8>jOs0*q3i)8LG zYJLsvp1r3vTaDN!#CSb9Y#=jzy4NR z0vi2N_rV9+xGP(}C{q&#GBlIAO%&Fvi;;R!dn(b}HaWr3dx z0#0lxCgRAwNwK#flSVt;+dQF&#cp)xAiW;1H50JI#d^6KxLrKrCH4w_efetKVDhD; za-B7r=)-K~#j8M3;B!jIFtndFL7fbxSI*YP0IeJko>nT@dAoNDe)#*jlMY-irLTnf z>M_fA!dUe-!z;zZ%mk+pIBS&K@^yNsVHy*Nq3#X1`l(nQR~SPu3Ozf&oW&|l*olcl z6s;Hc={c*Y9BIMk-EK85O&b9YeOdoWCFUKJm+b76Yqvanc^SC5aQYE2b=m=0L4du} zSejiz8D%_Mbnot^Y@ijg6OP29iX&>rm@c2uqZ(u}W%yA~+L_7XYbK7$cI=-R(hSED zB%wOxo3*dlE)kDko*xypd1QFqBFOAH_HT}gr~b|{!dg`TbW;tD$ebsvH4sqjmDqP- z2~q$|baBPQ+*2%}sR%i4)XHX)Rk=Is9brnY$g*dyXy^+%XmIp-V|nmY^}!-Bx`F%J zX+f7IrjiJlNII_;KQb}JABWZJf~f`(S7p#Ssu)3lxVPn^>F_bN;|M%5=*KGKM`$Yo z8U(qqcfsnOXePn0T>!u1@C~=MDG|-5gqW7>G@hGR-_xHmV1}}}g$oG=O_!rjRj+^ayDYFPOl8= zp!wM5&f7Cu$iX=++y={S&{UHTW}(;h-;?~Q8krqi&wO9o-OdMm}|K zf)Q;C`p zI#+H=dMc^;ksH%;>qU4h5P9+i&^WND3S}_IL-TR_wsrj#IJsL0-}eRFPNVGWL|92M zX|PD$ATP6*5|C!@`e#0d5~YPTWS9@d>nCOst_T}xAp81yM90%g7Pc${3SFiu*0s68 zmX83%2sz%j{{mie1aR#mJ^xnDztuqUAdTBdeAftN0;$K$U zIzDR^VNANYxz~UGZ3*qNR4ZE@_KnYQ#+u>c7%W?>);PvD&LRlXd$OqFNl8ZuKsi{i zerODtQjIC?ZlG88o)zM`1w%kzje<@^pH%1^VaBh*cI#!W@A?n!_d!4=iEQ#2U2hH` zqqIkW92}lZT7_)z1U`3z)gNsy$S5z`iu*b%gZ@(kw=fS2r>~DSziQI%Jl1^5fn1V& zk*MP118Y46W^7Mn<7SaO>FojFvUx+-cLJmcQ10=P+q7FA14?X!58kpr+G5Wy3^Hgd z%d$T+gM`?d()y*9I~cZy5@+sB2%kW9j*qz(kyn02hwl{u5mbB7=&JpryF~C-cA#jx z=+)bo<>~F7VB6S`X-$DRWI_h4xgavw+%rRY5Mdpg$*y9oiy@9Ns`BPF0|9;-e2 zanM+xjXiSfvyiU#o*k+!TFPl>E>qi15fuf)Oi*5}JoWL10b;S|>*%nl#vj=TkPmfW zDQsPRLZ{N@0?kq%h>9)Wq?C)gmma#Jgq!+4nnxHatJ1ZEQuMaR^bp3dLzvB9`ja`DiqQn$ zfmSO0YGDEA)of_b=6Ltk9s<*vHli3U&e`I77&j>Q%CjBC<_XU9_BFtO>#7tCqETip z2gXe6ESwM%6kU= z=(OQeD@x%h=tfYaNB*(|LKm@!{lHB_PecmqgMu+Ltk;C@GI146z?%x2{R)gbJLSM zywkLMivm@dDuw*5KN5ns0gFxogjkMi@W1%pKc%{1FE1vU5My@Ke&~xkh$9@VIbpm; zuUxA5J}Re2O(1r!_l?LWFhnp+0y_BZnei53sxlroTJgmhV<2mVAjBjXyy-gk)AQ5K zfAZHfln*}580X@P8fl-|Hs78mzQGQv-goa z=fSnx^HT=i3BZBz)rnF#iT@QJ?0O0)-dnC!7-*(;tl_@y3o-~M&zGN^HJ!!6`(6Ro zk#Z&_W%b6K@Sd{@tk@r^&nnDlz;>VcrfYdWTI!Tq@!5(-jTbRJj5r(Jw8~#H@aqb4 zqztx}w;b>!J%?ckftB;#367s_l%T8%0rp$m|M(8V?q#N!jgAdrP4`2Yy;oV zysn8M^U6aIgZ{bZmwYbtFl08mm-YPXNev_k9z?j_qXJnm0w+^mjpo5H*)WXxaSNTe9P ziPTe(RFcb|d|iovilEGK;(H!bQ&uQ9Qp|N_A?uotHF*%Av40TWYo#yF(Vlp|z)eCs z{O(>%Adn>4TiG}i!0Px}HQZ^QGO^ve7S<{bd{bb0Uq6bZ1KX9lBKD6lyxE-T=WBps zcZ<1-<=1 z25jrM+cfbXVPun%OnqYLG=FI&UnZRLzKBFs3t-6kR?LN-u8=eyz^+fCzk9l;Izak0 z!APwMx9XyRCn#Oqv8b8a{JH?-C}*d9KO<(WP+s_$>{qva;{(6mLkCkUhGUyb7zVE)6EHBiq1UYJV>zqioDL2bwc%9| zNIs>c>D|pMbo_S@<){JLlPZK8B{bay7gQI0S5$(la1w~&e6*~aLddOy!2`9&e3j)a zQ^9Y0m$;s*XRH2Y;y2DbQ|jL9Sv~IPqD{R58ILIlr~6|-EIDMM$iBhUJ)cCl_VtAi zq&HvcWTK(=?XP->4kb9j*1S{4Z-Lk7+02AZm>WEsfMBJ;vm)#Sf-kg;t;B;VF9@0! zRH8-w^NX71JELyLV9m#`&zJW2A`RipFaJD7E==`b@)TCW>-~Y^nbzN3-Y|9(dG#LjzaOb+RXuT`;uemVuGV`Fya+t~=* z6u_1i{+aq$GlAX^I{4J8oN8g7)NxP8`|`9*D6_o@GD8Rsm{!p1K}`Hm)y0>+eCY%a z73MDTJ2O+^jGkzXG2iX-isyGgd0pJ1>4v0d{vLcfdCS3LvH>M*9e{d z-A+I++=!kyt?A36%Ghs>#vUUv>Z)jhX{z4mejR#iADN(w8eJ^3JoC3|@QHq}Pl(AI zl_qM(Q>qnl=N+HzwFUPX#t5u3v!`C_Dx{wW=SNob~6{D^=&R^<_Il%n;;JM@2ZQ+QMki1{DZL zE{(jXdDY5`@*&1la~GR>{~thVP9@Ya(xxxFe;0Z7Fw%R>I`95vCjuvrD((sJPTBs0 zysu9cJmh2Cuxb!@E{alIRxp{Gn`Cv|R<$uww84K9C}yX&a=E;%IZk9dkn-)j0F9?;UfzUW=*Q(53slGN(2%Y#fy>GXCy z$Ac)=3w6I*IIb>n}@iSX_ znD5EI+;k-hjKM)vwRBrK6EOZ}_H6g%_rVv6z;sr733e=--~BV*T`Hh7N`iJ0feLKo zwJ1+ShYX*-#&4En0{(GDHa`?J*Bd6nw8F2CsU9)^CkOAWm*%-rx)QJ~Ehr)xUU%?2uHhGT!PG1dw*$8do3 z#Z9#v{-y{UQ=lysccC63rS+Q%qo}iDmJTivV)nVNd%iHa#mx#pI!kS_ktkdCjxs*r zw~CONGP9T1r0uk7R>4s9-pzC(l;--4;QfKDB{fs9Kz})qPM(uBI057++87P3Y72#LC&!6eN!T$x|t6i_N2m@wEi3{%J^ z>EU^xNQPl!U%oDOGu;}|fUi>nX?C3*HY=Z$nM+<^?xBt#81AvXC(+!KD$rA?{cJ!2 zf+9*D=*>Pati|QOb>oBgF*@Ebk3D@?efx<-u~k_-HvLc|3lwSM#@P)5OeXD!&@;?m ziit5B5XJv4m1rCN+PEkHH^oPWY<~_&F_f^#?Kbl?JQd-XcIyqSILCsSinkY9UQuvz z@muE|&{kFMKTMr&d6Otd2@~d;JB<&eyGg9IsfT+%aQ2EAoKe&(#jQc2IFY9;GdR<& zgZF&}?L)sh@9`M4dSz(u9+;Ife3qwo6ndB%_M(?$E|(CwUSt2C(xNhGpXNIts!~u3 zA8koAyn>ipM?7T*x^vIRMmO5F@B<;06iZXY;I=lT;d&0WG8^RAwQVJNKNLEH6R^xJ z_{f@JsDrDd$KvW7razopmFdx=I%F|SZqwJw(%JVgF3{eN?ftUQ{Cf0#OmT0Hb$y#P ztY;7Cz*5$f|M(CKOhIm3FZH`Cod|)(yb$11r5G(SMJz!AB&u-NtW0uBSvL$-d`S7= z9i)pJShgk)egG&Ki?UrcQQch6V8d#I))8`QK>m6hG+Bv|Q$W3D4E7{SI#g#4qqaqIw+I*sfh%% zLEyIj28;cjjN&52Oeb1(w-g%^Xxf;ISz?|cxHS>xpmT7S_QXN#c?4iyj0?$Mu8%vH zg!BdlZZef`L4o%Ve2>`kh^4Te#`@uYYuz`-H8M&ug=i+h2=BWY>DmRw=h2AA=J$Y1 zJ>2}Mvd)tsAp}Uf|Dpz7WC|pm#nG7(Zo{LyfrguoGn#iEw0YCF_wEr^9iTwfA{6TPDkEK(9oW3Ct}reduh2e?6k ztE=p)Rf}SBMxiSgC;WQAFk{;uAR1~%-0{Z+GD8AdD+m=h#uG>=<5`RQ?nV=wdeK;s z6W4PJewGpIrVUVui3Gi5lJ!iqgOut50c!p8iYlxXNuw$C2F(?ZSffEY0TX6;(k-;= z4;>GL`#K!QlvyK)g-5>v6y>CiG1`x*pt~x#!<#FWHx?$X2x+ik$kGH8Tew|;w(qVu zhDWsNYjN1guS8j3_ZlALhv0^`O45{W)sz>y_`ItyRL+13FwySnvd_Cmn6Cu#1Fcw_ zK}aW?qn}Q=47bTizgI$tJYc?jp_BmmX`ZZ(8?1iCa)&z{@WIM|B-%{&1&Y4mi;3kM zC=FMl7vwSAdQZJKV692O#$}3e*2O)g@K@;mD6{T6?lQ?0PJoIc`i$>JU8!yWs9+1_ zs%80yU{(Wq5{f)TRKPJMaICf@@MVb1&UZ(Y8v}B+EjX&yMk|)%7#>-Bj)U)=%K<^? z^CZHys1lV%r7nH&cS9s&-snNS5ag`A&3}{H6v~mKy}0^&q-6Lh3-I}M$g?x1;>iUo zR3ItxZ~4a19wbZ#C@QzRfdCOtl)tcQcJZRzSb!!Y&ceD)JE1IPC=K1EKP-|kx6d}O z9};zrF%NqJQ-Kxz1yqVXC5P}ZbqOJ!C*Nr_5ubZHrU!-M=c%*~A=ekxG5gq))=22XXY#z->U=^4f+{>yU9d@qLLeiL$dJ~deTl#0Vb+vZoRK@Um0A|Qu4-+4ht*G4_(G5bVK$QvGK%Vv^v z?Wl=hXxzwi69*l{3B1tU!{OnT%SEsLJVZuwBq$&&l)Se9gZhwKixdzKK<0*Q{w+Cp zWU80oC}DKp3Yz{iIi}!&|`9!GmwoW*r_oH z7x!CgXsd;tiUXb3nD<-{FdgaV55Z50ES+ZJ{zAZvQdj4HTl}U@OdNl>mN9$OqI&lq zHiribaD0qzzaF|)dCBaacV;|t=Up{a&lJeCe=Aq|rH2JrGCKK6jy|J43*D`M`J)4h zDzj-yUW4>&gTcPI1-^OzD3l)rGhWWJKcUS3>f9V+aJ{$DoBJDpxVxr>-xqU}Fjdj5 zMcGF%^KzR=15dOHaN93fnkI;lt?-_)u=&c|U&g4;yz>>E8NP7Jf@p$K>a@LybNftH zd(CHeFsIyZUSC@3%_|X$Q9f;gHEg*M0}A9)4HNb8DIVaT+n#i>v&Y*S2_fSM5}+0j z)1gF_(_^Tk{2HDC(=3iU911h%Xl>z07LG`EOt}Z2IPM}%8OM!2Xg_xjP6?EUt=p0C zAHmlhLH4A0T!qgx?0@;~^`j35ES9rzC(rpjWy4i>9x|+JqZqH(kH>B;KQKrV743 z?oDLCdEL4cfa30~S<(k6IDoGWEjGjpM)02ignITo!28+SV4wNUXujhcEwn-g~HK%<6wmpBMG@F z=swGs*H-|HbPEpGbmPADc%uAhF(ztvPl~TaAvZ6;6Ca{SA|zRe7+S!xx7j4;=@vyJ z2UKWyzH}?wg$;QAGQ{SFxI~=kJH(s;v)|h(esE$Nb6yXL+JF$^^{Ar^P_M4e) zh_$NVksG64D)u5{2pm1C@QhNv+^Us0<^w>Tnr0~FEkh>E!XA0`_szD&um{AS3yIU4 z;rVj5uF~}#;0#oZtP?m$;9%y6lyIBPpFgxgMZqzz!&v1A$-X=V3xbP`3f!#lg+Fln z(pUXb*b9VUSwZ?&QKr9Et?yt29@=&Frpzb%u>fta+qeJOsx(h2K%$~R(i0)vI~v>Z zf&wY*S^2L7uVX?`u3u;>Pk9c`HDWnj2wSfQ`~*9FV~s;eGM;6Hd@VQ6-t=MTP)4z} zpZmy}m38B0CxM}oAaZPF3ZU6S3{{}fswHBVEd^j6Dg2N451_)Dp z0h5Eq`tb@G6}%->W#suEhHilv0&R4qE{}OxOHi~$CpBeckGjC%8w!jwm86uqd(FBn z9!8M6C+dl^J4rh}Fq3<}5?tI_+SZb{O?7j)y+R#b@!j1@T@KeOep%%Y2Rd@j>w^vS zro@_A!Npn+cQ;gRe#JY+S9^ec_p!0L3;4o?15>S`zh~;yq6{tq_)%Ar^{TbptyF%q z5JT_HT@vIe?D_&*U9te*WZ{Nk7fb%!uA<`<1K=e z`8xyoiQvoZiAi*bm?Sijobi%6R^~3UfUD$ z9&S6ioA_U&og?XABtXvW=ceCS`eCVW08#~3MQz%(`y79zFqeW_!JaRFD|T`jV_~EC z0E;KJO7(&os_gaoG278(?)j}lmk@|Jv@=^J4~QkW&8(;k!}`Fer2!360}o?2RtjNm zDub&>J>7(k12GoQi5;tBEV3T$)xt4ev|o3lLr$qz45Q@qO#|+7w4*}4qa;d9J-FdW zHxzY{TrlY`gR&p9emzgHC@&)Pj;4)?^GY4@H6AMBHDb05az^YkON=>3o%wAYXQjTE z{~t%^;ZNoJ|M84)%;OwVgmXBNtWRZSJI6S(qm)@HWSveK$KIS%;UJWmot{Ga`IjeilRb?T=^Jz< z=T#=AIs@oGq~7D~mxqc7rYvbmzd2hCOS3lGZw|dYGXGu#IbsYtX41;Pk3VO@yTfr3 z(-r0cKaT;C&oq?2TS>pF-~)zT#BDJi?{-sPu8i>;_?VEq_aY>+V;9S#q8L^ytF&5@ttgOR;lPaA zt_>wk*L?1VF{ACV7x%1SDC8Sq4>?q!L-9Q|pr9_W3l6K6?SH+xRFnL-(cjN2QZM{Ei~7Zm|C?xZ`Pl+H;GfNSmsllf6F<&-9w(hI z-tC_SaXZCT&x<6kyb8Gh{%D&HoS$#f_n9DNIY%1XDo_oGOI-BTT>6@PaT~frhghE0 zie0$D3Q>^N9i88=GG5)}ZXl)~twm>Ld=7waOMtGH{_0EZ%v=Tu)>S@~9R7Zl$&Vq4 z0mp$h2RS_2M|V@>0NHQwrOlVj$g4c%M;xeoQklT8mn;5(=rMPDZe0a?;}Ubd4!YL8 zIzZ8UM1wl&foqa|mufDEvXjIv?>kOZ_HNvQ175P0oxX>GH=zlzwZrwZjStLl#8OH6 z+H~j4xvQ=3p#$f^@~(pwwv3NbM4TM`)4HT?b@Dw3swH>S_0pvc#c%|m6E~{)&{vjk z|8pfTFgJBl*q0nxV@d_ z8`SXB}l+xHL_xaXipaL@g-NL5H7oaa=35Q zXdy>Jz>+}Dqq1Ub^ym;NOR>w=CQ*mSZQxAAuR`?QfJrRYiJPva{B6jw_ZsmwCw}n2 zj635K97?_C_H`Haq1kVfLk;W~(dws8P@vlmAk}iN;6DRU83W!hX@h|kNSF2P&`dVz zRCMmndP8Wm-5n^d<#yAq;U1EBa27w{+^Kr9S6v?z5Og&65F1|Kihed+x_dJ1rc{@^ ze^8@sD2~`ENjF&Q9!{4THh^tG>%v0+m@TeuRq)70`1TA8yj8Ty8zx9jjHCxIRpkYAvA za5U$Yc-pJSj1NQMn5vOx3~M{F^Jsro)pzGC@F0fKeoOL0Rmq3}s0J(FC|Ea{H54Is zYS9zLk`FL@eK9Q$NWJ^`%hB&XdJ*kAALFjk?o_dZ^Sz({q3%Cn zJeTdV`OmE~?pY;KFL>vJ@2+1EQ8ty3QFnQ$O5YWG^B8?#TS(_6uUza+CH%*#X4mqy z)u?BSMAs+Xm);CkrLC_dRH}FY<=0Jgn6K>u59dA~GxchZv5&1)3W_^gt1&pTYZr2yQUOe<5#A@?K zd6T;eg#AR!i(@gc%?No!83o8UvU09U>q`J;;aPfF<^P?(&kED9*njshJ?Na3roMR| zX{|x^9DI2Rx#a+Uww3U_av~sFqaCidH)OxI(Ec77jROA_T(s+jCwreT(*EojIRn1i2QEqC;)r>3?SEf}MA>HAFd%H<==|2| zEzK-P2BU3yedqKKXqqi7EdgcfnSJLXDiK+ZG948)ho=G0RPOyi-ODDUP^L{Kc+a%o zPZQ$qm}R3(9Y*$R8~5oei_P8C&4b%(OW_yS=Kg9g-B@xNXc!4!k6nW8PIziz-$>&J zv;W={e|1mO6L=rGI$io-7aMB$MyHVg_N4&*YAUDXptn*ibDd_0i%wP+M+kyvz)Srm zD(+`Y^wWw-GwMqAFaI#P_;GmM=_bm*?V(3BVmt5Y8zlnMe4zd9`MDol;2Im<18%|} zR?dFK^(l5J)3JsTKGyrNt_IV4mseih#|?P2*T( zmmtvfZE&V{6i>K(DA&j5yosna2Bvu(i;ht;1n|Nz<)t^*r;>wUfL1)?xqWSR zg?)b%qaCh1CPC5GYk|TP&K$0c`6NB76#}lNGah{w6SC~hM!PAJa0R=hGMS25@~{{9 ze5k7-^9=`7<&0n0UbCiuvI4PKxxRfOJo}s$zy9e&(rjvhF4L#5ZuM<)7tZrM z>P;?VGw0*U#~-{@4Z!$=wrLJKUn2@XSRbx=-5K+c%K@G!Ia=5?Fu@1*Nk!bfRiCG$ z63cKD>^5!m@Tyfm0S+LEkxGE8VOYDm1^$Vi31`Nr$bqx3R3<;EQMOhmz&@LQo)!B# zu7v`ZSlT-qbyI@wecN*Beej6B_7W-ben+9%hh_<8sv7ntdxHBe6WV_O`iWS{FY>R& z$H@~1EN}ePuog%n9)-SccgU9J1V2ejq~_G{PoL)jpP6-R{|@CDJ{bAVYu0()weJ;C zM33Zcqs2kj|jAP6&N9O3^QpB|cuQ+DqmCCx`{v@i}a%z0oqB zmSF?^wdulPtq3m9q7W7k1`d;~dKap$q3%jynEO__ z{=19Bft0Sr!0^v7EI|%GP&L^WSkE7m1Oy1sYN0>IxIiD{j_}}OWufA_sFv!(wz_wh zKoR-5(YJl^j7LO0u}1C689XnjVY@BZ&FOgC6?tuu3ISg{60?A$)b4a8N?M4&* zmUAiwnVJd+H!D&Ya4rK@2)H~a%Ri{MDgfb=@!O|qd?+V{kPW3lWaP%R`KOb7rVlacWM_3@N6490j|8TwPlBRgMu#HkUDFw5f+#Y=jjDL z(uS;G@U1e-bjP{3n6RSiITcxe3IV@b>p4Rpc|+YP22vE_z)G+_pU#L4lAZoYcxU%Z zMGtwH3yf(k7F*(4j(-uu_!E7t^7Mv&3=*sv>RK#2S;7vZD4ZV=gDqKUue1s4EvQn_ zZem1rbEh}x+jgw5I)nY6CGOmDGk3{^OY~~3fyzA+f1;s@;PwGw!%_rr=E4t9g}$=U z&q{12B`{Q8CfH-%F=L;W-9z*6Mq{Y!#TdgmOcBrK`3uN;31AK9>sqv)5yS9?B~HRs z2mfX1@0*bdYL-hIPW30mCBpO;&4=Rt)3!Hx&iF<@6y+6fh4!j|!+8r{CkK!3HUTLS z%)6RjR6?(=lbW+mTz~R4iqHn1j_h@DcBZXB*DOH~KgYUX@24feHN&ubsiBE3o`R^h zXDwqNQm8NMB@$4{@WjO2kvAuk5T3@l59b{NhOgIrO(s}{6?~MlmjG1r7;R#`i*JLQ z(H&aE_YbdlMIP=#BjI3Td2*;pbjV?H6MV@_8V6~+R)76re@PMUvd^az=11WWn4^_8eH#9h>8jtyFq(xo=PonuYeTk^nB| zF&>91RTKn1iPA8J>+Khq2D(T@wYUM^*#fO*y-F-}Dq{6yuzNJELJ>6{-9m_z?>k?_ zgB-j9_I&UzKX%o_Iv}61QWTY)VBcApNSIg~8{wX0OIyTrRHm$mhYSfd2zD2!+SSmS zVW6W~#}+MkME3$8?73;!P%hq?k|K-&9}^?DeMfA9`V%!oV6Gj(uY@;5&`#^5pg#K3 zsvDaLEqn0kqn|tPy?A(;oO`!#YUE|b4HU}SbXkLb=lM7qy%OE>zN<3SpVdR3Y&D6a z24p{N&&D{_kjx4~(JP-iPk}VcFh4gNJ@M>6&`57E=Y;Y_(T)q)H@PkJmQ#x>I_t>% zc)-5Pe>Nh#=Q-4sg+A1qdoAcb3rq-fn39wz?9Mwz`U7)iUSKnnvshAQG%5FLty-5N z!_@>^bJ*MSN;>{k_@^MMo+ItLmG&hSi(8>ys;I`~>%VsaC`<@ zUy+;Et%b{AHFp6z+G8fLR)}$7+OcY)I@PmGw zOn~5nXGZSnvl&$@FYnc6CJ#gq_n>s&pz20J4SssA)K>Fy`7y*RQP_2p$@T9yH+y?n zvG*nL&3#Ec0k<0C0ZnM6ZlsUqe;jaPr~Fa)cSy8*sKi0{d8qmKr#M}pp3La+9qL_b zSF}H}*q_U|!Tnu436bm$eCWJ(E^PZLTKg-JIwMjg=)g^{Mkqy=W?5!;t1@d41dKzt zeD|jWLIP}Vd)4~`b_G$93_RRB-p!U>bcUWTpzGmrQx=(j8PqXzRG_k)=Ar+Ax(@D+ z3v5)v5ryK-R^YHdVP;WdPm-!aoWee1+gM(Yaq$ zYWEPj$0NI(q0yVFQv*y#IFf~KF92Y3%ywAJVteWBh)E= z`ZB6kE6mCXzbuFS`9yc@JQhUZx9aa@eRNp(mQWWhYJ^U6h^MeY zr*DBe8QuGpw&yuux%wSm>wUf(*)_wz1cPdt54=172y$6MmBTAPuUis(S?JfBL2m45 zJkx$TfD|KJ1@Xwzan;WQdS@8=dK|7lNX0&4RURXIPVifvVk>mEhDgQ z>ov>x6RQwtkP`k?W%;2us!&dyUSpE!%aY)RqI=kzhlsz_jIJC4O!A+-GOLNGFDnBY zt-jGpVlRloPFw9SbealUL8yBb4^ z16UAoy0B%STN2bWoRllx(RCK)L`1(|99Eu>M^g}mDxgxMhf~erzyE-sT*g-{JkRAw zh8QW2XZ)pz@cM7!N~`o{GU2_5vIEf~v1J0Tp1+NG$JS%sN2iE#8sxrLRn%m~ z7g!&AB?8tUh}}Y9Gc45{Tf|x4Fupb+4mHstViYgAFu{N`y8FNExi@FlRhHr12Rq$? zOAPbGn~`J;!YkvmJ{1@k-pR3cBkT? zAkOd{$;v~KN}l=u8IzKDXh*GP&kU(0zDl!8ppw^Cg#^I}?GcbbcF6GcZz!+4}UpK zza^V_cg1P@j9W`FSxOrs0 zNhAFs#}(zp&n5l4`Shcz+sA!1e(ZfMREurmElt#g$Ao}`j&{|lOU%`%Kpc)XTxO_B z!sJl8_@g`CpT~Ge_E5b|2j7_q3;i@zVyISuW~H$MU)p798r-u2`F=LGMGEM{J?b0u z;4WADYpq!YbyNB-nwEC*^luVrB%McH2;EJot{5@(Dag%Tw- zLo;GN-I2$>R-_MlH-uK;Er(R~JNEu;ajKs6i6Jyq7E7{0ED#Z|D>2!$HZIUne}A>A z*B=oxh3HWLy^2>gYn$^Sq!UmNUOZ*kMm`RhgX5fn2i0n+=+k1v#K=s1_u-Zb>LqTl zVfd`-o;Monw0NTgD#hFiS;+Q3@_VfrWlSbq1P8vO>BcH>*owjaTvO|=UA+wX`a>`{ z%kS{U^ch$O5a6;T7 zy!-X-w^h3V@~AhlE%YpLUfVLvcb9{z4D*FVE+AD(cVd55i^3m-apEN6Zx1zSmL>}K zSH?a+4*7Owl}!0}E__A~y2cBJA387EcFH1Ym%-RBuWLUu`Am7wY>gaQg(Au-aHcD| zGf|b8mzu^MyI-lQ${TZ-{dnMRmEYiFLl6C;9pG^6K-J8$FRp}}sK*ty`GyTLZ2h91 zE6vF~H`KygtDu$-Pm!%{SafZ&p^1Y_7LzOQRUb`(a@Y;WR~EXUgz43d6mw1yX0za^I}*KT&nceWF?g_MIMf|rdR(SLlK@4+KYvH1{Iq2_KoZT;>8Xvbr_T{KfK!WU0#vMN2a9aU-s4!wn@07e*F7)UU z@u)~hE6+=PMj-d4yJYh;Uk@rdYxAyu$PF# zn-Aeh1B3izPY-a(waowr$8nIFr49$S?dNf}!Q^3ow>3qc6@o{s8y>W5*yF!uMYBui z4^KBG{}clG8h5RJsN<>x(_6l_{(anLtfY@=htdZ#Ug73HQDcyv6tv0zE_HB zRUIFSxou}SCq2bWv)=_UTFFN?krY1g%a4WH?{c#F@9fXMFf)%uxx;W{r)pi)|%;QUM3Ix7NzO zeq$rW5r-P)@<#9;*e?c7{!`N20iANhW*PeJ(2@NT*LF0so8`UzUX&9>5l&ky^8-(! z0@4_*I6p5QJ4OAg5W3@9plQ$xFSbgxrGn+e5`IC+;N~Qy%e;v^PqLxk%l43@CrIw$gTP>Ed$`0dTk-H{c2_-ilVqdA^>4&>* z#P8xUG+-rg+q(I;6AQi;+0{vD7vQQ((5Rb1CH!;C4_F-kXQ9ia*aa~ zTOw-UO;MMTq`QEm-W9JY_f15;F@O{4yo;BWgq=mvf+`ZqW}{ol`hxhtK6^(Ep{Hnc zrtUyY+#F0`RAo=#`0yOUhA*(*oqSy$Y|r*kp*$8b(B>gF3tX?Uh5B(onx%AKH(ynL z;dQ)n1gf_)+Qv|Y&M6Qd){2I!0jhR-xzR2CRhwA`lgyvJEwq{bxjB}gva`;cNHAUq zxz0zg9TG@Hx)?ci(V^3*18Y{gA|-xM7^Dg>GSA<2Hq%%5VAvsn#|Rc@qaH8vi^D8y z4=gsz*7G>3B=YpR#JIqPL^zpT!RixZDDhxnXQ$*Ls!kKc?hJ|)k%KH3aSgaZ7MG$3NcMaN~qi{8Ml7GhH8Dzs9}4k z!sq|TAa{s#6jGVT@=yd2Lqx22RTM5fa3w~PEsyxI1aX|!c@wpHH+zKq{M|ItG-${2)3GOIEiWQD`!U#1w$)4 zy?s?!@$E!ctw`gUc&7C!$1HbfT_#Dl%ZZ2+rTZS}4MI=Au%o4c7a*|bXeaQ%%s$|a z49X#q@GI)nbXE6tF4GK{z@>mU4Lo2a1Wy^HlMJ+txBf)ORWIXYPTt4In;0(!ykVmqs#pwwn!L1A{|iUe^(3Dnojs2PEXqH zl|~c}0;_?xN%j%iC|wfci&nnqViby6S?D>bdCXK?#!qzd8RzdJFH!v0h;)@D6ML>U z!L`sO!Oj@(#6M^tG{LDNn0%xGL|%5iRZ`Xr%w$jRBbg?F?p#EBjU z8MUjrHezWntxglFtd4ye-nc*y^)t&WF@V}F{04;x~GRIE5m^J!v+DMDtla;O_ z+wV-Z`(^h+0`;B9Al=VXkwrZ~r?x8n3nV|=Egn6~{BAs+kQHv~4JQ-gTINblSyeq> zjnW8&TkY71E}iU)Z+S!<=v}q9o~>b{t0B5>^=&=tisOOtLJO>Lc>Sa@E!21pV_YX? zlF!ZpLoo+!Ql^V;_KmTFK9*saz!YUEsD}s9);X(z9aIUA=O&tTrUsn?+JAWEB6PLd zrkVX9^?&No3`!kCM1TLx?k`rLPG6TfCi^bXlT3agh*nNy7rq@Qf__)(H8X)s%>x=& zy$dge-DgK>WD{&YhQ!D9oW}l_!YEDA4YMvsu$q<h-e8K1Mfv$NAvH|9@`d}+??|7{6kc_4Q>=ZEFr8@s~m(&D})= zR*9$y_%{EUFPmMDhQa{hfO65)cS2Y%j`Ou!e-<(tkn}=eyA!%;Xsyb2btkUU`Q^A3 z^jnPnOnNaKC`_hYItki2EjjVv7ysSQkJF$~+f(G+hv>9AYm3BID40_h+jdRxxtw!&&U$yC85aq$oLe+VAoyz3`_<^kQNWBwjpO6v0?&YyFe+)kDsr%<#Y|9r?_uG5{ ze+N#3j`t+3X|3zD0d%VF&&OZiN1^uh(TQ>QfF&_3=ck!((r~-L;pRh z3rK#ATrC6y6qkznzu5DEX3`SZ@qp9VS!|dBzCS8Rk2-gc!?a1Ni~h@XZhl?Jz==6o z(S9BB>M)QSP>*e45WB^#RRyko0OT_d3Lj6|@Z*=IBAjIIMFqGUV`Q05zBK zZSXZ&>V*(sW9wQe1Kdc|Sj#`W6!O>$%A6aLx&xnC51++)DbO1R!Yc$-8y#nq>4}mZ zn#Z5TRmuUBAJlOPeHmaXmN0)QolH-ZuvJA=i~~JOUFzpEM9H4MV9}oDM8&i<)(b_qchO?n z_oFoi;L7tIZ?|G)^tD?7`R#ptH~%6(F-RT%SYWl|hKalxiyZxG!QuFoh5|Pux@flB zBar0ne7OPk)|hO45geHd@>KitEm4Dq6f{M}<&0CW^uYtpF`+GIV5Rxcx}u4E9I|ny z_F^^7lM^+{3-c)z8Hi^u7mTFFywJn(-~+!G%$*ICSAiazu0*Um1(dHZe~n_O zTxOrc#PCpRkHheSYs|Rr{oyeHH+8oi8O;XN)e_8XH%3udA8z{7Anp|T2THLh)c^}& z%$3K?%4$%Zj8?@8dDs$6*v!ASy&xfgw~~rr&^}ttzY0hoTp&dr{!T31C1a4ZRG{L~ z$GXLRpE%$vaZe@aM#GvC_JJOK5V%%VA|Jzk0xC(MueY** z`xM_6hv1(e54{InE%RDCq4vk|N9`$N-&SJ&N8rBt@k1HM4q6CqN6h9;Z_1Rx(7988 zsvXP;nkenZg!L4yZ@>H#3@?)EoM4xM(1>7{+ecXJeO~&xfm`v)wW(0* zNzkNL@5S0;HY>gl;pe~hRaD$*9l_LHxf&k^)g;^Ug0;rlv}P>sw_mxXlgRq0;}o=@ z2qphhIgz1ayR9C@2oT?84u~|9q92mq8iA1Q(S9$G9fi+kWZKrqEIs3;;E{*H4UHOd$+*Zj+@$96{>`;=f*mGcARPU(bOF<2&=zPo7xAz6QE*NHOyn z(DFwIGloarLK9;d)N6Gv3sEiOXs5*|Zmr}|6>#!HbiC%z1@g^MkmIwwdlkm#MJtkC zQ|Phj-J*k(G>y}( zc43zf0 z#h_Yr9V6xOe6uE2kkN75exOZ(*%%$b0`UE<@Iz6rLK zK@uZLEAT1nRpFPKXze>z;Q?RHCfpRHk9}#&w%N@@hcV-I<%tRo=rS9`9nKlLN>NaI zzz=K1b|^gPKCBOt0hj~WeVqv*_YeITH}kNP-KPV?tOA(Ry(E#WGG*(%wGv{+sCeth z=;wc`>4>h)`6sv9c+C*er9h&rUCXBP1(gu!!@;L#^sip33>36Ku-k*n0zn+0Rvp~h zBr86`6GAVCTZQaab4-jPvCAjv$>k|NSL96-v6 z*wuBSG{s^1-&I-Q zf3CdRz_ss*_VbG5r;l3(8)_UDr`O^%wqPcUU3J*u=MZKgL04t@H?A#B89iB&>~jie zP8)T-{U#n<&(49?IsYA&Z{rfvhgpz1FRkP(yku%9)nJjImV}S*GGTvdpkim{BIV8; znpwNt`AN&RyL17;&v(CGlziP6{8CqyL+)`W-qxajs!P82dPSQbpD%Uzx(w4`iZeer zg`aQO@YqaF7g~f{9a??3AAj>blBKHgu>qPw zWBbR#-@Moh1%&;*(4!x7r+Eg?ZqARV$!})lU?yuwku`c>VR@}koFHD7D$w@t;5hV1 z8>DzV*serYGc5}60_TZqoyPO5C=@UlJ!N(5YQ{@Vla5;(ry75bvTvpXe3l!xo!31O zrp^)-TVy*~ur9k=kIPQcgyIF}O{{7Z$&finXYI1$-pq13(!>3o|;wcKKrne+4#Zp4* zwEON8IZH*n`-Q6uah6U8`EfF}^=?=nLHg+ki(8s%`mdfd4j?%yg%6*iPiF^&{y^l1 z0GK*m_cuir$o@>=@!ZOrtpz5VtO>vcF(Jf z9#1C7(J4a-FQ2zHp`Emd()LGpEwpB#+e%Yq*`-h?QgbAesD~ABmCk=zIalSqE-oM2`?Xae$-Fdcc97 zv?`T9c{5wrN}CflAno$kbEcpBREmMNEGbB~juNK&loMhhd-!*AAaqI61VIQF0lTFFkrkqQu*NuZ6n7N)#nflZk^Ez#vf zqAG1)YGNis{{|0{YB=#KQnc>h?KZorjx6GI?++9lWkMlQ!yb;i_m?4Yuo$Z$4IGzr zuB>V%>F>*d9IlcTJSBw^_|1ZKm1thSIQFkZvuUpycfse!NWWo6boY00r?jCSM2${| zeN$)Ac<5RfxJiwiGU@h9uZ9@hmG*kBl@rM z34@Z2!xjmNn0Lj*>Bt}-Urv;!2u$&c$S?%<6;T_!I;6J|%x?hp5_@UOgPiw65vx%8 z!~+ZKf;nyAD=@df&3C*D3S=Q@m;M=e->zjcLo&2~Zem88sr_WE3?4szE|FG$5=Qy0 zJ;De3Ds|W~`(Avb-Vt+Ug}ApVc2l)y3i+7^P+c9i`K$v(uX>OQaAD{g9y8>1gO0`R zX!kRHh}COAw{FNiB8QU*aJyry7|~U~7;KMz=S|8{iquaW2;u^@jJ4;Vr#B31OrX)? zL{8_nHTM@6FOa%BaLvZr%W*fA@qfD3GQD)qvw&Z(D(e^zd4po^%aO+A|4yO^X^fwv zTJ4LQ*U)Hh63=?B`r@)3x@e9_#Z};Fw_xnHL;-=(qJ^~fGeDkYnAM#3I%TlLz-g1% zFny!>3nzUup22YsI(8hgLbV^`g~(?U6=Dp{1?xFcG!wnw7%+a9fI*T{7e}d>D>=lh z4qu;((P-y>U~f9FI9bk)9ioV!4c>p*w)#5+`v6Wa2vR=J*B=1wH3pMwJ}Og!s-xIb zpaPMvBlKM>^-!A62yVtM;fd{%|1RJ1u@-f^w_ zn*RMbf*-~7_IedlUCmT`k5T~`Tzo>mT0Rx#YhC;dF!vUfIj0B}FHSN2| z0<+OA=xnENF)ee8oHlHTh&Jk;$7cNiI!1)3m+exS2}?G3MEJpKK_-YKu8Ps~yDA6TR{u0rz=d)Yu0Z@Qkn+e<=Y-E`?~ zuce#xXkxHsE2r(}SN5n$WW!T*&SH~rPCE+|ih^5t_lgZC(9H%;*PMXHqACTuyYKDx zYSJGgqh|q;GG)q5!CV%|A9yn{`6>hM#0yc9-70&cBPA3Q2LmQ1Ql3{nY-LSzz)WiR z?m)#?@}N`~qlSg-?n)yjDe`#pz1xRHuk00Ms^u<{2ex45M7uL4Bp$yC#o<6jv*cxp zN*ppG-XQt{_JtG1oDKU*4!`+GVM5%K6{03vtEuBu zcS;K$=;zuZ`cJimSfSAwz@}eh4?}ky(Zy8gwH?)Z%c$ zrsV|ODooQXE2CWva4u-MaNXyLNg{G}#!ILjNn-hG=8a9!WRWxN+1lRW{wCH@X-a% zLoLnHzNV?%Km?+zrvFsJ z-q*tyFbXnuFRUX9-9XOF6}xUx=8sPqm9O()Qi9Ka1}QO=?ZpboVX2KTQG-&$fr^vV z24Qf_K>J_1@1tc_X=Lt;Ji#7nzw8rW zc(J(OtN4+W8rtnHFgABic8TDQ>A;W%f`SJgaRp++IEm|JhZR3%f5x&)0X*G#L9slr zlLC;@V~cLhYSm6yLiV_U1nNQ_;jjnJeJ}R|bWRE^Jr#VSF&r8c$4GAIQr--27@mRK zAL0GP!sBElbI)u@~5_!?!esSEqY{n zZP9V4350%CAkTJf={YA|2tGYpn251hf};GN5N-{gK3<7spsVd#(s#YpW27LN2(M2XjyPfRZ$VJ&affKw>AO&qOZfM<9sTbY zL9lN)oW~so%?s$KfzVV&pUredM!cFnI-5@;;>u`zDzuN!`$>vpWC#~%4owNWpJ{pX zw-D+<0^x5?pH9dxf9x9_ymRCa_V!1^eDHyNw_y%h3P zaVVF+=x--Kw4>9eh;?1zpTzjNLNMP85Xpa_Cf*>vFJ-*PB$QYOr?*dTM`5TZfd&Wa zTZQ;lpib#h@nHW$ey|nmq}h@g1~3#a)QwdVy+{Q8+`OS>DA`WBjsJq6(llgq;QpNjRWUICcPc# zs>olOKs2sax3=~*45o&Dv`c0J-~Wlgy9n%Yy#?pV9LIg$PlX*ziF7uyY$abab9{dLia{naS3%NVS2a`evy*cUB{Vdlbvq@0PUx9Gu!*C&$=?ZN#f zJ$KupHM&+)e$Kq%Py6CI_@~*zy7_d1Pw$asfbdng#O5X{rIG6Y7GV$m%J!)y| zRDpVx^bqN@&5@CIB<+s3#S;UNLM-q*d<3riHpjk>YMGg;+U!Y7M1GzD7A9P}Z%{w8 z5*y+)w&}e>HoGVE!_MrYmWC-Xfl%GLSSgDbhR&m@CJd_(};Eg*Tt z$G_2L?|Ni&eSG%yf(3Vn^gPni^N-~#K_}a*^W;vxZ>SFtb1s=J;7Bn4*2_J$Ts?L2 zT2lMKh8<&9v|u(zs5zB!sv&#u=Z(#)-7D0>s zch*6V#pLZ)@8}hx28wHCb>Uefd&kwa{KGN@+Qj%W2!}!R7i^H8RnYR4B|SI=rRabT+(^uFHwcNW4o6}V(6&DmhfcSuj&TYcR@ivw%or!D8r zW#1XPjWq{14TU%`8U(!Reva;%viX{P{`B_=*Sr5C>AVA>{{J|hdC98C43#3uUdgz$ zR7j;rX33r?81OSUsAIrGSN#@+Azy5Bz!@9}y)U(eU;b0O6= zK49e7c_hS*v$f=J)Rkuc_ihTLwaZcFwU722>Gs`G%4Tcpb>y1qJN@*m!!;-MB&jJs zm0hl+?Mm+F_%NzZwq$%#(%F}KYYP1bh2MwwcN_ltD)jY>e*a3ATVbN7>oVEUM6M`Q zw(V^8_s=ZX`GWr_VBB(i1O8;PukP)_=zj7v%C&D> z5#?C(bB^e>A79fcdDiM_dAc88*ar)1-`P}?uwY})^ctr-?%{3oD!;D!M%(u57n>YM z(&Z~T_xqnWDHuBqU$3(=+S$?e?y#WhUYDu4q6bEH#VW05I{MY8UH-C{w7PB*%fBbm zi^YB?uf@)FTzyfCedufzpBf-_uhH{P!nCUHk!PP2Ps_}#_x|2dpXU5(P)g77=mXQ6 z9&WeFDQnd%QjV^t9+uDJuXNFzM_6t@a92_FcshG}glO!a=W2`D^Pbm3?#V#jd~;fK zdGFr>1zwYy@f|saB12_t0y`3;RiTG}SL4=)4Ro_WVLwwV>>Zk}(XDfBm zc&J(RtL2nm!3cZDlh3DZNeA#^D+UJG)ebLB%=rUR_70HLG^h{TgjphduQO->zO0+Zy%4=(L zOg2lcZ=50J2aj;hyN>f^*#`A4y@uEZe${}%*9)0Ox?LZHqyB!sZC2}}tzCRty$dv&N9D`30+Gtt)~)t4`w@y0)p+!i&oFkj_sv?7?$^!e3&rDymw%@@mh zm)#nX&^J;Q;0>L7&4%|{2#s_wPy1ybnP3+3W47DT`S?~`(Dy5;wHRvqfN|OF=*O{F z=3iiWXg?>LqHlidRm{Fg{6g|?EX7zWv1?_0{cK|6YPLRhs!F)zrmo|n)6UO4>>2H! zkIQ8-lN~65_oFwW6{0^Z@4*I77Ye$`&Uq?)SwEhh8Alf>PIR6S(t6kaBOzGAbG`i9 zOZTayN9e7|65d8XHuvfo!?PO2lD563eCYm`Xh^9GG-_Wt zLDbwJ?gd{mSHVQH@Sr$v)^3ejp`V5Zw0XDUrcgrOm1t2-^j1Vyrfzh-38tK2i>7wQ zsOOn4d+5YS{j+a8j9ajcxmuUe&SmZ%-l(6yp4gp8kLsek9!Oiwb_j{dt9<>@$6ZA1 zoy=FdN(>oCAJdRJb~BLrUgzdfA1NvO1H8dgW4x74H+(iW9r-H%oIf?nowHmmA~1ch z|C+MVhaX1%%9*@S#ak)L4{_ziXqF z6!R_Nt)}degLIY94T%T~O*dC9+1-jq519}Z?=xp%{+QKwZ!Dxqc20J$+Na8B32j!z z{#RPsD=X&EC#C7R_WO5?CC!5Vkj{SPLFo#%rC_OzH`}CB{g|Qdw{!n;uuZJRQD2+C z59OG>;`JNat~|)fNB*_GuxX)C)e`>k@#bks$EQA0?jB3Ir|X<*T{Wtb?O_eTGMiD}BX&t>#n1({AG%OOv>ug+9p!N&&NXW#}^v3eLfs?r5lC zMfa)>ylaH{Cgg0C_48(xVfT06YdM2mtLtB`(``J|)vP@qeU^-j_=^#zXMW&(FspUR1g1}Ge4tc>Yud8M=X`a9vN2t zq(-{0;j`0&t{-oh^=EX{xJA=RSu$R-4L37u=_Aa!JJ);SuF~@ak)ke7p%w8SiH*GE zsE=(&2}b|@{I)k5f8Wu+O1>oL+;V;VZZ&IP$sHQ?C!aN_Zfj^JuJo8te3Q;S?fN%| zNsjMSxhk%qGA4h}~q#q(^A3X^~ve8--3~ zYhJrk_(50kfGOid-(a_7O6v|M-pWkV{In`*HC93xH;!KEpvp-g;^Jo> z8-7tiSemD5Wqf2LhtN?ZMP2+ANzwE@l^LYqp5x@OOU5_BAt}J}qT+8Jz7Ex$ep&1q zI!jedHqH0iI(CudwZb$4i>ckLmeH=?j;0!Fc8Kiq_c3kHil@(%E!WNz%AJ+W(dfct zsF&1>^UamCG4X||=j^b)w%WC)qfybviWH3}n`&|VYM@`qA3AtDYCX|-aiVANxhCEB zg;9lH?GeP*;vMWm}xMWOnmyN>rsOGe==Dj2I1`k$@$+$v7rwvUa9)bRNcS( zjJRxRH>ek{uj4)JXONTgW1D79P+!}}oRDVLJj0OtEAD3puWP^E2x;iaE7*5ac2a}< zulZTv2G#6yROXY}DIY6~XN5%}H^r@&X&5Xqb zt>N(sYyBCe7JC z7bhm)`*ha-syoYU=iKq0<=b(OzJGu8y~U^1@bT4`QQy@RBoCOHdp~Z8 zYT?ILkdIoYEll~Hc8MJv_OYT{ienni&)!e;ZcAKHQW*=z&Snl~co;_~aHmB*?4N3# z7THHQ*fUd8GFCNx|1vp2;?=shD1Tu^GLxsq7pXiks&y)jypmHqwL-bk$AqKOlCigo zsm)QYrhO&_DYNp}l^Ft25g(%CL!aqsAr5X#X0=30Sl+rXr`4+?=V>{SMvE|;`?y{9y zGwZ(iReJRgd&jCT9kfp^QvTDY*@9+f^JZ7^uYHA|Zq~gYlyUZZ-v955aNtj>jgqA9 z=41Vq9*2-I;&S+I@3nqW^@NF7>m#)@KA%H02=zb3-xS9?kgTo8>~2qvdF;NKTQL`V zCCIRHLAUC+M%ApkBki`OgTmdSs^x+M7NRYM&F_x-{TCvwkMm!&nO>7z*wknhb1@#< z9UvjUzQ}3wxhnT_7L`)zPO>YuIAJ(wv5}TS`1P7)*us@h)nUxo`l^eCH#tdkcaiXk!GqpoeSuMOb@ahmEG70C`Z?H= zGU;^D6A5Zj`pkPb;q{RV)}|I3#QHm z371jv$uEOR)*H4s8Apyc^+x^CQg!$_|qt`OCh-hC*g`0BXRaoo*oE#7kM@_#QxS;Vme-Rxw5UiXR|4#p(8e!n&mATBw8-}rOyyF_tO=Pd+JXP-?OOjFNGn~NJvx;-U)Ga+ zF|TYQXSvLq5I*3LP2pj&*smzP*%IyM(fqQIzD{tS99K(rbFD3({YI{#(^6i2DVuIc#C*_gD6S^khrC1&7MNi$!IEyCUJc6-DYtskAfagS;C>yuG$8%3M-+d-eA zsR=%Q<>cn&pE{x^ME)gE{|!y}^{!Ux6yH$L{TzSzPGy9Dj|8u_hvZXrS-X|-#A1U` zzc*Gt-19cI=3|b0%nZq^pzk(1W=YGJTY%C9nlKwFd^OOCY~46LXS z>bI_U^VpbnYN&rqxgJUw?RfQk#ZvPZ>Aj2R(#_Ug`dxjeUX`z(LE#9LH(9ZTXw7}k(D(H>N=jea1Og3hts`zK83K}Ni-hl_$tTbl3<_=H&PpGOA8eU*k|^|ft7ivxZf4T@>9 zc6WOa8|?6<;@{T?iEhJ0`H6|(p(=8%!}E%m)|+WWTJT?+P}19~^7dR44dWEAdS?f{ z9-~V4PrYI;CETug7Yef8P?}r`KkTdH`PNf%H$S%Pz6o7##1e~|U$tQ3tL8R+eZJ_N zw^iuZAa44ejklU}*SN*?g%9U7{H&fx*4}ZL z{nd(9d^S1c%%ba8F)REdjl;)Co>kWzh_#HThu~1FLaepLTRW&!^SmlNlD{y z0F6+>s`<;RBA}bADaGc4K5w9u|cn`)7+q`pI+&hJ%lHHf$1vo09T1iK^# z5IJXzV}kGYNh^t$|EpCam^Ysea}R8{E_IBhCAoE%*z~eRr-%l8#x0FeeC-GoKc@#O z=p~X^@5-YyW%7ktpcIsycu(?oZ6sn=b0C-l&0nX72mQVJwSIRNVEsf&Jl2)L&|oJH;KtfQw>p@jd3>5 zJbQy3(0@86K@|?_`Fv_D`Po5V#R}1XuJ;WCwpkB-w5ZTZL3u zNnW?R?5p>|xqSYsXWxT3tArb5o#l;yl35b9)O*~=u}vk!dzqp%=UCb4XtqCjru9Un zTi&?Y5H}1iBMm1%1~PV>?C?YYrf%!ama>fRj~m#<=#DM10!=Oi79voT?FMWeQI&`dj^k)0%MAKyHnYf(6ip1?2Z|5 z3u^EaNH$UD5_OTiy!`gPJ2BC$YBlU4Sz(yEsxhtS;!Vkm5qIp_*88+rr*XkgqF5qi z+{&i-KwO(yvC?cZZkXP|+tfsC-KdXCJH%J%wfK&F0=wCwMqX>T35hV@{4HZsbW4As zR|~xXk@vfHT+S+0%9}c-Ze^!%U1iW_jUwhN_-jjg%<2ncy7Zcn=X!TLxj)Y>B(wBp zYo{DbYF+SB?9kFVf_KeE&*Bu$PT|dD@Bwq5&e?qg`-W66yhYA*lXpxZUGIk(L+5l%G^pFtx2^rhoE^ZzSHz+g&!^cl4#X@@A09 zG+CUmG$1Ztf_X)`B}Dk$kWIUqKfqNv-utkHU`+@J%dzh>86$7Tihm)!q_;lNGp_S( zjni~rl2#}Zop2-6-HWWZc8RJ(<5Pd`RbtQ`rX zq;lWoc}j_o=V_k6TU9y@_5!qpf$Jrz=>Ht>OMQ9GyTvc7INB4I8}lYzwad{a*@sBFoX* z{rr)T&J*ZC5^Bg(c|k=kL`?rP=aM!z+V5u}l3G=H$qTJ=3jGETD5w6C=i;Pi)hP>v zyuxH(cWt5vN3rHr!fdm4;2$b4Ni2o@&@9+5S?7ZNCsM?YDyi@hv#1XNNY*7p}tQnn{Jn1h$QY^PqqmgSp4eWv2vrw)ot*T_vYix zUEjxMbv8~cgvGYt?hAV_zcFZiEpcAM*C)M{x}H(xI74d<@1ShELvqlbXHTiem6K+4 zio#BiK1^t5&jgKNLprq8$da{gofO>a*0$m0CJx`&(u!`{_t;-6JZ}EasPSsEq2Jz5 zum{_%u86k{ixuPI1H1+|hYJXSlpStCto=9DLbj9yFC@0*eV|XJmt-G*`bBVC!AyrNs?_OU{}TWa#C z@jj2VJ1ug)qr-7kGW1`54WaFp>v0lQUk?WmhkBBR-&Q5N^Hj~>CsEGI1)Uxir%h;k zQe#L%{!a&WNdc|~*r4&_7ANUbLlUpt^4{ytYyK0AnO%Qtt~`B{n3_{O$Ud?WFs@g) zNut?I|6yOyddMpg@S^&*SNOyx;mWK@b)vJKDTQ16nvD3 zTkTfRweRsywnF~`%OjOeA>drgJg^CUCrJ)%&P(h_} zWSLhA$(649X*XB&xxV!OA{x+2=ZA5WwT6opVgw~(Ien5EpD%vo|h7Mme4>H->crRd%dg9q2|;Hoa0J+Vr-iK90!Yd z<<&jS$$doZDK3 zqo(SqKXc-BCRNy}x84ZE)8@ufL}_(?sVipQt?5J@>E+?+9UR_uL?Zo>+!U#{M4j6$ zqi6X-5;cCx+V5pfD3||=U-=R#dHUtfg_@O3w`fg=4)@yWTdQq_2_31M-RB6udg`5~ zrEXY+D)*R;V0&$C$1c4at_*1uChx|6S*gOkng1F)NWCa(RO0MRNbHdRRWvo?_PJvQ zQ)D6CGUgXdUti{WRk22r7c3Uu9<-6=-P5YI<~^1;x^67)$wRvtT5DJ_^2^BAJ*sr| zmyA9s@;7DXv}j6U^K46)Rn;t2BK39gN_~E5h;)*VN-n*S`#`UJ)9_~MKv^RC%ZcidP1GwZ~TfMR?9Nw4o%bf67VHvq?i<6F-x%nXtlEzon;4r_<-_)dJki;TKHDWamXuFnV>T+9jIiZ@r^rb* z2~|n5z7_O4-Xv;+yi#7w>Kp10{aN0Yv)EY+cZEW{sAp?o+LwtNq>`e7{x*{kZ`|t8 zN8bZasb9ZNTY3+l&D(tEo}VnCAi7S(g#-e}JC2zHI z!G*UXu|R?L#(ib{jz`}zo6Rd{{gj3o2zzXrZRZdQ(``r@&&Zg~MiWpnJEfwL;rus_5^mPCM13f51t1 zdcc+J)oW_n;)7jV>hj&p%t;~TzZ-OL6o~0tm+-Z_HO9Bj87m%Gs8es(hNFG6@mVEM zjbrJ(;-~S1S2PXdIEh<(ht!HAl?l#$yDMj57I2Rjs(}{x7c=I*A-+gWhkfLY>WuxW25?E6>eKdv8vr;QKd^`(D9~ zJ&91`ohH=F2db^)jGMd81UofoO^5GO`Td(?CGmbm-)_JbvWj z%gK=`o+@;&&9_ zuZM}MH1FoGEUli)RuyxuJ){Fq9XeO?bQ&zZX#K{CJ-Yan`)%#dqxDnD`aJklasC@D z8I+%a$@F}KTdkrc6jz^0pI9v3C&Rt*j=V|Y;-WFuRnVjF1z$;p%W|;ocML7i*C(%Z z_Qk|YrnFsCx|JJPclI3bpz^sP1vg2LYQdNe-A&2f5wdSuwA{u1!yaQFb1WP;J&41n zHYW_K=ByW5JL1(T{Y(TS&+5I8YBXpL=f*xg&C1)Po@I%N=_O8#46Q4yw^U(Q<~Uoe z`utKg45qODKZfY(BolYj3#SM_C+_v8{BXaw>&qkAe{rVU_vQ8S8%w`?HZs1A{ddB) zn6JN{Sk2wQKd@DNaQVmm*Sko&8@6+0^>!bKsr~oFD2yb&|AF02Hc7=#;e3i^KOf(Y z{+h7u^vLrkgR$XCLKX#D-@OjCeXu=TZ>Gq@cgWY~zK(V@$C0cXf_9|AS4TL91K+g+o*c-bw! zg{(^Xd2I29Gh5^>^E!_oli3oK!&_$GQhxYpuDvvSQrB4*6Mp;QXYS5)Pqww(taQ%< zYaSo?ldGQi-$ZZbYg#9;qjBH&`{>{2TG+^(6B)O7SZQ%++#2BT{bIU%`Sh^IqR!=+*qNa1 zAwh>u-DC^l&G1AbK|k<$m!@CJ{yAS)dU8?cL8Y|pI4QQ0W!IukSY^bEH~6bX!%rw0 zb*ay9R9$KRDR(G$JV+qqq3n1NPsscEOYQhs#YgAZLfB6hhwFxaFk=@m$x0XJ-YgAN z)g#D=xnGElidP?rzkV=UPv@NVq?#*N|3CiQ7h;8OZ2zF&YQTLGod;T96Mm!gL4QX( z+hp9y-JFx{C%KrG9_@P&9(cK;bEI3SGb5|2=icvharFh4dqrnAlFiJS}9Wc!&YmZe9*G7qoJ)F_C`*b5ukU5Nb|fBb;` zi{h4Et|NL;jp^d0n`ayTH_b0D%{9&)i-}Wu~ z#ci{c`aK?>o?BR`vKN$GdT_1TDoP}xH(jth?8_;IY)nDHrS2$nbymTRwV?FU%&wn8 z-`rm)b7m_&(pvoLzGo);dGX5anoFfcXYIDHOx`Exx#c`hCN_P(*k{)*^zD2_zSy_T z!0VVtRxgy_n)6aX(W}J4-N?Y0mPUWyE`>N40^!HMhT4 zPT%&R*0%VPOi#QEm+5FM?P29k-VakCuNtkJ1dl#(jjs8$ zA!FuYh6%euHE}req$^q^0^WCyI!MA{w^m*^zsf@E>rzwPnI7- z*)cQ3LMUbIqk6U2zJ?FfI5WFUs?o=<86pu~b1ZhOT`Fk%F$R-0pE>aFs+(!MP9g87#Y-hNhAP-A6Gv_*+0kv&(!;K3xOsgXY<=`#T(iNoI~?cyf0}El zqcif1fFTwTwgzDfm`q9V%VzbaKbFGbax07RT~BX2e}qcU3AaA+!u&&EFq6>RlLLPl z&tdvY7vn4xG>q>;%uX2INIJ~t)NczrxFEuX4l5KhXY3hb;@SO&eqYa*!hK@THotxJ ze(vqFZ|ZH0X#Bz*w~02T8W-%)-4iuQkq9-a$@G;&oSbMyn8$6u`V3o~QQiNGw)HN= zcd|pk6tnAmrte|6+Y5&e!qK4?Pj+M4K4ug257C9tiuU9y2i%vO-EE6#bn`KV4Ni8VlT&POqKx9%)EUP{ zOi)(*YO=a;;#;x%8s+r&+`*R*1E z=hS_7)TUUr8kP3@CUB+g_VtOozs%$IqnB=DTE7pN_1FRxB%yE!8Yhh8)TjtAqk0a; zRTT5!ZqsL+I|OX9-7`Wd{E^DdcT*Xo@xY*DoYlF$%2G~nuNQ4j7gjiFy@sXDqMTPRCTYJy!-V^2yVQTDfau}T~ z?L|_Hg7Pse=tP$*yE$!b4xMy9glq{WRBMwJ=}k(4P%H@PilCs|(IEv%7opN*W;jH0 zqR0Y?kZOE>z_uK<=GNk8XIZtj1}(9L6> z%3>EdJ1GltXfvO=^_epls@{J6;0Y{aAT}_*5IGR>0Zma>Gz&aWlzf*4^ij17ib_FW z$spp%ghWC`A)EyJVVFn(_5Ypw!HlXfkWm3`;Xz@T9qL^?gx5hY5Y%@lH1K@zu1>-d z2Dz4T8MfCs!5CZ+G=XIXKMGJF1T-X|sY*uce6UYr1p`~4h90;w4qH0GvXE~tQy97x z4hx|PG4z=UNyj($aQFU)J=KXm3GBs9hwD>2K16WiFUhmW_xy6^QvYjQixHh@K7K95 z@L|2}37YC{6ebc;{a`~z{X#s!R*hYBKC@T#qY{XunS+SPiJAu+&bu)v*G>qIFP04K zu#}He(3o`rK|6kQ7~PJ<_?w-Y%g!WTmG8M3KYB14rOAA)6^Y=cnsf>`A4Lxk)oWu$ z1(Z14zNgjqG4@Qb7lwT)?BCx-;rGf^!H1FKQRxe>#DQ(&Lo{{2*cvA}_>I*DB&s#G$jX3`G8nAsPt|@ha&>{*E2jtp)d7eS4QtD5GDs<9xTZ5RRf#l z=_dD4`%*K;=vJVc{m&Rq3%K2;gU$O(3XLwq-IMzZ_Ac3Ok_?>@Jva$|!WhvqO6u@u z1y|PSxTz~Ax}m!M8B5UpXzA+uny}HA$~so{exk<6t;zJ~9wE2hOS5~yKQSE2q0b!1 z$}J(crnJwW&89uY|D!vZ*1X@4Sqaogwl$%tk^oluGPoq&-sjlX?QUe2=8vuXDEbWRTr4meviCKP(y)w`!JSiwP!A}-7F{^UY)PKa{QdzoGHUG2 z4~p%eVa%GGS$X(&@HRLxVFa?FKusQ0XP@vpB{=3lf&2#6%_8xPveIEj=z9f~F0f9% zi3&VHe-Apsh}xme3n!PMWJe8oIxJ*fxn26*}hn4y$9l){7iau#r(0?D%w z5}*NML5wn-P*xW0?bF^nDaN}-AYJr28qZ?PXAtIdOOc_j%L=O3K{cqFTp32`BU{5} z9dvY|ySSJijHaJKCEmM6$(6Gw$qYTJDpYiYNO5q``}PwMr`Vj`DDDlrDOpSvQhm7KtOi0( z*+RI?A77COIcmpI9=E=oWX1dgxN8k)Z*q7MJz4a{v@ouFS6Dc$z7Z%_2OzbIO@IxQSo8O#G=>#dtyVH zr?#S3`2pOM4fN_nu1v#GPuJKWP4kfVK4{TImCg_=W(SpP`NglR9;3-3J4u#|!MU?q zB(M9q@t!$>SBH`GGo$n=^?aYP=0od#sOye0K1j8K0yB(h@$P2 zz8J#xU9t4VHivu{iO6}l?niXxDiIeJvh<)ZS*)|aAG;RBh-R_y_1Uxoz2yiwlIzTV zWn{6$(r*jY(Sv?^(f7gVI+Y2gx)mMYF!nJwl8LWGf}_UGcipKS`+8quORNs!)(jr_ z-i;=Co&Jcj-yL{`w<0hi{GE)D6rqOjLw>?7Q%Cd*g*O{z;aoYOE!Hs}!4nt)5k za1@-%28Zf!SZW*eyZWS2kS=WQqX_;{Yp^M^u3}FkJjz8cGxP=h<-x*c5hUADxf9CV z22W;C)|v@j@7Q(tL<;(!AiG$yMk%5w**Ond58(q%HKh4GD1$TwZt`Gc6-=NZ2W~Ww z8*>>u`24s<5xVmi{VgXks)>M? zn8cmG#_d0T!qKzvn2lSvf5c%=jg)bncIG-d-=N8k&Q*l&JSfk;5^#9@yM*J`ajqcq zzNI55tW6OxmoABW^&7AwUFB0%z(*wr;|HiBjGcraA%F}7nScp9z{oKK$GfOzeFTCO ztlC(`s3V4eS8S+!A}ezK$lMjIBr^O6f*&^IdB=%%@T?*R-~(_1L;;K-URa^-Vhgt; zbg&?a2{t5r7&Sg}m#A!fIdZE2-Vs{@j(Z`IsI&3c}%oYuE@IyK> zYyU)G2s6l+NvEPJcywa{U=XIa0AMNuyhqh3wxl_UMNxv-gLkx z&j*Ij5IAT6v+GdF7)G25I=ew}H(HtSQ=0_B>eKB;K0kywA~cl>m9=?M1x>E9`39wQ zS={dM+zpw}KSd&PH*QU(lZ4SnncMRAL3(ySUSK`8qNr#+GujuK@g@lkj1_f+hZ#Yf z4V~+V+!>7x;zAdGiU@d4*dB)MR=`1ol_N-GMiJrEGb<3B*$QjHON{kFIB)_yMn(p} z&49@!xiwbE8R76Ll%|fX9|S!{7dD^j+e<@7**v#H3%pM_yCp=o?Ixb zhY#8oi9T|&^^AGr!KNqJ971I>4-UGZr;>T*hBH^01;)X7FbEp50FaLPja73c6Ikx} zEj8#sHzPCfAZB2tyQPeGrC}EQny|iST0{3_=JObSr_d&I*s^EOfyH&;yu& z$xNt21V_AKGYgxEevFwC;dQ|qk-Bk_K(5q-UG?Gi$3Kdx~xEk(&`pRm-8xfsacW~#Wp z*{2W0jx!}bTP?S7!2B-}wSqi5Kmk04(FxCKyw z@DWJlgOwx7nUeyvF{2_zfE4aPG+~LCJA9y+zX`;RfsgkP_a1dP=Kw1QICFq48Mb8D zl3^IAn>56#O+s@ zx@{kS&hAHH^pF}z6$5+#O8{T_C3{{fBKb-pG!JG#Ml^O(j0w2s+5Iv1q z4;Ye8x?^E)O1MW~6=V8%u|+rb+Zc51DGf295F-zO=u=9@jLDvWnh&8w5ES0k@mVhu z9{H>i1hrma1U-Ww7C;0b6U-Px->FPGRFk**jF*5826+k+henG!g%(F+^?$@;=j-CJ zp}Ww=1{2Z~qc=>WlhPG%Pda^sXHm=ojaF8V_8YrV1a>O|j(@yag6@PeX-aTWlkTZP zwt|(No(*mF#4!M@8p0|!<{koKF(K3uUO?=Y5UR=ZUux{IW(J^@$=d)p=&+I10v}ib z01uR6N2PGuE*G) z1@vIUwuXL$^7EyYW;AM(-{%tJ!^I}$J=w@(+P=T<7*@r=uMU6(j0%8{(|{Z(Yy@Zp z$RRu_yWOX+U@#*Rfhx_yT!y((kw+{pTx;_U!`lGt03HAnfCHgQ0?na{6Ck=MA#&AW zSpr;QS;7#_3nMH|M`rVD`^EV$tSBhS+5mvQ>0c4&QSknw@00*+1q9N`fX zVUlUkv;;c~`gA=K93Hm8v6xBytnMJjWvPV@`HE_e(OBh$zNb}V(C(h?9`uu`&-Lg- z_-?Mh#)?}Jy!g@e8_f?&=!2~yLOLg$9)|5!z(IsxM-+v06(5Q0=4GFk7UBUgAsk^s zp>gV6LLer>Exud~(}*bu@=}WT7Vbt6f*o=Zp@YiA_WwCRTVA82DTy5URD4XfSKKI5&u^WdKqBU!%P?^3B8ry7!*3O2i%^1lqbD>l#Egm!Y<-~q3MY%=y!Zer08U6# zhcpV*(}H?_Q12R^QEwI;4uSOnXl#HT0No8R0XQBI*4I}Uk$&*pB%qouv=+P-O=?vU zYVbmh9jL~s;wyGg$_`3x0;HjyF|@;r8k3oCWk{v5pGcMtW#@ALxw##3%^}Gf;>X~r zJ*+uHyT=~orWJ3yAGdEa4tsG|)L-Mv7|EU(baT>O@hLWr^Ypy*JnZ%gHKrY8m!z6} z%Thxh__&!7#MsdFQ4y4NhYQ_1DI$E}gzaJ2ZUr1f7(arv+7$tFsMed`fE@t7YNRa* z1v1czU(+ob)^>23c{gt3@p(2>CYk{jv`S$@1x0uflD0r;K2%F}2NV>5T05bZ8aDbHqoH@Xj3|lg6$*>iGZ6KsofJz<87>%zhv3{T z$eR@ha&(Ocp==v+RKyI}34rY#G4RF?-l9RF3y=<_*<7DOgRxN))Z0znE~6gd|f) zk^(pY1OV=kPJ&QB7}E?ZGB5~Fqf8Wv@j{+81TvDWCKyjyhZ#xs!;7FFgAm9C?MNUjvO|n{k(qCw|VK@aI~4So$gmcH($8x=cRpXdTE>zQKQDY;mS_&CHB@f zblg^RmG&*78bLn{oyW4F{f_`xg<>aX zzq&$>I2!;;>h6F@c8J`Df>tl1qH|XPM*zaMhjD-A02}}naKZ<01Siq}BG^e|sW(|u znHGsa2bs_$kp-O^vjH#&L{og`L^M5UP1%$$L z-+)KHs+jOSt@rNZjmI2P^V01S)MuA#PSW=KD59Sy8U8i?$<9Z8_QiG|Zl?s=?F@gs zarTB{9QN!s6x;}b5!DF#Vdy*tLU*&E3t=vV31--G!j>5T8JavuM41cWwl*qz^9X@?B3$Wq@=s=n^s6hXXI{}vf_He;KGsKypQJ&3Z zMUD=GH%m6;$ealP2F+nx3RAev0^Ux8f(yV1WYhq~03W~-fE!=|-b6tk4+Bt#0jNhH zlt4KT7F20~2c%g*S{kI~L3I$4gCKbY@=6$hEWG^H&Hp^FJyxJ7Rik+yghw%Y+00Jm%p;eK8RjDUD8K(ZP^`YsaH z4+n$+poTH43H4bF6GAF86aimH1pquyjveXW(FQO>B}33Z2`~r!vw%X-9|LJ=5G1l8 zt@8{)3=&M)27o3~H~?$_ZUFR~!U*9-E32&t6i8bJgMuIx52Ep~RX{&%ekKpF2B`{W z@OA)fX@ado;Ak7*9DuR)0dJzvwgxDefuJWdQpklOx!^Jv1amP69$OHGU;u;QqXMQ- z#sLrput7OdsN@U!Vj!&rZTrC-XW1c{1@Z(Tnvu*6D=`2IfDa)M3x?r|-O&IoCeVri zt%qQf7aXoY%M##l1{}_SLtS?81w#sfzSs6c@)p1zfDFiVfQ%!^Ftmu!avCEU@^rWy z=B3qarEr(R6E_+c^=UV+C_clQi?yKNaH>$B71tQjZptS#rnO+u?mmk9EY$MX_$372 zMuB~M02kpr140|_q6_v2gtBVbLfiv5djP8#79_$A5aUHB2wF@?RDCC48$blX zcONS2#)UA=4@EvgkpjRifC}i3KutbaIfA|vpp6;n8v#S*@8%=1o|&w1@MEYFo*)C8S~f$-ekd6Gr%kiIWmO- zn1VM`*yh3j2Dcz@gdHHmXqFFTxB+qiF@O$$1z}nMe4Ga4fW8r+6(9#7!2s|u^qDOn z%>mM!U`_*)#UZZ(0vXBfu%ZCO04acV@Jav~0<3t!usAEy(qTnfL5!ARj>}uYk^(>i zq?JHA6u<{E(vXY+84Rq9q1#k=8R@XVlVE5GfXr@44uHJtit*S)CU5Gq9WA4=)89vp zt=Z6~r)Hqo4&4NZwu~CjgqLnKhQMwsdD-Witvqg?A04MgpkquJLM$^%k>DoJOJmv5 zg{~075F2a-V9N@CjL_W)&1u0x2pj%Lj_L*23g7_IIKV|fJAkjolJ?iG8X@y8Dq;-2 zVi{mTt28F0FTsnDwgoEjK@rr0ai{VG zC4w5(M4!XW1`sXkLl@=vh8JG)rY*n3b4w_d`<OC`BGtZ)ko zj)%w1zoa`RZN_^G__W&mAgSfJ4iy=cIkZlcesJyINVGzKwC6|W3=%k;s!~XBwO(Nh ztQ*vc9BUc3?o{(`dqdNxv^6!Goz{#jb67S^?josqwnfcQBg@up?uRT4T6K`81Qf;- zheMouq5{0j##Vfn?hp$#ZnRHpa?+Pg1v~>Uj=dlzVqNu!r&37eww35@SMH2t8e6D3 zwhz-rBHvp%4F~re=m-pa-#VMpQSl)wb3NQyM`f&~Dm}~3cct0-`rLa5-=P)FNQahW z^|3dntQJtSx{gDyh71S}a^n+8nv^%rg1u&i<9`Aw0@Vrw1uQ$&GW{<0)J2vxuUO=* zKV{PqoLp|5PE~UZU1`ak7+esrd}Coz`8slpI6YH&UJF5Zm2JX;NM?YQ7E|BVt(|OI??=cCAG~WMaOaN)t^>hh4!&u z`v$cF2bTp7Pfl9>piedvY<>NV{d(SU%FiUJ+nrwd+D3Wht7q(or>!l{SNR@E6t+ai7kti11vOqn zHFLyvX3o9G$ouXcmajj4cgx*(!4IJMp#cFqa>)z+v&v6`he(4;?yWo4< zk8{*KzjU1A7RO##?+w0p!B8fpd@aqdt>u-sz^mnT+Vc7umY6o?oKu^svM}VSvcNMZ zC6roqC)D+=PA~tq?T;cYj;mIY-LIZ8SKQ5eDq`;4;=m4%NY(pECu*dgwyNXO)plC{ zvf2Fvzsf@M(zmcvJm)V|zF*{^`!4>+btmR{_I@p}4cg=K!SNZE-(y<|rq<|fvZ|7^ zm|nX8XNml_`i(HB9}$p~@FZA(zl%{ccq_GIdEj8o8lfnZZ*ku>4j`h@ypQLJS;J4?QYsQ#9?_h&0} ziGBp_*V7Az|Fxt?HTL_fZjTXu&@$Y;gHK!Fw4+{r^ua!U?*9_a9m?BxCmGYZi$39; zB88+5s$z$BaIXonWhe#4a7@IqkLhzg+x6&ag5;?fPgFH98A^P0#>)BqI#kK_AK@1g5)K#+RB1H-dHLv$ zy%G7adfyvdmxEct)f2f%qg-EGIga3BSuXtJD13WQeIxk4!}X@u2xAFO;e-R}= zdP}vpQz^~XnX`@~!s)-`3DjFzY1>Y6yKMWuq}}@3>F`V}+qH=I61!@JY9ej=qkcW5 z=7=dh_0&wd^Xa{G%wZl(#!kBhn?_z-I4*|z(CN;-poNB`{{x^vU%wg`TG;Vi7nR6I zO@8u#jZ3YLQs{MS(_#woqLHP6R*H4V1&1SH3qtL|XnQbD!l$&hsl)W2^lX9Kf|+vD z7Peblb0};JmSS-skA{H{7%VgFoh8hPNBp6%ieIha4>_YqSa7H<5)CHWC4)%MACm$} zbIc|M*E1tD()T)=ZL$oNVB2E;`Shv|k_AmD0*yrd?JbdT#4ziEQ%#{*duw2+jPqKT z60L>R*8f0LJ@b!^OQmff>*8+;EeOShC2I;r412DW&_bd4tsRCdc^2PiaBcc;gTOPi z72?(yG4)J(GbLgIp+IY^zfFWwG`kV$$NY<1fNvQ3XT)pM{w) zF)f|4v#nB%ji_5|I87|IJQ}2IE!gBAs!g2$&oszEJwzz%j|GjeVu-{%6thg#7HA4u zO%K5*EMQOv=*^MV*2rSvimbB*3^x{7Y856e1fM87BxmMJLN+YFnvN*ky7b@mqy(%0 zq9Yd9oD2vvB|>E5+m3KZj2#WeA|28BL4SzCV2ZG#(#^9o0bg3N1rWUqrie~;# zL|svnL_vfS^nR#KL{Q|&Bnd2fZ^Un{apP6(^*)(ik|5FG{7^fk=`mAcC1O$>mGqFn z8BDN37ZXU>lT^)ycZ0!pve^Ohzed0)>IwqbXpry{9xj26((9=V-Nfx^Km@yg&=HIYiYDNYnB4rQuwXP*=K_}|}DKc~p`Uu?A#XZ+tZ;PY*K)B+}|PR|vx zctm{hyeKm)K9d9%JP{@3P+K4xYF%n3@Xdx%YYIh;3U@rRI1p{}TNXV6O^X8Icwm80 zf_8yu(BBpb2jc-@0@~VjiA-keErIX?JGYy49VO-^moKVt)XQk2x9dmyePO-Ej5J$Z3g>d!H%X#cxf9^&QdXvBA5t5sM#Ou5H>?r z=|b_=1nXpZLscyTh6Q_05nbUVy`~25IX3Tk)*|R%;BTgQqs3P8wtm^T^cf@~QGaZH zG#CsEaWLxcqDn1a`=swgJR<>?34W-py;ay$X&gleq}d~Fh`GEJSxnwv8kK*KIM2$J zUzEMuLg7$bN1F{CQQ{7?w+91J|6-wPX2G4*Di9R_S&F{$L*tv6Tx&5MOCauV4F+Oy zaslnpNLwgO8XJ&{4F7?F-w?H^U@RC`HA#!pwXSK>WP;ihiYWeT(rtG5f-eG}|$MC}bk5eSRq1Oxz15)R*JYKvS?S z5Pes2G8A8GE`zqUMZ%)itg6%2>12J{@DcHrP_)TUp~F%`FVuREzbV)pXj3j@Q6MJu zU$~|DOU){FJQ9tIx_v0Tu*2X@;=qk+eJNlqG|3upVkzI|T199j-dP+C#ii$!QIIG{ zC9H84v;`5-)b{Njlp1;qA^h+mT$L5VzH2< znc6j=<{c)Y=TKP6!E=(O-*07FTlE0KK5E)Z!X9~ze$L~Qq*TtWXJvZ(mS?8_9&n=XUL7n z>|^mryJeG?HBbl`E2i;KTksQtEupl;%3!O`D5N9^0BHikr70?`vt1uepJY~#194LW z$?(QZOK0R$ir)W`GE+j4NQhE69tw8^wQMyB2ibmY!; z4Js6~)TxBVn#dY}icLatYmmx+Wkw`p4qE_jE{U2083Yo_WT8(Jg$9I#QP%h*5^E@$ z2ujK`go~ol!V%^EL^Pn-DOFVfA>NLv7*-&u#8ZnPyTIRO|q6>ls zSwCsiV1npaHb{x+OzhjUkh(D#Ure^l%8*aoY@1yK#6N{io`TErAC-*;IfeY%vM^x)miiR8RbdbHoVloxFrye zMTB$vgesXJ;xm(3_rWE^x`vaJ`PJ_Ud{rcA1L5DvH5LTJ!DyiMc|o%hSRFSfM#y&j z63O$t0Hiq*4K9d?r^OL}kzc4`cs?Zp&Cimg#g^*nwVNhYhql>hxiQ1AquOwaNYYXY z5L+~L<{h(D8!YLLF|4s)!Lr|wLQRrMg5OXGSphMs7|+Wa%?Ly6#16}}&|s$Ed54U( z%w+r-LP-9K?eAo@^qY~WzcsQTBI>Qr3Y4h}?a@#qs#QUmq33-iBux}MM0}(|o<_M7 z+8#qc^L4z1hVO`qIMD>NBNkW?^e^ZLH3eHk;h^xYvPLHe7;7;y>`*-BUmR?Vh2jY* zyjW`pEDD5L4QEODj9i$Ms}&Se5Krj8&)M9+RF>7_0Z}%m05Kjn&k&e|UhseW*v5a_ z{}Rvtv;<-;|Jif=-t#|2Lko)r7bc$n88&qA|9}4H|HS{QJKu8xBu@(lqVrp(1>?}U zih&C}HIa9N;TUwTVc@9@#9D$e=v>brd0b0y{=2b`witA7V34jJs{`Q$^vXKMShvp4 zIlwkT=W53Mou74rqjNO_2e@j2OX85q!1H!%qjtOzgsDyWl+6J9x88`#sCg{Axz||BX%3f7p z-C~d=Gi2zz$G|PTJalpfUUiZR5WEaht>>u#p*sUdq!|!~GH{U>1|-zn;)E3-lru<@ zE(s8(s;LngLUgzmg7}`fP_#O(2*@6apck;F+fKzgV^ZEXW$m4SU^XCZDL2M zbz;XP25u3k0Xpg!IKmM?M+*a=S%?I5gc&63ax0)?H3Mh7g+|+&2%cl7iAocooO^z<2D0lb0iArc*-D222_AfhnQT}OaYx;NMNFoHb7@z2F_5N zUMghZ>>v(0ORW5Kj#iL5iL(@f06J?Wy_}6Sk#QIX(Ah#n3${iU13H&TN;+5D&~dI~ z;1+QUpmVz(doKgG$RYuq2c^6@k8376PuW=DJa1)z^Ev~M5i0>Y@7ti~3|tf&0lHFY z*eIYY+xmtpSHa*Kpz(7JmB72o7$obHY=EwE29Cz1fUa5w$+|WM=&Dy-az)iV%NV#t zlmX~k$-rmk-+-?5QhU+0OMFRV?o%vq9g-w)9n;XAG@(0d8TgW*5ec#Dx@3y$4o#*{ z$^p9Wn>2U3G*R7|RzkSDOPt;P8Tia|bb#(ciL|?dfzLeV0qCBjV0Sk%@EBn*pnD+$ zM?3=PUZTKvuh8JT*VqKYy^(>7f@?rGkz#421JJ#nfyX!m2k1VmXzM=3z%6nuK=(N{ z$z=kM{^c5pAEkwW?wbnc`x=Btri{6{B(TS;$>B-2lEaguzVqZW@Txf8xM|;G99l4L z$u}VOOx5q#T1eq(5ON|<{TUb1OKd%>h~Q!4cK9^gIY8rDcmu!#3|vbi9Z};(cAt4N z(71KocQ zrKCd)Qmy9_joY9F`I0U%aEl{l#+A$l7m{w7;M`MhK33K)iM*aV!D!rpEZ*>DGw_+G z8I2o@U1Xe%n}yxtWTSC$u#2)3<2GPI%v;UCW1Mv~?)Vj)@iv*d>Ro8?**yJdT)vxX zJp*ani0f4+A&t9g4JLX|2v?y`MH*Miy2TQRapkLl!(9eG^PHq{cdIi%BA4tT`l>UN z#&xQ$P?)qRxtD=P@_+=kCl?CxM#yRBp;MIoqW^~T)AV(xam?1`4I!3S-3TBqf|rQmqM5P#Oj`s(R5F~ zbmc33-Id7rdXZt0XE=@976lJ|Bejk2jkVec-y{amXk1%pgT>dNVeu_8RmHc`fZey= z{CT4hXApe8Z46wLeHwT7NuUmz?;e%f;5%i$cvio7$$asu5*gnuQ~Z4Q7&zNW417;W z`sE2y<4!syMJZjh>ZasLDyHNcV5bx?NU?0TF)n*clBZ0K>)28(XHAWZ)zWMyPK^uD zG85088aI=9jMJyaZD2|A461RtSCTx5YFyFfju}=y<+_M$TGhBKN{~2ps`6~9GfWbu)@y5!x=^ZHYTPtGsml~MQcVF*-N3-v z7FcRrXe6XMbtkz9ao*Lqrzpj8>eaY<$bf?49C-rPxC+Q))RBz)e5Br`J}~%``qZ2g z^{;8(M6FDd7CtS}!l#)QKCN79W!e;_m1(sS{rR`K? zO500}HdM~I1Vw0E+DWZ(X=kh&mv)f>%r~wTvH0Y)Tc(nwJywIKI~e%P1zh7k4?)*- zKT%Q~TQ%<4khDr4%D`hR`WSa&$blwlB+_flP%6D%zp&7By6I7gMEVMiMEYtg66qTl zK$CHagIBE_88(fY zIU1u3KLZFF&HdFs6_}G}l<05Dh5NFcC^j1JtB+bF-WgFHej15e#u5fe@}#lRf?iQD zV}~AmpGmi&U(%^>qj~Y$)xmNuBRAnn?-D#iE88*T$)oas7&aEYz6fTxeDqR zdNc5<-4{lu<0M%oH`)~Y%rn(SzhRk5zR;wn3fq+Pg+&sW7uE{5W9)1*dhu#1zp&G! z@(TwvzAqfJ;`_pB;m*Z*Y@;D9*_;<{iG0GKuF*|4S)b50n!!Sm(Yn>u90)~?o~=fr z)g{*gLzmtRlH~bqqmimG@Lk4gaJp1l!Rb;hGo~($47_R=wb74MAlzk{F!N0v6s&hy z$-phj{ze;6!GSK@1htKm6h=2s!|QZ8WCe_!yVFcBq`V>mdc}F$=6G6LRRT=NY(K1B+uucRd(lG|n>_)b#-a zw@B5D#&=0_|BTVlPOvCTr~g^KOx4TkuL7v7;)KL0t4!jXRinisYqoXPtR|cIXT=$K zj8m{ik2IY;W^Gp1D{Ge_%31puBQQ-$1z}w?i`S>~@@i$Jo~b*zJ@Vymz~3kgMA@HSG-%2g(ERfZcBE zam|=0+acf1P8E5SKHLJB-9^2hZF<4%BApy%k7VGCgz5JRDVf=1`Pw2BpJvx2#8KJx zWja-qyQr0AFmPS;SF&z!#TE z!o9ebL8|rGKH!TRqyWB1;h;RM0r=tpk&hW0cK~0cG(c|J0etbI{l^;`iHEk=p4wi^ z@yW7KPOcd*8pVU0u;yOQA_mEN zc^oijrQ~ML=4ZH>vrTd{=WqfKbB>wh&bep=jX6r@b8aM%JLk5A+&L=JdCB(-xnIhZ z_`cNNO752mZKQf>w3Uu8Roj1TROEgsZhLLH{k8Ry+%N4g$^Fu9HT^+@+%FxmlKZ7& zCb?fa_YApTx||@BFFi1c)ZL?a(Y*_e(iovPx_7tOp6-2BHr9Qp%x1ce6ed*mYXIy% zRx+gf48oFfpzd`7eo=Vp-lTBv-p(LNc18f~PGPR>=>XV$t+3FG0lRNy;1>NI0K4y$ zZ0WwAL9*`k0NDMI2yGTg2+n9cE?e-pZpGs+gCu!26|nmg^+69W1GhBNJu;=N^vES+ z6?m6^@1+y`9s?Mp*}6pl_9&Ku+M`+(je68lerooQ0PNAgAX#s<0_?Fw&9mNS{(EfF zQ0=yW-ebR{Zx4%i?{U(kaF6qf!ac57Dcs|R;zy4M*72UGKs(nXI4L)E0OqDMNRqqj z0CRguY0NFMdFb2{g=%h<#aHK68?l+_TLGBczyO8<=0-(j!R#sln7c^fnY+>I7IU}S zrr#^k&OJ(@NKlp~a!(kcOYQ}e)47*qWSM(C0ij!hk;L-cC)R-GW#!yn?xJY-a*lwd z%_!o(?3c*DT&RG3xtKw+?vw%ea@jMOyCekc5)9DGD{adE@)oOg zd3mq>$D>xW@$xyT7B645zjZ^bc*z}`fG^u@d!E+zylicG^YR$DB4K(vFW-zc^NRGl zWoDe0S0PPNUbPP9@@lOt%+rQ0FRDn8w~Uz3LGg9oDytUetv9HZx1E8Df+fJbooa@C z62-iO8WOU5@)S8>-U&n8#94B{Jdx__6Xk$;H&h^(_t*p$t-!wG)%oBnISkz5ygA@2 zy)-zl6i6suDPfReaSMR2sKEA>84AEx>NHtjX;Rp~5>8x|9HU4 zz*kNxXzb4XmCJUvzjDX+6<476Q75e^qjlREG*NFV>Vi`bKZNCa?{A+A^oPWI@V~1smJ(9xyLz;p9qgDp` zPpR=P=>e`V@R=v*0sS{@HrD@G4%$-}cY3Bo@0@wP0tm2jI~-ZdTwOkdN&ws2kg0xh%Yur0ruRjOnA>jMz(G2 zJLq{#6S(I&@?b&1!JZ#Uv)1#5CRxwhR+9C6pcJ$hlkfJ@l<1Xi$f`VT2-quIQmfa1 zgcbT;MGA{vni9Pxo5c27WEJ{eYwbU7wTf>qWe9p5v%huHF7&-F*}l>l zO|QqA^1V>&`>S3h)US47kY;N$0QhQm242-{0PxjfP3%`I#Y(zpJOKD=wOn?M(OZoY z&{x}4Y2npHl6SG4UdiO10Z|xI$cQ^fM?_La&WWxi%-UU)ndg}^r?{bYr z?@2NO>OJF`P`!7Z#IW}w1H<0S6GHahX1%-j76#774gzYYhQ9Y+y*;M)AthbCkBj1+ zI79;2`?QAYqr}m#nWH}>^xDN@M{lkxLVdLC_vxbF?Lz^uv8@%bPj88RpCTFm_9@Xp zMV~TjP|>GSy{c_upL&x!eVQeA`b0H;eU@0c(?=|E(;J(VcJ}QG|1TJKmwwD z4w=B8)r(zyE-~;JCIhg~H52K(O8EOcvPE`%w5#Zwu1!8E0zrw0-U$L@cNM+vw za*by98^FFJMIEnA$Wq@LJ#XJeJwR&$0)68efxhb$bbU9A{95+O0qnb7L2^(B<$aIX zFzBmXWMAzO`d+au8}z+lSvKhVPzvvBOiU%a>j1vyk(_v~yCTVJehVjFlWTmh6(^)u zua#;uI-WPQ125;{V!Sh1_cgESz}lNFpa* zJ8j{_Yo-Lec2^JZC=mg!5y#*s{hqV3fs2LtAjCC^H53Lb)e~&G~?w_3yVfW8h z5qAGF4Q&4kE3o~iYLC^w!Hlr`FVx`lUnHUEzcMkx?!QJt+J6TFS1>?A)_->bq5B`u zgzkS@(WC!`1i9#c*~ZlV_pEZ!A8kLro^Ivv>wXE}>-KWb>&14tc)im0Rh!c z^(SjAQTTuj)+l_yc6$^)KyUFGa8l8Ez*(&V11{=VdcajnEIr_silqlUw8qi{o@z1; z^qH~rz$|Iw2KqJP1N&MLA6Tg17&uzJTdD9FI3*#L9;jA+2DT=|(gSs>JaDa&mVq0U zv<%#uAj|`I+9Yw{5vwo{JZt~)id8HJ-j$phXfN{?FuO1pbg_O_&{yG9km&6S%CzUC?d|t_#*{>KE*=2G<39Ex~nx+RIaLMg`Xe=OsN0bXC9LstL|b z8G07nGfZH?LrZX7@c5bFdXP)QKPXQPI4Iv#gh7RJzCq^xra`v-O@k)cgX=+cdYpDM zxE{2`8e9)rEhT5rX8rQE1S$_QmpKLm%|E2CyZWLX^viRM%#rgI_xNn>yK9?;8XNct2Wmf?5dF&%yvp0tMFg=&Xu;Z;4&4U>O`%JCIGG7)}i<=|t&W%u5J%m(3c8&uaQX~-_GL}KIJ|_n_q>_PK9DM{FQm5o+ zNQ)HYA?*pf!iK1wA4ArwS2o#LG-Rtnafqsl3^`?|5`Uyd@= zVP(-!uZ=}RbDm+*(EheP=|e?f(AcIubcPhSp^fr%$IuoU+-QjeI8?d*p(~W+4qa`Z zZ~e3LDRCbv_qT?XatuA8&Gu032Zmm^$<5H)YRV^x!Y~v~VR$3kSTcO0m(2a%=&LmI zjR6Th_>G}92l_^p)d#;(XaBL)>P_ERA!+``2K!r^?LPR8J+`m(!G<@^X^DU1k{aro zBIO%56YT06cTEI~RgP1fnqaz%yI9`JS6CMh)iG7^NF7rZS6E`I;;Aa8Dz3NhcqneR z##qJ6l;jq#Q(aB@l4fXlXfy)fguh zjE;eT!*sekEX=?a4z$sqD$5zRl5DW*BnUWcjg+-v+Y)w=3{xv1!;a_ykK4#F?6idp z!!E0VZZYtxzJh?mbf!OylahwwG0W1IRE(BQG zphJ?gRz61jAfAta?+6Bt-(QlV6BeJeelVAD!Xp(wpVQ8P^}BjeIL z43cCo6u{DZnnBHyDiinu~%X>;)pn&Dt5<@I4%=}5oe8~ zct$@;z!4YJ4>vWoBkov0ewYX{CV)IL%L4Mq{tVy^z>y^kG7`F#0FE4)km8Q4Q#g%` zCgjBgV%Cg7-C1^K8V242-G6L3_imgiBEq?Z|`*MdjYF>o~o zi6x_&q&$zZZ}c4%X8<(N8V1R_wrtNYJ-Y`$T&u07qT4 zkNlC^o;>Qdkx6uj0CUuR<*i4dB{3=UNHHtRQs9?$*Q74%W#7G0Hb5dD;G1O<@;7T3INQmh zzByaJ-N+zWcM%1AbD`8Rqn9Y)n=7oudUG>n7(wyoZsQEH(Mk{S%>&ZRy?IIxZpm`q z6dM9$*HOSXuMtB-fN$#4oNqqT41JU9EPu2|WhJ9CMW$hNCIuX=k8_UhZ;$In7cofI z-9!LKSCE}i9ZLa6TRA>DEcV#7wGpXCFIW4ON3XNKvq_>hTJPo_y~jjt^Z|2&*63rB z)uYeoSI>*oBSiVmXwrAl%mr}t4K?aLnPnO0c>qU06y8MjLIoV-6{s5>Q31!Og6Eh* zl@!fi3OGg`bsAG)0ykz71F!0r3OJ@#gvJXyh__?ZsopV56tH7fn81!%V*)#7ld;Az zW{2g((wJS+V2?Ry-_$hbh-IJe7!~h~xuOl+nCn)l8goYh{=}Z1jv*Uh^kW4a+eMBu z)=vsybk_nL+gE-(wpi4PjmCX|V@FD3J$6b$+&Z>Kae3@QB|~GQTKL8;lj-5u)!Jl< z0ad^=cDp={GFIU~cCY&6fZ1eV>|v|kjy;*+Z^mAfOdNY#5q~Us`FBHPZpJ<$I)@A% zjz#N{jdAL*$GBWFv~4o<9oNggL3Lb_b^37?41DIX0KjoG)U4wYi@oFG_SOdDbUrk0 z2LrF_DhoJnkAj5aJJn$paGbJt%a>bcTCF^I`6g@kh4O9I!yD!M zbn&qKSOVOq6{uH?0HXZ5sa@qaP38ki_%$*JAHS6xUC5x}c(vX; ze!p@{;}1zLjz6X(Z2U>xoCL?8W#BOykpYhXNKttFP5ts+0^4XW1~~qqIPj&Ki~&|S z&iL#0?&R2bWUjgGy56_c!NtZ1;Zv7()UQ>aSCN=f93wc1`) zY_Qs^imhq_y~B?;38rJR;YZq!hZCz; z#JN$qn|Ojx&M`qBb)Mj7kYec<3^*ZQy);^f(-SJJ6qrCVF${1*gV+zO`_uwXXfgzL z!g5W52`jB6n6OT%%mf_*P1t4enG^O|W10y^?J>=Svs%t3TqAF-I-degxXmEV){hu) z!c)CZp)y+uN~PbT8I}1`%`1zQAXbi)_*a%I2rH}1VtZw^`ng`?SlML7u`+C&&R6Y% z0V`Eyta6L&Hel#n<#u)KuJQl_S4)7zu=0rQ++F3#gcPyzl3CHJR35PMQ9_Pb`P6*t ztxRne-pW;IzSY-EA>Jy`sJvBbMdht>Yo7a7ji&xvO)9*4E36@ZYmreb4bi(RO(#gh zu4mvg`_uxywZoQBzjav4+FNH5$@kVpiRD{&Y~*|EzOe@+Kz6B$Ndr|Sj`wvClvPq&N;Ets+SXMb@P&mEi#6g7`2}_ zo47<7>4|z1?8MEs^JWvbOH?Nw&~F@0aJLhW+oSY}mn5Gj>Wz>S&Becoj~HYmw1fnl zs1LtR$}=f4sjtm`PAW2Y`Nse!Y3-jh!;I4>)k`8zT4>G3C$;OB&24{^)|whNX_Kgd z%ih+2lXh5%JL!d78iK$)DW1Z{FQ zNmHmT2sk;5pr)dQPq*9c)$c!Q^Hw;*<3;=gF%WxCJ2rC$E!e zOeWi>`fCGD-may4@&PL`CaVSU$!GQS7tF+D@@3o0X7hu|50(F$%(efU;*x_+Nta?e zCCe7)P3bPdn=(KKDpQKAl0K!xWa1RP1!78#$*?JPQi!LtXpE+Wtw2uE)qp8xXfVZg zKxE1`O~xtvWUw3xchE0~rMyo$qwU%hN)1KRV!$bv_24%t2o>#{0jJz$;4zvG15SC8 zV13{A$PDD|Tua9Fb}v&o-Yzsu*xMr+q}h6i1HL`l@bYih>D^0jH)!d4d!ceMZ^skX zmfl`2x$*WU+X~U!TkR`EZ|}3N5WTGfqPH(-34dGlJ9zts1m<>v2Ymaket9ZWBTV(# zbbe|VOPhzOYU|%reMDqxiP2WX*zE&2RboE1#>%{@wd%tb{h@gRaOxr%*iO|uf~Kw! zhp~xTQ#Y8BG^o5_XWv<4kn^1_2{Fz) z+cf#!IcVe9JI5>>d*{4F^Buh};+-3Ij=gh7PQk5sR;v>N)q0hvI@`9^P@ShCs4kQY ztS;3rkJb#Vt~41~U9A{cU7x_f>SoEnYP|=bdX){NbyfyeZ&Lv7Q#7wWXfm++sAgcb ztsh491!JQ}^>vvfRO)bK3FWl91YbU_MWxQuC?XEU0jI4ocM?onuN=rUN)`jslugr3Vx}En z;8k7e0jC{NfShHJZtqYJIPHSM@1Fktp%4z)vmS8TQ~63wx_YH1%VcMbIu2ixuPIbh zV5Lw^iDGz7rL}BQGnGM->~s%U(;)VH84k0iU1l6L`s75-YO#$VYDBd)s$yJYddQkx z_Wf5i`?Wu=IcaBW%{h~xHP@w2tGO$jo@y&p^FU59U9TNa_gdGDre|6zBh&r%GWm3M zYGV3WeVBB5r3PqvwH=`8bqw56bf&i}dQD%>AjKv*(^ngt6sB*N1%~P3utbmy#dK9M zntm{0aFsPrKc|T`{i2mc)32KJn0{B%WBOwT9;0_Z;B?NwV|4HboZ(Xt&d8B)%&;bm zGx{2f;xW0BIAf?J#*9jf!<{ijlVe7m8a)a)qgmoH!|3!Xh5?+h%!F~qItk+pwL~^! zyR~jPW0wZ-5czI#Ljd56V^XYU=<_o(E|`^~8J889H`VZzJjh!F0B79SiO~$yu+Q{b zV4vAV!amb)g?(mUW1V?sv1Y(bTMjw1JhAQ6Onp#(W~=PJLz%?PxLwF+l6{nS5&+KJ zqCeVWRhOCO(V>|qtgUZmo|P!i)U5z#Ue`u_=51S%cIE?}(9}B2EkCuXYL`T&1z>iTAS6*j!W-4d$mGf_Btb2nZ3!>+}T^CM9ki$Niln`l@zlN z>6uTNEr@5IlL9;YvbnfR<6UFmGp}v{oPA%iXO1gj2ihE;meM);gw!0fFUp)E8+vm_ zTG5*`MQ1c~>J@@>)DFQp?Urir9JM=ejy@YSXPwlaIh&Ns%-L!ZWzJ3+lFiw#e?DXu zi{~7(6pQDaQFVwpAL*B`S?if|ZY7Xp&LjJpNS)6rKy`Tu3lMb$YTUYV3gV2rE&%H$ zSxeG&bqOWux>ku}-KuA6({*dD5Z3Ls)|~59N?3O~fn#-Qqi~&hO192+O1AF7^9m$$ zb%He4FIoY}`!fLN=F=~WBY<;98s)FK@ zPG{Wt0a&kghS%$TVD+agdqL{YX_H&8eOtY`^{f7_v@G?HY)-EJsTrHk(>=1X z^T@M@)$-xI{-(msE7jUOuR<+Z%+sBY=hfPm&gV7QL}8w_uRYFNBjtXcJ_|H&yHQOu z>JamGCyb`LV9q{DI0P4&R4xD8s$8!`#CXov=F$gvv!hThiT zreUa@rJ>w5OGA})mWDcoM?zSjbMZ7_tUU5p-$bfM_b;8 zrHIGd z0UOI0WF*|(0@zr|z!`}y0BmewfS&&RgTD8t17PYFz|`%GpL_3>r2q(CKuBkN@Q3by z20+(rKvx6fv)}pMJM?~^mzb%sf@3<)$wb3i~{>dgOuz*r_a)blZ~SNfI zvWW4X@9*A7^PUAvyTJIFt$(tK=Di7+euwcd{pw;Nz!F%&_{5eSSBWrLfT`UX|N6=g z`qASP(Uz9?-nimZ1fT~nBbD*tKbrG(fX*|}d7klay!00@0ie?d=*(n%X>{OQ4nXI1 zK<6z6=*j_f7ORcj(`90bRWq|IANrO(ysc0(y@yUYa-O2mof50cMsn zJ|S<-D}?L}Kvx~(`$q1Z>jv~}1@!D-fJxf{lXlS`R{)c)(;sMb2FK(Uz~nIFuHCaP zIsko-0DVsxU`iEW%2dYB{e1Xe6QRlgQ_2~C5x&|;2#*C!tz`VYu7B1^gxU?5zK`)A zewg}G0x}BdUBdXUw?9pxF%JX!jxj*rML^$W#`m4=>_uPg2TVW2xMSd+Z#e+HGXTAH z4A8p`(7TiI?!CvoPjl@8Ox?@)_o`O@iYRl(xCjAVy#QVLj4%Cqwuf*}1$1>`{A+8= ze?pJd;vxe+=fTYG4#4C|MrUtKJ_wk6gz;&)F5+B9957=UfAC zw-S=1?SPJ5jDIKg!ru{AYXH6L8UM+uH)w*i3c$2UjC((u?WKYG17;L5KD%yTmNCAv`2FDoNH0Kl zKE0m~n3TnM+kMYCQrjFrUmoLAet7c_Nl1KvDVdDl{DY6aO^mAmOr6B|#czCki?F;1 z=%PtIM@4&o-goc6{0R-d2GG5p244u6)Xw-n4n6v3q}RIvVISk~uej1dAl(6U+-Lme z`Wq*SqPqc|`xqa*=8L0fkZM48Ee$dnFsXv^@OS2t`X}E2Ouo(du+|581n^}*-!;bn zZrN`J0ifrCxL<%5e7|%V{aOj=o5J{Ck9d+z=#-1T-+a}D7afF7DPZbo#*5S6B3qHN z8!%-br3AyBen<7v7Z4tZW8v4FF#P*D+$nb3D9+ghVBdK9zcKW zF>aMW&oMv`&6?B&Fe!)rSO=K2k(BBzp!Wjf&0mV1B~(`d`qnZ&q-~?HXIBAJZ!o^P zXxSGXfSxYKB@vkP6wu2U|JH@We*l0_&nLN!+7NW<@H3%GQiYw#@n`Zqlr=< z0H!`>e8GaX3uvMi!1OTV5B9H{L{J?Ebe&@SXMgmWdLn!opr@QTxf0N`hVid%`btj{ z<1>KC=NbR*rrXEK_V@wQ`Z6Av79|7VI4>^D;d{oXKcz9(0=hOZ-g;=_FG=q%0J=V+ zF^>Rxjx*l%*f+0|%A5dnpC%^n229$=_`yFcB-7<-2lOmr9KW&cw?wE@Bs`2`_s@Tm zAV~#G?!x%zm;9zTp>t2PfB7eUi5m+6o$ZV- zZr&TFNwNSv-5LJ|pM8aF{~Lx9587aiSQMpg+Hb_j6U_4PXFg29CH9O@)-a0@>%-`_i8{dnJ(`ZK<{?O zPsRU85WW`BThDl(j}M3#l=9}u11`IOur z{+u2U1EwEi{APK^e0n?rn0}n`iEY=u1km{iI-fHBwzKTdNePMoJtc%o9MH3j@p~_g zCWiWU1N!zcexT?nnRee%K;H?*$7Rf;MLJA(9mWrW7;& zL1XS;&}%+GPbR(g5HRTpwVVDfs# z@8&9~Hf{~W^c@s{(jUhF z(@!!!FY7MZVaFqJSr{*xIi`e&lTOqp;yfYhGd}yp`69MC1?WCYSnmZ)I>7j^dj5I` zQKKHv(?sv@1oZ4-{7WybXC!tf0DY$!zq;>ufM~cGFl8I##ozkk3__0pC!dK?YttYG{HC&J&Q$5udRl=0esy|$Uu@RD)q3no7R zOn%IG%I3#@n!Fm&SIhW-FRh_4E#nwq#!1E}Zv6Q_lBItH=%V1=b6s4J#IMa5N$w)~ z1Yq)M#!LUymrAPf5n%dN#$o>;F|}XZmBvqZdyVwSbrR5ZhVf~i-}HToHa-G$T_szW z59ltSKlTE;56~>f0X?UPa#?^$B-BakjeCyJdk)Zhk@2JvJGOWL-6eqTGWs@ZT%3jO zofNjvC%uj9m@sKIMJx1eE}*v;%3l!hrvQ`BGXCnP{^nJp_Zh&H^Nepg`DhPG z&_ck}cE->C_S^dims5bwvy3n8UPM~uDihb5@r@&I{ES|{4w!n2@t6PftKCW5mH?)$ zVBCGXobuQ7R&l`v|Mj=8(?pKZfQ|~rr*|D+MdHu|=vhcu?*a7eXS^lp0OdM97og9_ z_&+@Tm_j;V5umSxad-G21rBKs0n?r^{)M~!7ZJY>0cIR!e95)2Wk* zN(JLT>QTPNNtvl}0Su-^2}}Cp1Yp`}##jDggs{HNgf8P>DW3X6`ur04E5^qxpO{Wm zI|JyVjP)Z-pXUo{laQ_A?L z>+KX{By&KYgYmCtO%rzC59sU5_>bzpNzs>Y1)y&=H=*+m<8v8hw*WnN89x>MMicq!sm7&S=-m{Z zc{Ei28^`VYzKktYLKsGfEQ2pIB&3pzeI|*r6~ow>!#pd}|H#|;C z+j!>8Xo$Kn)|#?=sIWu6X!J=qyZYagNV2I=Kxim^$iA3WZcc%P^#py00+K8xjC#K7 z`Y(TwG(&H=gXofSb^6B|@ICF`MbXnVS2{(wz*1WkSQf+*VMrJ}8gAFW{1y8y>e-83eu;Le zOL=beI!)?r^8bEok%H*QcKMe;;h&QnbNqFS{Y93n2HWah|I2yg_#l2ERmkcZjTNPp zDRHZnE{DRuq@{l%SEBpGiEi9aR5~u7mP%K}NB;efQD)|5$$aM3qDNugqp7lxsj{dx zu@unB@AHm<4@7#4`O%|Odor5jEe8+LT-tXwE6rB7?~%QBa$0C*u*rlx-z%!*=sh)v zXyYBQ;f`@{bL6~sx`_irPScBB_Rf-6CkkT+sV_zP%y~Xda;)*5V{S4|k}vR@{@%Uo zC1tO;Z$=*`=6#R6oXjOm4&2lK6992vlQLY3=sl|g-0Z#QNoVb@elAy{2DaZX0?6zC z{0nlka>p9aGZ=M37(>BLBWF&+$5I1LIvvgN^Y|+bY}eEg8w-{g z3r@owGB#0uNN3YKO|fm#dJEDC3#nJVl1j$H0Eu!jAx0J2+*{QhiUdIqVWhtimF4piv!%$XQ&dR0c z4WKX?v!~Tgoq9wJJC15&=*@H{oU#?i>-82&R~eXq9?W!(*SLdp-bjJyDW6qonZ|=(Zw{$2esFPp*>acYEqFs_*r1kbq~2Xnb#a9Dw1@9s?g<#MaD?|)*|y!38bt|@p<;IP zK+dvRw?T{+AomMR(tv}V$6wV`A~z4eUWp333O_lunrbuu?k~VMqDn)wt4ZJW)EZET zZp6IL*p0lkc*^{hJ?&fE)3Cvz!o?4Ns0<%?;VnmTo!0alH>nSyE@g~_7LEcf(X-!w z@G+3O5I=Z|0WxU7LA#z_M`6cbiWyl551U4rddc4R>xo03ob>Nrx)n}k{E*)DUYXUx zp(m(wy#1|(QmYm`B(it(Kxu@TzDPRKAcx{XQQd*h4U6ePGR?vQd(6K z@HY>%dTQKQ8e(0Jm^3K=-$M9((1EnO~s)}RZ? zOHyj41BZ(3g!u}VMeeC|EVrgeQ%l)$hhFss?dEjq-$f&RCqVjEa5C!< z@X?7cZ{#*VyN5E|9=sHJ(3o#WSHSyrpM9ywDWfg@!x`Jy^Q_&<0rFx1eUrn@?4(k4 zx=cu83#b@H$4I))K(QA+JDks?CQ=>f=4aQ3-J;Bt#H8Ck@4F;%Skr-DH-u<1gw&}< ztUl}v`0-Zmd8+&w^*ZRz1$^3{Ad)FLC&;C&}3Dc>x3 z<$(!(gS%LCGy-TJgO6AiJ z@C`fMNc$lq&(P$UvXi%~eRs=@)nfEvnC*}Dbi1K`<{?7Q5yf12iSV2e-ut+>J@_0F zMps~4ysxuV;oBCF0|&Dc^o?=np?hZZ$YIF^Z0==ndzyL45E!{mi~>F#pfk?__;CYP~V#?9u#$1IdrGSZnBLE1-42GL(F8tLG@Y zU^o(TjV#ph=%L--rRUyPeM#GL0v1W*+7na>jeeny z6!Bh{2nzYkkmc&FblxQc>gswvU5{$UZnydafvOAE^pYB38_pdQj46>Hh+wsUBYuYN z!b|TWLjQy=1Ip=~ti{MQFDo$p&qt0!DP}*T%xY62Pw=*8w$}S})}iV&#QV`T!gB%m z)9XubTX>Qg#;X`VEIyn&{o5S*-ygD(p{=fEtF@!!fVy01(K9;A4R~@4@<<5YYuB57 z1C?2DtCGp0pzG*}JZ0@wL^+4Ys<*lCx(8;=d$L$~$~L3eRJX4#nJG^na0B3eCiZlYI3wtqPI|T4V%v}c)xW~mQ%GvcPWmw@2+FkE|V&wSdsd* zHBtU&%Eh6K{5Ts&_o0e}w)P^g9+;t(>~!+asKS60tKrjs6<30s=ra99c}>Wl-}V7J zmWe4Ko%yVx+^S^k<6hH)fBMCJw0SS$PB%WH-WD{@ zn^Z3Lj$U0+^eokr?+egX65eald$u}zjAk2AGel{3PD`tnz1p>^JjR3it8UYiGF}8} z(TCKlMI00zvOd{pjcQ{|Ico@$b^|NS(pd+p5gQW>~1DM)-F%N3xAIisfVw_e+U4Zcuj`l}LA_^B97;Zx7crBZ;9;w4wBzdK{Cho;87IH0+8T1` zZk~sTt{}31QHddM6P>`VJ|7*2BE~v4gOW7 z-MnMHL2sQW8X4M?#@_u}HcCNBw0(d=;~eOg?Wj>Y7p{BEwe!@a$Lu^~{OP}3Wsakh>gukbo97e8;cv`AS9~kpCKiV-PdFd z*Mxhk!XIxKsl__bfiLI$jdEsP0(qN(je^Jw79;K_wvqNX|1;jZ`9q~QQfm0fG~^S# zMd5JJK$X?q*F|4BRoy^K?a2+jd^Rj}9{|^g(=BT%;6fIQbAj(qR!mU_(*dAfbbl)I zY{flxDY%1Vo|4w|WyhG+f?h39L8U`Tda2uFyZDv34}F(YZ@VTlJLA*?!zrF#=`fn9 z17Vk`cvE9(c*m3$Yk2NfYdPN=>kY16oDo7dcLY;+KVx4DvRb(G9`*f{8F=CTiEaos zd{i}4M|zu7PM`FoJ-9wG3|vEJl(Q>_pOzl)*QLuuof!2S8z4HI(D`o;2S1y?u-85<_k<3^&`Jqv@nA1mFx-LGd z8!@`yHmcjJPW&S^)!6)b-*L^}fB5>EeV-l=eztUE<+m3(>jCLxv+4%d#D9!<1}V zW~Z5PeW-c(FBxoEsKgXchbjk4eU4!;tT@A?lQn#fk;%OK#R^1v`+~%3xH>%`4@hxu zt(eo#WHFC}RO#IPX?l5<5woo{^N>^_-#Xn4|0N#+J+oV=inhdcXyWT{ebBpNz8zD- zlUR3LXUpunzyo_+MHo@vG+^Ajb4$bjIH0ZN_f;-=D68{id)?v(b>P^rZO`ORqr5L0 zC$&qWk_9~};H|&SQ8d2Jh$Hdiwd!s5=dM^YVifqox4x`rAAx05-$UAiK7A98$h5}c zjx7(nuu!bIkJz7FM=uVbrW2{~N6;@;FA-pyRn1yiDGz1yFy4)d*5qOWCqvw&5qQdI z1clevoe6L=N$R6&E0Pc3vBlYhdd3UucvsqS9|n*2__S0Zk^oQl!6mLKrEBB*!_pAO zxQ6E6K>@IqI)ZO?A^E<_>L3b2YQ1HJ{P)1Sn6IrcXxChGPY6n^-P+kM#TXGaxQNr& zW^M09deH;#EE?3rG0&N^^ma0|VOcPp3`$^YZ*I~1Rj4t+V~lw#E}jeBnZF2lX@>3#wLEQG zbqnDA6WPY98qEiM#RtBzj4}~eke{>BWkO#N4kyh?{LY+6m|z8khyuWJGt|=w59vZp zTu>;!Z?Ns}lV{~DK%0vpo)x>{Vd9$c(GUKfUB*&(=FeVPb^nL^eFrZ+7%?{O5-tL4 z7<%T;Ka@vY6RwnYKF%>{x&SN$h1fRRSe|@U13FvQ z*j6ECTV3;nDq0*u^nhS9(ooGlm^tb73+VS`{VQ6Zxw|e~BGLi0ws(m1UH$jmhygil zDA|hiTUDP6AT3Mzo4}~|^VVUMEH(La3q=N1G+l|?;=wnLvr=A2iPCX$9rphjMYpJ< z8l!_tE0Ib9;k&b75oWMwLeJBn*^urZr>EWbIKFw3H#Mo&_XOc(16bpt#e-}s+BF=B z2`{O%FHK5#kl^Nt9tokA_@DaS0P5P4GNnfy*0cM<>4jR~cW)6dp{}bo*vZCs3$zjC zS33msDt~dB3nxWH9*ldp?8YFX5!k-Mu)mD$dhDDZukOuq?G0MvqLNl89cSmVm;I!M z8^^u52kQhSuRVJg+A|RZdzwLzw5odgJJoJ=J(DoX+p60e>MIV^Hm@OU=DJ0_Bq+`- z;gw7o=ffl$+o@)}lYho_FT4Ac{kD7J0RU>)B7ZhspJy>rLcFcTmVEd|Z8jVF_x=HC z?Z4KrCsw2cS(ap4(6cY5`oRbAU~Z^+U<4}qtWF9zafg&j)-q|m=B<|_SkT~=y!L$H z4{q55Z|*`ny<1E#jxG#A4l(*vaw9tBu;zV{8s94qM1euyD{B>j_l-$;E`fl?p4t~B zvlRI4xDxk7mE^^Lc~(7YLTghM8!jtm_X4A;DzJk-4NXPu-kzc}NuRf^-5N%75N$!n zUJ6U-Y{Fzr>J%fOk`b-RcS=auUtsj(Fg7G*^UsRnFC2a}A^lx3s3ke)5dN$1c(z+~IXjomn%((=c%{1!@n_uUQ!^YNj{Ood<-DWb&J6sU z8~jKQsAh&dj5F7Bx>*7*6TntSHg(Sj)=5Km4~8{E!?wTih#n?u&NWmwI*f9_;Hd;R zZc322nEl`9Nd!yYxh2HIPny67Ry7VZeg>6RXBk<|i6;M!SzNa93cL3{xvKtO?GXO^1Btag3kpG+Hg!`tCmk4yBHW~cA z0(^(%ro0TDZf@cL+BwzCbZsU&Npf(e2(?xUwA!dLamqo8T2BB)GM$~c->P`t??dFZ z_!F=zRyXbXuT5z*{B5@ndp@{57GyFn6FjW)cU{#T%~T z>lW095oHgs=U!?9u8%J^u=#@lqUi~99?QL)e)8%2ZkNWy0snqoJ^xA~S*NN?qBZ9NR} zM2kXt0yBXagRXyEm%PgY0D?lGCAMEMu6q67wMDfHxd5ZG_K=V^ksOeu|Gft;G7n@yA$W^lHnF_x7gLK*0*J z_k1nmCN%J~wB1kCe$rjCGIpSh`Xr4WCMQRkK2@U7TaGy*y*B+&jk-BZoVO3iuq_ok zQawK?7+$o&VSXS44qW#zvU%FAb^rlY1>fzOs-J1=O)6X@UM4zR1@iG#E*vLh&pq=D zbylQ2(yRJ<7RU!wzfVdJ^*Kzrt}BKqkfW>*YtjC+SF#zq;rXX3S9zxIi#|?Nan$=E zEu<0~$C?yzer&fh7zxLr6Lf8z^N!G zCj>1;`6d$c>n6-A#UqVc?`KxEwwv!!+9T~}?#c($zEAokUoiilylr>JCZrx{fAFQb zc188mVc_RDX3@o+s2)9%)l_teL?X@8Zl`={F~mkQS`G-XoP-tsV}u>U`mI{8k)yC)#77WSsFi%tH&fynoe^5uoyqmlOU+He&QT zu0JGl+zN#!QV*`iBMPXSdz}XjCCCS;$T+vCuS{;&H|P?LrI$Hxk{mh9;K3Atk->VK=Ye zZOdmcw-RYZ9B0~6NCbvK65n>?$~Y=|4zc_)scm96v9CD#Db7$C{{qA9QEm+H{DWPo znG)Y=uEmY9xRmiKlj`E(>#-j7ss9yCuNUHw29XN_u#iSVUi4`^mC76ImXP>h{ooVp z_fBElZ*lyyeH&u?Usm|83^t90HAo;sWo59=BQsY7(o)F}lameky8$8|I@G>!o23l- ze3$u>iTjjXc(z|Fm9vr+y^x-8BM_E$oDDhW|j*+pvwza-*m z*wNJEkMB)EnREO{xSc2{Ihk1AwjlHCP9)5um{6XMuyXA7gd^;?9AU_4g1W13`(htX z4QOYnq3wHLx&0G|`6QntWq_j>eE^@1$CkR#_7pB^@ixX`1Ih~q;gxIv1E71IQ1013 zI$$t_w3}Dr$-w*(G(%h}1{Fu|;ySM22dpZa2dK|7`yPFGl~O{aX)V*O7JHkQaVYmnikOy^`5{f`5A)G3vAs>IT0G zqRdE-Mr^mWfPgRpqXrX3T&3xn^$JMqEClz=SnKRN&f_{hlng#jNDH-seUp!PBnA9> zr)GSig}6X7f_c62;GVxn*xq49^YVo^8{z`r)Jw1q*GuUMn`aEP+ zxs3-H1;r$`>8!ClxTzd1n~i?p{OrnlfwKTcMaEuhM@*+G8aKp;pQRAVP#IkzjHH77 z#5LAWA`raNGEiJU0$=-%MPE8LZnnG2DU2zv z6Z=UfkJDU*&q>!c1@-h(x#(@=*Yu#oBwHEu+%9M<;Wh<2}7y(wwL`Op;P+kXcZ^j_<|5^%#` zKTrsut6;xA2x>m=IL~79s1hkJpuI_-gO0Z?^;N-o8A9_78(Pw(kL+Myu^wSF&JS*Q z?OnKCL;7)g$#+!`_VlgCXvuZw{l_ZNZrSLzf8XY9o9W%)yBS!S4@1*SCUb!JmsoD1 z-KH!5M_x`1fr2SiDo8jw0@p!@M-H-kgZ->wW4brKh+wV?Y@f`k6+Wze!91J18d)<) zRhZxbYyc^@tJi#4fHORRZ6M_Vp|X1+YESB7vUBjo9i{dyPP9m}euH4OaDqD ze(oy1e=TM%<<6ul48P+tzcPJJR~x%m179jFq9pFb^zai30XST=-|N+NKbrf< zGB_bnssHb~6u2tRO)D|thHFDU6vqODT?|=|Eow*~pEETfjg_~D4R9RBGgHy}yHUGd z&lQ0;jFG-+#zaW96MR|IIB%Co(e3J@)q42D zYO)B8ochQ}QLB!>!PtUTa4+LB6EIyqWdH9vGR^56&#mkqmgVkT2Eg6-#QUmvO`Zc{ zy6#Crcb@Xw@0f^0t@J?BPV_dl&#JNzWlynxw9cHQ`h_o{V5E-uKa{&Lk7jwm!j292 z%RgR!@Rw((>MlV}UymnNz?1G9R=}{Enn4dQ*}K|h75e-vLGYg$4V7A2khUpRdc^n{ zLBOW`%-**cL}bZV90ZE*Kzo9JTHKG7RYV7(CEx619~TNGPqx&4axaWNCVq!%&0i0$ zcX%ue!!;2kPn$mP4^HEL>*14>L#GaxpK70vH?q6R!s&LRe7mb_!+U`nO%zeqJqmD% z#VWvRVhPJGylH#4wP2UePcWMp|FDmWRHOj-PQ%9*myrZF0Q#{1lqyjS;($uXw-YWv zeI)(z_1NEVbN(}YVgP*Bul#`tcz342#12-Dbuf;!f}V79z(P_96)4Qw<26T7K%$Cg zOMTv~qXZ1sy7=}A@U98+AE-3(4KS8@{+o3-q709ns?|?xMh(ITvanh;!I?g#?WXHk z^}^`^>;65Qmn@!D$Kp~{DH{e14C(ynDf-na0Z~WjklxvKV7`YlWXD?;(bShvK3jIV z9-T41!~3^Cu2p0c5`616RJvktRG2QTrlNA2o;T=f-y%y@PH#PgOQ*ePIU9+SjZstSD&xDaW;lWBm=p zvf*h_5#ucHq%{CQiFw*5Da#< zC>2_DV^d;ySLwPH9}hFwhZK)YxAdfict+eme&22u7_x#O(^oBJ+xxQfVJT!20$UU; z;zC;qwua9~RMvDkNd|5>qorBBd1c-eF8qBq;m{pXu3oCg5O<0CYCQQb<|M)IUV=HJzy z&ta4rk17{~B95B>Lh+{Fze6sf*c#tq2c4xm!-<*;;`q4)M;b#bBASK;gLG-p3Gs2b z{)_nWfhRtncYol5wDJFB2Iqwz>2`f}f{vcLyL=Egg(odx2X#pXzw2kVtM4N1TaWj_ zC%SZ;$1sRy_vKk=X3_RV%{e&#s3I1MBOvfRS^&q@&!2$6d+7;-IM^)>Tgs?X3%3${ z_d2$65q#T_stSAfnxH>NoDO>^0K8^HTBzCx6ONKK?ao+Y#&|OfYKlneA{pv!D?&4_ zQbOx*Sn5k-DldoZeQBay4i3h(+{0G4wg2|N7_Eoj*#w4g^;??w9Wx{x=%+yk+ zvch;iMY~O+50$DHr`~LF!2(|rz5z;nSp1}q~}FGqCkyXNa)@9q=lxZIG8eC z&C*=(nGFl(DyV6-Qe3`eT)gw1C3I@*HcsP61E_@U-c;H5y6zy1sk}6^w<{Um!no1V z#T^Dy>crYW*TN>|`jqtO08+q^u*1uk={~)3!PBF7dzn+e0#+baJ;NJpZDkuEVO-O(IvV=6D8)04LnXea)T0K%AjFes;8HG$NP_a6`7~IjrId?L#X3 z?FVe5;w9c?fuDK^A@H-^U@J<@WgPOB&{~!^{e4q!{L9icy$yA^KJY7ylbDqmkdyXssMNnQu z+oQ3f8*Bh^#io#tThGiLIMKd*txqSb+TvyFx&(9~MG>dECf97j7?Pa#s+c{aZhcg2 z`Z&c}81qnqs~Iwwm3FpXxc{oO1j~3vI7&YIT+$qXuP+KKDRoiVO@Wb;Sx1-r>Nqje z@*%&w_GITHCPSDu4%J6x?%;_o;KNVNagT9{@=58}aQ#g9??3Z{nzAiAGtQISuw=r! zNAy5D7gDkq2oTh**x6FxUli7u$NSU<_CB7_a4(>RnpuDt@WF;37F|O6F#vV#khAK> z;lR6+t1RhF#2M~|cgkQ0A9$YXJ^6{0(8HRnLOC`qBCmhI)y$fPFaW`Jr2I^>J|Sk3 z4KsD0)YJ^9+0O>k4PM}PYFVv{WO}8WJZENQsnwz80Cfn{NOn{xfp>nz;!mh2k}rND zI%lvBCchnbiUV-C1bzH5j_?rAuKs6V^`{hO<8sq+YHP*G`B|&>Khl!g-J&14Ou$Te zN>~$P=NL2YemH)cm#ctz`SB$!ThdpBil@gG+nk)|Cr7`CrwOPqM%eo=sFOReNAEon z7!91ZChf!lO7iwT-frF21ns+WNG zX#`sHKbVICu%^qwP71Kg+9!a66%wfA`+-%$RUGIkzSBRG;KEKh#ZCbmC}XY4pUypc zmtIJ_Inp)SM+EjYfk4@h+=FS=ieY9{++WfN|3N~;fnak|^)R&Uy}U`Mz!HSf+F%cI z5l07rUDnwe5=A+6TH=0d;g zNNH}12fQ#TsEpS&w>f}lw($ZCF6#X2HLCCXW(G5YlH0=c>m6nr!RWUASsBlFsur<` zDwj++*R5`b70B5e=TX<_XV$QWIFIH1`LrXZ{m5&+-!8#O9|^Vl zn)-hk^~5ovAp50UX8)5;b$FRJ7B%_!H1NE1Rsf>x9=n3&rc>u4@bR^t-;N$TAV-n1B?)TzJ?zYiZUEg%dr{JtG}*48Gsyi%6&P$mT9EE;V=29i zyML=@zHzO=)lxaO1e2`)|q==}%St`4Fw(-LKHL(lR4-|GSvGn}{wKMR8QZJnf3ATls)86kfc z1-AHhQA->WA0V zs+Hs8FiFl~)&&mXg(`7zX7{dh0}5pA-TfNB)5tQof6vdT4`9dyLLJX3%(PYlFbkrz ze*OnncAD|F(EvZ$C(}%*h+Jc=wL!g0n4(5>Tt3?QI6O)Bq_7mhzZ*)7f$}D<5}P^% zr@lRcJ$}k54P@nAq!b^)TSuccd-F8_FN>Rp=s#0h@U4cL{*87zo}5IIg&QL zS*l)&;P%)`XX^rvfldQ{xkLthkzbj*olwYig{4Cv25OpGFgpPvcMBvyP?PJwqo4W-0JUvMN5+|9 z5$=jzYFSX}CO12qVg>s|nyZbI^uU-X%;N@#? zpj`CyrcY`a@e0JD_Sd~W-$fCOf)IFTM3I{@jC2nCiAk02VhT=7VZOhdOWQ+29b`yriJJ31?cN@0*W?${J4R&3&wrg z3#-ejupilpUXrl7Xu{5@@P)kxmH!}6(qV;r1L%7N&tQde2qnSF-_Wy0(1`{MwBn0@ z-j;ZbEMG?Fw4d_9yc#^x_Idch^^<~+&jCGi$XarMFAUpG@I2j-UaATe!hjV*%*Zx< z(R25gA17|KraJ#~NQ;hM**nG=3j01%_C1Fsf03G#&;6}`pOoP03HzNM6}Jbuw!9yD z`jrWI-<~wHncup3xF7;h60(eFB1ro@NYxV+Iz^@KffyRa`iJ=o_U2JiA_?LlOc(8G z$Mx~l6{9opp5v2v)`_XmYqTK82CSjwmWi}0|lLIUo9>qd|`|4#`d|S1hEKsaB$Y}ofeP2 zi**i&Wo}MhI0#<8NB-A}cuONDS9GaehfufMYu=(dg8e`2fK8)&y8PZUHgkf@5$xwH5=NfSuL$oBHS_5=susS@Rz zZh>A7ujRqYJ&oNb@__fN-G6N$?Ye4PMv-4Oa1d|&QP-D3dpC*Bua?kIN$q~`rVls^ zPW;JjTdHRQpu@-u+SNSSU%iROjt&*qVwSdzbr;n7R`(|)(Fy3-HxNQSk--&I87|b8nnobNX;2uTd z-6d#+2h@=`H<83b>M4&_&Xy4@u-U*I@6dgl>oIu zV?5@Mn5EzD;*PH1TTz9Fzm#XWG26-%QuvfDdGG+Y^%(!MZq?k^Pb5tX!phzDErydT z9+5-%o?0IqBHZ7>APbcb*NmU#V1&Qz#CEQxhI_N~zKBamKGZ3C67Z?8?+f<2l*GvW zCpth)2P8SC$+ERnqN7Wy6jITJy$%UI*yxb_Jc$d^#RE!xJT|iv5WB8e->mi>Xnj&Q zj&uz_+BA#s4Wq-PCSfOL3yE%N9bfyPN;K*}p^No=jU`xSrK0^Fr3b74&x`i5XOkfj z+T4JA*}PAr5$T2FN^mgWyz{E(z4EMRw?VX&*=-(HMCaqe;}DUx?#o0aS25V9_a5YQ zJ%=P8%C}r%D^Cl|oEL;L;!M3CZLzWPn&TV-e zw&fVyO^Gua6YSAf0%vr~A_MLh9OjineHnlolEX`J7A@H=IKw{OME;SCS)(X!c-ldb z`{sN!_Oa66-Vz=B#(ZZ5EzJIMYKnoNt?cv!Ruc>FYs7nacnAF#$Yx9N~= zBT3G%4>xOU_b!oz%PMgbJa|jg{C=EOk)G(SqzJ**c@g^M?mJM@Nr2TPIes{SSp>ZR zL$JLy3&!11z!PneIe(0QG66h^b(-P;2~d;&@hZ2Jmsea5_*Rm1OpjF(?Z%zbqj$DJ zCzqOviOSLx3$xB2vJl?MqpwMQqQmfDWhm-Fvohg%$aT@D$Jlzl_!6u;LpyTs^DHyx zmY{d&StV}|;;j>IOy6a)yt}LRv^xy;tNKs>)6uY&=I>ot;nQv=81k!DkUFq#USvQV zhm4LCU7b!ROi46@MWae)yMGi~ykG11u@5z{2|Csn!9-E{>q7y}I-NUeoGf%!i~@LUKY7N4u}D&BC5XP23`ay8 z;r&K2#6M(D4)a>R%3>;K>k@j-GHJm-_}ex(f(c-tLit?_;_Ll!j&Z#jVm83ucCUn` z`(8JM6I8J>Xw@VEoS)TwdBzi+7aokUJ~bOhBu!&En>O^?=XlJw0O3Bz>sE6q+1(ix&{CRSrUPOHQFaS^ zmN&L^sOo2)F2nmT1Qt|H{>=bGCe1pA^47MP13EIyA%l^~zft*nOt5EP39X=KwaMi8 z9xD1l;j!HD&eQIU14w(@j$Kz*UUx<%q|b)EWyks>J8;~Q^keGqRVKV__A9{&^jHQl zY7n--2K>bUxH4$u0!uDM6two8bnES0!w0qM#QDq#!k-y)-H&E2M^A%z#`KN>BW#UY7Y}w5&wp2em4%f2*?aGCh2E zq$94+w3!R&u_GCc&qP!G|#FS!vpx0op$Q3 z8$#~`3flQ3!whFSUlc&!IbjQjS#7&tY(fSD%R*vYe4?1^lP6F8dUY2B!x3+d@ITY$ zAB@W1W&#|_Ui1?JXe-R@VUEYcdjsO)LYuT}UO;D?GI!X_k;13Nb9AVz_4Ajwhdh;y z+(Y67fKE0V55B~MGN!Lfc_(VlH_Yh@93ak1?9UeO6bALc)6XFuSAik-kl#K&2Ywf4 zG`Hj%4$z^!9DSv-V7p+o-&zGhNfiY#-r=r=m>yJWO7<%o`XmvGC$fpJzDUHMVi#Mk zjl?H14$qOLtmkJ}57h&JTbfeJyyyo4r;UpZiD%(r zK#Qlt>o|fJ{%&SF;-?u0=IW)8_X~k9B=Umwu^lgt9b`r)QFG;UBmYm`%`=MLivI zFdo2=$Z5c|Xwm+_Q`{qEyt;@b`Ks!9fry}(hjNxFy4~r6gZtw1r=TjkB8t46wtfaT z_yAIub+#wZ^RI6Vu$H!SMp%X{Qvf`P1L&(cH?I_y zJnAhe3@K6Ux|apD9cn7q;xjTLEhX$N?0@#8Gj_%IIXg9Uwf^7}jc*>nykP#G>}+?e zOP0IA)O{E4TA%fANbiOu;Ei&~-=(+2kiVJm-7;+LPS^t2=^-=l%XtZ|JsZ5tQ7;Uhiz89N5i22}{-mNEB?r zVSYJ;k<51>KZz%FgBpO!u@k**Vq9BzsHGCcyom-JR$iZ7I=PE0 z9wk7GVb~$Bw2!5exZl=q+P868OuWaqwP9q~ohBRH>d)R=_(TF50j55f@}gdbT#6at>a90fttbGgD5>{;bN` zpMCpQ)sjzX9u-k`SQ~$?&%#VJfmT&TJgjoqN5bHBgkR2Yw`sGAxS#<1XKVT3z=GQy zKZ3ESv$|R|IkxlbB|P4NMwzLs69+n&Yy7I~R&D=z69!N5Ko6LUsqc`}Nkqpr8HJ|P zHua&ywN3#}=;GqPiL273PjM~wSc6|OX^aZ5`6L60BfcjQ{)lL1EEJUbmmR_cxRrFc zbN6k(O!hdgA@MMzT|tHzfIE`IV+4JUzc<&41Gm3C4PgU<9g*v;HZk5XZNv3JkD7uD-i2%}PN;5e|Pk1ijZjXF}jviOnHi z9ocR$kGH%Q+^|oEq`FAwqrCbr%D~CHH5ZZBci$Yq*W6|dh}Z*mPH1q=3{r!X@J zBc{J&txKz#e=Qa>1GnFrho}L;mZX*EQwBRGsu$w%`k=us24QHV_L121EC(X`zw-rE zw+Fqb$_U7jnb}xi;SGNIOB!&2(0g7A6PKNN+Lo5rQ(=?tuS?MUt=l0WSuqwg z=2H;)w)DCmt|biLa%AN4{w`bhMZB(enY={wC1L_}?Lx4mexW?#xo~TVN3y(P(kc$3 zgiqJ>sYTsZhs|Vek|3~nzkA z_ABOx2Pdqi)?;7^ZKkOz0Faik-`|^7*onP_`}WLAi0ZWIswD)tudyy9Qf212 z#Y_E3$Y=w&{ktg}yCR%qgef$aBS()&Tg(6GYUX!OTm_WxtL`Prm9MM2BG2eo=-B4e zc<+V<4qlvN^5k!nA6pM$&ZTyFBXzb_#!9|u;n=sL;K8g9$zsV^xXWo7bJ6swTMs)@ zC2KUX`dRrXO9NSV=QPR&>$eNej+4rk-P{k7)<2R?I;=lQBbv%Zqt|0zVPxGBXJAT6 z3fOv?MPU77(40&xF}KsKZdvbmScJ{bK|q*FIo8SK2^Uej# zgOFM1ty53^o_pINaob@^i16vSlGJW?!mqz7q;J~FVbw4%(U*2@#F`(P*6YLGx;j6c z$3nY&g2RM@_Ajj2W6F`*TTTcQE#tK1?Wcg*ur7}_!y75AF)#BJ9tR3$Zb_#bvmm1W zf4`Q#N#0%iU|IS1wz3mQv1D?5Tz-p7$V`2C(b%Ia?6V^jhBvmLM;|h%s_7N59xh;q z179#9V+#@H&3&oN=sw?X ze!E2$FXTL?dmX9pDrB~MT7rxxkQ|?n5;qKoJ6rXMAuEH)k}SX4QgZh|Z=n^{O0qT% zf%MN8C--IH-45I_)GFm60bwf{e}AD*VaO);8yb-9s4xZzzMj>j3?saNyRS7Ei>8VAdQOD)s=!I|m}sK_HOl}4*~%pt zX5!Ix>42-~xT|^*eEBZNn);4iC2Dqc&HdfMP9&-M38r%WV=5{$GAniW;r2_>aSslz zf3=)!xP55#6Rn32GkVJ3gv3Ym{mO5XzGknOH+C_b{B2{@`6K5q{qtD#td$m8ceX`r zN!+M|ba@KNxmasIQO$(V!)<>C=9urQ6D!4^8Lm993Rbo$JYvx4SAr;-9!#a?S9G0+ zeJjR)usBX1a@O4{e`}XPU&R?g%Q8Dn8O{IVd%b{sF>&OIriKCzj_n)VVCho9-HH#* z?6)Qx%UM#|ZYeGVMwf{n zDcyZ0f5@7}?l#;$thOo~Dpg@Usnn)exy8>Qw-x{=rr5uFd<@LKVT3 ze?u&b__G64aUoJAW?BcqTW{{ddibJ`N6E4U-yTHGRqce4hwRc@QEP1uYz~kQ>xF5y8Zq7j!~DwH{txi2ob;`y-`Yk4YE6RID;T?Kz^_(`SLMgK_A#;19gjor4e_x|#mrw_Gtdg^d-NH!*!+GADz zXudSn=QMJL)-YSFLN@zG|EYQSWVj1CiZb3~Q3Iw2nZZR_efsujJ{G6WDarIB_)mTk zG%{f|C7t1XZ5JnAdLTDGaM;}eS^Jxh&-YpLL|ZE+Mc z*+-Lzvp3Y}nKNDf%6MKs83KCAXEXl_6LkzR+;86$N_ZA~n0Uds6~Lh1@c=U>H<}|5 z2}#k_ZCp-TnXtkB=$l)5sS`tebo|JQ=hD;zKJ6Y(aZFcv^K!)~N+H+M{8Cw3)C3c@ zGWyE!zHfro)E10W@dFJ6X({gO5*p@?04&WcUI;`GqAgaT}&jyU~;XUhA?~nL#{&b-9m}&TEgTv=DVzOefv+%FJ?v3yE%H(*~Msv==gNHVe-27LX&V%+YA+l z>98d{Rui5mA2>23Fxys*o@&R5EQHknpN!M@M)sG*xS z&hnr8E_^jY*!$@4?E9Qzz^jDmsIHHKGyd^W!Ex;@EAy1iF>XeME3c6v}2tBfIJFG)OW#^31x!_Dv2kA-A>xQUudxwt%B8P2>Z#8m0bi(_o znzx-K)Tp%Gog{3OHZfo8elAv7kul(U^5WG%uf{XguHAflzkIo+*KYY@H+nHLw@u30 zin{!f?--aBSAN|iAPWBaQg`icH5BntRLM3%8OxqQmo$l?=YAbMn{uNsA~6|}WSQ~f zAIkM9$Y~b3#PG$Q{1TKlbSK66)-kdNe;EO{I+~@|E0q?*-2D4`C0bms17lNw=1!+D z7yFq!sXAe3ly3$VXM1-HpRaLx@xs@HN6Dxm!;}=c-xnKA6v)XWVv#->`o!H)NJli6z`M2g8BbJ9lT7CB%9^H1P0&_Veg*uirJ1<4 zbG6vx^t?5-G$lM+xT6`=IPZ-y=twyC>A%FfQMT7htvs5>uM6e7gx6tR>5c5wX$`L3 zk@K?C6_8?HJF)#P3cYInU90O@Kc{RUMEEYl1cifqz(=7{Z@fb_VzF3uH5X-N zi3#;2Cxd{8RjWyIiFkMnyGOc{PJT}1%TQ2~n0B(J~4JS+A~3r$jyC3WwWP#cy)G_ft-g+9SW zYK&$I_R=g4d3igvr{_YXIH1X-uGaMNxfXsd9Uo6Xusf&htMaO5ul_wpLY#Uf`L}-W zA9qveJp6h)%1pr@|4yIAR-g8Xd#Ehwc?-?p1_6=F0MUDi;{$>h--qrDk7} zV8@xp;ouZJ{UDhJMZTgfp_LUa*^K23+k+Y;QNSJ>~sZR+5jgzxfN+Z{N0!U4VyTQ7&QX zf0!>R6N@nC@48u5aOj6P(JJySismpg3KWL4G6bw9o?e#Fx=J2!TQNT^{`o}rjkaoZ z0Lmb~(O1bA7WHy0znD0Cd$9%cuxE<8ty7Bttn5%ejqR5l%rA+V( zlgDySeU8gZ5dxjU*_{J6^4>J#d}x4=awW0lVKQ)O%K zZ&>yV?KrrkqP=p5PSLA=h9XGLQS5;ah&r%ZOb<6Za+LpkB^khqdZ>2w9QvpLvAl<{ z?uKGB{@mH0@yG%`nJB@UZRpZ$iB;9`^;V+PA&n4Kz%w?|90%Sl8mq;ZYjbk)8%q?f z*P+W*nu+2*BTIAJVK8`2G`f0+zz36g^m*}K%}Rf4%e%WO1@E3TzD(>7@3()+pwIF~ zI}l!4f1`HY{5rf)N+ZYJ(X46l?gy$C-CZC~v0~nU!$Hr$GD{hm*mq1uEYxhu&`jrr zoJaJJ9uMtGGDVTcNd>QC`O{l?F`F#u$JAw&#Pf+lWJ0>B)7j%$ zLR~YPHP0{YvkZ@+|4aG)7ZpLw1_8<2(vbsKhNy0;2t%~3S~j=0_Me^RUfylHjL&9u z=yD##vm3*2@7$AHZ0yjzeJ1qq=dYDHult6`yKq0X_fFpBc5=MEUiA~v&FlO6<{6vO z^NYG3s(04+1yN_{<8QxwK(bQkc_jTYeLjKgm}}ABzcuQ6fc*!t`i>u~h-axtUO@ALl`b zM4)0Gmln({mRHRp6(H9v!}w>(F(8I#p6`<(`e;cOw@ATukEx=GqUwmsUefn}RSg^O zNba8g*48|iUlHhtcsy&Q!d@Sv*&-dm>Oh5OEYtdk$p%+jKGcr%&}i=J*cU}wSahW& zFpPK(riu4^R_>o74yX9%?kJhoca>{u#HYon!Z*WVc2NVLsjm22#*%BMmu^F_UaNj$ zwUA%7%KY(rmma2Cr{{jLmg9MTwP78Qr2*}sYt8XS_aC?yKK?e!XXQx1WjFZnQ@6gX zs<4f&%kLH^z3gpoc*}2EjttxORyV3DS$lDIme6kmYrBaZcav)2YJ8fGqDC?9mg&hM z`0skF^nn<@nh}{ro$x5a`mE=?v+>-+~S!e``W@&vE1hmCtOrzR0KY=lIdZc57W3&iwXjiemqn z6GtyX^$U6)DqsbtICUy`CfD(}FV_+m=TiqoK!Ue!y2Bf6uH#q&(t-CEoob_$wAS&? z6L$u(T=rtOo-}+plC&EWgHOP7vtwR4++Z1+4pOutF@;}Z@_z{5!s5iWC_|oyebRjW$)Wq{ z_(=I`g#31nVRpITBO}?}-<7Pm)6qqEHLqpzXBFvuHu*QWUA-tcUU;HR#j#IgSHZl%(FDXNdwUnz~4C;j|achEv=_EY_p&{KZ9UEw~`qxaaXPo<_i zNL|^uv#l(nRR^e(JZBy0quI`$t!5mvp7E|`9HybaT+L{o<;V!zU4QWGyCx+pkE&tB zX4&n#s0EB@(!&0G5-|*oQnj|??ZK>+*VCuHbAe&INew@LbCU&xjqb*g&c5XAYl^Io z6nxsj73wZlwys^Vxf2L;9Y74+8mBFrJ!Gg=(2e?XjJqt@^yx$f{pprOzl7;;*k_IL(o7 zFX&F#R4>4%>&HF~UsnyY^#6lyz!I{XP}ES-J2!%EP!{swJfG}iC$aKukrYO227b@_ zI+ruX^Q7=-!*4M2!15qk+n5w#>4UxKKeN zD*si8Zqi863t}?Kvcde>iq7+4w>QKg)b`2B)I|lm8T0hRuel3p!-6Q?`V`u4h9<>{ zs}%N>tY!r@RO~4QECT=XDQhGgyW|Ht<`VfOp0lus?mMU+;IoMB7v>q{X{f$8iGx7> zyxhL>Oe5&O>~DW-WB*vDEu)tVm32e$JG)@n6Wv%RUhe z|It+25DEp@za-P{pM}PfOc5UcvU)ZmZY3pU^6YZ#o48;|{ZaQ1&Ge~_^{wPT@PwkR zjf$%4_yHe;JIdEJhQFWqeqT=jU8@7;4-}|t z$n!zyUUBL+j=tDXr=mn2(o;NKi5ywa1%c>Z4**0s0GfD}_2|E%KMdVl@o8ZR*pnO1AkvFkwW=tB@%5bdpOBMK+y=L$he`9)AHV940KTr8snlMA)1_8AbEL?UQv!(8(s@XaU`0-aBzDO)(s1S@ z3qYm}3wzP`_P;m~YqrW=`gHA+&xL+EO9REo{ltREkPLM`DZ67VVW0?^+!ts~QIHDY z3dR7n(kIkpf`l_>bDXz(5X zVgc=y)*-(phGy4whJM*Wj={gKpr`}Rk&tP&PY+5X9`~qI|F@=5<*@H68+ff! zvLxnftY|DjGWVLxiVHnIkXClR?t6YBrvy7B+IixG4)GH;iS9yt!TzYeO5P>#>+n1S z+P2XzVzn@PibJLRj;Tcc8)EdJcU{hfc-Fu?^iKFK0*!0ip^frFE1R;YlovqoP_S!# z`89+@AJSPO*`-ht9nx1ljiH3UPg~5{KDZAFviF4+*tnZKZ&QYYM&g#&`&H9S(P0Mh zAI*n6L+CwGA~1A+Q-C{2#~WhTiJ}H1T^3@6D<6?LbBG|WH13bOeG}bYPz9?4&12E8 zUlOHICd(N1m}yk~DX&Eo)))Xou;150gooe^1L{}kd4*yHF4@RcZ*DFme-!j7fFj)i zDfDgaoqVn;d|aGG$P#aMjwEv~`ewi^A7;<9oorVMNJP(^)d~`VujjMnwkx7K#|Ka_ zJ2})$O3#8Nz`P!#xp`aQW1Mg&b8G%XB|DHpDk3nh)ht+_QyJms((FN~C@z$sVda{?fc9{*kH zZ`_l)%_N&}-BTK99HhptV?{X?tsX2o_UQ8iDT@zZwoRcq6<>UfFMYP3jC;s2&{O8_ z_duKOVv&6BE5lmp=scnrT6pCZh1MZ`BRMcpAX6s3+DK`C1~@$hKz>#)0#o&`oDtj6 zq(OitI3XQMO+J=1$V~}>X8fQ*9)lPMgf;ezV!l|WDbygBriNK4YNS8_8S1(s!)zuT z<4Cc}73EVgNYv0DY~ndpleVfzao}PDH3(xu(x&J^+AA7Bl?iwWm|s7-+^&LHvkwTX z2BFfGPagqz^J4%{q?mdeduTiLmSSomHkwug_O9)N@xn(akUlImxT{pGtFnty3(xn0 z6cK|4#T3FzEn5o9viPZpH(v+bRgxn(K}K`04-pN820tn@5iT^@)2*CYuhSQ@E>BeaFSeB-d9gQ$Ubcuri&NNV0tXF`pe&;-*02a& z?@7LUD)(xIJt{3En7AWqLf@+%m&R;qz%tH&Jcb(XAOTG{HQkHhi2gt*?y#b4i$f!G zn@^RAY^P@MB4Vxd9c`g(sfvryw_A;<=NGZs7(LMklJAh-6+On2_YKnP63rCK`YywNR0!|cGnzBw=S4|~ zf`m{(Y#v3u+4A2sCM-n+e+H;z_6TJ0ydUGqmr#~V1Ukne;ZWA`q^r>RTj)>Xv19~6 z6M~?Qf-k%Jh#QFeEa9+6d&1naJk*2a4*Y*uDtEqv|)-=;-C?EF7p!FZ6R=5l;B0I9#&7R z$OVq(HK^rok=^EZ^Cyy(d>4wsh_ zK&64)hx7~nD+2b4Oc+IwH09eBPr#fRu+o!xjRR6IV1Rs{2sRd)JJI4eNe&u2{37y? zE99XMg+|c9bP$C*9`Tle?7ZZe4^j+Vuz)HRjvfPNC;G{MheUJd#D1F?Mkfo!A*E*c zu4G0M7;tVw7cEdG_gL5_Gx z*j1^oB-G0Y-Q7k+G*%4H*M@~406~em4&lw9?vMI`dScxn&ZSQe5-fAts@H#n`svSh z^Bkno6Fr2s@E_m60;HuWiA%PH=t8F>k^V*&FD zm>&?iQ4r<}CWp~RW3%Mk6CJ0uX0;g7F){VR_GAUHuae|-v#zdj&=ngd<^Xn!LDMX-oL13bGt zB30G{m|g&W_`sYM)FCxDQdQRBH9OHKE6R&XpecS%AWnIa7h>XlME+l5vYdT`=U*}r zvb`Qd9Sw-22#Br7<$;zbPma&Gl|HILAbi`E8gGmGY*Q2P8Wu zgrvM*_Zly<+i+=%MQMSLQN&^oilC4-N z$Z0`tSLbp`p_DqzTbBr3i42RAMc|%_heALcD1^7iP=n?x5eWHB0l_ps;rC=NImkv| z+s6oVLNUtr1Q6_dQfncN93nOdV(aQ)e$%51c)O$q#<4RYpnz)O<(u+wQxKVAQiv%I z!0n;co*?;mELFiITo=K6j4>h|pQ5Os9l{jau%OdDd-7wNB6*aG-a7`Mri2k8mKPNQ z5|>v@`a>A{0BECwiW2~FqiPl)j^0!n;oI{Ca+{zTwI5iZh%+D=x~Po4W+a13A%AL} z03^Mk zkD%s%@`&E_zQ}}@Au?XM^2uatZs#Ne$xTyS!vI+(5VbB*w=)_JPVJh2`LitU;7^cjTBYFFs;+9ha zLRdV8!18DiF0UFJm|+O>8Dypjle~?4 zgJ8gbOx~AP8f4i-fPfl`QJa1YCH;m7H#~)oBhbJG;m2g$kw^A*#f|+hI}e~a6_uA} zA7di0aI#9FgoHTVLu4mKgsU&A6G9gyQ0kjUs>G38+~x=|ydaPc(%K~#H-zA)12W`9 z5e%cgkYH6TAg2nHkVEoc2|_?a!&Aure#H_Xy9)jw)WPaRoqaXB;z1(&uOvGqv0tdY66=M)ywE|94&EyPJi7N7V@3W2AWS64glQz2$|hek zvINBSWFE3Zrb@JJUOTk2L$q(jdsmd*2@s|PFfkyLR|*G_=LZ=`y6-+FqH5qmK#+yV zF+%|<_(2NN2_Q^7U^XI55@32F%%_l<_8rn#sZz#|Q1l5>v^=^CZ5NP?9WcPJh88el zI5wiLRQ!Mm9fnXu4=VI}3KXRRkTC`Xg7!e4QcFT659s^>=`(=dO`05bG5Y7Hkby2_ zvlsm{f_|&{U;_nMP*0RE3_zt^{)gFsMIHWMUOX^pw*-`#ha+GR=lg z;-zFS;&Z;ZT$n&S_6{+H@4pPcXpF&|NKAoWq|t@1E_D2V1h(o$p&0AqUDI+^4hfJqdk$LP-GaN!~-~ z1yLdd^cng^?!~o_D!hER8M#U?DFwuaw5i+|h z77()Hy@8@Btb%7vwGV;G_ZSif!-LMtP|{gUFc|RtZ-5G9s{nsEBL4$G77K#v0dJZy zZGV(J3nR(f4N*wmHOKgR9pFd$3+e623>7V0QI3c1Sg4~=XdLFH_^K;(q8ET0Ycf))>H}(ArwG{Q1KIfN zf>-`f#3q&OSn!pIV$lt2Jm4Nt*oxg1= zwnc4r#%-=W&S{_}RDzZQiqwW8yEYgKaGRK{Mi5z*pleHrVi!o;B!kQl4gXW<#*#8~ z19VD)LQp87WF9X7wH-*QiT)20z_{f1{MG4I9byZ`c<)2{D{S+6dAR|2+7EDX=2#lP z5Qt*BP}>1?&V;I5Oi?mGxd-$gGj7%QeAV|NxjNJzLGSBMerf7Jry)p(@MDN-EC|3Z zSpkgP7m#HG9&dD@CsLwNxkFx&Q=)LNy%pNcA?_0*L?{~QBASfGw1yUR@;r&x+=n<% zYBU?w9+5&zyAUq*S_2Qd{)W;tKLTm$5T!i_tb1TpPIRC-d-0|JNFM^A4?<5QLiPgy zBu6Bq$+29q7J;OZ=Y4~YwDQnV6uNMOdfQ`B@EpA#sJ%f}<)S)#!vtM^0Uj(M4s6oU z;1&sF&ji^o(Lj;#08peIB8+q?R%A?sLij?BAXxbp`-SkuGM1>JfmVUzgwj6U5-kbq@7e~7&WF+&JxIoGBH&QFkYge(W)h5>gYz|vT0 z{L$5TX%Ps`;;m&NX2qac-X`dp1DapJ1Zv8q5NZT~hZ8zH0`>QS6kI4h3@6SML`*>^ zBxv3h(4HZx&g<7w{KxN<28E*L;i`KE6r?#UX`J-iMA`Hx_|N zE6U~QxKScv7|;u>8oDzA&AxzU@rwPx95LknMGQH47Zp=LP~4n36cmZKnoR_z2mxLj z;H^IaJSm`oM#{!W8X#=EC zW(5=a&jA_<)FcN&T*aV5%*DYAu#y1qk1u!u+^lGT>oGt#BDf!du`b}AQbtG+yaznb z00NO+5D9e7Opb$w)iNm(;_V7K9fG=<`4<(WQwEvbo&XIaQ6H~SGeD|+W)QvxsuRQl z;V+@aL;Y@mo+dz#mKqWe-F5>V{j~+6=0AccIuKO{qJCh2s6FT=2;^}ELVut@p1hyX zEh5N+1w3Amu*|=R!Xv>r%^z@}f_Y`cJTi!&`!9k8;dulitbptVXtSU{Cj>9 z5d07XlLP2Ag4_&1TM$qJ0JQ^9pCI&TkzeFdl!x@#-PjirDbP^jAvEkN(1afDK<^$H zpgVe$M`2HlgRhAWDJ510|6l|2-92bBkWf4jlJ!H51L1lATnPx*7y18On85W$G_X7K zYdpkiW=?=WVgUCzBX+C9#sbu<+aV+?^DlySGbrp%oU{S zaW~YwX?$BWk#f>j6C!O^_{J_`qI2eJjk4=>Rm4I0I64;FVmZgmGqlE<18E)~ch9Wx zRBI=z{!Y!w&A@}m{;;-pO&vdK1xohKZHlKJYd5{4w@#UGr6(CVI$G16uIb@^hqp5j z*KgBkqPoRClYL^FEpXSRcG8kEF@ZTDknT}5@wl-D=9WKCWLJ$j<`HYaBz9J4ue~Yl zTC8QKSix{IBwaNm@GjNd)pGfy;F2;{(KUCY4VnM^$8X^w>_bCJ=iz?v^UXfn{4{D)*}Ko zDbRbDVWCvhMS>UcAuYlg+6rp5gDitcntI+fji)3NV+b$@mAt>C*!Io= zlUC|#4JR$*dbhmjG)Zh`_AhJ-BRQ3`JlUCi1N)d*NlH;$CkInBz!=DT7xb7 z;4-pfSC;M-h2u{d4b58g<~CA&j) zo_-r}WXXEz>0LYbEb{W7o2O~@TLJ3^hnN88lWR>+%Z51{$kJJJUS=PwI%C5teTOr0u(%v+m&h40g4 z!i}~^LbVSQ)DLMg5ORS~C(b?(*NGv+)s%y|QT1bj&V~ zf?tJmL+S#Hnv+RfH--&(E{&3x>e*KOMae`t$l1CAy^iNR4uWJZc_jX2s}uhcLdb@@ zT5~DocouI$T&kvo72%59m`dX*i`J8)YuR#C0_Jt&7^(b9f3Epvc{;<*m{+Zuq|5lA z|7V)6HW1>GZAAC9^m~cRpc7843l$$n{g!R$ngfhCTvFchs7iAnDuPU#q z%uSoTd(N?y?`$T$CtnSve13UT=q#2JL8dgIhi;p?9K?sZR~$`TCy3BHq2BxggYgPjq6>3oK2lsN-(MGR&DP#YnGX2=_i`A&b4uENmxU#DdSWXBysYT+fuyQ8#qN0LdHyS-aOLl+&~a=e zcIV9uCSGoCC&}D~=}mrWBv0h@)4snxE(@UYZxdlNCyyzLCs{{)3qS&wV{m zsJWV_XV$5WO*K_eMHy7o1^s>K3{!PB|6gvAsamBhk{kel`ZKO zT#8VSXEHXz18R^b_}+^tWFRxc=%8%r4_J+#G(7RwBH zl`bdvVrB?@rzF^ucl?C|{>5ZONgb1atT-_1v^utagQoHE1-)E*ub*O9Z z4LD_Or~Y$lw5UaIKyJSAWTMfrDV$&W;iqWlOfr|DrNMF2G8BX5EZ%4yu4NXu&)O8^ z5c<{dRz6<zc{XJ^ghV2S%O4CcHtopCA|dxF4IxTshxjts|e2!q;*IPAW1|d!1StJ)}7V%9zvmDIHrzQ6)DA8a(p$q;4J^K!wbI`S8p=+IZLZ5VQp7-CAKIVZfwZ-cI z0&;$f`gtRod~%OhwrW ztsrsW<2pSIg<}1m7k4Vg;?zbmhH|tPm)|7M{eh|y{lB_{e7OO zjFwlOJhP4D;wsfvU5DSTQY_%aHnMHjDNkt3ydrsA$Lc}=_cqAup_OC~n@C-1kM*R> z6VB=4x?AGSgbzHs4{S3FJqv}LsunG83O!v9%u;ic-3PcgPpe$7ZR;|}$gKREvRyvU zkrpXWNaqpP*iM#2(pEl&b8xIt#%wSsJHM8{jqf4Dl<5!Z7ygjM9qV=`Vh;Foti}k5mk&9JJv&WePhe~2Hd)>@ z9;`Y9+fRCGBn@rS=GmWF4br`F-}O@Bd~@1gv!0)9nkf7yB;jhC*Q2`DR?Q|?AonQG zd5c@}gl|NN%#~#oTFJ*(XVR^{Zq>c1+U8KjDFRJ&l<%^A?BnH=k z*3n=}XG<*7O=iIawQr_DV&vX;bzZ`@5Yt*<8QkBXqi?b!@9i8Zak{&t}Q3@rbbKTiH&hD=Ly< zb4z18{p)tPB3J_HF7&svW4n?w50HgS3IEtA2YA1<`(cA+#SLAd_t;tu5xBox^evrX z4$lmGQ<~;W9zmE#5{qeFhucM-9V_B}WL34vOi&L@RntICT_zE9}Cp%B17F%#6b8#fU;eigOX;YO|{nf;#bQ8NDaD=($j8Q@` zEv562COL176Z7G)KISU3uFR#axoPufwUhMyJThm;PK`4W(<+?0l6!N;+!(|!x4JJG zPlIpA>EaIF#(hkFR9jD2PR`K(ibIEEnoZj^Tc!k${&sw~5x21j#e9-!n=fICRk-`m z^(9yT{y<{J(z!e*(FBJc-Oar5IS1d-x$TX|JlV0DN*1A-QtHH>iO3N-_ zhiITiagbAYbB6fR)%v=UW9zSgA<5r$++vh)d>ucF} zB_?StRCi~Ij7@p_ku0;C)sKv)&!G<(BvV^eotUyd3$UNbiz~dx_kxYba1{ zn@Z?tGR$i9*nJImNTq|{Z=a-Y0q54`>T|9b9tWwXbid25W=5UkA*%Td9wF{m#r^qw z7~2E)WM+J9W7{L{3fkBYC{uYUw5Ch{%gNt z&+|XZ-#s|DN$Gya5FF;2Dd`m2vQ`L8pJ3*FtBsbT7SDRscuK9c5c+peSO0r)CXUkO z!DlmvGhI8~a_!MBn~A0C7lp!SY#}4^bw;Z$yWb0wE$TU-KhvlDS7Xl3Pdt8%DKVO$ z)X4E0U(HHrpnWv8R3>Mjd{bI-Q{aPBliZf8?%GBRt5da$Tjl&#ZU5g>dUBL)WSP6) zF(~s_s|~gb?Z!)XN?zH?#!P5%qnfsb=TEc^^5zA{a`-IEq0bm(Qs(`h*vn8;5`~s} z|MkrE#G;E$laC|!){^_H#b;!hFGu=M57v*gLx*|)U*wwFT4QxU+WEvU02v4;-;XgU} zQ0P-wySO2P_iNPypyO^Fqr#?ZpfmOviABJMm6pQene(B$2^sY0foxXE&je860&Q?KfL$=vZ zbD!?4;#qmu&YMsFirFG^745Kj?g0D6zj&9i^lm}rjH}`;Pbz&H#i_@^&acU#pxdf4 z%UiYEjg~tBtv%Rn_QC z+XlNnSVSwBwRgm|4M_s4ly!~s>FA9~o|6&>DLo&y%jS{`UagWH{FS+L|1!_tE<<)G zxEEf3=Y6jLf0brupCx&Ax6OXasI%U^)2G5>kKTUSy$@q zN7~v=i}{_1<5}wYRY1O;XLn<1#3QoakSa~h-LEP9kpVBskf&5U2h52MT0K`?H*)LhHk7LL*GcZO300b<(W^jXDG3+ zKCJ9FftP{%WA7{W+(6*p5nj&)cLsW4J&An|v>`wAxc4yRz;hOz?w?d!`b3(Wlvca; z637X8x`O507fZf7WR<2_$V8KS24BVk(PtOG;@i21BTEb6pOo?#{|yfMHBY1F`CY{G zVPuySQ4so%Z6;OZ&z=mMN*}s^UXg`1P(C5jzkyW?yipd}qf>vw*OJfEUh=>v@L_6v zF}d||!<$H-4}n~~-|4h6KT)f|P_(N4hoY+hYU69-|CUlpu>b{%yIXO0_flK}#T|+} z6e$FEC>B~MZp9r+2@Xkd2*H9o!JUt9=H74i$=%$WyV2J!&G?HC~iH@(N`gzg}i7X@)MMp-T8nwYob&Qudfat!-Aq`8}R$q4z>k~ zrJURiC^u7$8)<9xxG*x9JVoa%%wr$EZB3tuLs1Nbd0He)j zuMQFWYtX~#!go>pU153mbF99FTo3(_sV!llpRg8!nxS#B(2h6%>F-Wv2wpKzF4xzm z&FHHCS1IJccMXmno48aTRF%j?vb@lTPDq}2MXUSTI#0%OII@N&QDnjVS^5KY^_@`DK9OYeJ6zA5(p){Xnsz1RIV*p@l8)~V$NW63J%x3>ew zOLlOU06u2b2vB>S!07v2(0Ttwis56jDlB`W|7ujg46`>nR$^27W0#D zZ?3ggrh|X`b4!ps-JpvR@!YH@5205Op}S`XNQGQR?&B20kQhDF7(H>+_pFY*#VhMu z22>{>gvV_^UM}1M`7zmj@S6%x*$&$`@wfX=pXJO`O}tGAzCGkNN`Pu9#t$#XF^1a(RDRr zTLN2iCJC;*TcT&Myb7?eG@t)(XH)(aHu)4{EBuU-1gCG{J#3+xiJS#-(cuW4)$&$e zF#^7S@-_;strGofaEEE0fN9RT&Q4QobtD*0*?#%E@^VU1Vgs1|+^l4Y2fqBl^yqicI|WYs6re5P z2WMA#ZY#k!3BxOlxp1IntiO*jnJT!{E9lU?n{C@~lp;7X{_wBmv(bn2@44KDq}#qS zott%^19|1JF6F7rzjQ?Rs^EgK6zS=>T1Trg3YEE&(JAr1u`FX*hqYVu>eP`Fi*F-- zuV!3V*Oo2^mi6H=WXS&>=y+PTg&tcq!ffUh~OXZ+W^xJNE_+gRpG?_N_}?%-^k zD?E=Q$J{vA^D#aOXP4Gosk(bpdK_owed|&V^}o&M;w$wXi~MV*8lDF>#RflqJlLEn zm_7wR2Gw_#_E<7GG7&#NWj#}*wBQ4~!ai_lms#SSfar6ZoA@eV<9y|l%0q8wYhXt5 zw~W>s4pU+x>orF_g#_mRjD{Q@t=IoCSg&z4*a(sf(qdgP>zLW+^e8rmaX7b=PX4_c zPw(0lBp{aDAuhlwP`zXf5NGB`;D1DuHgOF)jTOl$Qs$$-{a{p ztWfpM!YJWyL~loAK4Qm7k!i?|ciFcch`M0`M~7b*Q`mm}i&vm~KxR z`rZ3RV*R`APJDD4sc7G!?FcFNvy5V=O>5VA03RbA9H+1kin6*SJ)YQ2C|AVu7*Lr5 z!LBFy4Fg{gdJG6nq#wkar;!puQ$%YbxGU@%fQ`DNjrKOWB?^61^-QjK*7&)8Et(kI z@ZIG$dvozc69|tKJ`AINN3*4^Rk`JwcxnG<+2D8DxJ1U&W)`yNY&d1Gp48>9M(3~1 z{aS6zt}PIH#KG_@#N349cwt!@cdBr$o$c-A59r4HTov_^EYx)OMV1VdLR0@=HvO|q zLyhLKrHSY7`-tuF>}soEw@kWuI~McZ%&xgmKWJ+yxZ|ze^6^NZEn)%|#B?!Bq9cJE z6O!0)HYFI!re^Zdhu(9L{Rh3Dom?HGe*T_p_#0ydn2O}NZ|did0;6cHQFIa8#MbVd zK#@2Df0jK=ks)OD1jGjQSXLG{+`2PHVU5bKQH~S4g``NDb9ZwC4dM!viTzP((EPX+ zRc#NHSkCIOe6G=b+rDvJ#z~yjU+%{l+HDS)92ATdk(Uu?&}_%qcqCf6WfnO5mXFz+ zHipKoI&o6MDYqnWwq|Gd!8T3i7$OU8*DG-Ahr#xsy+(NtO(yquay2&Ki|^56y18kG z4Yyg3b`m7Dg0KKSM^(EnlCGzsZUlI`C6v79VQ>hm$G?oh?L-zzu-(HLS7gp*G@BL8 z$i6PlvEWF8QuFDc;8@7L2G_~Agk&MIq4TN3-I%D&;|TpVonL>tn0|)YCJnC*3LC=FN7_r z889QdygEFuCWFrqUFSd8k0zUY!z9w=-8rlBFIN39??XAc*Yi4TPpeI=1MyR8HyYqd<1BIqNu!?O+#O+z_aKcFT zl;n++#1`4c!ZRXt$MS#*)fhu>hUK)2++?6PGh?`RF1VQ)g&rIx1X)%Kr}841)fdUW z79VIvoA>Z81BOJExy5$iBlTjKm7=9`qfA~`P796Ej%*<$)(cBDKe+e@fqLYs;7B$N{(a$}@km)}6e zniy>dB(@w&^v}NHE4y?7PiF-cH7i`)Ll-PaGMj)$Jy+jx{t73)|5dV|2eA76!&nV{B^ljK*tVm_XzoQ5ovivBi3-&d6tFv7!?6(}eDq$Vi0XXS{vb;rf2HoUl@PiUovoKc5oYy20p7Vvoe{~G0R_i*pVK< z1@2IY+%oVan!}f}&-5&sBeYkJwfg|i=+Tyc(=>z*dQe(E7E&Ddv?=93l=D?Id9%mK z2MTL5&6C>rnfLw=%{I4(h=jS+XRuVEt3;@i?(LcHh2GuG-6wCKN56VFtU%)lWmx|b z7Roy^9=BU+rebh+bNnmhBF1(zw~Q0~B=;)rER^$k=s)25K*tkwZ=#{~It-o!MkvmO5ulXl-DA9V(fHRWlN))fwPnrEo zf6?$;QShezTo!qW76zI8})cq30I)n*P=b_Ux_B8OVq8aD6{dzHxf5DaW<*?`G>g!$x@E zbIO$P=!5RB5_(>}R(q>h!Z0Bj78(-yxJRsI-7Mf2@!fi?LP8A>nZ`cvumEJZn~RC} zl`1XC{Z3~S@02gGoee8nzv>0#`5Ia4R_yWctmv;nWI3O+A3s}>MHhk$6ln}^3~$Ss zrxHRo)ymB&lSUd(BLhMe1IkR$eX;)QHZvv>JMwVmJM&jbx0E>Ihb$bl~Y9F`T zi`FT3?|{756$WqL229B1+{A%r+-6C-HfZfqUbO9abDk?4D<(V@CVle!7w1*hx?`d+ zr68qPe5;|xxP?~kl2PeNLAEX|o;-s!p17XwpjJ7z6KLQTLtxm|Q2SrymE#NjeWTJD zjRwM1I(k|CD^pECo|iAKZed`>viHz z6G=-W6BpQfv*)_I>3j~-uf^<$M7E-v-q$dlXotR#jKMnT+B(Ye(lDj) zjuntICUhb$R{dSF)9>rHZZ@8&gmdZ@E!_7`l5zESz}s@_slG8rvr~htR*64q`seDMZc0~EGK=eQ>O{gA`dhH#wy96B)=8)Y7hJQH zD(=_rQyVQy{|FQNq|)TI0}SLQbjO#Zb@B%OzGNN0hHrn83K7XbHMuE~CXu{yl2UnC zRqLn#-W5HpHeGH%CP_Gj=0DYKf9g55f)!UD4uaKMa?^G_b~T^ZL$P-ryGLcD<^dnY zE{lB`vJ|p34Qqj-mHWwR$3A)iyJ*m+ti2as)u=VN;<$o&n>gCf`@3x>iro}O3)Q6b zxlM14Cb6a-r(1f~;-d@AK15=3d!ar24na|y<=&PEcTOD8&v#fSuPwn} zM!O|tnf0w3Z>%|F#jSPRJy)(o+_0r~X$fal3fAmy16EJs;AqiFN|Mx%Kk(l7QI`hX zowTTY#(v7YU2m7I->)@6p0>Dp-J;EPB(C-y>@+bp`E(W;4#w}T%E=; zb0LRPo8$Ir`W^C3@Yh9UTDA29NX_j*Q{%JN%Bk~1*z_}4r|&G?rri;YHeBE_W!dc) zD09PR_oGg3Tj-=}Lk&6>Zt=WRnjX_2bWRUh6VHG*tT20PKCO{ugH)Kc=_bGDGATsw zsmkQIwy7)%GHqrI@KMqQkNRA3)^jZ$j|45quh8w++v>)S9wix%+KA$GAJlaZ1T8#A zu=HD~9Db%ccBR1Tf}^8_lxw3QDpD7L?L0}ksXb)n3N~b znrB&%lPDd!t)Fi2Iv0f;B3g^NFA~J~FA`e%pNABQQZLO;`#J~zw>G)@N(sSJ`d8r^BfT1d1RodEZ>4{;iXJpL7_SiLzg+Ng^I#8}Li2fs zb$5FBJD|_}d1v=yu{_$!dCp~p#&Ij~OoKY-PJ|0gYCSbrp2m>d9aDmxTS$nX3z4IZ z^?bdMhe~dkfYRiWWbY+yE9DyezEDbm(c~5-q>kT>;fNBVJRsn*<=r?HsQHoQ_PhpFP9~4~K3m2YkCR8; z65z1Sq8eKB5QCM4f1{uODemj zaI`1x(+$0mg30SodW|-{oow)WI`3`!Q9&QRKr+A4kU2y%VvXzCh13Qq7{zC;#((Z6 zLePZZyee7ob$+}n-0I#G*l*CE7HRG*pI~7@jIW==?(Jqlv9<0{y!^1TFF3)wWolZ}H z1luCfu|r%BvWTTzi{8Ktr9f>^d(EW%XJzTk#4~tj**K;E-Y(8|G20|s3UAlm)-`Ei z-qJO>lJ~5rZYjn)bnfC48HB^*jE`n93R9hf4b|!|Q1(ns7o>REa)LVCJ88RJ`PIYE zg&O{lgL-X#o1N{e*c(M_(&G(u+^5#IG{8+xV|ppLF_P*zoDq}OX}}dH{$+D-$LTQR z*-9=T`P{>qNMUf)AT;S*W~^K&m)jR#OoA3I7A>=8 zn>WiFo2xybh!U}&#b#!~lIBCrfF~B~#p(w!y~Ui{QH<361sA;1*@ou?btW*^K*o{D zKy96s%b&RJi<%{uznX(n44Zvu7YnP$D_>I>)Uy3sBtxU{$f$ka=BSX~UpZT$Rs-Lm zwL^O+Qv&w%%546;4}5BGk` z8*~J;RerA=kCslz!EFn$3c5Sk>vF9Nxp3M2^+?d;A{wx`w5xQa)_ut1;%p$5`{iPW zTR~^4a>c9qcF%X`LHJg5WA7@TyY`WHPtYKADtf3g4XcO}tvoDvFgdz24)A87&NL8_ zc)_(s8SvhI5Z6Un>{6KdSlFI?IC1fg?TgaEH%f_ZDCN~Le7~cHf<4#V04Cigi2j4$Ff)YPoEZqDzm>>+`v)+z) zwyXJ))t@c+#RYHgQ=M`hNmy@-i4uRukkZ7#5$j2W8KG)>J1M2wozyHj5O27DaT#jD0FHKN?&P{m)6QL1G1qjJ_C(GxUG>xir($7~ zen zRckY9;`IIJT(oL3Y8Eq$J4}7|JDWzmO;7mAlJ}3Ex4D|oXyzoom!0l|W4^mDjplXB z^EA-Tb%ATf_9c}CcK5sg59cF~uG~w%d`XZ@U4i9JlN|<(x#ves!_T$F&Sxk%`+GE8 zrgH2vNah3ccs&lqSqSzmwC+es=~RsTul^3j^1?IRBm;}4!<@gD1$)njx@Fw{D!Q5U zP;!md=^YMDhgMFk#LI;T8{RdyDKq$kn(osa3Edxasbjyni@2il$BVw0MjdVEtk+wL@=C>doNOYJzx5?H{e#RmR> zZK`^g60C&=Q3;YIzOnERrGbT`;(?cYwYYvP{j`^~fv&#m2=K0-G@Nh$XU^MT+y&2` z{f$8IgfvAUxPU~=0miPaDfO?;6&5qU8z`wJ8VnOk#0(5k;j@4pvoax8m0XZfJByn* zm7mmGEnLDeg`AJA{^HzCs<+a%Hw5*iFc7*bAKM{LhQyf=Csh&>fqf=as&%%nHlo&J z5k9lX`%*H8Zfbd(|6y**8h+=aUeZO~5mI**$B=y)lFu-; zT(F(8JMhAQM2IV4$ZOprcaz-U3Xe{xMx*s+065%xIS@fCA=Hk4Frb1rlm3XlF<=XS z5R!b~_M|9L?6rOtV{tZ+mDabF;5I%Ai#{qg@5lgtbOBQo%Zx}!}WFC|Kj zgC;F(RvH|t4gzWaj&!$}emk7fVY`#u=^N=zqSU_(CbzO#!8?1tODH-cmzYi8)i|{* zELWewX|?3yLEy_2?i|#uT_Pbl_eh;~gK24~efRt5lSa}nfXCE2W+dWVmRi;|;Q#%F z^Y4U$v*m|0R{r0|eFmtP+I~S!bLT`A-VN$aeqg`t<~dp+t+ReQ45ntfN@BVcyrfn+ zwm6m=h!@VsA9^euOJ2k@ntYhxnSO9Ww_E7hr7CwxpVTH?f$_Orbkw^ zd)s=>={TNZT2wAI>e-~y*NMdJxI1{KMI*F-GnTso;`0~xC%oUn6W_=$!PwY>P15v; z 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%0DTmoA3*B?qC6uJdD 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%0DBS-T6K&8&^hS_ZmKNL>|%6TJ5K+#Fv@ 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 h0`R{D;9qzpGnZGhuoE$sN`3AV3YuMem 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

ZWBH8H1e5I^}qPLqgNq&n&fiSo?!sMjl1k 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%0D>f`*?{Q@F-KMJbw5RF7lfdN%` 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

>0CW{jyO>9oN>S=!yeBq1=}47?gIte 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%0DUN9`4wp90DPFo{K+pI?0 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

t-Eh3^YQ;R>Z5O%7<0I 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�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

TZIIutUf5+Mtk2DNS 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

%!UL%R~AlZfCC1PmZ4%#;B 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

b}Ew201xsA)*PnDC{dgDKgiA`~K`4I)$^ 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

t?x1q~&HLM&07XN!deQUt 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%0D|1VX0!9HDZHieC_R^kY5G#Lf1DRcD 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⋙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%0A&0uWi)~5Zcc=he-mTzdd6Mk| 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

w~*wU>A>h^XJfp{S-Yf#!0vnGU< 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 @3bSiaYX}&VG{vvLb znUd|Dh}kcBMxt^;r33?PxDR9FtU&o|(;5@zjdfK31V+SK-XEqS>0Y2Db-$|S|JRBF z`sAL2I2KLc7bz`@;B=hEmC(dM=DyoNSsXPZq$uUoOeH)h6e{be@)9d7L;VT{t?ehC zX$wXoH4LVFKWOI72Lh!@1fQBhcDEm_3{U0Me*CKUe)m*N9(_BXVE37lS!v3+sdGa`F{_pMx;jBHhk-5DafjB>wcxQQDUQ}?l~`DQ66-f$ zwtdt;_G3vive6K+PJswYesxRrNdZ~)ntjdyh ztxLr`(i%ha247^3iEdp|L{B{=?<)9&9^U3m@B(LI1NzTTO*2937E$!31^S#Ntm`f~|7(hzE}Dfp5^UgozB z3e9*KM(2kgoq>vqa<}vK7=}t8e(S@V*oxkHW;Ed`fyKVD>YF!dTn@VX@#J%+iW=M+ za^~%trwcOF(km7!TCaX)!WxY{g=-6_91{6Gh+LNg`||al-OO$+U{?Z7C7fxgwTn?e z&{;~f^*O(nb4qbZrUE%WeDyjy>}HJAYw!E<2gaV_$ogKeNjFGF#$6Oqhi%*XWUlpr zipSAZDDibM;f9jJk8ZClGB(Svo z-q_CPv*MgYZq&M4!qt`jakHgS~qKt&>e4tgLBO`dZ`O zN>ajXyIksRwTy;7ny={Tl`1nxY#+FKzRf1T_-A3DGoLzcx^XVpz_SZgKa@M9mH-9= zX)B%W#vHHUkdui{_@`sRnx!Z@9xPkFZ|5&4&PzNA*B{lvV*OY{Jm49JuixK2TsPx6 zM%3SrW+4?h48cw_K4*Ik>{W^tqB~t&3?R64w zvZK+|SAzK1`fwc0G*>!6FC7y>LSw?CFVq>CS7c|df^2LdX8QWKimKj(WKcy#CJ#3)aHIA$#pzj=< z%`Q+l1n<*?^2_v_v8Aa*QvV5PS;(sV1-DyLQZ2&ge%si(=OFT{99Y^VK{IYA8;B`x zL-xam2y4PGE3e0G>}JxCrblo8scB6~$n{c`-+=u79|>msqQLBh>X0O>8ZoE}+2Q@4 z&~)5@H|dWYR5-A??C-^oJNJN$jxZ{HI+gP}?3Vtc6=!dv56GoFZ+j0AVNb zGwCQ16V{d`7h+CNcaxnT*%=PeeCnhhZKV+Q1@s4ej8f>7o4B81ls3o0i@4wOq(6R; zT&k=_2!V|R`a*$T<|_9>xsx?a;F7VF5}E%a=}O?4e*bvxk}G$Xqf;o7kQ`Hf(S=Ix z+#xq%lWR#K5hW@@NGhBAo-VmTakxXB?fz0v>2#6D)C=k@U_Q6je!|pn%96M`+d>{UwJU`j8TWjvoX1VqbL0Qj(b>AeP z&4qtug;$ItpSTJbwg+Ar<$t05&86v0nfdX+VSBCT7_&h$2y2Kw8^&BnoaUuS! z)Q_qrmxqqLTQ}Ky_kPj5A};k&{)m5~RN+{>Sy*yha(uw2&{?i$lrCQ1!#?`S6Kzt< z#!YTLp{f-dPJGUYaiM3;$@q#+?cu4WG(B3^uQ_BM)3N1p-cK%Ff-=A)-{?QHi1i(5 zsUJU^5=YWhOv*2E?>)QsF?het35kF0pI%nUu1dXVZjuby$*etco{9hcjq2^vzq?=Y z+)~RYz{gUJxMXx}F(31Jx9OU$CRX2cDc+!nAyz_u|gJ@p8{<^Te}i zBCqaVxocLAVBzk15>WrhQaM`NYOffdNWYBXZ0B0|`IRUNQnj^WBTyTBFrQLu-a~T- zF5V^)@Nu>LO{R(G3pGd2nCECSUvA2gOFMHZ!%b|4kC(?J|KnLv=4Uek`IfccqJ(oU z@)t)LVpMM^m6w=^O$ew~ovX@{?>@GEr0MiV(xR!5*#3Qn$7q}DWl3AA;pd0=Fe$4J z&Z$#eQFN-4?1I>@gtok#RuJr~j~7?l+j;74u|=)yTm9fwJp5AfSJ(ctC6%K)50 z)_=#94veQ?+L;~*>Qk3$5QzVKaA7#|$)zTN>pEhwEu2z?-A&!y&1L6WrJf};NiT?3 z8rf(vkBeT`pd@b0^M%wLuBA2QA%tDAVp#5deTQq;Ev&Nk&SizME!R4Gon*Vs5r5&v zA!PsE^~RL^?jy_THnHXWOTzKqmg5Z=WM0ONwX?^5HWl}qbhoz@?jIkx{vPw?&)?g< zBb!nE8d|13FSQX@K8X9^L-(H}?K>gW@UuxT;h~O(*wssSx%Z7%arr1-)NtW56fz#H z;_v~eRWAUdjCqn8{K@^U}_UOu`>P*yK%Ul?m~RA-Ql zV#`)dyqU~0cp`p%s4u9)@B8dJCWw0Iki@tG(zn0=-HV7Ptp`>M4Zq1YeC4z8AFr(W zWM1gP8`mJ@SqV9P&Mx}KW%5LcB~+|V#td3exP{X{(Y)a zTJujVC0j3kONa{c`r=e_iXinPwaMtKpf&q#>6hT^hmzAmFQdWxw|v1b37ZaIHAxeE z6qoU9mHDCBO4xnN_xR}*(=?4;;){51({bc&t3@skE>?l41?!(>BkN`H_rZsM*NOM) zFSduBw>%(Hr?n=neCO~Li^rS!`OfEhZAO@v-K9s+J&9`D0ixq-28(nx9s0m6PM<@E zNgK;|67g;vO{FR4H-k+wer6sT$4OZS&T1)7*`c%3wViLjI_G$} zc%MGe<3kb`oMQblFUNzwbMwZv7hAtN9Y2d2m#%vU9~wgAb8f-(N^K~gjfBq#)#hvXGp?uq>GI`U{L5mGS}u&= z{BK=uzw(Nd#7L&TmsF|17tJOl_>u+V)G=ZG*k`%!lu_)&u`9oIs>!=dWyy+B#r!_g zua>^f=GjNN$uAp~dgXu0NA6orJRp)Cx))sE6E?{T7-arvF1t_Pv9v!qKHSFdmf{EG z$7kw9Rj;1@apg)d*K$m*swGFDK6wA!`2+7=>W^t2CWSV=L5$$+%gEj zG}x3)UuE4VAI@s(^3QbdGw`nT)!!6$AMg+HohPg-$UO@FN68Va*P^Hrk{NEIKO>*$ z@;eWwIGNo`m3ryfl*OU(Wxqr&=QCqzPjb6;<~OswSLKgdBX*{QIc}%K4}B_A=N|uh zNn>L$lJn6YmyaC>FuthpPwp?)`C5g?FVF{bwkJo}e8|VG&DPTAz8<;EXQ;T`J^ar2 zPH?JJt!GoJmKK(Ds#=17|iga zPwbVBuTQxrnt!fiPkxK~gFXAbD>}ybn|31i!Z*)xE_8dr5w5y^smC#|QY9Ccd0R18 zSKd*B5ixgr>i1yNf4sehrP1j-Q>MHdU(P)6R5vZXZt7O7d~F|IqzomZ(^Impa#CMz zR`rN(?Vr;ot)AvLgz|Z_hy`pey6Nui-VvIvh~Z=v?lt;0XP*eB>B`*cHN}AQ69)=w zMY5D8Yz(C0n+aiWQDJe;3JSb8<9>#o}G6zKYT1SFx}I{4&uzqM#_ z@Ce>n*;OX?efPY~Z&K_2EZoOc6#2Z6h$zY)GZ(80@4jx+A8VBFW$hOtGo)d@>XUU; zwMf75kn#<`iCg8#(i78)1t)d5tF>aXbJ*7klbIYMidHomf7^LYub9R%hq--V!X5N8>NQn5`z4^ka^&Ajkx+iZ;q9t z@5A#)@1wmVZhPuug!vDih+9`#tuXETGyP_xk3QsD_A6IRI5Lrf*i)p)CVDYVSxvOz zxXsqN;ih?0?&aV20e8>85nN|~R28@8?>*m_J`yg(;06Z19*_M!)ZxV){WQO0&f>|O->Zkm2ub`#(u<0=sc>_L0YF@%Y)*BcC%i#j+&w z4_=sGSdg9DT}5^t792vmfOQF`tO6clE7D3 zUdFG74cf(8-9ZdzW#2~KS*O(W8XT+(%TTtmai$k2$06R99gZFh`AB3XB)&fWC}{){ zbI#P9X708SRr=e??VBnyCb#UYET8(Tg6kgY=E@i3+7R5%agmz-mZrJAQ^anoRqm=j zK1zG}gRwup*OzEre>b*jIcfD$-xpuMUFFz#@6O7Rls%XleYo5VaU!Tzz4R4tXk9__ z)4G-*Cyp%L8Ryd&-HZ1flP5u$X_up&|d;T31@7MQxNab}#P*3#RY|h4^E;oCv zPLJu1INxay?l;fMJm6>kJ6^qj`LmLO;J(}FZN{Y#FV50= zrz~0Yd2Wo@_wD@6r%SQjo5Qt*F;YL zQ`Plv{81e3i~p(2tP{FcPc@EF8tjsceg8CfDzCDWQ}*@wTj<2|BH?6 z*zU&~cWQ4g$q$_Qi=#Hm4{j}rbfj}h{P@nxJ^$xXKJH*dI%xsZ;XNOl-6&NM`=_@f zyb`-IINz7yRo$JGdoZEc?yRWTTjf9tfdb=U^JO-@Xff0bOLtEr_CP=1bDG>4?JObz z`+-EC;RxOOra1iQCoa3~8X;eOMeE&!uGsIW23Jvo*A4Or{?gK`qV<^>=gh9BU!*So z9m^lRKeO0ZZ+}Nv7vU(x(t>bldeS21Dm7q2b~tp@#My--kS=6?fBN3~lu7gb(#*cP z_HYBO)oP|7OPL5JdrOfLtE7XJoD7vg7Y@}!zSRA?)ArorNtoqn=X`?#f=O<=@|kmP zDaEu0xf^GrOyxpU4fGs7m!k}6YfT(VT=heHRThu6-8{F{)DTdfPah!>Hq^0+U7|T# zV{w?^(PYaQ^MRZAEdjOQSHA4)mbOyIOzhg}bEKLES1znQ@zI{xw4b&~TTNCrzs?PD zP2i?6)?&r2UC!M5!&`@U=a}Vc$4uonheRcwI^MXu8A6k9G?@7Fw^!1;cqU1ssl3C_ z|Lh0FtUrpMztVrl{wesR)+c;l>TDl}eS9-2#?#itWYS}^ft}(QW0KU0IHo$f1hAtbvG0ZrJ-N_HNrxGPl*Y^QBx>9ebi;>bpCx<eSEq5R!UMn*f z=G!d!IoR(YO}7_^i?|&0&;2>Ez*!=9DvL+4O2zF9Uh5p$RF6aSQ#moj;>W9(T&q?B zwU*zcY3s{(NUxApYLtpUB?$Va+q}=wjN%h+c_UMaE-h*G;+}Qoi}ZHcb~+h9^;0W+ zs<_QR_vjf`86A1WKkRPDRJFhdh_%e+4`gH$YlnKzmIqa3kAD3g;~(#EI*xMg+eNpk zl9Jv%YO#Ns&K$)}G<)-K|7#jDUY!1Mp|sM!PhB6U*Xb(572osWHtu4>hdfgIp6iEyRxIMq^;R`;I%+zln&utJ-I73+3?jc=cx+}8 zIOCc1Qt709IA2v7`XSoS#rf$^_9OS*j}9+Iq>HUQ%Ir@o{QaNX$urY(_#-OJ+Bz?$ z#1)LSJPN)iZCT8`AJaBh#*b}UgcKdFUs(a)z3vt>Wa91cWB{e%bmL-QO8XcdGwfP^ zq~GD|X#&+z>_iMvQfx_6L?78d9Pk1s_A9_7X7F!a-wu87&BlbBi22nu|DY~P`$k6J zmIv--%f>3^>w^i^MY9mJi9MXV_8ta&giP0f-J{E#p{I9VT^fSAMZVd;t`&O zKc%k9TF5N&&ccx2`l5p+w^DDFEbi^oesYj&ng6Db=Povveb&?crHQi3TZHZ*TS{=t z8;^de2rnlJx`n&tm$3EXck-{VS1d5$;>(EO@WLaOl2wVhqS=~t69;zKN*oEz}5iMt0CJ2r>mg_RK!lb$bo$0@#RD6s7n%0V9CPH;ur!aQ}H61QzM6`IF95=DN&mFB%*fO|la^>FNTDsd!cB`z>00(tf zkMs0C!QHw8OSpsiwN7Uw*t;CupK5GXviM_?!_VM66@{2MyW;C1T~hugw-#HVxCBSJUrV zMMp2tkm>y&mnQR+ z^I>~#U8mAHIi7PPw}|prw$hL@A-|}W4hK5lAKZGWqiO1=tijKcJ6SUGW_7*JZ3O?& zhG%#>=m+U3wqTfVYO~cew5I1i(Pz39!D+9?9 z6ArT!_VmEruI}GOX>u2=ozm2O`TDn4YWs1b4bcRw_~W|MGF$Wks)%=PTcF#fjYHZD zIr!~C!a&uLqe^%FJF9g2tj-bTBN9r=LaeOEKQ!Nd8S@?d_Xqb$_x_~rS)H?&j;J2t zPnLOkuqg4n#`FK~>0U!S?B*}0BBduW$j(*kerk2jLP({&`-NA{%zZlrJQU5A9@5+V z4vXo~_1}{M?)UrHnLILwzGmWXck%dC5_heGpC`@^d43F9cpOglaZ9gQb;Z|s`d?6a z;EHA<{_tuZ#r5}ej8)VHl_H3vomC|4hSv;>?+IK%*k#I0T@3=I+O+-6UCT9nrty(F z5?w2vQKWXX{FB9WaLsn z{;w#@no>OZbK`a?{c%n8OUWtg?Jj&iDjc~qIvmQP=Cl4vVQ^U&Uq+io@58KYjfU2z z*4&$Tv$3^lJByXnEb3g)*qvglE5sXmZacndFHO=XEcv2GE2*s1+e!G`2LPFtv}oCrma>i1n-48=4(YaM#iv2@`Bp0aa!v?O=9Psb(l zfX9or4)Kca6jNHRxHnw^`IkzreYHsK^Xa?p5Q{T$vU7N9^51=%fP#nq>JAg3NcT6+ z*(6dUMT45LA*VJ&+mD%{P1OWR6fIvN+(l3D(su^?MjVAqRd(!J-Ee1zg!PEIN1Y{| zq^*bB_ER=d|9T7z35PZDW^RrrR0{5i2zk6439+AMQ?Se}Eu{`w=^&O1E~9eC%QKHs zA5{J-v=B(cyRUziKrgR7i>zv;O@&|zjs#kg{4t08uiSt0k&HiUNnO-&6tIaR74^^}}y**9%MLitOn1(bJVl2v8%X>8hsW&__+8!FCOW1C0a zV47WPXSGr#Vyu?d|Ga$YsvMr4tm*_jLwb2i27e*d<%ejClP-FB=bMM} zJYIhzK3s_07#J_g9Y%HDpnk)z3*ph8^wozX#9%TDj_uDpH@L!V+`u0BA*PJI`@L_+ zJ-DMR9b3>@yXJiTc^|^{^fi?Rd}pp=fy%>#)6;}RF7#@J-t^Gn5OraX)=_t}PA7Bs z7p=)!xRq}Gp{-K7pMuBcu2`;ip^Lpbt7FY^lMyGxF_NBP+@K>aUgh7EbKDSb?D9Kted&OY%gW;_itqoJOO{bCNQbkT`yU(t~UyC=@ zXE(x8k-s}C&6;uRsf3GsDUC(>#|X;W6a`-rmcV2sS5!oJPEwe$(rhI$56)T2{q?sA zovf5GxoekGwAArIeXCRCy?bMT$|7ka|Mkd3k&)--yP(-*N28^i)l{0*exA~{T$Imf z&DzAY$-;p$qmZ({_Y$u5DLCq%LW$Rt_7AOOdn{Y%rv`;gnaAOcT7w-c5UbC0$mQ?& zEuG7YJk_hGwN~4mJ$-u&x7&_TwpUGey7C0@w|LjA?wyujlJr^2Xyx@T#=Huy+9hl) zsndrSM&?vToqw5=q7EjudUSP%Onk^zASjyPpLK`6x!0)FINC?E!|W`yDm9}2(JEp1tQ)B$ zeA>j@RdtRiDZe?5T)dVjq-)WZurxd*`V&JxPN23d`SK2 zecQMZPt}>rE<}}fa^4t15^N;#K2_?OOH;zHV{QmPC4*7& zMO9i5?_$Y3w_I@f>K>JuxzL?wL-#0=BB7c;3U9l9tyZAj_xpe4m zc_ROSW5P!MR#R)4xU+Ndkl~Q2^^bhi^|-B_y>j{`gdkM)ZW-C zF(y`L^B_t5dHJtH=x!OzP7N`*sK)@cQnkxYUBF{}!>uL?T6FQ?h6A+jaY$!Bn|N(Zoa#wEKh$FroTXr!SnI7>aJZmGyA|Fzp zq0oNl^zAiqz4X;-L`uQ-uqwSky>=7V=nK$@n#){J zbCvS^oeeD#5lV{e9}*HmuSTnBdL%CD%*UyK52MvueJYcSRqG(uZTN~*?rvjT%ZWGr zche9hHdM-%xU^W_gnrr1XwK*>S)1E_bC|FcE_ru*#^we-zYZ>pz&Pt2` z#>0)rvv2L8^nj+Q>h9FLIzPJBn0@~4R*PTfj8D$uD{5xZqu8Cyl1(L|FelF^u{9 z4&~VyGGofIZkF?kP?IB97UoGAB}s(jS*f5cCFZQ>Rgl#D=kMuXR#Z}urMoCR+PxJ^ zOu{4a#M8r-%W4a)1@os7`Y46;5Q8>hNsqX0&M(BHZStcfonO-Zem+EcAARwDd4Eb< zdC!E3%z^>EpF;9-?j~LZFEvH5??-k$m(%lo-O`c^`h;heK7QfOsFI)~N#4&floeOG zHPn;>m)cO$6?X+fUZf?*Dq9Jl%c6b*-xXdKp5-|}qsDpXlP_%H%XDm;8$H+S$Gm(aCB0X7O(e!cA1?GZVqbJb z|5*B+Zna$~C$I7!G1P%bbwc$=h4cE>h4f#PCd7uQznX6eS<+i|zxC5ZfH<_D7h9>v zGq_rkA`v{9T-NL`LaonV6wcNcF(*7g;Peyf21?Y7%0DVP)}~IQ>jFY2JUlyh`hz^E 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

@DBq~7(?hs&(Z5I^=V#iBJoPkqA#%fX}Q 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 z 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≤=U|!*HiUE z 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

9RXsAO1n|;HiEjD;q8Tt94wE?rWr>==?JWf(Vd> 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 z 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

xSMw=}W;PIrQC}Rfoop6u4CWf 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

65FMi(KjdGpA%)%qaq=slKSF$U9ber7 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 fQ7vx5v` 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�|xnU@As{MsO}R(g9PNVjwzLiE4*B>h{MbK2_b4Q}MT~ z-*5(;;@b=^e5yg+7mdH18_uStrVe5_Y-Lns@VYeR<{i9)(Y>sE_n;3wAvF ze~;hVFifzeQ~!Dm^T7saZ-0Ofb(;f9zyDjKMeboM$uO4E{~u zLZ2dhc5{h)!eo~>o4@AH*j84%Lm>T-z;hpW`CwgUl?(W~63CBXymMELN@&xGSl6l( z&yXmFU;7B@Sw5jgQw<2Z|5DdquRdAre3XksjP&?XzZL1>F^KDa$tW7Kt4E9E47@|t zFaCiWc?mG5`pxQcNp2ELG6>_WS6w`Qcp^4ajyPa15p|jVWX03Ru^=j5B%00F-HXs* zCD$+-Cgg}NTnSdB?q$_?i%6M+=5MV?)QCM^Vtn&)>;3J%-+^(p96gdR$`cmSO-+${ zJ^9=|@-woDwV6WZ#A>P?RtB|{Qt*Iz@lUX`p%llcDWgs|Ctd74DhamLR*p-QcyT;W z@N&+ZwhIKEeM0gsQ@pws7|aWcWu5z(u+r_zuQA4f(`mdQPa+;mETHj!=u$<#{l@n6 zI4~ZwxC==>gEhXP`tfm^?dARg<5Ci=>~{C1YVW2cX7V2 z33RL>CCk*NOdMiw>)>ka9AY~8!{o1-u0$``QHEa-6(V>%xm4(R?}rXTd%cGi$t^KD zDVvt$W*AFvE!bj-=S&=9(yC!(GPY*?&lHVd6Q};dkTS-zGH3R%-)~VTIY1&whB_=A zrk7i}VD|Bo0AC^8>Fq`j>WeERa(Vkx1wT86afqH*NcqrvGs#Wxu#gwe3)AN8_WC5&0~&m~NOBzRP-pC3kn%_M^@D*sGFbUsbNgZ@C3GW}2dAyybly}A-X^6^y^cKPdp1%CjZBU(E zPw>>jN9|hD7VtlTf5`dbB@~EA7yw_;XMf0*Y-DRXX%31L{&j2SoWVWnOr4Xc?bax* z?fONLEDu_IO-}*;#1%$ss%z)k#B$ZTGvx74kfE>#jHdA=v=Z#x!ywj{zLQt^m`Zek z%+Dv+Ehj<6>0O)Yb4}T_b?^xx9H!_zzq@hv-jCrh3UT;yGGQ6+n;V z4YqUPNPbQo$@kW-JLCP&f9spk(8mE@4LyAiZzEZN!a)70lUM(+K2vcSdk^8JekJ$zK0?f6#u^v_z|CiG=y z)cZ6l%zsQ5eAr|i7^6Rz>PiX0%hLCpUOeo1aPN^Br9(y%&p!2&Too1$jgb zL!+oQ6*U)iV9IVpT9YDPbYUDpVup)Q5zsOszEA%qiJhZ<%z$FC6ic{4JqxS3q%0MX zAu2{H9Rcscewn+-CoVA~Bx&BDv*~lP)kSsOPv0W6F!DyhTfcSoR~nufiqO4d5xyhW zi%{a5;lQUEYttDrj#3h=>D)sNVtURq+UQc{ z_wlp9g8nbr*xhvQVUx=&FP06?A?}L4r^%h*6rzT&3OFkb{*9ZT#tZSyxvwP*F+Ap@ zHJ~16BiMHL1Shcl$D8DsrovG*YkQ)ytKA1(x<{Q*Y5WB?v+;2dgPwBYKpz_{kqA#8 zDBY=Y=>lm#dM*etx(N^?4OH{Pbncv- zogDIXE)Na;=+1h#n#O%hd=88OiPJo6QSakW06CESsU_Xe&(-N0N0y+ouZpJD(UW8QzG!J^xlQp%LcK!X5_S zroK%*!Opl%S3$2N;X|L04|C)ra(7EoL6`;Yr1LDfY%?rWDu%*RNo8memPKh=6{>)A z)lkMn#4XWZ4k@d~dQ9xr*bsU$qf7J)ngv>#>>s<;r`(u-vISr?t83{fM}ndyP_or= z$e~OXCakK8{G61_z)bTc{Dq=;4S&3jwRn;PEYOO&k9KTK@Pk#nCm1bv-0e)?CcV3B zjF;1OG7L$`(|@I;KXafrqj&s()?DH@%Q{a&2~34LoByuIqJNror1P7;$_}D^RC%{2 zv%f{7T2*AIyX1hI!Pj zPqHjNG|1%y@S!zr``2S=A4RtNvd|;Vo(%;zfBwv6I>)G!LqsT_`<`?3W#1bQspdUhyVg>K>8sr(dvHxJs>? zCZ_Tla{$e^6OQAE@002n)L^uk$rgz(uJ1Z?ZYD&DT((}C6Nn9L4{QHN-sZ-((BK$F zQH&xCI7Vji?phegXs`R)WOA$)clzi^k5&-Im`c2iJwdF~Lm7-O|7Ync!=mcC=!;>6~a=#uf z`tI(l3ER=PT8nlhPDZ_I{Yrp$Hokr?D2(NIue0^Xp5PymIb&`>l>4C(Vk?w>a`>9j#v_i zZLube9`%M+x})a5Vixh6_HgtIwcQLDN0dv3kFIN%uw{~6dtc?@>rhO)X4fhU0$u(y z`R@dY2gffME}mQf8Osu56c@=WBm;&QPS2~p!T)uLsi^Cm$O8_^SV&7N+&%pYyu5`3lAL;BS_)p5&cHyT~?PGG^(yKXQDPmAm7>CT?!{CnoF1~IkS^dgQJZ}qC ze)}77br|s@O2|995%^>HO!8ru@qX>b?~I7B4rpxolt#YAk(9>*BPskb=O65|9EX>> zGecAOLt|VW1loR`_jfb#zK=5e#iJSv@89r29x)MV7G5=Yc#oNfR0Dr*dtDJ$Pj>YK zaR}HHDb~+38^(0s+vZ2#eo>(&ZP9UVGn`SG*KWrws= zccTT$Tfqh5K|Nyhy;7(6`&lLR(%r`NnR2YAGLFh)>Qo)3&HnHAV+Zqa%%|GI_k}g1 zeaD+{2J_iu32g~8BZ4x0e8aK~6N|9Z8qK9Bsfo)ZUi-g}s0;I~Co_?dqJu#0MR6bV zf7O}78T{AdAT9(}Rr%FSpFx|ZeeV#Lnzyb^e_niSPN1)n}LBU+gd9q06m zDxKap3GkE>E|b$ObCGbygDc@+p(XN`6;vxF%+lg*te-k4LXEYJ-m`d=Be1@pE5}`z z!G%tA*Y5NyePxb$HN9@;FG}3F$bdgQ#TD*f83sT`8z6WkSoPSs+&7W?n#CC+xYwZB z%p&fB$hupYqU-E&`Yf0Zn1%71zYMJETOr^}Wq)0;w>Ei7So`<~D%?vIJ6Ci{CEBva zA%;Fx2mu&fIkaKmQ5j7Jl7%!#NyB}o$bg$Cg#UQO^lm(WiqW@zAp9`K**bo7s zNJ#v`*)R1j8OTtXT1V=VrKn7GE~Ymv^z(gX8W&x5h9Og@b{JOa%;8Bc>TYY_Gw?=f zwz07Xid6OfC)iaSo&by~5APW3oH5W=l$rlqo@!2fbByCx`<@ByPfgq^imXjS+Z=L; z%v%s`2`p-1U!1`n=t3(O1m07basqQ}Wao2IO6?KL2&r_Wp{STMrgfyn4V1F!4{Uui zWhvx}o1g@BRrYukxki~A(M6HdztO)O2j_`NG;Jz&a@6$klum#xYY) z33gHDWq8h>P$z#X-2Fz6kR5SN`=Q+&3n~;fuq7qB#xXlu!4fx+nKU{87yD&hvO;*c zTkEw!7z=2|`vr2gj=nC_opHcM&CUeA61rIjTwr-t8Ab0Jo!$d51UKW9m4 zeiP?9z`?L$m}Zu%2HMaUX-9_|8u+B7#ZzMUc0KUymJG1b{U=jsJP@HWrq%6U__l!U z7OV*(sHY!h>F;6%{_EcD$wnSR;mjn!wA+ds_ngi;i3devd9!#%@aAum%vTE=!#Z3+ z@}Dc#2G~KLODY#ZyUc#%_TvcyC@S=g1FBHA2>S1|Ia+2k1H_ZF7Vy~6+xVg`$&fpg zS!KtJ0RsBoUuL%qB4QfS(VyR8-({Dx#fjL8!^cT0j~xaKhxljM807L z@2>2#7S<~VNJD>VNf~6QKYFrX{AJ5bpF0qk#wQDo)HE^sDtID4 zJ-w%X_ew-sg)lQuz%^GC8XF*)2gIp;sPNBx{cj^}J@+P^hBOQnGM&CG>;T9>Bsz2h z;O?x}Jqk|MBq$6M14cmoY`SYG5A#*8v`8Vz_YN6cnu2wfXRaHot*^T=;s4P!g0?`Z zx54(jpcV~SYR*Otuq%hUHjE-+ML{$pJuOXtmmSdkg?a5;GL0ZFl_{UNFY7#H19(x{ zN$@g#O5Yf!sKJw#0Y15nCGzTWBHSFbeIzQ)1Kn@loXjM~7k)WVhebU(oh_xFXnz9x51612)QE7?_gysID@8J83qi)Ew&s1Hm`@{&MEOBdJal1C-SlU(dAIa4LY8O>)?G}&Yk(h5i_eR%XwHFZrNaM= zxQaf;$iUJ?etss4lW`F6`32hS2D;rE9S$0m3$>&_&5z!G-E9iKlUq~(ur|I+(SIcs z@uLL3dQS4~)y2Ck8I7^mWWf_hAQ1=LO3;7h&tmXEyyN)Qka6Nxm1pw@`sq(pjM84f z+udK%Q!vO(65a+kF?XE{#a($%^o86g4Oj+*mG}%&PwRyKpBgcN1mroGD3vzFO<$m- z`+?GPJqK8DhH`$H0nNhh?cPO%2<2htfRJIpmCA1H@J9@Okm%4DVD&Lbj26O`Dc07E zTT>~N2Foel%f2*GM+VZ`z>lUzNdUYu&>h|2v}E(qBEI}*A3Rr2T@Q={q_(rqAXeQ_ zw&>3(z+&w<2ey#z+{Zo3`y;qD0rceAJfC}x0SRNZ6s||?Ly`N)OFbMPAW*t1nubuo z_R{?;h{zbvd(P@T9r}M!+*6U6CN!*E841ku(diWIrrAEIbXB3e1Xf$N_ojSCaKnG1 z2OAFz3VVgruYaw9;L|rro^4B)H0?C>pYOhW(Y9E|%EsH%Fj?^18Wad^hT@9=^(ANL zxU0YlB>f%t8k+`F{3ab^GSgAlh@f!TQanmK)T)0c1W+nE_(`vKWzrI|FYMf6pV*!D z$9|>;8Uqs(u_On$%Tn2m1U{-zIecJFB4a9SL!ng+P$k>oxIgBpQvdZc*2%MSbSP8* zf$!0$l$F~};Ju0z!zi)yyB>1by67r|3#r#*XG!CvoU2WMeh9s{`=j-oDxqcUzoNev zHxrIr%zbkPX!+)D1BU}=sML}TS0(1lI>?0Bq0FC$>WXGc8YqiNl6tb5AD^xGvlV@| zlFwEiup1d>MSXPrPi`Y+O9*ddqye1R+4RY&=PVcc=OPR}#^+SN8JNB*fD|UumwMT> zykO4SFr*hAIVV~B7De9NPtLH}t}VI>i4H(FxN5Exb~1+w`%fXIPYykYrxgM~h_X5d zmK4TAr-FfX2MCv@ha7P6YoF;rT>^?*niV!kUryHFRd^@b)e>d`tjIElQ5!i7gpvS( zQOv5d{jg&-P_g|D=)I;dlwLG{zKq@|U)c{J!-s|P78rX^UjMV(*X#2J&InJ=MV>AB zI!?%sk=OY;NO4DT+W4<~oPH|4sGRf$Wei-N^GXTmW2&oOJMlPAw3l^kS2hcq@4z2c0UAg6uq_MGt9EQ$Fb8qRNxa!!2?b(N=2NR zj4FVS@O$Yfs%J|BSi9(60CqTV6WE93>w?}rEkQsok^z`6j4ih$y7?KBM^5RbCGh>d z?uQ)y(24NQS4&Vb2o_qiVV7j7#kU#P1 zk_S_(pbNZ^n_s3+DBQm(IxqRB^OEyEO6H?-2`la}IP}X)j&iHa2Iw%e0~K8Q=~(>Bv9(0{tilT?20p3FI;^t;=OKW7=Lp)Xf3CNIlLSajaYa+*_iUp9+bi7z;2S%ElqI^e z*r3nN)UZu}O-c?)`iY*MUu;o+4&&#k_iE)iS&INm0ANB4aJcbB<{7S6_OC>KvHZKp;|js!Rw}%?uO3-Ug6K8BZMNi<>Q$!Fpld5cAAorARzT<{Y{i zT!i@&?Y7SPZ`e%ZVoGci5|qG`Sn3k@`2WWc2*Q+k!6GXdKZ+#=x&)9ik>;8D-LqAA z{S<%~;Y$ETtS`QJKRs#1EB-{i{OTpoEe-H5g&X_s4A`WeBx8AQY9$e84<=@NY0pPa z?~?sKAj}5n&xqOd-^pDBAqXuJDZcNL;#igUY~c5c__7DS0==$!sL(?*9CqLT;pwC5 z1I-o9!p9W3Kw3ip3D_ImeTs%k?eziIxOW>}wjjRGxW|B?3|GDFYq({=vZzrZJZHRK zJezJA3FOi&h(1-k$O2>ro`83i12s<};9`~N&?-R7?FK-e?uRe@&rjd8ie`az%h`># zJLkQ_vyT{v2mlZRk$!@4y?n`Q3FASPrh(Gu${@TDnKX%$WO(sy5dz@8gL}b$m!SOY z=Uo;sCxHCQmM4DlWU4RT{{+zo0sd5hxzD6*_x>fqu#2LeTzcFWV6qq>g-7u~d{W~| z^(n4Ht7i-g2>f@jt5i)`_GfQseNm(Q3$-P=C%Q{wPqroDDP|ASX9oc&Z7Zjxp%)F59EcrkAV72(h zXB~M6ba7*qmVsjvASw?l{7XbhHz=aOmI1)h_+&J?yb$#Ye@k9=M4F7@#yEQF&_9L zK!TXr^gN?3IRl@h_$OpDO_4>)tKR;DBDhp~LSSY+F?(I$Y942ze8e3${eO_(x-TG- zP#Hbi*oVi5JK?*NI^l}_=tzyDDswH1NBt913k!?nnYqx%+L{{lI~%Fq#hW9MBsm+K z$o0Us7k4voj)ta>{Mvvl(mbbN~ zN(I#p7(gTcu2VeO|MCidP-JwS(k@9EOsL%&i0kMPrPKXwMWfUe`AFUQDP_5m6xdm__zKT!OOjWTLgqvYBsoKXwy+ ze|6;=*Rky>x6D8aO-mb%lY&Q&l{IlS=VntWn5GXbZBGK;9KGlfG_ox#m@nL7jLP;k zdb<|K-0SLE#?2v<-e+*;JtpyV8NG>Xnx}|4e{`X_ZmarlC$}~?hwF^6W*M7?ai5^* z*+sm%%ui`hKVJjyg|b^qsaY$8GtRP$wz`qoH%<61_~(HS^pe_9lLjsgAZTp3L>bLY zO^G*BmQb#F^Fyhm z%YGTLHk7uaep-wyadL8Mf1~Zw+Ek`^W{=CV;$Iiqjm$>Ew3#TSU7+v8@I$c!CK zun&ypi1L!}CZbhCt+6*s_H5E*-f9Y4uwS|{xYlFUJ@@mS*DcsWp|Uyns@CE9-FTll zfy*P;&+)IPOPyMYOx_noY3v;+FGyZUS(E@Fa6H4xKjfarVI}s>fI9RFK1RMZKmUE1 zNc&k0CPOgJnU6j~6$NXGiNXljL=P*c=}L9ro{#x3gU&5bGrh_q*RzeYQ1e#VZC3Zo z`(UH*nzU*{o4IG4pKnZuM5)xEn;y*%%@L{ui#kSCo6FP}J9VMNB*pVV=Q4s@VW01D z_s;IO2+@2-^jwC9#MqQ`-_^QIu@Iuvw4UiP?N||i%*6zuY{^*5<|;zns1~S-epW)b z!(*$0@cfAxKsAw$@w=zZ-pRsRR?2+U0VTfWuJhtx6CjSVhN2nBsX4815kid)?NqbD z*g;SnNkJ@Pvy7D%1l3imsl_+RQCh8Fy;i#>NQap^OK~7>pmQfubZUFtxPJL}Jj3w7 z08bp8Md#fQm6>0i#&9#jXSuukr8IvXqGq&c=jbx_on{XG3P8@&8A1#nx_^{nG3^+a z#WGxM7x^!Fl^XV;sn9y%BYFr~2Hn&QQD15i6u9~-6~x}5KmtR+;Soq~-&0?EpeTze z!?W3dD3;_BYV%7>4!%+CTgqnAt4!)u(99$Nf5*}6Tjh0dSe{N&`;mX)3fp~F>)p)x zvtsz7*LIt*I$Qjka*pBSE$8dv{o2L&e_UEyeUCO*Q@dZ|=!&XKw9m4Z#1Hr4g%pkk z%6uqQQ_Zy@xS_HT(%#@4wA&@Q0PCTw3iNlF5T5^RI|hOE*#OD^U*Z*p1suPPb&c zMSa?j#3}iY39PTR{nidkaAb%Cx!XXEcW1eptx!eAPnboU?x;1<&G4zh+~3P4QO1=R z8hqOaKF)o6LtubA2M1!+gpfAqf3Qin&l7X{y07a67rCjxxMpa*)X!4G~{o%A&rM@!2q}ifkgXVp` z(+hW(7#iwj_S&nm{h#g0RM*{=ODtB52_CgLVaEqknr?bzZDXkU=gXd%JnE;1^BJ@J z>Xq!N3_j&_bqCSM_HB-bjiU41`sZN=DGiBMQwamk=`};8%YMRF2COkkfK#pf5kVQYxRnz!2{1asUlHR_bib81qCPuaI6EO4mPfjm%_t{AiO zEgk5HB(Fc$or)>DNZtt;^0@K`wzQjth;^Rq+xD@0#vFx(F0;{ zv}@=vg1%J{OPZs1Pc1d+aJtU$!BLz(?(pkNSd|D7{AsRQ`{J$Noj*SzWU*V_sQqSb z&+BARZPA|5JE~Ut&N3&2f5=~HkJT{`x(8LNWQF`MS^Xf72vo zZd$pWh{J$H!@89S`zlu7Bp*OZb2+_8S z#@H{L4;H!6@VIuuXRo&FX8rZJ#}SRPT;l63l9yoTF=%Vm=^c|Hh`?DU&9h@F79!@Y z4rzGs%A>E^6RgB+e^vR07&gCT6t-zHImXwDVT@RA&g;|V=j1uPw^J;(^s9{9<`e6g#?q--@*hgrZm8?q{aA}(AEu&TSE>}Gs znL$~)S@-$aer9gyu1zsV*REMe=D&s$H{zuBg|LI|*LCg$m)o< zEFS94{cq&$IcCLXV38(8^4h+h5j)qTbu>yCd-LKEG237q1C@;y=gfhdJ3Zbk)P6Vy z;#zkN-DxV?S+k~9=M7BN;j^?&);Q(bL6zWFWN0iutmMzv9GfoV8Cw zaCXfwJ^CYewA^5BPa;i~)(LaH5>>4&HyX;V{$DYxLS29|DJ-lGiHhn4`(s*CddvX} zsHw$(RrhSbztgxmj7D%V)om8uXDo(JbmsNamU11t!0vRZ$JJm~_i}3g#lC#iR3yfT zL}t>#d04?UGeK@?g_1w*t}XT=mD>T6+HDJoMa90_302twRJFScuJ<@lllgY^O5Q_T z2Z_GBgm&NF$fdJ9d}|Fl*oS9ttM>~!EB70ZfbPcJ78<%xnbxr_I+6id*;x|8Auh3Q z*q~OhfU{!RBc-)Qnb+7r?mY}fqbNT11^5K?g$ijvyK~V8SkjA0QckIL@ z*a>y!pkO$4`p(}*s&7_6BYaO@#E z{Rd2X6PnjurjheIL3JqprPqCnggA#B!I);_OgC2GVw#Q!HG#Ppr8xQe_Pz8mu}i-k_^476U1*TX>RvLSsc1`blE86R_l7F+WeAFZ&jm2d8=QDpgc#rz;@%C)0^|8R^pUh+1)s4ga0)Oz$ zV@+L+%Y*J?+avMgG@4iA588WV7Tvw$y8tzRdXb1X7K1Y$x%6L<->7Xvy>xKR;r0ga znvV~l{`cU5HxX#wkeCD}4D==I2m^SfYO&Cj zS4}q&%V)lisQJ73G{9P&6_9olqYHF>idr1f$RRsH{T1I$0tf7nzd z%cx+{t@-j8;8a_U2xd5V*B6q7}fk&BUv9*%IdU702x^lT(hJEkSRbjVlZG0|b$(SND3X zwnPTM=QVGM_pbdlK_07M3M3gZNRJst9<@(3Y{4C=GTrWp-fUwvqAjuZjju>i-T5dh zNuqJ`-ZZmEzm;faP6vg@R!m_o>#J2Rm+F3U-Kk{qS`WY9$>LLsg7~(B)>~VM1D8wb1*`;Oj z41<`+Ik|YqIPtZJH#wZ;Ao7Mp9QhSt|!<#?N;NX!JNrW8P5mVKwrQe(0 zS6v5=2*G8K8qy_RHuz9Q-?{j!IsEzU`dN~Be$s&2u#&l=@6&atDu@{4g7Joxn!yp( zX7aG7%y#ZuS;^oR&lY1go!BT4E(Reg*7o_3-Ul;m|)5)?g*K07|XSam%qeCPXTP60^FEZpC)1mscM zO>#=FbD9~xyVaOg%ZWXingj03FffV6rf{a_Wik!_l22UQPnDS}&8)^Bqm5g`-tS~? z65ZmPDvdF@khnSR&L6YrhQJ@w%#w7nsiMC?jVTqD;Hkk!B{0mWj#Q-{l?#`7olA&j z)WMY7eb4d9S7k_~C13NPhzi&Fc9P9Ze2XnBW$SwJ{M(NKx~4~K-2ZO z%P{d^lg2Feb6IBfZQk79f3Kb7SGg*Mup9jr^saka&+v$1taU4OD`9tRiOj8Kqup9t zDOm!k+_FpYjpQW}+*Ku8oXG0*CtW3Ksmkw^N9OjNCrykRU6|*%ym@hXj2Av^{wy}L z{ExMWcLDzkvsM^~zH=3qzO&SyG5(9}ru~5*OW9j}LI$)LGmb=<2YJv#_8F%WG>v_rkg0Hxj^l7mh+p)QqHi|_iD8})osnY8A>=y9kM#LAg_VgfH z94$FhqZdKYpuCu*3Y8zVZ^tsMSPiPH3@E6>1EWdpD?ekVj)h8nW{*XNjE71wiixhK zO9~j2{8YbGrXZ>4kMrtcGJvkxD+sKs3TP6agi0Nv1pN*PE{SuN|Jy}Dk|2+w=DGel zSi3vImF{P}6T)}~0ds(GGdN$8=B z+hk2?hvXig4=A_PTXL!3lHEL?e4moUsV?*LTkDSk=G^hfTi)wRQIb1;N(w;}eFb7c z(adPRu9He$D+fXANCIRem+{bUrTqPQx9awFG4JuE!`=S1YstF$lW%ETwKD>Z6N)Mv z0luymZ`5YT4lc-Nrg5Deqwt(BjJ>v)ZhtTM%`BSHMt(1#qBeFK-%)r~yTDF7QHBN#OJ%#6E zdN>03gIEoj!MP5sI0JZ^60BT z&C+c}p@7wA>@qB~gIHUpTS;1E_QoH|TOJOTPWM=2&irR+<1oeHtX7@WbL(y@yp^0+-)*-!1 zTl;#8It$RXISGN|vBvdC{){Wr#n)nHm-{p%E{u!VksdROnw<_Iy%lKuW$%Z0yd#7R zJgbb||6Q2o^}4`$nf(iE414Pnr`q+`!b$$!idI7ZX=VEq1N-{vLWKxnY{}W*CiL#x zv&wk_pSIM>Ug39F-%q0&&EK}QF$*K2jcKo+vTgeFyjee$ssJNpNr&{NBN5sP94woO zW*y67OJd%Q2gKWAa_Wox`HIZoZ^x$}N0fp+O=uq0lYyn6e$u!VkmP;Z(@2Xqrn|eDWW*P7VfXj28!K zFoai=d3Zf8K6pV9Iq9$NeSaZz05(>(|$F3;;doE zGCy6{OGJ!mmLUmqq1Qo)UL1XgF`evpj+9kW{xE{4HH}PRUoO#Seo%Aj75W<9OVfD- zfxC+=#?`N*rAx|(*=XdFl-fj6C-=6)rPUhI+jFLZDqrtVtxH?z%ULSop5_>oze#s= z7!9OeGN)BtX6#OP3_iMyIcAMT@vIJ|Icnc8H69e+`>|T10AJ=s-5C4Rv9EODXp8+c zC*d;H2EK-Wuchy1iqiSs(O$(-TaLt#wuI!ND@MzYD_KB+D~ZU?k<%^ls=8kd-pl@M zzEO$uW?nzr+`j)ZuAl!Ru?{h@esH>d(<7+nc+)nY|E6NpT7LQDc74=P_Mb z3Kt_y8{wfibvg$)WwUyM(^#S6P4-Xo+VbZ}IjG+8wP}@pUBSocYqI(okk_stD?6lK= zr<1`)hg!SwR)drIPV~vQ&3M~erusUlsOR#EKULbLMp&H?c2i=nS{@E;Us--`*vjQxd&yVe_SJCCpP zy9KIFI;y;r!{CM1<+WhLpH>=|RBt&Sj47@~|LhswPH$YUcuZ)-yhFs~VKJs9LQbI+D(lC+Y@W`T8cBXF|7ynx z4pZ1hg9kYUU;8e#PLjs=yfpMFdyo9c4cDtnuJh_{2j1k@&e8P9q6sY#uMfG<3Aq?0 zi!0yXKkRGc+s$H~S4%s@=$aeN+!R)}%l)5-syW1Kdzi9QmCVdaR|xB>C4nbYZ5p$N z_kCuAMQiz%Ocqwb&iZLxOcG*+WV12#Mor#z4>?U#DUVttb{^gFUe00xii+#;eN$?K z=b8shW#Ses619HH6-+0*uygB8|`sd$&B~DQ*X0+Ju)Y$25GzCA;NrCg2m}2ON z&v?!4%?KiX=niRj;-|MgA3Yyf#j=9}^WLPBrg+xKbHqC87j=~k`AXZQ8hx`q5HRCG z*QT>>OU=9_m@zF0cH*faLGCd-U_C-8DZ{KvC}}VD5y>j0V==AlWI*~! z)tWKq6oe)WkJ~4g3z*4}E+^84Be_fw3oVn$f!N*)*RT_c6 zSYp(?O0L#}N)oQwgL*Z^GRDI5mY@p1`3*)8>M~N*#d5jkPh+&PSL$pZeJ3=&Bm_($HkyA&5=?6YXiWT18;xLwDDNAHy-K%H<9wek9uUfB3a< zEk_+1PBC49=Zo8`9SrDHmVF;i1EG*6h^tlkZbSLt@){`jfq4-JEfckFAJO`U9Ll@g zP?l!&WU>28YmGk(ScdDUq|rucJwM;**0a!d=ojvpHq)I3N}*9f4&hD%MS9b${qPkO z`T|JcD6kbs&1m;TqeJuS>N9y;Ix(*HP|Fz#Fz_t8CKBMHnq->BE}+>E*IW05y1isS z`V=87OWS-K^j7cihtuiCG@*NpqrHg}sLkx2N4BKhtxD(Z?nURAy@D{w!`jt1b zTuUxxZJ#9Fu(0Gjm10^ivWye`v~4*~B_wfmh5$1}j>uhj$bnWf^wT zZ)RbOm^FBh4u=F1d-aHa#^zinD5;DiefvGpt>^Phx(Vakt0^OqnqhTA+DJXCbpny( zk=;1yS$J#g5n2P}7BfZ3vxwxix^2JuP?N(+$XvwTe$Q+~i!(gC;bZv^fsH*fE%y@6 z4cuAYCi6tQMMY|~Tk5pa(##$MZ`9Lnx+aBknAI-)sA=rVaIIkQVt3W1&6ao6-}Sg4 z$w~MiY~AL0-XlmeT|rYgqV0+f<6!c|{@FTlCL(59(*$^;`x@P6!@snUd0E)9K-ZJ( z@33q>=4E)4ghyX@J{l)zu#262p3XS3bfn{VzX(kVuZ22^@i6M}g>fm$0H=f1ER8XO z%TM+@KLRJ?ek>-+v<8iRh`(c~$#Owi!-OK&nrj#VeHP*A0|S$c1g)@ zUEtx*mkK{MPSQWHUntb)v`@`Y$xVAg*ob4ba+Uy|tQt<50zD>=~vgnpg~AMH zh_I<^b{GY-%ow6|y`-bIRK+z&scc_sIW0HlF{r_hp36BO;W|wsCXL@DF93bmH<+Ff znMu499p$UiiA+%%c9)A;A*dBjx@?7p%~4S7AXWvZe;Khxjv_T?L4try%0OyUbBzJ1 zkT%_P;^P^U8SOcfm3Pg~h#34D;W4o4a4s420}HEoh?5?gQ@J06|hDax_3sOGO;dUu3j5eHb*ph7qzbYjwNOOPD3He%0@6Ze~*|JZWl!OdWRRCNj2=Krj$c zQQdW<)+h76O`_GO1R8d=Y>QySvYyG@6JPIT@%{QLRYb^{fKUnFRd%seYq|-kjmp}m zLs8QXrR!(}Zp9OMnM|aZ-0rR-qh&z>A@S6|*@Z*gT}_I5zKM^z@nMuzuwXP&qqNiM zcerzXBvoyvQ*oGMeI)c!Yo>wIf;&hIM}$qBs41xBLw4`xWO` zeflap5L-=$^acggnVV15wyAd=c?SaOD~_pBXx|FNbg*2~kO*z884EfZ(!rgaT!d15sOvcRpMziB*u`I2{XlZNfBh@70BGGz2fUcP*;DpW?l)xs{t-bUBPRPCJD8 zZ;LD~Av!($MpXE;d9~I-2O|kH!UJyV7%alxo^pDLyEHgk+ka^qu%e`w~HJ%7K^Q6e%9veA&(hr z7)vz1(|;jMKUdx{y6uc0B{ZM&`#tdaBtjQ&)Wqps9*P>@3`My={ANjW-sgIhoI%_^ z5nT!*d%b?s1j!!p5hw`1QJ9|U{s*gxe;&1aI{nXZ?H~K2I3%a%Ureb4UY|AhuP7`Q z(`cA^`R0r{MHNQ}vF49lzW+sIv8dyrWx%Tu$S|Y?xV9(h)oPCtaa{Q+=NRBwV(7HM zE);FzYNWGXtev|F+&e_QOiEWI{pMM z9h<3-WFx z#}=dSV-psOJKfu#;mebV=>lG6HM9}S>H=d%Mis>mzCPqS0!t;7_%73Bl)(GO#IfqV znRJL9&%25Is*1ZsBG%V^$xy?&XTHsLb0362Jo7Vi#Cow*~ea2{4GDQ3^$sDWfN=u>pJQhzCvJqhSx@#R8N(?M5f6G-nJk7OQtiv-m~_m zrBSo;m!b-ej9Bv*w^77|VyU;$u#;FUd-e@Fl^Sh6F%V0ZIeq*ES!<{+@QDtybMORP zg(KayU+fsT$-GR!SPf6M3!(Xb=>&_#ZCugNLyP}38a9Yf;O2^4>>Kz5VV%moq-`@- zKm3ZSY=2k%ENyUK8Jln@H}qEGZk$y_IzgVlMT{vGR|Cp|KJqa^2OC1lbc6!+GJ~%{ z|BiY(p6nmN++yfz$b{~>kRbF%==#+3j>Su+2;r#~kO4VoBMY=Bq-klSgtqsM$$%Rhh^vJBVi*AI}tSY&I8HD$88OxjHwS zZZspIkQX1f|M{^p8I}cpQ%tV2@~#**0`?Az#iLL0oh#|OkwTzT; zj50VQ4^*zkgB02|BEYi-+S* zofyH)Ow-)MxeGOR%q?0gZn~5-m>R+pB1Az>dmE+jEMC*|oywzS%wF<4_p-VZ=Yz5< z5gaGECsQWgZj8I|gERxZUrFBUq&c8BdBzKwxS4G74knoSv*_X;Eey^C9+fw9&(|d! zbYGqwb>3Z_{mQqvxnFZ24Rg-fGPs}L!D12CGZiNu4spF{|D)A=(0UpF?ZWme#rhUu zmB*aAi=*zvmnF}+$y=4+LF2iBBMdywgpyGk9c<3;305CJYoYgCRl?Lw{HWA+uHx@+ zwlq=fPgnxC^)xf8Pebq`_XhWSE{qf!=yoeRgABZMDuVx3Qk0VFI{$XM7>pz$R0;;Y zZ#_h}YQzn_ohf}w%rzdSdL4ml^)?W%UcA{Ltu#$ldvCc;)UZ-j8=F^6x1t@`5k_3ve=b*cB4CWReeDYM0 zRGT5mS82GPacR42Il7iJj0~dWO?oFCP01>a&2BipX*#_5DVkCa_~9L=l#UKyXO@bl zl#ZdK44@>xrtCM0rflFe(>OUf_sSVO!Au|V{@s*rB6x5M@euYXSz*kWDtf#gvV+#N zQGG7C`qwk1ia7jm^@sGInG?d^^}a-$Ig{V6P0TM%wcAvY5{opddZ(qTJBy`JFH-M3 zIJ{z~i52yU+o-Sh6|JrkbT@&7Tj-b zh|D2Z3HWU#`2UPGN@o7q?U!Dj?B-p{yXdu@XqYUzugsaz!?lwJ*6Njvq-_oro;4-( z6+Y0oZGL%}dv8y8-?Nu;*w)NA!fS!UOZ<3SDUd%nCw!4De(b-6w#hP#H|@8D#w**d zE;1W;3_`#A3HF^hjA1$i7y%Wy?t5X`Gt!P*^9rQt_+l@Q_ z#j2AIdyf=3M0<~PaM|L6$@%o+ih}dbgLgBP%cQP-z@o6c^XBlsA%?B^RL(8!>!V|c z`0EDQ5uwaJ$hn%*rnMvMAIo-Db?X}qq20s@29xlp_Os@d&6Mljg^cF5X7mB*^}>+b z(C|a`*4!cs%T6)H0K;EdgJd|0$xidvjmw)WtEiLfwq1C)tOU;cVbm7g;%CpQ4Ep#ldNHCNje@U|ft#E6 z%G{)r=}n>|xt!p=vxCsf{Avn)wkuhS<*==9>XgmOxtK;k`KA+T=BK~Jt}lXW==d1w zxgd|5g9|v1r)v(}>d7#VCpF;Y*CxnGxA`YS3;(vx}zR>3HR6nDRQ7c&@G|t%ir%r zAHX7e6cXCJPrkCs|6O&o#8v;NaJ|eeLs}X@h!KlLWMGu7Y*#NWs`z1Vd9y#Y`cX_P zQXS|gRL(Ch2~e-eLchrzNdiJn|v|r&j=%lL<9=0%XMtZT3 zV=Xu*69B|bI2V0y{HKQWE=6OsUyH6LD|AJQ0k+nNN>a#Xccca(q_{IO3mAMsY2CFu ze{t9>EY(B=l_$e|!tq)*a1t2urm%>fb)=5dM@&c;*(X}<;qc=ptx>hFpIlorYpKWL zjN7jil9zvyVRmUU!ZFj92633OD!#f+e1iWFHz$wsAs zDGulkm)Y@mGHUlSHDpU6ZZ=Hi^#1PlrtnjT(U>FwqEa6%7pUdj=ku7BnhwT2FuT1- zpFcqcm8t_y%ZXQYCB$|w7s5xwcKbTi!zk#OS-z6n1fFMBLB00pC8{j&Y1Y#Q76p}9 z18PwH++?nYtgL&v4!-!hSg!aMNmnE{kSwa`LDzo#b1I$MZTb}{Ad_2e?89R0$&XW<&ykEPeKY*1ysGw&1Q?>uidzMtY;k{3@{ zd;qG$$TS_mD!%P}JE?|8Yg?l%$LVi)jPJqn9hkSFP3T9d$pY968Fc$Q<_{L<2c zzQ}D*w**R572rBBc~^pu9};#y2HlgB$Axl^um+^yd0S(<;J{Cc1HX9tq(gJB#>vU# zv6!?5OWpe#-M|X`oay3U9W}-^9MM1yo4O4hT<)zB?R`xn+#tMf`X);aT0w-FVhY)*Ycb*TR;Iupf->?pRiARi#E8J%h8)eF zkofobcVi?|8QP{bB`fKB7<^06R&h%_DhVnHv9UORK_AE4nn_>yENm;!eHQSFTG(Rt) z>7~n&V#xdu6rWlgs6ZU=9RohHVdLTLN>mWNgjjOVyk+a=Za@jK^$iy1EPvxGOwnD|_I^kn_(+63L4jc=7b^}U7W7cN#I~R7ZtU_82_brk zZ9elSE~>g_{VIyJmc!@!mOWe*2j8(lLcLHdTm<~5sjnD#KF*)GX3F+(jl1sqI|*ru z7*r!}>a}_$7it5mB?I=2mKt|QA@)(JzJ!>+Q3$HU5oO7A1`UmFo|V;Fxtqpi`a^j6 zRkN>>*q6S^gt0hbd&7nHy5(u7FskwBZgNaY)VnIN;;+&%F=p`#6X*VdS9PSYIdkuw zZEiEGT3Xo5GjFrO(d$kZLDZur^j;&WLqLKL_M1Hzvn?0-BKLN;G?*`^6No8JCpwr- zoMQ3Kd_B6mOWw0F>vqkn^HQDy!_E})dt>DI&8x@QAJX7{L@u?*JPQ`>0{%zkcbU?y zY?q4z*YXWK_jHggdFZtq)_Y%1oRKX$wcD+e8$9&ds03pmhkI#l?SoD^XbnrwWM(+dM zeladT-(SfGdn*?B!o?Ekgwv&KF(n;kcX35mNc?38Iep(Q`C0R*am-WUVz`%9*jWkr zxd2Chyl_Fgs~g8(mH^#x^AU@SvPmcaQr(*%XS%2XD6q27UJ|)g85=W|U^QE1mmBB2 zN;brL>wpBaAnSA{oDAv4#$8*}uf0q>a`e3Pz27c5cNH7LjWcY6`w@+pUf6 zek>7|jZTW~;fOo8xq1Z7_mDRH@Oo9`_0quYcjDYe3z7K6?*bCXG>nu5?UT!Yc=hhm zN^)&~;N!K`q9CU2>Md}g2%sL?5_*G9unYXYiS)~Z%wzTSUr=G&Qm zomwAT$(&`v(O3)Jc2$1#73USQ2_rFNO`Q=t>wyd=9CwpoP5}DlxZVF$tw}Mi_I9om z7@3ux4^nkErQR%1bHTtv^GWNXop)W!Mu=TA>;BI?@tu)R0PEzi_f|?c5=bHfW0kAV z%=)$?k`_1spND%tqp#B!u^bxKu&5AqF)^zVyDM{hjgsE-e#OAk?&Y7yRTb&Sh6nj zC%L?vt`6>(yn8|rXKDHFzS92Y#90x*u%^q{dR!>WpjDJuPFy-|@gQD8@qW)c)WpYp z>-9Guh`dLDKj(&pjW_7b&K5MQL2q0Bu&h0u6IBmbG(g%l;_B8fMg_HS5DX=kZAQln z5x6$Xf^Gxzduog*bY9@RR3U*D`wb0dK>wrv8qL(*HHdg$_vy&*%AfGjTiiE}#e=Fx zP*^{7dv)}KIE6-6q$Ds64OU}MnuIQpZ&LGl$CjxCm`r3rcA zO-4lU1=UZ#?LOH;SUJQe%5!FTAw=ZkF9v&PU2DCdsQHPi*=8>UsQQ~E5d!(18JlRI z7uq6A^T-hYBgWjKXmfc}b@Pn=U{sLFk(Q5M*q9ehb6M2K&U%B8QPrWVBWg(JQuO?B zUJ)Am!}xqM|13;%V!bXrpaQN)ec8vuGDTu~V%#@>GJo(alS-n!2KO!Un3=IV7q#RH zFgCbw3%s)H;E{nhPhC4x#VOtKfNx#whFL!TFPcEx+v>%Gp71{spP?bFFO!7cHDTdI zAXAlw-X&*iKH_i#ApbII`Fw($asUf6*ssHnPS3V3d zW|1@R4zHU! zZId%-$z+XJVEP^zQ-fIldvz@4Dgl8GKrQQ63q-zl5@B&Duw5xkxu)rx1oA}@t|hsC zXDM{OLqflHdufv5TqwN2Ksq33hectLT|z=~-?5`*22ixeFZHS?p$hDQ-8T6|ZmuyJ zr~{9JwAn6KTsbP$$MfuC8Iw`hJgPeHt@~YAy(+%=*lixZw#}W%&|0wG%l1LRF(I$N zF+rHg+53><@Jjjd^1=r?*e9OAGoD@Zoq7(~oPl0Rm$x zT3LBfqHMhN+vAHL%TWHkz|AA}=+M*%Y(EXyOfILSZeB^OJw>u zJ{AkJxQ+3q%MCvHqA(HhYc3JJ5}QGx$5l6ByeK>Lz^H7-{Z?#u%ct;8p~edA552%$ zpZ^k%%=jKl3}Sv^whU_eAD2{0<{**wvds~i^){`NE5Po4#fv95Smh( zy>ESb&hJ`PP;UCUO8gG(;34Hc`4tj+{aT(s`YcJcrVFU)!~{seGdPlUiqt3~Vqz2Y z6x?gZ`+czg?7`#EpM&ihBwq;|1OI57JG6rGSlmPKqy9^I{c0lUyy(nD%nHSPwJ;Xx z10Dng43|c>qCQ03k%^AUj^~)O$fDwr95;@iV6_g2#q!o>Ikcd6QrP`G2kC9D7{E8< zTYhiy43Yk2xc21@_;1=6gcA5(Wd2DbN5!ASh0TiVkleqCRWUtsiO?Ipaeeapa{4mc zvFW3AH6K&~2_V;AozEAvUxYdhf&x%Wxz2+Io{HihE~-3iKQJBQEQU`J;d+z zZk29m4b#mBTPN9C*uO5nU8zmJYn!*i8GG7?sPU!#s0~Suh!KpJZSzYQ~t4&GQCYf^oonrsYEod;;V?yOnpNO*lNbIKI z3RTzy{!s;C-F5K2haorQNF6G*37FKcy0@wpWN~R3;%{?r^3J6Vv(Q-}X5L8NSP}$q z>zKUjtmD@)h$jeh4%Pz}xkbWsXZ}D?aaQ?Hs~0L$T*1rvp0UJoH%|n5Bk$O44XgZI zq-kS=-9l)L0_t!t@FdIC+deh4aqY$uHR-#$V~Dok8+|c276)%dRDPk8ygTo zC!m*oxl&m~al)Ny#&FI|m81@pEK+S~yqMYSoAkRZ5Xiek-)rY4Lvk6LP!~|7^~s7n zEc`SEnBLC2u?LzFLELCUR(^$gccfBPYSm9MU$m2I8OtGSk+m-|Bj40I?U7jZ+5x8H zajw?tZ}x!ocKZeGo2R$5p^37%bBe=W#h!4X!1KPV!lE)7=%!GjxaQxre_SwcIKKaF zV9T`Itpirf(MDU+FQ1cJ@1A)ZC6&+FR=zL=%&MG^XFR!Ns7qsj{5F$hkj<%-3YcbR z{hC!?9~FQAmf|uRxfI!;cli}Q%(GS*9`RZ}`j5SJqt3Mdk0aJ!7c_0V6i&`w=rmJ8=XG&Q0BX5(6z-LrC z;iyF1(3IbJC7pUaHC%-0@S`N(cZ(&vZhUYhT~p(>Fyw6(+Sel~rrm&~`r z;dCZOf>OF7jrgP4g`3^tU}V5A;8)VI;beoc+6xfB$8(mz76FRFst8|9NU$N3J^tPSa^c7tL6~XMayQ6Uyn68T-KiCI(3H$ zW;*o9buTNz!$Q}go-&f8>6wCoPf;ZASd~yX5wp;(?eS7Cf+2nS$v=f;_iUA6(D=C=QeFA3xjy)Z1 ze{?gxof^%+Tdkoa4EZNg>??WW>hE3TeD(cXRDMxG#9>+g`aGB5z#emyV_u!neI!v8 zh5J&n==Z6;i*aCDhO?OVvqo7rPaWLU>iDhHv?CU+3oaxaTLNEMp`uK!9&=N-U(QT1 zs!bUOnOk+RZ^stoB$~0VO)@G;w%u9iTf?=vL&u`z4Rq2Vn_%`t0A2ZRqQDgjQTK7`lhb_6Y z!IU54G3V`EsgJCY5~}#QwozIhe&0^IbNIAr;O^}>K@=I|{8d{!off;=<|kaeui&R( zp%~On&YfMoSDa*~>Eqh&Ot~5NgS+@4z^7z=uE%|HU*`sGPuO(OiC%Z{Zlsb_R!4}n z7uI(-x}Z{zfRFm02Z#+JDP}w~s8GSgE^~^5bd27mz`!5%R#ZVK5c84A(C8wfvNgtD z{4)Hm?+pi;kE`5B%L*b^wCQvOH4eYyPJeL3QUU8d_V;K1$u_m|pSf?qb|%s-vP|GkkX;Sb5LQP9lc; z?C?SghayJ3LSM%zf7<4j`Bukr-%j$7(NgAWI!JzzFH=qzk8yJQFNZ?Zhf=flc;?BV z){JLnyBR)W58}Eiwl1a4G#n6s^-@)avBba5`vyg0%O!nV^>W3Q{FO|y0Q{|qf zNHL_e=s8<&jLmHrvnWetVEcg|;wMgZfgyPMus7!m!drSBNmiWr4Y z;{BS6j~sKh|Yv9=%rt(qznk3u9 z@$f!(@-?#gM_^W{{Mx&Y7TT6fU3t1$>d2Vb{TGU`S`1Shs$j(%^Eh+VVqo#sK?8Z3 z3bK(*JkbWF$84oqQ~bs>5>fW=1r==B%Fr(w(fselJ=k|0(VgyP0&$j(<)nb>H62z0 zZD;S8)x#CX(xp|i-z+QWR(x}o&}p4bC_AXwR<)bgn$Zo!!QF!PERLCLrC?LK_;1(s z{u2?ITi6eK?v%%_ZL#HFs(7v0{p8{lEeire+_uTSk4Yi>nL-RT!R7+q?nvAZY9rf| z=^crx65P9C@sEFEvpdwD19H+0baa#SYln=Y zu7Q-te=EEyQfg1n*BjS;rS64+$AZdWWYEGbj2mOfONWJ*b7%qBr@o~0uEDTX7^3Jb^&V@_cvjbcZZGiBU7iLOQO zmW;DMP$4^bhM(&ynTz_)f^~NRNz&Y^)Q+Z<$ECU>$tvH+$hL%R-WmDT?Gy7ONF+n& zH(%{lJWjhgBoK}F5$(kHW0I_SlnOJs5`5+T+5fOw5@0H6w-1M09_!V;BjGbUus#l< zE`svZJ@ejJOPDzRKo7$SH#yI!i##4SLt;}e^y2u-6YBjx_n5H^8=e_~^TP+q%UBj8 zdys5#nxEknRXBnaQ#llj6>zZpqu{zx=1QOSHGr4-1mScs5%67JqCGn0wH}%o_V7(x z2?uN}g~2S=sUY@yFNU*x zIn&W3+O-U=uJ)7W1M!oU#IeP>)0&@685G(bvN)J~nPjCx!>L;|X{&s{_c-k3!2mt$m4_|wFO z&F>tfC%)dozDqFiXN0ww)Xqlfx2TRxM-khpNiaf(Xy#L8f4!7bLM5~T;>VYtGQE5w z`I{51_Lq|(r6;*IxF_Ztz-M)wEOQxP5vL;Xae>!9 zaoL+)U6gP)&X(X;ac#`1i7XwN7cCRJBRx4E7-4V4XI}U#sU80lLi&HkRWTX+yx63` zc++40m)2!6=XMJ+2G_rd_mzG+Q0EEqu8buLWl&1Em7^VenBpa39rDn9cRd;Zt6XLY z-RM)|@PxQ`J7%QKF6e~i=9&;Ex>Q1vdh-WTy}VuqTDH96wehZF%(8_)#M z#gvWH6;{}Q!Jyot|A8mTotPda(1hu@;C|egO#ua1HZ3crYOvT-bi#h4$)Bc`CCtV7f(6dtr1IVRAh4t#tc*V-G-_% zd|Pwl)w5Jsaq&|t;Dt>f@IF;RoWk>ZneCe1f4hbu>e!q0p8vg80~XkuPK*FnD;@2z zA>+Qb8B^=@og`Z}o%W!zbubPoPn@19Hlq^K zZ$ow5n64B!(3v0KC&?cB95_gK;i|o391&B7A@Q5=PuiG&nAx6kp=0l?R^Kt|1F*m2nr{F&Qv!v1FE(HX>81Oqal;f=N2j)yd zn(mUeZzDpj232q$B(Plc=zFBs)g`Q;$o%M5c%j6zc-b7b`A3o?K9;lI=V!w@`nHs) zY5`zW#h-Eh(GMypLqe$WN|g8gP)ZjQ@7*`$ZNFO~mKZtq;EnxUHn9kVN&JrD^`I*o zhey&Jej(NR{v3*>paG5Er10bT%n!@s4LnU?m)?OhB7r7crv3PwJJzYAX#9H#T{DU= zHwvfUVCAbgz)W-?5MLaYze>W}Y?B%S_{p>;W<6QGRs9MVR1@Yws_WRboCQ>0fAm>* z=YuJ0Fl^7Ic!D`oB3J;{c1Q(4I~B#xnkbeT)UTw& zK@3S^thoNuHjRVaM}dJrLz0lYYb6H^G{9e3ZRn)a&1Oks>fM@GB}#;&`4tm)P8<(I zROJ{jBTXnu7xFkEPB6`fg}%T{bg^>U)@J$`#nN8aVg35el==tbMvA@c!%e z)lK6CI9NXa9WT>F3!N96Y5y%4c!`7{Kfgmq1x%|@OsKJgTy0Kd2_iB4#fb|Z{=?Gu zi|)SUoq4hSCF@yuC-wupb~;Rs{?+Ynn@%mT&Fw0q)Er25%KEsT;b%9M>U>9AmR9sy z>}e-T8+l*T+ach&2}6BxDfC*#grT&U}xD5w_Qe(;y%0E1Y3E}ea}D$YkvKm0iOZypGX zi!sH#{;RkPrIKsPdmY#~U$;XE!jRsTxKTv&r;vgXtbrW3H*N9cA#*+nW|ScW*vD81 zS?wsaJJikVMoare@h2jzH?PDV={PgMWKC*Es_Tg4jRldP%F%yjCNl$KSUb9s5OPTm zj;ych?!qPv@sW^3YWH@c%)P{`l~0g#E4S$x<1n_61D2~sS=cjEeC1CAzg{s2bQpTM z=VpA@ZMn|UTFJ6;eI_V;0$tRbV3qO<{owKsH*!^I>1MFfn)nRyHi0&3-_FPophxAQ z7Bag(lK%@L%&O(LD|IQEmTp1vJcagO8kZk0ZB@o_-8Au``R13zUjl@O^106%=&P*0 zp<~l9M+c=E6R?UmE-Du2K{~1KTQ>3iX=S*v|6(-HH*;Ik2s98GJXO_3qj>%^^=RZD#ZVYRMP)Mat=& z63j5fD$;cHF&xS{OMuyiZqIC&j5fO7hUzDV?mOgfovwV0#sdZGTcP@~K5+#lxW9s& z=ZW1bl~1vHRTj+4$?F|00RWNP;*a;N&Jai)({|XBNV3NR0%$hRj9t;7y827(4??hn zHQ0}%0h{aktoE$Yem3GEL;psqo5Xo?Lrl*srmab0NQ-If7RCq4ZtgI_=IO!(Q-Ifg zm**FILKV#)8(-}6U|J~z)2a6E2F(liz@@)1LVw+x*?#TV;NedWWdw11UULM0pJPuf zKp#<}n1;;{F3c}HjJh6yc;4I)s`alV zubQ_0n6?%C%kGGTftu?ReD@#2!uiwV7g8>9j2woVDV}kk&O0w60H2)!?-J+}R6!}= zqHx~9)^B%D?!g*xf=uf3f^S;HB-)#CMNZQa zki?y6#BqFEaOd=jys?O$;Mw<&>z8Ri&_A=TilDQ1FfL4&_Q9R4x6j;i{n^Ly zHV&>XDs()q#|F4d67p*lqw*%OzzV;%P5 z_RVr}FA7*ZK6%R_^prlmpJBLVSCu<1&L*J{aC+_2#EFg<0H~!e=h%x~?_gwUb*)cd zDGDp*PVvmJW4=dBxEE<8P=&SZvoiD@Nm=#`m+u5dZ=G+A3VuIm?!L$a=+ikqKbeKZ z*C9y%wqF~njc#Lwb`xJVlYD8~nNWWPNua8WqvEB>(hs-HnKK54nRQGo) zIBtsEW={>A3*xv;)l=k5cNPpBC9WFR4WON-vTUy~`?a+5NP>d#^5XQg`(!#@LR_f}lE&SpRu zh_Q~$92N-=hyk{e8Hnw4>8GpA^4k=pG^(A81fec1zoEbz|FE(Y^uHI^^=wqUfsDD5 zr_ZRE6m;CU0@u?Iciq?2GN+%`Uha{$6$t($I-t4(dwyHnmyX@fJbFR=Eh&UCUhlc5 zAfs&P*kRTrrOZe^Tx3I+h-rJ(SdrLULk=8WZ&j~d`_tXx3)~sQRkVspR5j!N3G%c) zxbY{T3vhENx2C_oMNXL&xuzfyFW+*ExbJr>g3YYCz;+i$Ij(^d$%Uhu^*L?MI|>|LDo-_kk_zB0m3_U-ynS3A+DB)kr~$|k&DObVMY z$L9@jpBYvu4>|EQHG8x1)>}WB;8nP8KEIRFeUM3x$#V|;<4cv?-BkjgzAPuYOYd|G zBLh|P)0sptOu~>7rVO^BT%nzY%q9u-oR%3!9HWKz5@H2LgL28M&7+aIK!YaKqEw{LaxH9FQ;W6x&StBR9%xdr&j^GVjD(bI!+hr^3KRA1O z-y8r|)9dV>D&tR|pDzZ#H6o6)G`Cjr97prqn-F--G|c||_cLB(X*u&_1 zvFMSKte0%BV~KCRSh)-(d)<~&R`X#8d@RX}3~LQEO3Ln??{3PDq2&TiUIA0x956|` z^bb7(>5a-QGsoWv?dPw8Gux5gv&F;{bN<;*f))Ar5a}e5dY{}khi9|jnXS?sDu*j8 zE$%j_j{Su|C}}LAmfyMWlRZKVHf^z;WwYF#vRk7-`q!iHU*LYy3~^E%XrElG+n^Li zaNJ1zCp6>ee`U~n;RtfXXoaJlnw>K23-Trc$a2o(y#UrO9f#?AlT1*0S8EvBy2Lrj z{7U`OrXT`XoV$K_(DOqYi7v+J*L=4Kw1PlOc@=zqwSJ_?;m0!PK6j4V>aSQddHx_O zXon1PmN=Cc5-9og;oBUji_aFL%)?q$k-)Q13AYb8qv>MWYmL~(g@0zYy?6Y&8u;f6 zaK(2=uQ1L7Q3a~_4BJBXI9A#Z305lGt^xv`1e?+5KVL-Vs@FOts^HScg+?{Z?Qfrp zFMZQNqF>{JLe$yRa{+-XZgf znaAGZV&U_?;f z8#2fw{rvR|y`4cL@ns4QVLtC?Ud@3;x`72!Qkm#pUvMwJP0?@LL#&zx3S+$dn@GsJ zd@~uOEEF~0&1+{xU)U>&J430ssQ7{UoaXm!)U2`2a zhAd*t5M%KG_QVWCBv=o;$2lWwb-dy4%)BG_RqLAtjdwZ1&xe z55b`lWj(^uQ!P>G1CjTsQ&Aqt3i-{4jlSgn=YZES?kg48j(D~QN#>WS40&kwLJJvky@5Q zav%j44-!sRzWbPY4AB>QsjlhhMm!`1igo(w%5QjQs%U#}j5W+X?VXosw~#*XMhv;x zDxs>|0NwM4n|aozkv-+{_SU|Cgs4mTwJJV12}L3l6CAfQa7y%r7SkTB68P2IABYq% zt|89X&kVni$JPN`VH;~!EoTzqG`SfZ&bJAR5?%{ki`OjwxP?SxaZ7NA%uPu)C_8^( zSnf;4oMKUmZNz$T^PwXZwNwSe0^AgB4kc8Udb{n`0{ru@ooS*nJRMP zanUpH!`#a(q<=*`1H7*!&||}$AK93QD>BA>2{^Yv2DhOH7SG1;D{(e^g+PpnuV_Q| zibCC1Ml!X|tx`*^ZTcivh|2c>k2j3)^H4?=}Tc$!faws9|2|EuZc`)7TSc#hs+$il&!ymEz&p@lB-GCf{8^NNy z8vQWWeHtaJn%^W`b@Zi50DJkdry%yIteJ)w7g`a2>Z#O=q4_o z-<^h4MO3*q%1cF05EM}vJsylVWJVDpALx2tYO2sl#`<-3ox>X_t#Nq-EU+C+=-Cpi zxL{9=VhV6lc4*8u5|1Djfs5ziiF9XX$q#%J*I*mkE9Cmzwup7>CR-)B>^>~N!o_={ zouNrbq<1bZN1^poUA56%91ia!+o-O3Nj8ZP;bcu23}Wr(8HVToO4t3(C{K=g7Qb-t z*sJRcl1lO&jyAU~p{tZwdxG}HF%iO=@~Rl$4iH<1b_a8{F+;7z&fv3gIA{9pteW^M zHVW}&cTSjxf%mmkbAsYiNUQ=NYD!r=6@6f{LP2GMaBM&TFo= z82nnY-ZmI>AGH(+7=5Ww{LM>qxpa0$MYYy>K?v#{_mPoaJ{p3<%iGL#J~2Ee#W+Ki zPK~lt{%l~;GN6Yz%s!G`Gz!5KFHkbS`sMu$7H$b1lr2a{yVl8CmZOvQxY4oHW}F7p$8IXF*uKrt~gnRnusGZ1=@eAVX;^|L7LU zb|$WV=%>=f7FClH=ohxRI`X#RqXFD)`y^B>WhQY#58SM3`MYpwj7k?)2tJm4BKY>v zZT^`WFc$K4))?Dw2696F6MGS>5EYSBKNv;}@_($R6HC$86hHg7mgEvqkGJE^3w?Jb z>3s{T01MoW&T--U%K(GT*>WCddkLem(U@ncL7rN+NeT5kHB*03f3W@B;MCVNzqAG~ z6nF~omONaCd6UB0%%z=vL_GBTK%NE#S++QfAv*S5Zw}%5yLsO~C>*3xKGHf78M7JR*7#@ZhIm6t zAwToqm1Kb0=CPQQVqBmhP7y&rX#R4K&}~cL_s;L-doojj`k!M?SrM3KyqyKradgai zqJ8f1--qOZP?)T#_sV|`(H476SbrjL*R}C2DAGm?T@*7r42vrxEWM|t%M>D(x^$u~VHGc=`UyHL`nUia+)trY>3vIbe-nkiGg* z(NZG|voMvebI2H+I`8ZvLNr+KlZi^SP(zi4&g{21=OGmZ*b{e9@cLZEZ>NN8XpnB3 z(+N?+#BmEk4c!hr#hLb}kt4ssM_c#3j>l{`U`+3Nr!-v%uCc0t;bVlER}%q=E1myuBFS+$oI2n&4+4ZH_zKGLU;OMsS2k z?*!bJB=zPo5`~U<-Mo9J390Jj(7ZOOU{2AEqF&2; zGUwgM=2Qm{D?I;int7-9M+KOPw#_32*e8L&&7XJdQxbZx-#oz$ap{mQbrlLbj#-*m z0pO1{gB1G21r-_umSVJ_Z(cfJ(XlvPuzS>iV6*#061@F zwH}tt_DA@yBXL27W0a*Rp!7KXU7AmYO=>WhJ4(+E1D{~;Leng45`U%QVfi5_q-$W3edfDLjM9suxL4uY4cfu zjqQO=bqtV^aW$N)aF+s;5pT7iHg9`!9~m5hTb)yX74(P}hU3eYX^wv`SllI{j`u!M zFQ!GzyeW{x+C-u^ zDy04!Kc0x=XHB5Gb{Ipb(%U8YGQWL9vF#HT&;yL(g#&y3dk}rP(?4N?^cKAI&?dZV zr4!jxobdW`Qt20!o1hTAQplf&XYoS23GsQ&NAJq!yy>94J_FP%MXm&}HaLEp6q>Z` zE)Q!n^VZ4O#_#pV73AXNL`IiJBJGE|5hA-;^K4r0cw~%gHO{RU2n|_NW`wh+M4#Ng zD;yc4kRa=JUo?uLA|^)ehB#mkjpSpC?0KE|I>1*`uJRWnbeCJ<@A)?du`h40RPlpu zEc3S~5JaHM;FEzS91YSt6YY;6zI^mK$0$LpRgKy+n+@4gfxbQtA;h0hAcO01n#V<7 z<6ckH#N&!br@l%VY-Q>vj@^wlZbL1(XSO>V=F-NbGc&jq0{3ysc3K3mXF>|@&LYPz zoaJE8#F}iDU)J^KOCuks)=N{e#522lK5xv zhM|q@TP%fHxWv9HfBEQV@`hq`qcNvNqHMO=d`%B(rny{0A5av+_2;}8)dgicu*UfE zGh>HPE9%T?bMKjKf(j+%CuP_~{4Yl)hiwei>Otgv8BJEgU%gSS-AAQ0O7^_%x!1>Hrp%o%CF1_IS12zgwdc3QZ-{Ku%8x`a$f`|1C zP;>q!#qEURxtF5Ime=SN1tuo1pG44I(d@QmMGa>+jv;fQ8(g_-HzJ=tMytdUB%NsJI;7y#GdyD)uqZaOG*m8Tn08B8<>9ha59Zvn@Zn&bOzG^$!D|Y*k&~M#lt$ zVS;*ex40=|DZs+@zwARB>s@LGh~(+=6%HTvm{Uf8IDg81j@&OQ27@qiX)qACh1gW{ z12urSg5L}!R2+JVUSit8>u8dMg0K9OLK7M=i-iD*-=~!X+p7zOa}M8 zhY?wgxF4eWPvv-|Y*K##$6*b5DpYG-k*7e2xQLJO_ohw**xC2a^c~x7V}@p2p+Z!( zxCsU3kT&G^m7fKF{Rp4F_e$CDMEM6|7@9xZzxfXf)qh=)@&M`7)sKv5xmf<}feqfE zeCp1Y0*U13@p6zgTJ~6o0~TO)S~!(XTjZ7qW4;a(f(=<~Xm$WpgdD|>z*sZzHCkQQ zCIJSjn|^-5vd$TP8iyFozsw3+Y+`^~@y{r?!qO;iY`8*A`#Y~XpOsu;e{zxg$;0Z+ zymuu%I3+z7;)Q&BgPw+sp{!)UbHNG|s@blVBS1u9$Gys#q+5+2aH$kK6^tW4Py$I! zC_na5>qo|vBv5fQxrqBzDZyqQ;r9f3&cpe}5K^DTj2PQ#hunk%=b&%*+ZeI`SiqeB znv=LcI$)6`xmv_9SD-NH>PM$K^vghBn}l09dL_x{E{*y&a~(pmU@vfFf&%J#Z)WRY z!Mk^f4cSPxM8(FTdq_C^I%L;zjV@IWt7QrzE>+yCU}s%C zMDT`?6S+;3)dw)oC$;8<8R*nKK3Lw3wWBYJhixaeXAluKR6Z081L@NHX_d_ULNxa) zh=<(xo1FaRvfb{7^N+(DT2p#|=Kj2;?aX-jr7tbtvtS3Sr4I&bw|Ooay2K)U<9!#E zSIxyH$f2W5qE}oE5IO%lP&UTak=~2V?iOB&UB1F~31mOJ5Kg1!caH_qxeW&sZ;6kU zhQxja-p^X>kUu$$IK4#pU988%U1WQcu@1QY^YdUoSS-^VBnU74<8*=0j-1>XJ z$8KqI$Fd+|Jg$9TCGj&SOwyn>5VwkUbtL=B6^MK9A>H;v8HxLVJ9dH0Wqegafo*_M zJ)hfhu|Ov&qkTyz4-Eh+cu4Age{&O+wu-<%j@znOt0YxD59 ztxL`zH=>uu@AAlY8#bpdNofga$y<1MxYV99@N*HS_oyiJ`l9=oS1QWPCwk0}O%{VN zoGT~4q9uEalRRFzP`I$!j`!NXT9N2|@a^X}-(RsO^0B_oE6lS$dkb7_<89f_@q-Nu z|LtDpc|G}yZ`l9yUdAcO>Cn+}(d+0}`)=s*!tTLC%>;8R$xiw9BkTnKIh)53fo_G`Fj~+T4C5MVtQ1 z1i4Pm&)2DVkA27G)j9#8I;(KoNP^{6UwUVyVCIyT%Wq%fbW-vr1N0!4kIgA_FXHt= z9V4B-ET+-s) z?%`xvAAw>XR7?G@_G&YvQ8KzAnweCBCjv{^+4#?=I`>=ltKUYq*?4AHGVib{hTAjDVLEEU ztMB}??~tWczKwn`l1WoSv}y7!yW@zbmhP{8yzrNg*KytYhql)w!g_4A1O&vzrUtsd zshI!1d+?fI5*F`Ty;S`b*0%p%(><3o7#6PiQ+6ef3@&l>HBZUf{0_PLH`S$n!ajX2 z>z)zXIg7^H?o-hp<*ILgvk)Ci{}$+BXHg~jx%%6cupwIYwyiAJPby85lD}E%?f;fZ zayAG^qY7Vsi=TP(J&)s=cVjeB2}iILTki^k?EYMaTc|DP95N+;8OK>b+E{a4a=e)h zc5=HvC0HW?Xf1+lO=%oXpPRkhWAMFwMZpP^ZIShNh= zqh?MCaUZ8(JACG!)$InuAo=cgf?Y=)W ze3pcXZ!U;!iYuJcAg=#k>PK26b&6C3ey;b{Expq1fiu%_8|;Alg?8gB?3_IEoje^HITcXatUOke z4!cHP`Pac4Iez#K410Z3Gzn}J8iJY<_%2u`=s3gCMGpBmkh2BEAR___h29`BCLnhp zlA^mJ_0T$^bUh>!1))bXV8c+kVw&}xs!IHU`R+DgN_~t%j42}^gI?yiDsk!wu@*Oc zIz>J;4L*TEiSqbVgSasZXLcU>jFiQuz$-BxJr9sruh7L?jP5Q@c#F7)7mtLkm*As7 zW#Fn4?t>VNf}?=hg+wm@`3RQGqb4S#8&#gCB@D)cie{~sn2<}$B5f(_cy9%^L8QaZ zm23ST?@>x{S9se&zNxE@gcDhW$g&X4kUu_KLK*J6__E1X8iFNP$*=v4h&Hw0-|(lF zj@%Nh2<{wTan=nnrfUVM`&7utttCt)0}!kQ53?k@LrSF)?lvUwxDMwjXuRH-n%%aq zGYzc>m3p|{!G|y|ufQyZBI9uW{v3!yZeeORn2WlxbD9eKC|S{vlkfe!T2YJ)9I{3u z6VI0aApYHT>5cTfSg}j{sCr+ zQbMdH>&;j#+Yp};rV;Etca27FowJFEkSLn`1d{v0%TOSS>kMrT zpswOE;cV^JPl1d|8U0WBI)@ZFkFAYk@yVzA`Kk3t#2lRX)8PF64C0zw(@j`3vg1OD zpU5o&J)U{*;C672$FLER1I-5nHYRboSX#bDw7`{41^U(<3E+Sbzl#HvgR3arW?%+G z6i^vIP-(q6;iOT)!GdED!KR@3LzW)(V?d(Pxbu2eHg6NrjU^;pLf&fl$FCQmGf9Mv zkN_-Uto0MQ;4eq%4{OhbBfTyN#u{I-X~ZDbWAH?*a8_@9G$bFwvaqn7HztX`^hXZC z4T`oTVymI&qObS6eTOjzVlTnc#b1a>T;b%vuE3G=ughRG)Jw>1kt5SRnC=b<7=Aw!^2WkJ@r~+K+rkYr1@YjLn7f3S%l1YCF0OEES8jA za{PDvf)_S^kX0~82E|><56@{<)85ZvMox|XiE#}_`O1y260C;gNI{MvC@PnYqhN{? z2$O^&W3cfZD;PZ+0M~((LauO-_XT#DOClnVq?w||>yIrdvL(U`EIW!hL0&%2LHLxq zLK_t-f}miH|7Hq?cb{n#ye1w~kXzFm0`l>hP!kME3}iU?2)a@{$p9n_1lN7B<_S%nD7_wMVj^_&q|0Iur1RALfk&rz3gwkFx_G~#$m=i_jSX*zykS@_db&% z7kt7lfQuF-PXL|I!#?-d4aj~A_FG`@f_~8MjNy(&b@^tEdK6xA2L28vkGIzp9tY_w z2qqLciqw#OgMsv0ydVT#3W2NILS=KxFCUR+x;Jj=MPLS{Z|OF*B+p>`Jbt9Z48-9X z9&jGsZ^T_lNTNlO+q(C-ylF(=GjT1{QV>+kxmLqdJ0XL~nQ8#%^-4Kby&E0|>Vb6Nz_k#-E7H_bRkPZbo z4-><0y{BIG9gv9-qY)yd^W0p89n0HnZmVsiIZy%W64fCDlmPX--jHXMB8M8a+dY?@ zPwX`JZsOrzoyG%0OK~oDTj~c?rkMR$S zH$R%D54A;jI6FO?jL*USzyaFI9DH6QDXKNw2=W*$!o6K|ySsf+-`MC=?XK8)x1NfF zi<$@jrBH$at%hJzOhOE+ja4RDf)1ev?KEJc;_b(T7Ji9R&QeY6oY>u+AMwR5>nG3T zmzLw*y|TEQe_@wC4-i|1S5$T$aCF`Ijl01iqjg}lC?Mrh_|gV{p{>C|UWt6SX!rcv zkV-okSK1UCIG865GY;d=V_F$J{)YV<_B>n#0i8u)+sTI~7*4oTG*ww9!_SInH3o(% z!Mo^0Rmi<^Uoon}VRQPd1g4X)ow4YIolElD5xc}-;Bipk)2w@xar_Y%fe18G;qZ}? z3KrA|=+i`0`iLZ=yLmXhNNw^mgc6dlwRS*axHn{iXfVRE>zFix!L#AkXg=Q93kg0P zrqz<*&!_ajTN*_&PV*XJs;?-Iq88syIUcW1s)s0uea5lfP`Rff7Zz`NbjL!|NPaxI zr6Rj~nL0?8z)VmEKfrLpd?nY_pejQmM=F(f=;^w>Dw~r+$CzF~mJRuf)LyV7D65par>H0-Tap5z7tg~pp;u;ADEq)vLIQJ;jc6E@n2{zM1wNRY$hljb=f zQsV@h1%EO4w*Mdy__7B7jBy5o{Vc(Vp_@yE3LA*^%MdsR^8q<{-ZbIMC43Pg%%OA( zMS)6h;?)K3l=os#x+E*ycmi@}_~Ba`%DfYpZP8O}X*cXs7Q+zu)nFKYSILci%-YIz zubPFRhx{RLiAQ)i2H->J5y`q66;}@qs+StJF_i+!#O%6YbKv5B#Qhq49XioykGPaQ zDvchn87>;WCTRS#WYgeV?We1?EE6Ory!29-R;fs`ln5$McqF!-A9=>`tK{RGp{EF> zG*qq#ZREQsrm#J_$YlaQWPzmoRnk zfB6PBXcs9%#Cwck<6yy3*cb51@n4Ay#iiVl&8o45VXsh1<9oUyS{P2NKmQ~V&AK} zL9ALN3%mlBtDET$iN9C|jsxIOV-nUcd3oWecr=c^Jg~6DGOSApE(`oe=A6R8Mg+|x zrbF;^e8~R!!(p5eKb+Q2tAn_(aH%;Hf)nxRI)d3h$D-;H)etQpl3km6-F243;>nwG zf8AS8fU)3cY0vLRnNj$%_W3=ofw*Z)1U6;^7EbtQCN7x8&oPZtR)egoXwY-nxzhY^B z_TrCR>&1g{w!y9mEyQiGTQ{h)xj1>+Z`=xItdR-KHk?l4jSNM&M^fZ8JwV$C%IS`HBXMUEaf+Y)w|f{P{f|s&iVQ7dsoTM4~h=)}M{_k1zpbG*UR~ zvB(Nvvlizmdz^5BP(GI#FIrNaBPtRq`L~BvaYrsT!NN#vP%qZROG{Oo|5pB>O0Bj+sjD4Pjhuv4A%9b7dF&bxz?xq;_vr9fgq|FdXa)zm}Zr^C>>b6~V9!35# zVs?7V=t(9As?M2UO@xZ*MZ4glf=zr}0xPp7w_C-NJg)CxRq(CoHZm}{Q%)9un64qt ze3MhB1t69|G}R{2M3L9lQT()eH6UB`I;IPm- zQ)umWQU>8_gWFP2Gnr-zaMQ}~%W1B(AC#_uskJi9LRuwCGd%bm6vb4{MZW>t`GUxZ zu%+uUeMj0yoP7_406nlQakRTnCA{{DW_ltGg0w7Cu}pKy7gP-0N@J@eEt;|Nqm z=E62^5hjb2Ep44lX~bHVu>@2krnL?!AAGzjAI!J|ZQHWwUHjXdbDA>6bbCIqPL#c* z%rr*Mc|61x99XN-#$>HotB*tBR`ODsCn38Iu8V+#m-=T*B9XR})t+JmP+M#N)(%(aBi1@n zwi?3s&4>7aZ3^(O67@dK5V&3j0DhI#;h_2egG=ne%=L``6Wid*q&IRQDn^&JlV4ca z+PT~9Bg?sGSl-t|uU+4tpM+2v9=ds(a;k^usuldMPo-G7U$tG)?HYVRp5LIE>WQ(e z!=+E}?B;)>_$wbynbf`#4hf)DDr1J4q&^{4%&8TCm^?2qHg9I3hG6o#{l&TI3+M?{wr2R1F0e{~!+)32a;f z2SWX`k|7Z8^+ABsUN<_7(rHrgg8>dXNBVn%%_1AAir9Y9SiwgDU}bf&F^CdMAH8pK&cg11p&Z1&UXYUwDbkR z<>soYSE@--Q2V&mxQtZa9!TA!4ijj5)T7|(r8R{)t^760ysdr!TM8BFnHLIBqX2B# z=4$jAg0P#y<+IN3Y)S`PofLZ|r0>&-$-&Oz3#sd9y4ilsqEUFRx zUCYeA_$KDZgwQC56{YrgagqY_NVA5f61Q8{JgA8!YH8rP!AN%5OC>TP4jiJ7WHi{y zQeOl3!V(mtsK>OZ#}x_nizKC{L|95E9zCL4rB-~TZcY|P#$ptgbOZhozHckL%Std? z{;?IzG3_M+HA^YqSGZgQCM)Eo1;>>Kdl2-fuh)ZVS+I38ex^*lPkQw!$RKF-N2{W9 zGT{9y63SuE62LiNsC1wLTuh|yrn!g97*d@X7p<++3xfz-4wI;e4MwQMbuVRa++Qu7 z4BnRjV;AGbFv%7`+cE0Njm{Ovi%9;o7+vl^n(RiwI<4HxWyW>Up8xltRjxq`m? zd(WU6{bXmcSp;>vS9bUTOi^(@sn}E=JEQ*2eP&E^B0Xy0eXaP<_pee_)nsp3i&cw{ z0h%!8>*0xFuudHv9^>FM-3~TX3fh;Kx~35b>ZB@aL(dRkXVsypPnL?VEorIUr|YJ> z-2(iiU3`~l`OjNFW2jGDVtM$CBOf*!i zXXH{XH&f;*WoJt22AFHb%S7E24-+(nbbPsrEw!}033zqY&7otGOT3u%TCZC~gP z@@!A)a*O{n=;j}&s8wRVpqQ3FU|6>NpF}qI_r+)NYu36ON0@g z&_F|Q`{NF=EtJ|;q{lC&*04t?PSLt9i-^=*XVr)nR|A#NSg3wi*eif04w1w_$-6AO zKv9he3ag*`1w{86eGw*JN&FYb4>$x%(>SlRF~*m{(J7LXneAyO_D?JQWANK60og^V z?glc*b6UMLSHiEz@o?0+)V1OMAB@O9vM6=`LDm@lN13kQ7qA>Xl@_%ob3VCB*rXo- zFCFR?TKH|U#oXGx0@^0JvV>OWnlv8tQJR&B$lqcudZ6|i=0TVE|D+aFQd((i9dl@R zs}V&`L16^9YFI%F(BM$bm;Ijjgcc*nL9{DTK?1MQ6}eEWp2RT|uwYbh zKbFhI0|@k`WdE6R+c$@1m+)aLvQuk9GF1dx;B42!?;V-y^P#*@Vv;m!txNwioz0&B z_F-PA_(xX}C9NtY>Vo%w>SxOT!cU-`g*N;vRc8Mr&%oY}lq#21sK%yCsuHw@UzcJA z_P$9k*lbU0w;~XbNBb&D9R?(4!`7gX~l~+UviYXlG|G8dn;O73%1s)gh z$#J_I+Q85>$p0+VS_Y_rS=S-FRp>tIt!^yR-zV3h0pUDs{m4$~Hm2u=BBZ@$PfmzB?Q~y&%E>0QO@YMNddKl$Q0hiZTAUro=exLQvL~?7)Yg8TrugirqP->ye@_x|Dfm(={fR;QDv@T6MqFKQj zY25LEry|Jje*hEkuyr!v=xekkg|yMMops(byn5HV1b_REn+9117YqOvsDBP*d@E>s z&M5q64P9AwBQ*qCUOd(E1g)ttlZnayV5$98`3I^UI+b2=e^vHm`VV&*ZJA;y;GDVp z8y%hvbk4-#q$X<^h(LWsKm9})(61FIdA;k_Q4I}-;9+avy%x1vQdGSuU%l|;zlV}3 z)SwH=ITG19xVW+`Ib~2ogU^;Fxc?-MO)vB(<=N10&M9wJ%!3?13$k1@PKW6}Jqf)U zUub=m`PR2^n~pZh_?@B9<>4|yC}dy}KKRwOlwEz5-mqa%J2#YmN|BKnuUKITOS?Ej7X<-gbp&;G>*I;7rY z-E9HUz0xfv`^xZTSjwKdr)Wy0{@_?@wd(s7?RnmUCD1#?*G2pq?Ks2#pbWo4$p#ld zQlQT(I)`f482@5KFOTg4s8RhKSlFVr$p=f9@g~>tgTF#2rww(lcgQRK4>pinn^b9x=j~X)pp-p~d+6kkCKb`YKh;43b_gxTF1(6#rIKU$+d;f&YL32GA~e zRjY+|0aT5gtAy?q$RFP*4=TGxgLhE=@E*3l2x^@}=h`b0>|{tiG+fm~HD{JrJerwW zs)pN4P%d9>CUX2|jzgbs5}H~@DCe|Lx}n-tim!%b%2P44nF0STp~RLIL0`PQ#%<^R zFIu-~JMa*+L|zfqL0?uw9ZDGqvm6!SQvU;z+#Vt59mJ&g>P3O+L!pVH59ilXq6r}0_FdsG`p`&k>|hQj#XammRuC=KLN0d>Q2C0 z=QS~Ekx)K&_P!78&qE z10#ag@PZbmi8d~j0uE?9_dsDn^^!qaY|_x^VxHWJb`@8kEJ9tYiW!IP{?lXZj)!V9 zc7J}|gEIJ^*JspMKaZ*ZP?kqRab?4FM;C(cOHfClb73dM%@ z_?eATwQcRd@^8(l<%5c5HkE-E`TTlJ@%$0?S3|&02-Sl@YeHHMDX5J(GaB!b>?)0k z0sN@6spdg;Fnghmip5R!hAV$_zXoYL{B{p21Cq}hA984CX~2AH=;p6$H(uqRzQjVG z-7mSVV|kV^YY<)+dlrh*01H4G0hyL=W*<8BoD>`T#%|v<9{PM&pEn|7!{4?@{hYJ? zStH+g$*6+Yn+WNkSR>z{oKUg-o~1DEJYFN8Ytd$n{aU+^;~@kqb~Z+ZS<1;(86&H) zPr^wVo`Am5n6zvTN$x?Zr1VoOKuFP zG3t%t)p>kDVAWR;br>C}!%N&TFo}NxbL5+G8 zw}->af~1lle6O@D>FX0;C;3+DZi1{t<>A)SnTbPCWd>V-l>k`JosCz6`S@9X%qzU#uV_9+=xU6=$?0iX_nu|&+!fy1w1;1% zQUBY90C0DSq8ZIr*)C$z)x;^!ko4<@e{{SPK9c;wjJw4y{wM#{j=JJr7-IHSJwPnK zVwhZ+2JQ<;xmpbXI)QfzYX9J8T+(JyQH^qepw-?+I>${pr-oIIEe|SZy{zJU z*TdlrjoL+5iyB@%@SGAn;>QQ(;Rbw<7N0_8)?acYX4?h?GXMc~0Ey!u#h^Q)5jXIF zl7d}3tBDOsG49#7Rn3?Zd?fQ>Ug+r)gVx{sCf}b`FzIxYoM9X0FThpu2Aea#jmUf?t4 zx2!Pt#s&u&okj{Tg{wKRh~iA0a-4ZkP}#&+sh=ri4RWM$nz7SB2IW>^`v)p>Yq2Fm zqd;p&Byq)DxaaPIo4%(*NQXWf<_EHpwX)fvM;aC}>vI2U9o;RGm(mWTHJBrvp%5-0 zDLdrL*Z11sldoZm4CqAOG4$k4^9%s(H}+RZtbY|c`3)WVaIs>q1y+QqlO^}f9=MK; zQnI8QC#>@u9E#X01vNO7_$PPcTYBE0+n&Y-6;1){XRueg9?QidBv;0$5M^_ zvohbvny{M|0#)I4%KaX!j`lbew}ic7J-xOH^y1or;GcIsPnx#c|8|pJ4mW5VXD$}? zJTu*)38ms5QiL)l^{Hl@_=wV7TIw*Mb zG+J&VI@;#vw0(`nI$jX3tl;?c!&B@CnSg?AW6pN?{L2I+*y-LJ`n6y&CA4Cr-x@~l zBusHy_U#cHllR-}TH@g&A(!=|zOe_TemEq%FD>OD z;U7pa$!bkSA{5#4XHPj4Z^GpqOk+L%48@3wL8s7wvsqZOw%lAzf%3a{0yn-i%xcW} zR9p|GmPFkcl8?s94?!7 z8m{QLD@k<*mFhVWK0s34@g7cl-Rl7+z4OD@U94LT#>6C*3De7Ti6lBiYb~FD?uY;Q zCKtp1P4oAjd;j&fkF2B{9^uwOm5a7%S*Je+*ZGS+jch_%lEd}TK!9SW!RQpZ>`&bxKZ$XNnGfsj z?LHKDU`W5&YMjR!A!&n|C5!q^cz9R)W#NKHpSv>yp!)`Lr4dv=PRx9zl$=`rR1-cJ zy+kjdXhQ1wTL?(b?i?eyEiHT3#ro;0j<2S!Wm+k20%DW3Qu#@bL2Y3{+`;gkL#dXf z5h=Q+Qip6_zp7=9?Dygi1-C5Tk<%Zg`1Un=Rk5>5Ui8)I@j4HkYcyduep&}2ksLtq z%`m{O`wJTd*loY7@yMu>Z-eCUT3T^--+syuO)!<|SnFGj83jloccd1L%nnRIc%fY- zEN)S=ZWwI+X}(G#zm?g%!H}z**)6<^TdC``Rg{a3!-cASroD6i(*D?X>+YYNJ>S za}!Sm!N)jtvRJmvMo_Kcz;om@LFMjju=Q`kLguiPis+}`=keU=w#Cb~LjtTZwD9kK zA+82rp*^orD4X|InY}OD8z2E|JDAsO-^uNH_?G7vPLQ_!F!OLLp&-+~%{uQ$XJB4E z9$P_7CCe9KwYGKzRw$;I@#Wk${Gq^nk}HxNrDRRpcn{)$?|bG00(2lVPCFp`scpvh z{u!x{Tpy$7`*rMRob*twLLQE$O?`lPOS}+2i%PM~w*lKKiuKk@^A8w{r8DW2oh`Kd zaf3cWH~I4?X-gpW;!WFnerN|g#H0p=D-w9pVE!0hPmjiFxE?0rJj^uD?`97tD$mJT zDC8D9TpM&6bZ?x9^|Rd&LNt7yHUe7oba+}!CK%7scujk|rj(^ZSujGt6#IxO8X%vc@ z64lg+Y78mjV$Vu#)pr1O?ih)Q761mFPK?WOC-;zAI*0n@^Y_u!Ho!~*t9GJkX|EO)j4E_HGSnGdfQKbyg;x~wO>OieM2?Oagx(P2I-Tk?F9Foh z;-uU*pAk)#6w8-+lY5eK%25?1!M``g>Vp1OyLS#1zIO7phP9eiRjTSB&-*L_hp_$P z!0d#1>M2(YE45;!IMC6Htj;snOx;N4ADyb}gw0jBZwWJC2Z3K!EgwLQc9U;uX^Uyd zvvzr2QqoK`h}i}1l~NUJ4Zv}I9DVOg4618gQpm#cH4vSq89n+v(d}cT;`sanxYsQ& zOh{|IXpTSXC_NR+Ni#Hw7qJPTO(+w2FBDGKRR`<6)S|VmeC#ECZ!_RMvGHvA(XvRZ zdGuV>ttbW~DC0|e^yl;V^PbWbW&9O}H=*XuChbME%Sl!$2}ctfi4bRT;*Nv6J6eK= z5YCG_&yP=^tKQ+dgFL;sC@I4N~&%5{Aw*WjI>&z=xt)QiOu4CT9JLZgbLd( za}WyFSN0YC<&_@5Tfz?Gq!sDzw-ds1`}lrmq~MbPZKHM9G=?XdyUmmeeK1zq{_*ax zbHqXMkV54m(}-nHT-daw)~fqXSxmbHQI@!$2{7KU8UG$Fhk`<>*wFJ<v=qI{2Wc7&JN z<*NaY8}?82RsexOImd)wBXU-;FRLH%3TID=az=^1if7A;%|t*ZEPMvo7n%>%xkg=) zXkpPpw|xtl9o*eMbP957F{x`*ZfGY66K zrZ|Y#ag;7o;C2(_SgKIeunPa6>&M0A{#Ntsq-?i{AgE$u?j*Cj3!hm^*XL$KumhsVf{F2@nmw+f1Vj+v~DKjdX| zmdwv46j3+bf5jmq-$$_Z1kxoaU;2|M z63dmW_MAl+z3u8=%@vm1y{O2>ctdKRKQL2lqyiyRe2(eul`DIX(s7-Npe`jAu124@ z)RNr2D#iBoSIbIz24j#4H}qoPb`MhZdf#-*Je@pY^p%C~W(W%|Ii4qNTNe!{qi7i7 z?wBWrlKmo+yQNULsKO^#5!7da5Pf8O0T~h7&(sD|6yc?zZRm}&qyz@x4SWg*d@0y5 z3S_ar^UtjpJxG#bVvJUgP4vev=fO1AW<&4-}&jtCj zlK2OF0UMRJ+LB`@2lr*OGSSOPoYUdklXa_0b04hl0^!X9<~{O?<^thB{*X^XX#}}x zdOF_wHHOCx^V}`Xz1j`SN0aaKEE06etXx>P9?Xwc&Li`SFt}@`w=3Hn3e&=}qtom} z3(r#1Y(%#USlI-8%xjDR`o1T#;FQM3L7?0gJDb`~i{53i)jVd*bX%W*N4b|rIl2QS ziQW5B_14*FG4%x9`YVRH)=F&P82g%PlB^Xw`1`FKu?Yaqr z_w830M<=sb=#44mX$FFJF6^usu9L=<2KMXx1AHHH*9glj&ExY4Nj9Po!*OZNo!?WUrg5@lRX?IaRmi+WE$ApQs+lpmFc3#=ZYD%mFc)s3H?kXrL&W|b#!((WEuO&PL|+d4ks#rha9)3 z$}ffQ_XXj!GrThJY1?Q=8Er<3KjaEOh;b}=mAx^KOBBwFOZ0^R7v*z5n6oZ@F0%+P zwbUxg>lzyzD9+R245J6nScCp5H6kA`}VuQx83|uTWs@3mj>X zQOqUbu)xVrPXi*MJqKGw^h*5v*k5yZ!K-vJN#jN9k?Jz}i?5c{#(6wHJ@MY0&eEAb z<$B^KZ5Lrk(4+cqo%k$QMnt0px0*0o_9vZLM9O>@eF;Z><2l3C=x^Kax^=9?t`aOi zm^*0mAKdentEzgX#VV0mI%EJii|Sa=>BD0L(pVd14oVxGypr=}3hAa8Sdg$K>(ick z0|iCsu<(m@>uAGqrDgXT4pn|AwTZURVQp5l|#R*{O#N+COhdfYFn))bp85t zt9hrx3pHZoy*V&RAxwn5n?Lcq_IIvt`wpi{PU5wNy}NaUy~hQdR6E3D3~Flj+_(-y z2BiuQ+)sY`I2d5pIn^%9pL6Ur8=5i|s^=5Rin52h)ZDH)M!MI0U7pQfRE^0Vlt0&% zo!xol>teX;)l)gwu6+MIJ8$}X&5X%T9cSR~No-F3Ns2}#D`uZQR|ii`c1 zo!VWK$Wie;w(yZQg;YtWO=Mf7nur+_8I5kF+5_={om0Axl$iZ0gE9)+))%304ef5m z^zprJf&5`0S-e*iqocc#keNfpTfC}%0NV?A-%o_*WMy-$z29l`Q=d`zxjHZU8NvyY znvWFECxFfZ%9y5 z>I^pMIm#h3YAaw#H5>n+KkBHCUd9#gY#_|JN7WFedSs9uTkSA0W2xc7ep5&KJz1-y zsJi_TyIUmV?22-3i+nlX+4b&xmXG&so;w+<^ROOg~N`^4A`)`cKQq{niTO^B26E52wEiP z`{P^5_z&qU_4bhBfVj*{iw$VSEYt?JMQL?zc#czN6RRmWQ{07vewZzqF}Fr?8wll{))%EFfI z0|t-p)t1Oz};2)OGYVkW^X}g3Dnq1L!0MDn0z?Z-C9l0I4J6C`F z3X^TlL!W1cJl6K0Uyv zC149lK9hp5E1b+lm2|+V1vPL>h;AEE9BZoTomeVj-;3Fh&Y{~3>2&ijk`@#X*o-Er zWcJhHfP~(NRm(HrfXa3#ZH)7?f_a*UOxny2m9AWQT>lO zRsZ&Tcz?h?(ou3*+e418(czZno4$mTQ_617!(o>gfB$Y1^AfSmp_A!h�XHqKlgE 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"=Tx&k$p%BWFZ5L|l6 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 Ga=@{)BWot$o(`)JiSL2Ku0WjBn92vZU+UDv#9 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 A&j0`b literal 0 HcmV?d00001 diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE b/vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go b/vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go new file mode 100644 index 000000000..1bf01e263 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go @@ -0,0 +1,560 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package stringclassifier finds the nearest match between a string and a set of known values. It +// uses the Levenshtein Distance (LD) algorithm to determine this. A match with a large LD is less +// likely to be correct than one with a small LD. A confidence percentage is returned, which +// indicates how confident the algorithm is that the match is correct. The higher the percentage, +// the greater the confidence that the match is correct. +// +// Example Usage: +// +// type Text struct { +// Name string +// Text string +// } +// +// func NewClassifier(knownTexts []Text) (*stringclassifier.Classifier, error) { +// sc := stringclassifier.New(stringclassifier.FlattenWhitespace) +// for _, known := range knownTexts { +// if err := sc.AddValue(known.Name, known.Text); err != nil { +// return nil, err +// } +// } +// return sc, nil +// } +// +// func IdentifyTexts(sc *stringclassifier.Classifier, unknownTexts []*Text) { +// for _, unknown := range unknownTexts { +// m := sc.NearestMatch(unknown.Text) +// log.Printf("The nearest match to %q is %q (confidence: %v)", +// unknown.Name, m.Name, m.Confidence) +// } +// } +package stringclassifier + +import ( + "fmt" + "log" + "math" + "regexp" + "sort" + "sync" + + "github.com/google/licenseclassifier/stringclassifier/internal/pq" + "github.com/google/licenseclassifier/stringclassifier/searchset" + "github.com/sergi/go-diff/diffmatchpatch" +) + +// The diff/match/patch algorithm. +var dmp = diffmatchpatch.New() + +const ( + // DefaultConfidenceThreshold is the minimum ratio threshold between + // the matching range and the full source range that we're willing to + // accept in order to say that the matching range will produce a + // sufficiently good edit distance. I.e., if the matching range is + // below this threshold we won't run the Levenshtein Distance algorithm + // on it. + DefaultConfidenceThreshold float64 = 0.80 + + defaultMinDiffRatio float64 = 0.75 +) + +// A Classifier matches a string to a set of known values. +type Classifier struct { + muValues sync.RWMutex + values map[string]*knownValue + normalizers []NormalizeFunc + threshold float64 + + // MinDiffRatio defines the minimum ratio of the length difference + // allowed to consider a known value a possible match. This is used as + // a performance optimization to eliminate values that are unlikely to + // be a match. + // + // For example, a value of 0.75 means that the shorter string must be + // at least 75% the length of the longer string to consider it a + // possible match. + // + // Setting this to 1.0 will require that strings are identical length. + // Setting this to 0 will consider all known values as possible + // matches. + MinDiffRatio float64 +} + +// NormalizeFunc is a function that is used to normalize a string prior to comparison. +type NormalizeFunc func(string) string + +// New creates a new Classifier with the provided NormalizeFuncs. Each +// NormalizeFunc is applied in order to a string before comparison. +func New(threshold float64, funcs ...NormalizeFunc) *Classifier { + return &Classifier{ + values: make(map[string]*knownValue), + normalizers: append([]NormalizeFunc(nil), funcs...), + threshold: threshold, + MinDiffRatio: defaultMinDiffRatio, + } +} + +// knownValue identifies a value in the corpus to match against. +type knownValue struct { + key string + normalizedValue string + reValue *regexp.Regexp + set *searchset.SearchSet +} + +// AddValue adds a known value to be matched against. If a value already exists +// for key, an error is returned. +func (c *Classifier) AddValue(key, value string) error { + c.muValues.Lock() + defer c.muValues.Unlock() + if _, ok := c.values[key]; ok { + return fmt.Errorf("value already registered with key %q", key) + } + norm := c.normalize(value) + c.values[key] = &knownValue{ + key: key, + normalizedValue: norm, + reValue: regexp.MustCompile(norm), + } + return nil +} + +// AddPrecomputedValue adds a known value to be matched against. The value has +// already been normalized and the SearchSet object deserialized, so no +// processing is necessary. +func (c *Classifier) AddPrecomputedValue(key, value string, set *searchset.SearchSet) error { + c.muValues.Lock() + defer c.muValues.Unlock() + if _, ok := c.values[key]; ok { + return fmt.Errorf("value already registered with key %q", key) + } + set.GenerateNodeList() + c.values[key] = &knownValue{ + key: key, + normalizedValue: value, + reValue: regexp.MustCompile(value), + set: set, + } + return nil +} + +// normalize a string by applying each of the registered NormalizeFuncs. +func (c *Classifier) normalize(s string) string { + for _, fn := range c.normalizers { + s = fn(s) + } + return s +} + +// Match identifies the result of matching a string against a knownValue. +type Match struct { + Name string // Name of knownValue that was matched + Confidence float64 // Confidence percentage + Offset int // The offset into the unknown string the match was made + Extent int // The length from the offset into the unknown string +} + +// Matches is a list of Match-es. This is here mainly so that the list can be +// sorted. +type Matches []*Match + +func (m Matches) Len() int { return len(m) } +func (m Matches) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m Matches) Less(i, j int) bool { + if math.Abs(m[j].Confidence-m[i].Confidence) < math.SmallestNonzeroFloat64 { + if m[i].Name == m[j].Name { + if m[i].Offset > m[j].Offset { + return false + } + if m[i].Offset == m[j].Offset { + return m[i].Extent > m[j].Extent + } + return true + } + return m[i].Name < m[j].Name + } + return m[i].Confidence > m[j].Confidence +} + +// Names returns an unsorted slice of the names of the matched licenses. +func (m Matches) Names() []string { + var names []string + for _, n := range m { + names = append(names, n.Name) + } + return names +} + +// uniquify goes through the matches and removes any that are contained within +// one with a higher confidence. This assumes that Matches is sorted. +func (m Matches) uniquify() Matches { + type matchedRange struct { + offset, extent int + } + + var matched []matchedRange + var matches Matches +OUTER: + for _, match := range m { + for _, mr := range matched { + if match.Offset >= mr.offset && match.Offset <= mr.offset+mr.extent { + continue OUTER + } + } + matched = append(matched, matchedRange{match.Offset, match.Extent}) + matches = append(matches, match) + } + + return matches +} + +// NearestMatch returns the name of the known value that most closely matches +// the unknown string and a confidence percentage is returned indicating how +// confident the classifier is in the result. A percentage of "1.0" indicates +// an exact match, while a percentage of "0.0" indicates a complete mismatch. +// +// If the string is equidistant from multiple known values, it is undefined +// which will be returned. +func (c *Classifier) NearestMatch(s string) *Match { + pq := c.nearestMatch(s) + if pq.Len() == 0 { + return &Match{} + } + return pq.Pop().(*Match) +} + +// MultipleMatch tries to determine which known strings are found within an +// unknown string. This differs from "NearestMatch" in that it looks only at +// those areas within the unknown string that are likely to match. A list of +// potential matches are returned. It's up to the caller to determine which +// ones are acceptable. +func (c *Classifier) MultipleMatch(s string) (matches Matches) { + pq := c.multipleMatch(s) + if pq == nil { + return matches + } + + // A map to remove duplicate entries. + m := make(map[Match]bool) + + for pq.Len() != 0 { + v := pq.Pop().(*Match) + if _, ok := m[*v]; !ok { + m[*v] = true + matches = append(matches, v) + } + } + + sort.Sort(matches) + return matches.uniquify() +} + +// possibleMatch identifies a known value and it's diffRatio to a given string. +type possibleMatch struct { + value *knownValue + diffRatio float64 +} + +// likelyMatches is a slice of possibleMatches that can be sorted by their +// diffRatio to a given string, such that the most likely matches (based on +// length) are at the beginning. +type likelyMatches []possibleMatch + +func (m likelyMatches) Len() int { return len(m) } +func (m likelyMatches) Less(i, j int) bool { return m[i].diffRatio > m[j].diffRatio } +func (m likelyMatches) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +// nearestMatch returns a Queue of values that the unknown string may be. The +// values are compared via their Levenshtein Distance and ranked with the +// nearest match at the beginning. +func (c *Classifier) nearestMatch(unknown string) *pq.Queue { + var mu sync.Mutex // Protect the priority queue. + pq := pq.NewQueue(func(x, y interface{}) bool { + return x.(*Match).Confidence > y.(*Match).Confidence + }, nil) + + unknown = c.normalize(unknown) + if len(unknown) == 0 { + return pq + } + + c.muValues.RLock() + var likely likelyMatches + for _, v := range c.values { + dr := diffRatio(unknown, v.normalizedValue) + if dr < c.MinDiffRatio { + continue + } + if unknown == v.normalizedValue { + // We found an exact match. + pq.Push(&Match{Name: v.key, Confidence: 1.0, Offset: 0, Extent: len(unknown)}) + c.muValues.RUnlock() + return pq + } + likely = append(likely, possibleMatch{value: v, diffRatio: dr}) + } + c.muValues.RUnlock() + sort.Sort(likely) + + var wg sync.WaitGroup + classifyString := func(name, unknown, known string) { + defer wg.Done() + + diffs := dmp.DiffMain(unknown, known, true) + distance := dmp.DiffLevenshtein(diffs) + confidence := confidencePercentage(len(unknown), len(known), distance) + if confidence > 0.0 { + mu.Lock() + pq.Push(&Match{Name: name, Confidence: confidence, Offset: 0, Extent: len(unknown)}) + mu.Unlock() + } + } + + wg.Add(len(likely)) + for _, known := range likely { + go classifyString(known.value.key, unknown, known.value.normalizedValue) + } + wg.Wait() + return pq +} + +// matcher finds all potential matches of "known" in "unknown". The results are +// placed in "queue". +type matcher struct { + unknown *searchset.SearchSet + normUnknown string + threshold float64 + + mu sync.Mutex + queue *pq.Queue +} + +// newMatcher creates a "matcher" object. +func newMatcher(unknown string, threshold float64) *matcher { + return &matcher{ + unknown: searchset.New(unknown, searchset.DefaultGranularity), + normUnknown: unknown, + threshold: threshold, + queue: pq.NewQueue(func(x, y interface{}) bool { + return x.(*Match).Confidence > y.(*Match).Confidence + }, nil), + } +} + +// findMatches takes a known text and finds all potential instances of it in +// the unknown text. The resulting matches can then filtered to determine which +// are the best matches. +func (m *matcher) findMatches(known *knownValue) { + var mrs []searchset.MatchRanges + if all := known.reValue.FindAllStringIndex(m.normUnknown, -1); all != nil { + // We found exact matches. Just use those! + for _, a := range all { + var start, end int + for i, tok := range m.unknown.Tokens { + if tok.Offset == a[0] { + start = i + } else if tok.Offset >= a[len(a)-1]-len(tok.Text) { + end = i + break + } + } + + mrs = append(mrs, searchset.MatchRanges{{ + SrcStart: 0, + SrcEnd: len(known.set.Tokens), + TargetStart: start, + TargetEnd: end + 1, + }}) + } + } else { + // No exact match. Perform a more thorough match. + mrs = searchset.FindPotentialMatches(known.set, m.unknown) + } + + var wg sync.WaitGroup + for _, mr := range mrs { + if !m.withinConfidenceThreshold(known.set, mr) { + continue + } + + wg.Add(1) + go func(mr searchset.MatchRanges) { + start, end := mr.TargetRange(m.unknown) + conf := levDist(m.normUnknown[start:end], known.normalizedValue) + if conf > 0.0 { + m.mu.Lock() + m.queue.Push(&Match{Name: known.key, Confidence: conf, Offset: start, Extent: end - start}) + m.mu.Unlock() + } + wg.Done() + }(mr) + } + wg.Wait() +} + +// withinConfidenceThreshold returns the Confidence we have in the potential +// match. It does this by calculating the ratio of what's matching to the +// original known text. +func (m *matcher) withinConfidenceThreshold(known *searchset.SearchSet, mr searchset.MatchRanges) bool { + return float64(mr.Size())/float64(len(known.Tokens)) >= m.threshold +} + +// multipleMatch returns a Queue of values that might be within the unknown +// string. The values are compared via their Levenshtein Distance and ranked +// with the nearest match at the beginning. +func (c *Classifier) multipleMatch(unknown string) *pq.Queue { + normUnknown := c.normalize(unknown) + if normUnknown == "" { + return nil + } + + m := newMatcher(normUnknown, c.threshold) + + c.muValues.RLock() + var kvals []*knownValue + for _, known := range c.values { + kvals = append(kvals, known) + } + c.muValues.RUnlock() + + var wg sync.WaitGroup + wg.Add(len(kvals)) + for _, known := range kvals { + go func(known *knownValue) { + if known.set == nil { + k := searchset.New(known.normalizedValue, searchset.DefaultGranularity) + c.muValues.Lock() + c.values[known.key].set = k + c.muValues.Unlock() + } + m.findMatches(known) + wg.Done() + }(known) + } + wg.Wait() + return m.queue +} + +// levDist runs the Levenshtein Distance algorithm on the known and unknown +// texts to measure how well they match. +func levDist(unknown, known string) float64 { + if len(known) == 0 || len(unknown) == 0 { + log.Printf("Zero-sized texts in Levenshtein Distance algorithm: known==%d, unknown==%d", len(known), len(unknown)) + return 0.0 + } + + // Calculate the differences between the potentially matching known + // text and the unknown text. + diffs := dmp.DiffMain(unknown, known, false) + end := diffRangeEnd(known, diffs) + + // Now execute the Levenshtein Distance algorithm to see how much it + // does match. + distance := dmp.DiffLevenshtein(diffs[:end]) + return confidencePercentage(unknownTextLength(unknown, diffs), len(known), distance) +} + +// unknownTextLength returns the length of the unknown text based on the diff range. +func unknownTextLength(unknown string, diffs []diffmatchpatch.Diff) int { + last := len(diffs) - 1 + for ; last >= 0; last-- { + if diffs[last].Type == diffmatchpatch.DiffEqual { + break + } + } + ulen := 0 + for i := 0; i < last+1; i++ { + switch diffs[i].Type { + case diffmatchpatch.DiffEqual, diffmatchpatch.DiffDelete: + ulen += len(diffs[i].Text) + } + } + return ulen +} + +// diffRangeEnd returns the end index for the "Diff" objects that constructs +// (or nearly constructs) the "known" value. +func diffRangeEnd(known string, diffs []diffmatchpatch.Diff) (end int) { + var seen string + for end = 0; end < len(diffs); end++ { + if seen == known { + // Once we've constructed the "known" value, then we've + // reached the point in the diff list where more + // "Diff"s would just make the Levenshtein Distance + // less valid. There shouldn't be further "DiffEqual" + // nodes, because there's nothing further to match in + // the "known" text. + break + } + switch diffs[end].Type { + case diffmatchpatch.DiffEqual, diffmatchpatch.DiffInsert: + seen += diffs[end].Text + } + } + return end +} + +// confidencePercentage calculates how confident we are in the result of the +// match. A percentage of "1.0" means an identical match. A confidence of "0.0" +// means a complete mismatch. +func confidencePercentage(ulen, klen, distance int) float64 { + if ulen == 0 && klen == 0 { + return 1.0 + } + if ulen == 0 || klen == 0 || (distance > ulen && distance > klen) { + return 0.0 + } + return 1.0 - float64(distance)/float64(max(ulen, klen)) +} + +// diffRatio calculates the ratio of the length of s1 and s2, returned as a +// percentage of the length of the longer string. E.g., diffLength("abcd", "e") +// would return 0.25 because "e" is 25% of the size of "abcd". Comparing +// strings of equal length will return 1. +func diffRatio(s1, s2 string) float64 { + x, y := len(s1), len(s2) + if x == 0 && y == 0 { + // Both strings are zero length + return 1.0 + } + if x < y { + return float64(x) / float64(y) + } + return float64(y) / float64(x) +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +// wsRegexp is a regexp used to identify blocks of whitespace. +var wsRegexp = regexp.MustCompile(`\s+`) + +// FlattenWhitespace will flatten contiguous blocks of whitespace down to a single space. +var FlattenWhitespace NormalizeFunc = func(s string) string { + return wsRegexp.ReplaceAllString(s, " ") +} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go b/vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go new file mode 100644 index 000000000..d1797c7aa --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go @@ -0,0 +1,111 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package pq provides a priority queue. +package pq + +import "container/heap" + +// NewQueue returns an unbounded priority queue that compares elements using +// less; the minimal element is at the top of the queue. +// +// If setIndex is not nil, the queue calls setIndex to inform each element of +// its position in the queue. If an element's priority changes, its position in +// the queue may be incorrect. Call Fix on the element's index to update the +// queue. Call Remove on the element's index to remove it from the queue. +func NewQueue(less func(x, y interface{}) bool, setIndex func(x interface{}, idx int)) *Queue { + return &Queue{ + heap: pqHeap{ + less: less, + setIndex: setIndex, + }, + } +} + +// Queue is a priority queue that supports updating the priority of an element. +// A Queue must be created with NewQueue. +type Queue struct { + heap pqHeap +} + +// Len returns the number of elements in the queue. +func (pq *Queue) Len() int { + return pq.heap.Len() +} + +// Push adds x to the queue. +func (pq *Queue) Push(x interface{}) { + heap.Push(&pq.heap, x) +} + +// Min returns the minimal element. +// Min panics if the queue is empty. +func (pq *Queue) Min() interface{} { + return pq.heap.a[0] +} + +// Pop removes and returns the minimal element. +// Pop panics if the queue is empty. +func (pq *Queue) Pop() interface{} { + return heap.Pop(&pq.heap) +} + +// Fix adjusts the heap to reflect that the element at index has changed priority. +func (pq *Queue) Fix(index int) { + heap.Fix(&pq.heap, index) +} + +// Remove removes the element at index i from the heap. +func (pq *Queue) Remove(index int) { + heap.Remove(&pq.heap, index) +} + +// pqHeap implements heap.Interface. +type pqHeap struct { + a []interface{} + less func(x, y interface{}) bool + setIndex func(x interface{}, idx int) +} + +func (h pqHeap) Len() int { + return len(h.a) +} + +func (h pqHeap) Less(i, j int) bool { + return h.less(h.a[i], h.a[j]) +} + +func (h pqHeap) Swap(i, j int) { + h.a[i], h.a[j] = h.a[j], h.a[i] + if h.setIndex != nil { + h.setIndex(h.a[i], i) + h.setIndex(h.a[j], j) + } +} + +func (h *pqHeap) Push(x interface{}) { + n := len(h.a) + if h.setIndex != nil { + h.setIndex(x, n) + } + h.a = append(h.a, x) +} + +func (h *pqHeap) Pop() interface{} { + old := h.a + n := len(old) + x := old[n-1] + h.a = old[:n-1] + return x +} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go b/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go new file mode 100644 index 000000000..2f443e5e1 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go @@ -0,0 +1,491 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package searchset generates hashes for all substrings of a text. Potential +// matches between two SearchSet objects can then be determined quickly. +// Generating the hashes can be expensive, so it's best to perform it once. If +// the text is part of a known corpus, then the SearchSet can be serialized and +// kept in an archive. +// +// Matching occurs by "mapping" ranges from the source text into the target +// text but still retaining the source order: +// +// SOURCE: |-----------------------------| +// +// TARGET: |*****************************************| +// +// MAP SOURCE SECTIONS ONTO TARGET IN SOURCE ORDER: +// +// S: |-[--]-----[---]------[----]------| +// / | \ +// |---| |---------| |-------------| +// T: |*****************************************| +// +// Note that a single source range may match many different ranges in the +// target. The matching algorithm untangles these so that all matched ranges +// are in order with respect to the source ranges. This is especially important +// since the source text may occur more than once in the target text. The +// algorithm finds each potential occurrence of S in T and returns all as +// potential matched ranges. +package searchset + +import ( + "encoding/gob" + "fmt" + "io" + "sort" + + "github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer" +) + +// DefaultGranularity is the minimum size (in words) of the hash chunks. +const DefaultGranularity = 3 + +// SearchSet is a set of substrings that have hashes associated with them, +// making it fast to search for potential matches. +type SearchSet struct { + // Tokens is a tokenized list of the original input string. + Tokens tokenizer.Tokens + // Hashes is a map of checksums to a range of tokens. + Hashes tokenizer.Hash + // Checksums is a list of checksums ordered from longest range to + // shortest. + Checksums []uint32 + // ChecksumRanges are the token ranges for the above checksums. + ChecksumRanges tokenizer.TokenRanges + + nodes []*node +} + +// node consists of a range of tokens along with the checksum for those tokens. +type node struct { + checksum uint32 + tokens *tokenizer.TokenRange +} + +func (n *node) String() string { + return fmt.Sprintf("[%d:%d]", n.tokens.Start, n.tokens.End) +} + +// New creates a new SearchSet object. It generates a hash for each substring of "s". +func New(s string, granularity int) *SearchSet { + toks := tokenizer.Tokenize(s) + + // Start generating hash values for all substrings within the text. + h := make(tokenizer.Hash) + checksums, tokenRanges := toks.GenerateHashes(h, func(a, b int) int { + if a < b { + return a + } + return b + }(len(toks), granularity)) + sset := &SearchSet{ + Tokens: toks, + Hashes: h, + Checksums: checksums, + ChecksumRanges: tokenRanges, + } + sset.GenerateNodeList() + return sset +} + +// GenerateNodeList creates a node list out of the search set. +func (s *SearchSet) GenerateNodeList() { + if len(s.Tokens) == 0 { + return + } + + for i := 0; i < len(s.Checksums); i++ { + s.nodes = append(s.nodes, &node{ + checksum: s.Checksums[i], + tokens: s.ChecksumRanges[i], + }) + } +} + +// Serialize emits the SearchSet out so that it can be recreated at a later +// time. +func (s *SearchSet) Serialize(w io.Writer) error { + return gob.NewEncoder(w).Encode(s) +} + +// Deserialize reads a file with a serialized SearchSet in it and reconstructs it. +func Deserialize(r io.Reader, s *SearchSet) error { + if err := gob.NewDecoder(r).Decode(&s); err != nil { + return err + } + s.GenerateNodeList() + return nil +} + +// MatchRange is the range within the source text that is a match to the range +// in the target text. +type MatchRange struct { + // Offsets into the source tokens. + SrcStart, SrcEnd int + // Offsets into the target tokens. + TargetStart, TargetEnd int +} + +// in returns true if the start and end are enclosed in the match range. +func (m *MatchRange) in(start, end int) bool { + return start >= m.TargetStart && end <= m.TargetEnd +} + +func (m *MatchRange) String() string { + return fmt.Sprintf("[%v, %v)->[%v, %v)", m.SrcStart, m.SrcEnd, m.TargetStart, m.TargetEnd) +} + +// MatchRanges is a list of "MatchRange"s. The ranges are monotonically +// increasing in value and indicate a single potential occurrence of the source +// text in the target text. +type MatchRanges []*MatchRange + +func (m MatchRanges) Len() int { return len(m) } +func (m MatchRanges) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m MatchRanges) Less(i, j int) bool { + if m[i].TargetStart < m[j].TargetStart { + return true + } + return m[i].TargetStart == m[j].TargetStart && m[i].SrcStart < m[j].SrcStart +} + +// TargetRange is the start and stop token offsets into the target text. +func (m MatchRanges) TargetRange(target *SearchSet) (start, end int) { + start = target.Tokens[m[0].TargetStart].Offset + end = target.Tokens[m[len(m)-1].TargetEnd-1].Offset + len(target.Tokens[m[len(m)-1].TargetEnd-1].Text) + return start, end +} + +// Size is the number of source tokens that were matched. +func (m MatchRanges) Size() int { + sum := 0 + for _, mr := range m { + sum += mr.SrcEnd - mr.SrcStart + } + return sum +} + +// FindPotentialMatches returns the ranges in the target (unknown) text that +// are best potential matches to the source (known) text. +func FindPotentialMatches(src, target *SearchSet) []MatchRanges { + matchedRanges := getMatchedRanges(src, target) + if len(matchedRanges) == 0 { + return nil + } + + // Cleanup the matching ranges so that we get the longest contiguous ranges. + for i := 0; i < len(matchedRanges); i++ { + matchedRanges[i] = coalesceMatchRanges(matchedRanges[i]) + } + return matchedRanges +} + +// getMatchedRanges finds the ranges in the target text that match the source +// text. There can be multiple occurrences of the source text within the target +// text. Each separate occurrence is an entry in the returned slice. +func getMatchedRanges(src, target *SearchSet) []MatchRanges { + matched := targetMatchedRanges(src, target) + if len(matched) == 0 { + return nil + } + sort.Sort(matched) + matched = untangleSourceRanges(matched) + matchedRanges := splitRanges(matched) + return mergeConsecutiveRanges(matchedRanges) +} + +func extendsAny(tr tokenizer.TokenRanges, mr []MatchRanges) bool { + if len(mr) == 0 { + return false + } + for _, tv := range tr { + for _, mv := range mr { + if tv.Start >= mv[0].TargetStart && tv.Start <= mv[len(mv)-1].TargetEnd { + return true + } + } + } + return false +} + +// targetMatchedRanges finds matching sequences in target and src ordered by target position +func targetMatchedRanges(src, target *SearchSet) MatchRanges { + if src.nodes == nil { + return nil + } + + var matched MatchRanges + var previous *node + var possible []MatchRanges + for _, tgtNode := range target.nodes { + sr, ok := src.Hashes[tgtNode.checksum] + if !ok || (previous != nil && tgtNode.tokens.Start > previous.tokens.End) || !extendsAny(sr, possible) { + for _, r := range possible { + matched = append(matched, r...) + } + possible = possible[:0] + previous = nil + } + if !ok { + // There isn't a match in the source. + continue + } + + // Maps index within `possible` to the slice of ranges extended by a new range + extended := make(map[int]*MatchRanges) + // Go over the set of source ranges growing lists of `possible` match ranges. + tv := tgtNode.tokens + for _, sv := range sr { + r := &MatchRange{ + SrcStart: sv.Start, + SrcEnd: sv.End, + TargetStart: tv.Start, + TargetEnd: tv.End, + } + found := false + // Grow or extend each abutting `possible` match range. + for i, p := range possible { + last := p[len(p)-1] + if sv.Start >= last.SrcStart && sv.Start <= last.SrcEnd && tv.Start >= last.TargetStart && tv.Start <= last.TargetEnd { + found = true + possible[i] = append(possible[i], r) + extended[i] = &possible[i] + } + } + if !found { + // Did not abut any existing ranges, start a new `possible` match range. + mrs := make(MatchRanges, 0, 2) + mrs = append(mrs, r) + possible = append(possible, mrs) + extended[len(possible)-1] = &possible[len(possible)-1] + } + } + if len(extended) < len(possible) { + // Ranges not extended--add to `matched` if not included in other range. + for i := 0; i < len(possible); { + _, updated := extended[i] + if updated { + i++ // Keep in `possible` and advance to next index. + continue + } + p1 := possible[i] + found := false // whether found as subrange of another `possible` match. + for _, p2 := range extended { + if p1[0].SrcStart >= (*p2)[0].SrcStart && p1[0].TargetStart >= (*p2)[0].TargetStart { + found = true + break + } + } + if !found { + matched = append(matched, p1...) + } // else included in other match. + // Finished -- delete from `possible` and continue from same index. + possible = append(possible[:i], possible[i+1:]...) + } + } + previous = tgtNode + } + // At end of file, terminate all `possible` match ranges. + for i := 0; i < len(possible); i++ { + p1 := possible[i] + found := false // whether found as subrange of another `possible` match. + for j := i + 1; j < len(possible); { + p2 := possible[j] + if p1[0].SrcStart <= p2[0].SrcStart && p1[0].TargetStart <= p2[0].TargetStart { + // Delete later sub-ranges included in this range. + possible = append(possible[:j], possible[j+1:]...) + continue + } + // Skip if subrange of a later range + if p1[0].SrcStart >= p2[0].SrcStart && p1[0].TargetStart >= p2[0].TargetStart { + found = true + } + j++ + } + if !found { + matched = append(matched, p1...) + } + } + return matched +} + +// untangleSourceRanges goes through the ranges and removes any whose source +// ranges are "out of order". A source range is "out of order" if the source +// range is out of sequence with the source ranges before and after it. This +// happens when more than one source range maps to the same target range. +// E.g.: +// +// SrcStart: 20, SrcEnd: 30, TargetStart: 127, TargetEnd: 137 +// 1: SrcStart: 12, SrcEnd: 17, TargetStart: 138, TargetEnd: 143 +// 2: SrcStart: 32, SrcEnd: 37, TargetStart: 138, TargetEnd: 143 +// SrcStart: 38, SrcEnd: 40, TargetStart: 144, TargetEnd: 146 +// +// Here (1) is out of order, because the source range [12, 17) is out of +// sequence with the surrounding source sequences, but [32, 37) is. +func untangleSourceRanges(matched MatchRanges) MatchRanges { + mr := MatchRanges{matched[0]} +NEXT: + for i := 1; i < len(matched); i++ { + if mr[len(mr)-1].TargetStart == matched[i].TargetStart && mr[len(mr)-1].TargetEnd == matched[i].TargetEnd { + // The matched range has already been added. + continue + } + + if i+1 < len(matched) && equalTargetRange(matched[i], matched[i+1]) { + // A sequence of ranges match the same target range. + // Find the first one that has a source range greater + // than the currently matched range. Omit all others. + if matched[i].SrcStart > mr[len(mr)-1].SrcStart { + mr = append(mr, matched[i]) + continue + } + + for j := i + 1; j < len(matched) && equalTargetRange(matched[i], matched[j]); j++ { + // Check subsequent ranges to see if we can + // find one that matches in the correct order. + if matched[j].SrcStart > mr[len(mr)-1].SrcStart { + mr = append(mr, matched[j]) + i = j + continue NEXT + } + } + } + + mr = append(mr, matched[i]) + } + return mr +} + +// equalTargetRange returns true if the two MatchRange's cover the same target range. +func equalTargetRange(this, that *MatchRange) bool { + return this.TargetStart == that.TargetStart && this.TargetEnd == that.TargetEnd +} + +// splitRanges splits the matched ranges so that a single match range has a +// monotonically increasing source range (indicating a single, potential +// instance of the source in the target). +func splitRanges(matched MatchRanges) []MatchRanges { + var matchedRanges []MatchRanges + mr := MatchRanges{matched[0]} + for i := 1; i < len(matched); i++ { + if mr[len(mr)-1].SrcStart > matched[i].SrcStart { + matchedRanges = append(matchedRanges, mr) + mr = MatchRanges{matched[i]} + } else { + mr = append(mr, matched[i]) + } + } + matchedRanges = append(matchedRanges, mr) + return matchedRanges +} + +// mergeConsecutiveRanges goes through the matched ranges and merges +// consecutive ranges. Two ranges are consecutive if the end of the previous +// matched range and beginning of the next matched range overlap. "matched" +// should have 1 or more MatchRanges, each with one or more MatchRange objects. +func mergeConsecutiveRanges(matched []MatchRanges) []MatchRanges { + mr := []MatchRanges{matched[0]} + + // Convenience functions. + prevMatchedRange := func() MatchRanges { + return mr[len(mr)-1] + } + prevMatchedRangeLastElem := func() *MatchRange { + return prevMatchedRange()[len(prevMatchedRange())-1] + } + + // This algorithm compares the start of each MatchRanges object to the + // end of the previous MatchRanges object. If they overlap, then it + // tries to combine them. Note that a 0 offset into a MatchRanges + // object (e.g., matched[i][0]) is its first MatchRange, which + // indicates the start of the whole matched range. +NEXT: + for i := 1; i < len(matched); i++ { + if prevMatchedRangeLastElem().TargetEnd > matched[i][0].TargetStart { + // Consecutive matched ranges overlap. Merge them. + if prevMatchedRangeLastElem().TargetStart < matched[i][0].TargetStart { + // The last element of the previous matched + // range overlaps with the first element of the + // current matched range. Concatenate them. + if prevMatchedRangeLastElem().TargetEnd < matched[i][0].TargetEnd { + prevMatchedRangeLastElem().SrcEnd += matched[i][0].TargetEnd - prevMatchedRangeLastElem().TargetEnd + prevMatchedRangeLastElem().TargetEnd = matched[i][0].TargetEnd + } + mr[len(mr)-1] = append(prevMatchedRange(), matched[i][1:]...) + continue + } + + for j := 1; j < len(matched[i]); j++ { + // Find the positions in the ranges where the + // tail end of the previous matched range + // overlaps with the start of the next matched + // range. + for k := len(prevMatchedRange()) - 1; k > 0; k-- { + if prevMatchedRange()[k].SrcStart < matched[i][j].SrcStart && + prevMatchedRange()[k].TargetStart < matched[i][j].TargetStart { + // Append the next range to the previous range. + if prevMatchedRange()[k].TargetEnd < matched[i][j].TargetStart { + // Coalesce the ranges. + prevMatchedRange()[k].SrcEnd += matched[i][j-1].TargetEnd - prevMatchedRange()[k].TargetEnd + prevMatchedRange()[k].TargetEnd = matched[i][j-1].TargetEnd + } + mr[len(mr)-1] = append(prevMatchedRange()[:k+1], matched[i][j:]...) + continue NEXT + } + } + } + } + mr = append(mr, matched[i]) + } + return mr +} + +// coalesceMatchRanges coalesces overlapping match ranges into a single +// contiguous match range. +func coalesceMatchRanges(matchedRanges MatchRanges) MatchRanges { + coalesced := MatchRanges{matchedRanges[0]} + for i := 1; i < len(matchedRanges); i++ { + c := coalesced[len(coalesced)-1] + mr := matchedRanges[i] + + if mr.SrcStart <= c.SrcEnd && mr.SrcStart >= c.SrcStart { + var se, ts, te int + if mr.SrcEnd > c.SrcEnd { + se = mr.SrcEnd + } else { + se = c.SrcEnd + } + if mr.TargetStart < c.TargetStart { + ts = mr.TargetStart + } else { + ts = c.TargetStart + } + if mr.TargetEnd > c.TargetEnd { + te = mr.TargetEnd + } else { + te = c.TargetEnd + } + coalesced[len(coalesced)-1] = &MatchRange{ + SrcStart: c.SrcStart, + SrcEnd: se, + TargetStart: ts, + TargetEnd: te, + } + } else { + coalesced = append(coalesced, mr) + } + } + return coalesced +} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go b/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go new file mode 100644 index 000000000..0f842d866 --- /dev/null +++ b/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go @@ -0,0 +1,175 @@ +// Copyright 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package tokenizer converts a text into a stream of tokens. +package tokenizer + +import ( + "bytes" + "fmt" + "hash/crc32" + "sort" + "unicode" + "unicode/utf8" +) + +// Token is a non-whitespace sequence (i.e., word or punctuation) in the +// original string. This is not meant for use outside of this package. +type token struct { + Text string + Offset int +} + +// Tokens is a list of Token objects. +type Tokens []*token + +// newToken creates a new token object with an invalid (negative) offset, which +// will be set before the token's used. +func newToken() *token { + return &token{Offset: -1} +} + +// Tokenize converts a string into a stream of tokens. +func Tokenize(s string) (toks Tokens) { + tok := newToken() + for i := 0; i < len(s); { + r, size := utf8.DecodeRuneInString(s[i:]) + switch { + case unicode.IsSpace(r): + if tok.Offset >= 0 { + toks = append(toks, tok) + tok = newToken() + } + case unicode.IsPunct(r): + if tok.Offset >= 0 { + toks = append(toks, tok) + tok = newToken() + } + toks = append(toks, &token{ + Text: string(r), + Offset: i, + }) + default: + if tok.Offset == -1 { + tok.Offset = i + } + tok.Text += string(r) + } + i += size + } + if tok.Offset != -1 { + // Add any remaining token that wasn't yet included in the list. + toks = append(toks, tok) + } + return toks +} + +// GenerateHashes generates hashes for "size" length substrings. The +// "stringifyTokens" call takes a long time to run, so not all substrings have +// hashes, i.e. we skip some of the smaller substrings. +func (t Tokens) GenerateHashes(h Hash, size int) ([]uint32, TokenRanges) { + if size == 0 { + return nil, nil + } + + var css []uint32 + var tr TokenRanges + for offset := 0; offset+size <= len(t); offset += size / 2 { + var b bytes.Buffer + t.stringifyTokens(&b, offset, size) + cs := crc32.ChecksumIEEE(b.Bytes()) + css = append(css, cs) + tr = append(tr, &TokenRange{offset, offset + size}) + h.add(cs, offset, offset+size) + if size <= 1 { + break + } + } + + return css, tr +} + +// stringifyTokens serializes a sublist of tokens into a bytes buffer. +func (t Tokens) stringifyTokens(b *bytes.Buffer, offset, size int) { + for j := offset; j < offset+size; j++ { + if j != offset { + b.WriteRune(' ') + } + b.WriteString(t[j].Text) + } +} + +// TokenRange indicates the range of tokens that map to a particular checksum. +type TokenRange struct { + Start int + End int +} + +func (t *TokenRange) String() string { + return fmt.Sprintf("[%v, %v)", t.Start, t.End) +} + +// TokenRanges is a list of TokenRange objects. The chance that two different +// strings map to the same checksum is very small, but unfortunately isn't +// zero, so we use this instead of making the assumption that they will all be +// unique. +type TokenRanges []*TokenRange + +func (t TokenRanges) Len() int { return len(t) } +func (t TokenRanges) Swap(i, j int) { t[i], t[j] = t[j], t[i] } +func (t TokenRanges) Less(i, j int) bool { return t[i].Start < t[j].Start } + +// CombineUnique returns the combination of both token ranges with no duplicates. +func (t TokenRanges) CombineUnique(other TokenRanges) TokenRanges { + if len(other) == 0 { + return t + } + if len(t) == 0 { + return other + } + + cu := append(t, other...) + sort.Sort(cu) + + if len(cu) == 0 { + return nil + } + + res := TokenRanges{cu[0]} + for prev, i := cu[0], 1; i < len(cu); i++ { + if prev.Start != cu[i].Start || prev.End != cu[i].End { + res = append(res, cu[i]) + prev = cu[i] + } + } + return res +} + +// Hash is a map of the hashes of a section of text to the token range covering that text. +type Hash map[uint32]TokenRanges + +// add associates a token range, [start, end], to a checksum. +func (h Hash) add(checksum uint32, start, end int) { + ntr := &TokenRange{Start: start, End: end} + if r, ok := h[checksum]; ok { + for _, tr := range r { + if tr.Start == ntr.Start && tr.End == ntr.End { + // The token range already exists at this + // checksum. No need to re-add it. + return + } + } + } + h[checksum] = append(h[checksum], ntr) +} diff --git a/vendor/github.com/google/uuid/CONTRIBUTORS b/vendor/github.com/google/uuid/CONTRIBUTORS new file mode 100644 index 000000000..b4bb97f6b --- /dev/null +++ b/vendor/github.com/google/uuid/CONTRIBUTORS @@ -0,0 +1,9 @@ +Paul Borman +bmatsuo +shawnps +theory +jboverfelt +dsymonds +cd1 +wallclockbuilder +dansouza diff --git a/vendor/github.com/google/uuid/LICENSE b/vendor/github.com/google/uuid/LICENSE new file mode 100644 index 000000000..5dc68268d --- /dev/null +++ b/vendor/github.com/google/uuid/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009,2014 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/google/uuid/dce.go b/vendor/github.com/google/uuid/dce.go new file mode 100644 index 000000000..fa820b9d3 --- /dev/null +++ b/vendor/github.com/google/uuid/dce.go @@ -0,0 +1,80 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" + "fmt" + "os" +) + +// A Domain represents a Version 2 domain +type Domain byte + +// Domain constants for DCE Security (Version 2) UUIDs. +const ( + Person = Domain(0) + Group = Domain(1) + Org = Domain(2) +) + +// NewDCESecurity returns a DCE Security (Version 2) UUID. +// +// The domain should be one of Person, Group or Org. +// On a POSIX system the id should be the users UID for the Person +// domain and the users GID for the Group. The meaning of id for +// the domain Org or on non-POSIX systems is site defined. +// +// For a given domain/id pair the same token may be returned for up to +// 7 minutes and 10 seconds. +func NewDCESecurity(domain Domain, id uint32) (UUID, error) { + uuid, err := NewUUID() + if err == nil { + uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 + uuid[9] = byte(domain) + binary.BigEndian.PutUint32(uuid[0:], id) + } + return uuid, err +} + +// NewDCEPerson returns a DCE Security (Version 2) UUID in the person +// domain with the id returned by os.Getuid. +// +// NewDCESecurity(Person, uint32(os.Getuid())) +func NewDCEPerson() (UUID, error) { + return NewDCESecurity(Person, uint32(os.Getuid())) +} + +// NewDCEGroup returns a DCE Security (Version 2) UUID in the group +// domain with the id returned by os.Getgid. +// +// NewDCESecurity(Group, uint32(os.Getgid())) +func NewDCEGroup() (UUID, error) { + return NewDCESecurity(Group, uint32(os.Getgid())) +} + +// Domain returns the domain for a Version 2 UUID. Domains are only defined +// for Version 2 UUIDs. +func (uuid UUID) Domain() Domain { + return Domain(uuid[9]) +} + +// ID returns the id for a Version 2 UUID. IDs are only defined for Version 2 +// UUIDs. +func (uuid UUID) ID() uint32 { + return binary.BigEndian.Uint32(uuid[0:4]) +} + +func (d Domain) String() string { + switch d { + case Person: + return "Person" + case Group: + return "Group" + case Org: + return "Org" + } + return fmt.Sprintf("Domain%d", int(d)) +} diff --git a/vendor/github.com/google/uuid/doc.go b/vendor/github.com/google/uuid/doc.go new file mode 100644 index 000000000..5b8a4b9af --- /dev/null +++ b/vendor/github.com/google/uuid/doc.go @@ -0,0 +1,12 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package uuid generates and inspects UUIDs. +// +// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security +// Services. +// +// A UUID is a 16 byte (128 bit) array. UUIDs may be used as keys to +// maps or compared directly. +package uuid diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go new file mode 100644 index 000000000..b17461631 --- /dev/null +++ b/vendor/github.com/google/uuid/hash.go @@ -0,0 +1,53 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "crypto/md5" + "crypto/sha1" + "hash" +) + +// Well known namespace IDs and UUIDs +var ( + NameSpaceDNS = Must(Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) + NameSpaceURL = Must(Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) + NameSpaceOID = Must(Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) + NameSpaceX500 = Must(Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) + Nil UUID // empty UUID, all zeros +) + +// NewHash returns a new UUID derived from the hash of space concatenated with +// data generated by h. The hash should be at least 16 byte in length. The +// first 16 bytes of the hash are used to form the UUID. The version of the +// UUID will be the lower 4 bits of version. NewHash is used to implement +// NewMD5 and NewSHA1. +func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { + h.Reset() + h.Write(space[:]) + h.Write(data) + s := h.Sum(nil) + var uuid UUID + copy(uuid[:], s) + uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) + uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant + return uuid +} + +// NewMD5 returns a new MD5 (Version 3) UUID based on the +// supplied name space and data. It is the same as calling: +// +// NewHash(md5.New(), space, data, 3) +func NewMD5(space UUID, data []byte) UUID { + return NewHash(md5.New(), space, data, 3) +} + +// NewSHA1 returns a new SHA1 (Version 5) UUID based on the +// supplied name space and data. It is the same as calling: +// +// NewHash(sha1.New(), space, data, 5) +func NewSHA1(space UUID, data []byte) UUID { + return NewHash(sha1.New(), space, data, 5) +} diff --git a/vendor/github.com/google/uuid/marshal.go b/vendor/github.com/google/uuid/marshal.go new file mode 100644 index 000000000..7f9e0c6c0 --- /dev/null +++ b/vendor/github.com/google/uuid/marshal.go @@ -0,0 +1,37 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import "fmt" + +// MarshalText implements encoding.TextMarshaler. +func (uuid UUID) MarshalText() ([]byte, error) { + var js [36]byte + encodeHex(js[:], uuid) + return js[:], nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (uuid *UUID) UnmarshalText(data []byte) error { + id, err := ParseBytes(data) + if err == nil { + *uuid = id + } + return err +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (uuid UUID) MarshalBinary() ([]byte, error) { + return uuid[:], nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (uuid *UUID) UnmarshalBinary(data []byte) error { + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + copy(uuid[:], data) + return nil +} diff --git a/vendor/github.com/google/uuid/node.go b/vendor/github.com/google/uuid/node.go new file mode 100644 index 000000000..d651a2b06 --- /dev/null +++ b/vendor/github.com/google/uuid/node.go @@ -0,0 +1,90 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "sync" +) + +var ( + nodeMu sync.Mutex + ifname string // name of interface being used + nodeID [6]byte // hardware for version 1 UUIDs + zeroID [6]byte // nodeID with only 0's +) + +// NodeInterface returns the name of the interface from which the NodeID was +// derived. The interface "user" is returned if the NodeID was set by +// SetNodeID. +func NodeInterface() string { + defer nodeMu.Unlock() + nodeMu.Lock() + return ifname +} + +// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. +// If name is "" then the first usable interface found will be used or a random +// Node ID will be generated. If a named interface cannot be found then false +// is returned. +// +// SetNodeInterface never fails when name is "". +func SetNodeInterface(name string) bool { + defer nodeMu.Unlock() + nodeMu.Lock() + return setNodeInterface(name) +} + +func setNodeInterface(name string) bool { + iname, addr := getHardwareInterface(name) // null implementation for js + if iname != "" && addr != nil { + ifname = iname + copy(nodeID[:], addr) + return true + } + + // We found no interfaces with a valid hardware address. If name + // does not specify a specific interface generate a random Node ID + // (section 4.1.6) + if name == "" { + ifname = "random" + randomBits(nodeID[:]) + return true + } + return false +} + +// NodeID returns a slice of a copy of the current Node ID, setting the Node ID +// if not already set. +func NodeID() []byte { + defer nodeMu.Unlock() + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } + nid := nodeID + return nid[:] +} + +// SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes +// of id are used. If id is less than 6 bytes then false is returned and the +// Node ID is not set. +func SetNodeID(id []byte) bool { + if len(id) < 6 { + return false + } + defer nodeMu.Unlock() + nodeMu.Lock() + copy(nodeID[:], id) + ifname = "user" + return true +} + +// NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is +// not valid. The NodeID is only well defined for version 1 and 2 UUIDs. +func (uuid UUID) NodeID() []byte { + var node [6]byte + copy(node[:], uuid[10:]) + return node[:] +} diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go new file mode 100644 index 000000000..24b78edc9 --- /dev/null +++ b/vendor/github.com/google/uuid/node_js.go @@ -0,0 +1,12 @@ +// Copyright 2017 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build js + +package uuid + +// getHardwareInterface returns nil values for the JS version of the code. +// This remvoves the "net" dependency, because it is not used in the browser. +// Using the "net" library inflates the size of the transpiled JS code by 673k bytes. +func getHardwareInterface(name string) (string, []byte) { return "", nil } diff --git a/vendor/github.com/google/uuid/node_net.go b/vendor/github.com/google/uuid/node_net.go new file mode 100644 index 000000000..0cbbcddbd --- /dev/null +++ b/vendor/github.com/google/uuid/node_net.go @@ -0,0 +1,33 @@ +// Copyright 2017 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !js + +package uuid + +import "net" + +var interfaces []net.Interface // cached list of interfaces + +// getHardwareInterface returns the name and hardware address of interface name. +// If name is "" then the name and hardware address of one of the system's +// interfaces is returned. If no interfaces are found (name does not exist or +// there are no interfaces) then "", nil is returned. +// +// Only addresses of at least 6 bytes are returned. +func getHardwareInterface(name string) (string, []byte) { + if interfaces == nil { + var err error + interfaces, err = net.Interfaces() + if err != nil { + return "", nil + } + } + for _, ifs := range interfaces { + if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { + return ifs.Name, ifs.HardwareAddr + } + } + return "", nil +} diff --git a/vendor/github.com/google/uuid/sql.go b/vendor/github.com/google/uuid/sql.go new file mode 100644 index 000000000..f326b54db --- /dev/null +++ b/vendor/github.com/google/uuid/sql.go @@ -0,0 +1,59 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements sql.Scanner so UUIDs can be read from databases transparently +// Currently, database types that map to string and []byte are supported. Please +// consult database-specific driver documentation for matching types. +func (uuid *UUID) Scan(src interface{}) error { + switch src := src.(type) { + case nil: + return nil + + case string: + // if an empty UUID comes from a table, we return a null UUID + if src == "" { + return nil + } + + // see Parse for required string format + u, err := Parse(src) + if err != nil { + return fmt.Errorf("Scan: %v", err) + } + + *uuid = u + + case []byte: + // if an empty UUID comes from a table, we return a null UUID + if len(src) == 0 { + return nil + } + + // assumes a simple slice of bytes if 16 bytes + // otherwise attempts to parse + if len(src) != 16 { + return uuid.Scan(string(src)) + } + copy((*uuid)[:], src) + + default: + return fmt.Errorf("Scan: unable to scan type %T into UUID", src) + } + + return nil +} + +// Value implements sql.Valuer so that UUIDs can be written to databases +// transparently. Currently, UUIDs map to strings. Please consult +// database-specific driver documentation for matching types. +func (uuid UUID) Value() (driver.Value, error) { + return uuid.String(), nil +} diff --git a/vendor/github.com/google/uuid/time.go b/vendor/github.com/google/uuid/time.go new file mode 100644 index 000000000..e6ef06cdc --- /dev/null +++ b/vendor/github.com/google/uuid/time.go @@ -0,0 +1,123 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" + "sync" + "time" +) + +// A Time represents a time as the number of 100's of nanoseconds since 15 Oct +// 1582. +type Time int64 + +const ( + lillian = 2299160 // Julian day of 15 Oct 1582 + unix = 2440587 // Julian day of 1 Jan 1970 + epoch = unix - lillian // Days between epochs + g1582 = epoch * 86400 // seconds between epochs + g1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs +) + +var ( + timeMu sync.Mutex + lasttime uint64 // last time we returned + clockSeq uint16 // clock sequence for this run + + timeNow = time.Now // for testing +) + +// UnixTime converts t the number of seconds and nanoseconds using the Unix +// epoch of 1 Jan 1970. +func (t Time) UnixTime() (sec, nsec int64) { + sec = int64(t - g1582ns100) + nsec = (sec % 10000000) * 100 + sec /= 10000000 + return sec, nsec +} + +// GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and +// clock sequence as well as adjusting the clock sequence as needed. An error +// is returned if the current time cannot be determined. +func GetTime() (Time, uint16, error) { + defer timeMu.Unlock() + timeMu.Lock() + return getTime() +} + +func getTime() (Time, uint16, error) { + t := timeNow() + + // If we don't have a clock sequence already, set one. + if clockSeq == 0 { + setClockSequence(-1) + } + now := uint64(t.UnixNano()/100) + g1582ns100 + + // If time has gone backwards with this clock sequence then we + // increment the clock sequence + if now <= lasttime { + clockSeq = ((clockSeq + 1) & 0x3fff) | 0x8000 + } + lasttime = now + return Time(now), clockSeq, nil +} + +// ClockSequence returns the current clock sequence, generating one if not +// already set. The clock sequence is only used for Version 1 UUIDs. +// +// The uuid package does not use global static storage for the clock sequence or +// the last time a UUID was generated. Unless SetClockSequence is used, a new +// random clock sequence is generated the first time a clock sequence is +// requested by ClockSequence, GetTime, or NewUUID. (section 4.2.1.1) +func ClockSequence() int { + defer timeMu.Unlock() + timeMu.Lock() + return clockSequence() +} + +func clockSequence() int { + if clockSeq == 0 { + setClockSequence(-1) + } + return int(clockSeq & 0x3fff) +} + +// SetClockSequence sets the clock sequence to the lower 14 bits of seq. Setting to +// -1 causes a new sequence to be generated. +func SetClockSequence(seq int) { + defer timeMu.Unlock() + timeMu.Lock() + setClockSequence(seq) +} + +func setClockSequence(seq int) { + if seq == -1 { + var b [2]byte + randomBits(b[:]) // clock sequence + seq = int(b[0])<<8 | int(b[1]) + } + oldSeq := clockSeq + clockSeq = uint16(seq&0x3fff) | 0x8000 // Set our variant + if oldSeq != clockSeq { + lasttime = 0 + } +} + +// Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in +// uuid. The time is only defined for version 1 and 2 UUIDs. +func (uuid UUID) Time() Time { + time := int64(binary.BigEndian.Uint32(uuid[0:4])) + time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 + time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 + return Time(time) +} + +// ClockSequence returns the clock sequence encoded in uuid. +// The clock sequence is only well defined for version 1 and 2 UUIDs. +func (uuid UUID) ClockSequence() int { + return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff +} diff --git a/vendor/github.com/google/uuid/util.go b/vendor/github.com/google/uuid/util.go new file mode 100644 index 000000000..5ea6c7378 --- /dev/null +++ b/vendor/github.com/google/uuid/util.go @@ -0,0 +1,43 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "io" +) + +// randomBits completely fills slice b with random data. +func randomBits(b []byte) { + if _, err := io.ReadFull(rander, b); err != nil { + panic(err.Error()) // rand should never fail + } +} + +// xvalues returns the value of a byte as a hexadecimal digit or 255. +var xvalues = [256]byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +} + +// xtob converts hex characters x1 and x2 into a byte. +func xtob(x1, x2 byte) (byte, bool) { + b1 := xvalues[x1] + b2 := xvalues[x2] + return (b1 << 4) | b2, b1 != 255 && b2 != 255 +} diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go new file mode 100644 index 000000000..524404cc5 --- /dev/null +++ b/vendor/github.com/google/uuid/uuid.go @@ -0,0 +1,245 @@ +// Copyright 2018 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "errors" + "fmt" + "io" + "strings" +) + +// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC +// 4122. +type UUID [16]byte + +// A Version represents a UUID's version. +type Version byte + +// A Variant represents a UUID's variant. +type Variant byte + +// Constants returned by Variant. +const ( + Invalid = Variant(iota) // Invalid UUID + RFC4122 // The variant specified in RFC4122 + Reserved // Reserved, NCS backward compatibility. + Microsoft // Reserved, Microsoft Corporation backward compatibility. + Future // Reserved for future definition. +) + +var rander = rand.Reader // random function + +// Parse decodes s into a UUID or returns an error. Both the standard UUID +// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the +// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex +// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. +func Parse(s string) (UUID, error) { + var uuid UUID + switch len(s) { + // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36: + + // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36 + 9: + if strings.ToLower(s[:9]) != "urn:uuid:" { + return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) + } + s = s[9:] + + // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} + case 36 + 2: + s = s[1:] + + // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + case 32: + var ok bool + for i := range uuid { + uuid[i], ok = xtob(s[i*2], s[i*2+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + } + return uuid, nil + default: + return uuid, fmt.Errorf("invalid UUID length: %d", len(s)) + } + // s is now at least 36 bytes long + // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return uuid, errors.New("invalid UUID format") + } + for i, x := range [16]int{ + 0, 2, 4, 6, + 9, 11, + 14, 16, + 19, 21, + 24, 26, 28, 30, 32, 34} { + v, ok := xtob(s[x], s[x+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + uuid[i] = v + } + return uuid, nil +} + +// ParseBytes is like Parse, except it parses a byte slice instead of a string. +func ParseBytes(b []byte) (UUID, error) { + var uuid UUID + switch len(b) { + case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { + return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) + } + b = b[9:] + case 36 + 2: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} + b = b[1:] + case 32: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + var ok bool + for i := 0; i < 32; i += 2 { + uuid[i/2], ok = xtob(b[i], b[i+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + } + return uuid, nil + default: + return uuid, fmt.Errorf("invalid UUID length: %d", len(b)) + } + // s is now at least 36 bytes long + // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' { + return uuid, errors.New("invalid UUID format") + } + for i, x := range [16]int{ + 0, 2, 4, 6, + 9, 11, + 14, 16, + 19, 21, + 24, 26, 28, 30, 32, 34} { + v, ok := xtob(b[x], b[x+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + uuid[i] = v + } + return uuid, nil +} + +// MustParse is like Parse but panics if the string cannot be parsed. +// It simplifies safe initialization of global variables holding compiled UUIDs. +func MustParse(s string) UUID { + uuid, err := Parse(s) + if err != nil { + panic(`uuid: Parse(` + s + `): ` + err.Error()) + } + return uuid +} + +// FromBytes creates a new UUID from a byte slice. Returns an error if the slice +// does not have a length of 16. The bytes are copied from the slice. +func FromBytes(b []byte) (uuid UUID, err error) { + err = uuid.UnmarshalBinary(b) + return uuid, err +} + +// Must returns uuid if err is nil and panics otherwise. +func Must(uuid UUID, err error) UUID { + if err != nil { + panic(err) + } + return uuid +} + +// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// , or "" if uuid is invalid. +func (uuid UUID) String() string { + var buf [36]byte + encodeHex(buf[:], uuid) + return string(buf[:]) +} + +// URN returns the RFC 2141 URN form of uuid, +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid. +func (uuid UUID) URN() string { + var buf [36 + 9]byte + copy(buf[:], "urn:uuid:") + encodeHex(buf[9:], uuid) + return string(buf[:]) +} + +func encodeHex(dst []byte, uuid UUID) { + hex.Encode(dst, uuid[:4]) + dst[8] = '-' + hex.Encode(dst[9:13], uuid[4:6]) + dst[13] = '-' + hex.Encode(dst[14:18], uuid[6:8]) + dst[18] = '-' + hex.Encode(dst[19:23], uuid[8:10]) + dst[23] = '-' + hex.Encode(dst[24:], uuid[10:]) +} + +// Variant returns the variant encoded in uuid. +func (uuid UUID) Variant() Variant { + switch { + case (uuid[8] & 0xc0) == 0x80: + return RFC4122 + case (uuid[8] & 0xe0) == 0xc0: + return Microsoft + case (uuid[8] & 0xe0) == 0xe0: + return Future + default: + return Reserved + } +} + +// Version returns the version of uuid. +func (uuid UUID) Version() Version { + return Version(uuid[6] >> 4) +} + +func (v Version) String() string { + if v > 15 { + return fmt.Sprintf("BAD_VERSION_%d", v) + } + return fmt.Sprintf("VERSION_%d", v) +} + +func (v Variant) String() string { + switch v { + case RFC4122: + return "RFC4122" + case Reserved: + return "Reserved" + case Microsoft: + return "Microsoft" + case Future: + return "Future" + case Invalid: + return "Invalid" + } + return fmt.Sprintf("BadVariant%d", int(v)) +} + +// SetRand sets the random number generator to r, which implements io.Reader. +// If r.Read returns an error when the package requests random data then +// a panic will be issued. +// +// Calling SetRand with nil sets the random number generator to the default +// generator. +func SetRand(r io.Reader) { + if r == nil { + rander = rand.Reader + return + } + rander = r +} diff --git a/vendor/github.com/google/uuid/version1.go b/vendor/github.com/google/uuid/version1.go new file mode 100644 index 000000000..199a1ac65 --- /dev/null +++ b/vendor/github.com/google/uuid/version1.go @@ -0,0 +1,44 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" +) + +// NewUUID returns a Version 1 UUID based on the current NodeID and clock +// sequence, and the current time. If the NodeID has not been set by SetNodeID +// or SetNodeInterface then it will be set automatically. If the NodeID cannot +// be set NewUUID returns nil. If clock sequence has not been set by +// SetClockSequence then it will be set automatically. If GetTime fails to +// return the current NewUUID returns nil and an error. +// +// In most cases, New should be used. +func NewUUID() (UUID, error) { + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } + nodeMu.Unlock() + + var uuid UUID + now, seq, err := GetTime() + if err != nil { + return uuid, err + } + + timeLow := uint32(now & 0xffffffff) + timeMid := uint16((now >> 32) & 0xffff) + timeHi := uint16((now >> 48) & 0x0fff) + timeHi |= 0x1000 // Version 1 + + binary.BigEndian.PutUint32(uuid[0:], timeLow) + binary.BigEndian.PutUint16(uuid[4:], timeMid) + binary.BigEndian.PutUint16(uuid[6:], timeHi) + binary.BigEndian.PutUint16(uuid[8:], seq) + copy(uuid[10:], nodeID[:]) + + return uuid, nil +} diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go new file mode 100644 index 000000000..84af91c9f --- /dev/null +++ b/vendor/github.com/google/uuid/version4.go @@ -0,0 +1,38 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import "io" + +// New creates a new random UUID or panics. New is equivalent to +// the expression +// +// uuid.Must(uuid.NewRandom()) +func New() UUID { + return Must(NewRandom()) +} + +// NewRandom returns a Random (Version 4) UUID. +// +// The strength of the UUIDs is based on the strength of the crypto/rand +// package. +// +// A note about uniqueness derived from the UUID Wikipedia entry: +// +// Randomly generated UUIDs have 122 random bits. One's annual risk of being +// hit by a meteorite is estimated to be one chance in 17 billion, that +// means the probability is about 0.00000000006 (6 × 10−11), +// equivalent to the odds of creating a few tens of trillions of UUIDs in a +// year and having one duplicate. +func NewRandom() (UUID, error) { + var uuid UUID + _, err := io.ReadFull(rander, uuid[:]) + if err != nil { + return Nil, err + } + uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 + uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 + return uuid, nil +} diff --git a/vendor/github.com/googleapis/gax-go/LICENSE b/vendor/github.com/googleapis/gax-go/LICENSE new file mode 100644 index 000000000..6d16b6578 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/LICENSE @@ -0,0 +1,27 @@ +Copyright 2016, Google Inc. +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/googleapis/gax-go/v2/call_option.go b/vendor/github.com/googleapis/gax-go/v2/call_option.go new file mode 100644 index 000000000..b1d53dd19 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/call_option.go @@ -0,0 +1,161 @@ +// Copyright 2016, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import ( + "math/rand" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// CallOption is an option used by Invoke to control behaviors of RPC calls. +// CallOption works by modifying relevant fields of CallSettings. +type CallOption interface { + // Resolve applies the option by modifying cs. + Resolve(cs *CallSettings) +} + +// Retryer is used by Invoke to determine retry behavior. +type Retryer interface { + // Retry reports whether a request should be retriedand how long to pause before retrying + // if the previous attempt returned with err. Invoke never calls Retry with nil error. + Retry(err error) (pause time.Duration, shouldRetry bool) +} + +type retryerOption func() Retryer + +func (o retryerOption) Resolve(s *CallSettings) { + s.Retry = o +} + +// WithRetry sets CallSettings.Retry to fn. +func WithRetry(fn func() Retryer) CallOption { + return retryerOption(fn) +} + +// OnCodes returns a Retryer that retries if and only if +// the previous attempt returns a GRPC error whose error code is stored in cc. +// Pause times between retries are specified by bo. +// +// bo is only used for its parameters; each Retryer has its own copy. +func OnCodes(cc []codes.Code, bo Backoff) Retryer { + return &boRetryer{ + backoff: bo, + codes: append([]codes.Code(nil), cc...), + } +} + +type boRetryer struct { + backoff Backoff + codes []codes.Code +} + +func (r *boRetryer) Retry(err error) (time.Duration, bool) { + st, ok := status.FromError(err) + if !ok { + return 0, false + } + c := st.Code() + for _, rc := range r.codes { + if c == rc { + return r.backoff.Pause(), true + } + } + return 0, false +} + +// Backoff implements exponential backoff. +// The wait time between retries is a random value between 0 and the "retry envelope". +// The envelope starts at Initial and increases by the factor of Multiplier every retry, +// but is capped at Max. +type Backoff struct { + // Initial is the initial value of the retry envelope, defaults to 1 second. + Initial time.Duration + + // Max is the maximum value of the retry envelope, defaults to 30 seconds. + Max time.Duration + + // Multiplier is the factor by which the retry envelope increases. + // It should be greater than 1 and defaults to 2. + Multiplier float64 + + // cur is the current retry envelope + cur time.Duration +} + +// Pause returns the next time.Duration that the caller should use to backoff. +func (bo *Backoff) Pause() time.Duration { + if bo.Initial == 0 { + bo.Initial = time.Second + } + if bo.cur == 0 { + bo.cur = bo.Initial + } + if bo.Max == 0 { + bo.Max = 30 * time.Second + } + if bo.Multiplier < 1 { + bo.Multiplier = 2 + } + // Select a duration between 1ns and the current max. It might seem + // counterintuitive to have so much jitter, but + // https://www.awsarchitectureblog.com/2015/03/backoff.html argues that + // that is the best strategy. + d := time.Duration(1 + rand.Int63n(int64(bo.cur))) + bo.cur = time.Duration(float64(bo.cur) * bo.Multiplier) + if bo.cur > bo.Max { + bo.cur = bo.Max + } + return d +} + +type grpcOpt []grpc.CallOption + +func (o grpcOpt) Resolve(s *CallSettings) { + s.GRPC = o +} + +// WithGRPCOptions allows passing gRPC call options during client creation. +func WithGRPCOptions(opt ...grpc.CallOption) CallOption { + return grpcOpt(append([]grpc.CallOption(nil), opt...)) +} + +// CallSettings allow fine-grained control over how calls are made. +type CallSettings struct { + // Retry returns a Retryer to be used to control retry logic of a method call. + // If Retry is nil or the returned Retryer is nil, the call will not be retried. + Retry func() Retryer + + // CallOptions to be forwarded to GRPC. + GRPC []grpc.CallOption +} diff --git a/vendor/github.com/googleapis/gax-go/v2/gax.go b/vendor/github.com/googleapis/gax-go/v2/gax.go new file mode 100644 index 000000000..8040dcb0c --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/gax.go @@ -0,0 +1,39 @@ +// Copyright 2016, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Package gax contains a set of modules which aid the development of APIs +// for clients and servers based on gRPC and Google API conventions. +// +// Application code will rarely need to use this library directly. +// However, code generated automatically from API definition files can use it +// to simplify code generation and to provide more convenient and idiomatic API surfaces. +package gax + +// Version specifies the gax-go version being used. +const Version = "2.0.3" diff --git a/vendor/github.com/googleapis/gax-go/v2/header.go b/vendor/github.com/googleapis/gax-go/v2/header.go new file mode 100644 index 000000000..139371a0b --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/header.go @@ -0,0 +1,53 @@ +// Copyright 2018, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import "bytes" + +// XGoogHeader is for use by the Google Cloud Libraries only. +// +// XGoogHeader formats key-value pairs. +// The resulting string is suitable for x-goog-api-client header. +func XGoogHeader(keyval ...string) string { + if len(keyval) == 0 { + return "" + } + if len(keyval)%2 != 0 { + panic("gax.Header: odd argument count") + } + var buf bytes.Buffer + for i := 0; i < len(keyval); i += 2 { + buf.WriteByte(' ') + buf.WriteString(keyval[i]) + buf.WriteByte('/') + buf.WriteString(keyval[i+1]) + } + return buf.String()[1:] +} diff --git a/vendor/github.com/googleapis/gax-go/v2/invoke.go b/vendor/github.com/googleapis/gax-go/v2/invoke.go new file mode 100644 index 000000000..fe31dd004 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/invoke.go @@ -0,0 +1,99 @@ +// Copyright 2016, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import ( + "context" + "strings" + "time" +) + +// APICall is a user defined call stub. +type APICall func(context.Context, CallSettings) error + +// Invoke calls the given APICall, +// performing retries as specified by opts, if any. +func Invoke(ctx context.Context, call APICall, opts ...CallOption) error { + var settings CallSettings + for _, opt := range opts { + opt.Resolve(&settings) + } + return invoke(ctx, call, settings, Sleep) +} + +// Sleep is similar to time.Sleep, but it can be interrupted by ctx.Done() closing. +// If interrupted, Sleep returns ctx.Err(). +func Sleep(ctx context.Context, d time.Duration) error { + t := time.NewTimer(d) + select { + case <-ctx.Done(): + t.Stop() + return ctx.Err() + case <-t.C: + return nil + } +} + +type sleeper func(ctx context.Context, d time.Duration) error + +// invoke implements Invoke, taking an additional sleeper argument for testing. +func invoke(ctx context.Context, call APICall, settings CallSettings, sp sleeper) error { + var retryer Retryer + for { + err := call(ctx, settings) + if err == nil { + return nil + } + if settings.Retry == nil { + return err + } + // Never retry permanent certificate errors. (e.x. if ca-certificates + // are not installed). We should only make very few, targeted + // exceptions: many (other) status=Unavailable should be retried, such + // as if there's a network hiccup, or the internet goes out for a + // minute. This is also why here we are doing string parsing instead of + // simply making Unavailable a non-retried code elsewhere. + if strings.Contains(err.Error(), "x509: certificate signed by unknown authority") { + return err + } + if retryer == nil { + if r := settings.Retry(); r != nil { + retryer = r + } else { + return err + } + } + if d, ok := retryer.Retry(err); !ok { + return err + } else if err = sp(ctx, d); err != nil { + return err + } + } +} diff --git a/vendor/github.com/googleapis/gnostic/LICENSE b/vendor/github.com/googleapis/gnostic/LICENSE new file mode 100644 index 000000000..6b0b1270f --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/LICENSE @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go new file mode 100644 index 000000000..5351f36f3 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go @@ -0,0 +1,8728 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +package openapi_v2 + +import ( + "fmt" + "github.com/googleapis/gnostic/compiler" + "gopkg.in/yaml.v2" + "regexp" + "strings" +) + +// Version returns the package name (and OpenAPI version). +func Version() string { + return "openapi_v2" +} + +// NewAdditionalPropertiesItem creates an object of type AdditionalPropertiesItem if possible, returning an error if not. +func NewAdditionalPropertiesItem(in interface{}, context *compiler.Context) (*AdditionalPropertiesItem, error) { + errors := make([]error, 0) + x := &AdditionalPropertiesItem{} + matched := false + // Schema schema = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSchema(m, compiler.NewContext("schema", context)) + if matchingError == nil { + x.Oneof = &AdditionalPropertiesItem_Schema{Schema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // bool boolean = 2; + boolValue, ok := in.(bool) + if ok { + x.Oneof = &AdditionalPropertiesItem_Boolean{Boolean: boolValue} + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAny creates an object of type Any if possible, returning an error if not. +func NewAny(in interface{}, context *compiler.Context) (*Any, error) { + errors := make([]error, 0) + x := &Any{} + bytes, _ := yaml.Marshal(in) + x.Yaml = string(bytes) + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewApiKeySecurity creates an object of type ApiKeySecurity if possible, returning an error if not. +func NewApiKeySecurity(in interface{}, context *compiler.Context) (*ApiKeySecurity, error) { + errors := make([]error, 0) + x := &ApiKeySecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "in", "name", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [apiKey] + if ok && !compiler.StringArrayContainsValue([]string{"apiKey"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 2; + v2 := compiler.MapValueForKey(m, "name") + if v2 != nil { + x.Name, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 3; + v3 := compiler.MapValueForKey(m, "in") + if v3 != nil { + x.In, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [header query] + if ok && !compiler.StringArrayContainsValue([]string{"header", "query"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 4; + v4 := compiler.MapValueForKey(m, "description") + if v4 != nil { + x.Description, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 5; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewBasicAuthenticationSecurity creates an object of type BasicAuthenticationSecurity if possible, returning an error if not. +func NewBasicAuthenticationSecurity(in interface{}, context *compiler.Context) (*BasicAuthenticationSecurity, error) { + errors := make([]error, 0) + x := &BasicAuthenticationSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [basic] + if ok && !compiler.StringArrayContainsValue([]string{"basic"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 3; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewBodyParameter creates an object of type BodyParameter if possible, returning an error if not. +func NewBodyParameter(in interface{}, context *compiler.Context) (*BodyParameter, error) { + errors := make([]error, 0) + x := &BodyParameter{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name", "schema"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "in", "name", "required", "schema"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 2; + v2 := compiler.MapValueForKey(m, "name") + if v2 != nil { + x.Name, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 3; + v3 := compiler.MapValueForKey(m, "in") + if v3 != nil { + x.In, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [body] + if ok && !compiler.StringArrayContainsValue([]string{"body"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 4; + v4 := compiler.MapValueForKey(m, "required") + if v4 != nil { + x.Required, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schema schema = 5; + v5 := compiler.MapValueForKey(m, "schema") + if v5 != nil { + var err error + x.Schema, err = NewSchema(v5, compiler.NewContext("schema", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewContact creates an object of type Contact if possible, returning an error if not. +func NewContact(in interface{}, context *compiler.Context) (*Contact, error) { + errors := make([]error, 0) + x := &Contact{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"email", "name", "url"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string email = 3; + v3 := compiler.MapValueForKey(m, "email") + if v3 != nil { + x.Email, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for email: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 4; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDefault creates an object of type Default if possible, returning an error if not. +func NewDefault(in interface{}, context *compiler.Context) (*Default, error) { + errors := make([]error, 0) + x := &Default{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDefinitions creates an object of type Definitions if possible, returning an error if not. +func NewDefinitions(in interface{}, context *compiler.Context) (*Definitions, error) { + errors := make([]error, 0) + x := &Definitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSchema additional_properties = 1; + // MAP: Schema + x.AdditionalProperties = make([]*NamedSchema, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSchema{} + pair.Name = k + var err error + pair.Value, err = NewSchema(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDocument creates an object of type Document if possible, returning an error if not. +func NewDocument(in interface{}, context *compiler.Context) (*Document, error) { + errors := make([]error, 0) + x := &Document{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"info", "paths", "swagger"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"basePath", "consumes", "definitions", "externalDocs", "host", "info", "parameters", "paths", "produces", "responses", "schemes", "security", "securityDefinitions", "swagger", "tags"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string swagger = 1; + v1 := compiler.MapValueForKey(m, "swagger") + if v1 != nil { + x.Swagger, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for swagger: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [2.0] + if ok && !compiler.StringArrayContainsValue([]string{"2.0"}, x.Swagger) { + message := fmt.Sprintf("has unexpected value for swagger: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Info info = 2; + v2 := compiler.MapValueForKey(m, "info") + if v2 != nil { + var err error + x.Info, err = NewInfo(v2, compiler.NewContext("info", context)) + if err != nil { + errors = append(errors, err) + } + } + // string host = 3; + v3 := compiler.MapValueForKey(m, "host") + if v3 != nil { + x.Host, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for host: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string base_path = 4; + v4 := compiler.MapValueForKey(m, "basePath") + if v4 != nil { + x.BasePath, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for basePath: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string schemes = 5; + v5 := compiler.MapValueForKey(m, "schemes") + if v5 != nil { + v, ok := v5.([]interface{}) + if ok { + x.Schemes = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for schemes: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [http https ws wss] + if ok && !compiler.StringArrayContainsValues([]string{"http", "https", "ws", "wss"}, x.Schemes) { + message := fmt.Sprintf("has unexpected value for schemes: %+v", v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string consumes = 6; + v6 := compiler.MapValueForKey(m, "consumes") + if v6 != nil { + v, ok := v6.([]interface{}) + if ok { + x.Consumes = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for consumes: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string produces = 7; + v7 := compiler.MapValueForKey(m, "produces") + if v7 != nil { + v, ok := v7.([]interface{}) + if ok { + x.Produces = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for produces: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Paths paths = 8; + v8 := compiler.MapValueForKey(m, "paths") + if v8 != nil { + var err error + x.Paths, err = NewPaths(v8, compiler.NewContext("paths", context)) + if err != nil { + errors = append(errors, err) + } + } + // Definitions definitions = 9; + v9 := compiler.MapValueForKey(m, "definitions") + if v9 != nil { + var err error + x.Definitions, err = NewDefinitions(v9, compiler.NewContext("definitions", context)) + if err != nil { + errors = append(errors, err) + } + } + // ParameterDefinitions parameters = 10; + v10 := compiler.MapValueForKey(m, "parameters") + if v10 != nil { + var err error + x.Parameters, err = NewParameterDefinitions(v10, compiler.NewContext("parameters", context)) + if err != nil { + errors = append(errors, err) + } + } + // ResponseDefinitions responses = 11; + v11 := compiler.MapValueForKey(m, "responses") + if v11 != nil { + var err error + x.Responses, err = NewResponseDefinitions(v11, compiler.NewContext("responses", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated SecurityRequirement security = 12; + v12 := compiler.MapValueForKey(m, "security") + if v12 != nil { + // repeated SecurityRequirement + x.Security = make([]*SecurityRequirement, 0) + a, ok := v12.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", context)) + if err != nil { + errors = append(errors, err) + } + x.Security = append(x.Security, y) + } + } + } + // SecurityDefinitions security_definitions = 13; + v13 := compiler.MapValueForKey(m, "securityDefinitions") + if v13 != nil { + var err error + x.SecurityDefinitions, err = NewSecurityDefinitions(v13, compiler.NewContext("securityDefinitions", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated Tag tags = 14; + v14 := compiler.MapValueForKey(m, "tags") + if v14 != nil { + // repeated Tag + x.Tags = make([]*Tag, 0) + a, ok := v14.([]interface{}) + if ok { + for _, item := range a { + y, err := NewTag(item, compiler.NewContext("tags", context)) + if err != nil { + errors = append(errors, err) + } + x.Tags = append(x.Tags, y) + } + } + } + // ExternalDocs external_docs = 15; + v15 := compiler.MapValueForKey(m, "externalDocs") + if v15 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v15, compiler.NewContext("externalDocs", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 16; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExamples creates an object of type Examples if possible, returning an error if not. +func NewExamples(in interface{}, context *compiler.Context) (*Examples, error) { + errors := make([]error, 0) + x := &Examples{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExternalDocs creates an object of type ExternalDocs if possible, returning an error if not. +func NewExternalDocs(in interface{}, context *compiler.Context) (*ExternalDocs, error) { + errors := make([]error, 0) + x := &ExternalDocs{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"url"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "url"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 3; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewFileSchema creates an object of type FileSchema if possible, returning an error if not. +func NewFileSchema(in interface{}, context *compiler.Context) (*FileSchema, error) { + errors := make([]error, 0) + x := &FileSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"default", "description", "example", "externalDocs", "format", "readOnly", "required", "title", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string format = 1; + v1 := compiler.MapValueForKey(m, "format") + if v1 != nil { + x.Format, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 2; + v2 := compiler.MapValueForKey(m, "title") + if v2 != nil { + x.Title, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 4; + v4 := compiler.MapValueForKey(m, "default") + if v4 != nil { + var err error + x.Default, err = NewAny(v4, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string required = 5; + v5 := compiler.MapValueForKey(m, "required") + if v5 != nil { + v, ok := v5.([]interface{}) + if ok { + x.Required = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 6; + v6 := compiler.MapValueForKey(m, "type") + if v6 != nil { + x.Type, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [file] + if ok && !compiler.StringArrayContainsValue([]string{"file"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool read_only = 7; + v7 := compiler.MapValueForKey(m, "readOnly") + if v7 != nil { + x.ReadOnly, ok = v7.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 8; + v8 := compiler.MapValueForKey(m, "externalDocs") + if v8 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v8, compiler.NewContext("externalDocs", context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 9; + v9 := compiler.MapValueForKey(m, "example") + if v9 != nil { + var err error + x.Example, err = NewAny(v9, compiler.NewContext("example", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 10; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewFormDataParameterSubSchema creates an object of type FormDataParameterSubSchema if possible, returning an error if not. +func NewFormDataParameterSubSchema(in interface{}, context *compiler.Context) (*FormDataParameterSubSchema, error) { + errors := make([]error, 0) + x := &FormDataParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [formData] + if ok && !compiler.StringArrayContainsValue([]string{"formData"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 5; + v5 := compiler.MapValueForKey(m, "allowEmptyValue") + if v5 != nil { + x.AllowEmptyValue, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 6; + v6 := compiler.MapValueForKey(m, "type") + if v6 != nil { + x.Type, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array file] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array", "file"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 7; + v7 := compiler.MapValueForKey(m, "format") + if v7 != nil { + x.Format, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 8; + v8 := compiler.MapValueForKey(m, "items") + if v8 != nil { + var err error + x.Items, err = NewPrimitivesItems(v8, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 9; + v9 := compiler.MapValueForKey(m, "collectionFormat") + if v9 != nil { + x.CollectionFormat, ok = v9.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes multi] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes", "multi"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 10; + v10 := compiler.MapValueForKey(m, "default") + if v10 != nil { + var err error + x.Default, err = NewAny(v10, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 11; + v11 := compiler.MapValueForKey(m, "maximum") + if v11 != nil { + switch v11 := v11.(type) { + case float64: + x.Maximum = v11 + case float32: + x.Maximum = float64(v11) + case uint64: + x.Maximum = float64(v11) + case uint32: + x.Maximum = float64(v11) + case int64: + x.Maximum = float64(v11) + case int32: + x.Maximum = float64(v11) + case int: + x.Maximum = float64(v11) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 12; + v12 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v12 != nil { + x.ExclusiveMaximum, ok = v12.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 13; + v13 := compiler.MapValueForKey(m, "minimum") + if v13 != nil { + switch v13 := v13.(type) { + case float64: + x.Minimum = v13 + case float32: + x.Minimum = float64(v13) + case uint64: + x.Minimum = float64(v13) + case uint32: + x.Minimum = float64(v13) + case int64: + x.Minimum = float64(v13) + case int32: + x.Minimum = float64(v13) + case int: + x.Minimum = float64(v13) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 14; + v14 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v14 != nil { + x.ExclusiveMinimum, ok = v14.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 15; + v15 := compiler.MapValueForKey(m, "maxLength") + if v15 != nil { + t, ok := v15.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 16; + v16 := compiler.MapValueForKey(m, "minLength") + if v16 != nil { + t, ok := v16.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 17; + v17 := compiler.MapValueForKey(m, "pattern") + if v17 != nil { + x.Pattern, ok = v17.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 18; + v18 := compiler.MapValueForKey(m, "maxItems") + if v18 != nil { + t, ok := v18.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 19; + v19 := compiler.MapValueForKey(m, "minItems") + if v19 != nil { + t, ok := v19.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 20; + v20 := compiler.MapValueForKey(m, "uniqueItems") + if v20 != nil { + x.UniqueItems, ok = v20.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v20, v20) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 21; + v21 := compiler.MapValueForKey(m, "enum") + if v21 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v21.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 22; + v22 := compiler.MapValueForKey(m, "multipleOf") + if v22 != nil { + switch v22 := v22.(type) { + case float64: + x.MultipleOf = v22 + case float32: + x.MultipleOf = float64(v22) + case uint64: + x.MultipleOf = float64(v22) + case uint32: + x.MultipleOf = float64(v22) + case int64: + x.MultipleOf = float64(v22) + case int32: + x.MultipleOf = float64(v22) + case int: + x.MultipleOf = float64(v22) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v22, v22) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 23; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeader creates an object of type Header if possible, returning an error if not. +func NewHeader(in interface{}, context *compiler.Context) (*Header, error) { + errors := make([]error, 0) + x := &Header{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number integer boolean array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "integer", "boolean", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 2; + v2 := compiler.MapValueForKey(m, "format") + if v2 != nil { + x.Format, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 3; + v3 := compiler.MapValueForKey(m, "items") + if v3 != nil { + var err error + x.Items, err = NewPrimitivesItems(v3, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 4; + v4 := compiler.MapValueForKey(m, "collectionFormat") + if v4 != nil { + x.CollectionFormat, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + var err error + x.Default, err = NewAny(v5, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 6; + v6 := compiler.MapValueForKey(m, "maximum") + if v6 != nil { + switch v6 := v6.(type) { + case float64: + x.Maximum = v6 + case float32: + x.Maximum = float64(v6) + case uint64: + x.Maximum = float64(v6) + case uint32: + x.Maximum = float64(v6) + case int64: + x.Maximum = float64(v6) + case int32: + x.Maximum = float64(v6) + case int: + x.Maximum = float64(v6) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 7; + v7 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v7 != nil { + x.ExclusiveMaximum, ok = v7.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 8; + v8 := compiler.MapValueForKey(m, "minimum") + if v8 != nil { + switch v8 := v8.(type) { + case float64: + x.Minimum = v8 + case float32: + x.Minimum = float64(v8) + case uint64: + x.Minimum = float64(v8) + case uint32: + x.Minimum = float64(v8) + case int64: + x.Minimum = float64(v8) + case int32: + x.Minimum = float64(v8) + case int: + x.Minimum = float64(v8) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 9; + v9 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v9 != nil { + x.ExclusiveMinimum, ok = v9.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 10; + v10 := compiler.MapValueForKey(m, "maxLength") + if v10 != nil { + t, ok := v10.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 11; + v11 := compiler.MapValueForKey(m, "minLength") + if v11 != nil { + t, ok := v11.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 12; + v12 := compiler.MapValueForKey(m, "pattern") + if v12 != nil { + x.Pattern, ok = v12.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 13; + v13 := compiler.MapValueForKey(m, "maxItems") + if v13 != nil { + t, ok := v13.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 14; + v14 := compiler.MapValueForKey(m, "minItems") + if v14 != nil { + t, ok := v14.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 15; + v15 := compiler.MapValueForKey(m, "uniqueItems") + if v15 != nil { + x.UniqueItems, ok = v15.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 16; + v16 := compiler.MapValueForKey(m, "enum") + if v16 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v16.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 17; + v17 := compiler.MapValueForKey(m, "multipleOf") + if v17 != nil { + switch v17 := v17.(type) { + case float64: + x.MultipleOf = v17 + case float32: + x.MultipleOf = float64(v17) + case uint64: + x.MultipleOf = float64(v17) + case uint32: + x.MultipleOf = float64(v17) + case int64: + x.MultipleOf = float64(v17) + case int32: + x.MultipleOf = float64(v17) + case int: + x.MultipleOf = float64(v17) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 18; + v18 := compiler.MapValueForKey(m, "description") + if v18 != nil { + x.Description, ok = v18.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 19; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeaderParameterSubSchema creates an object of type HeaderParameterSubSchema if possible, returning an error if not. +func NewHeaderParameterSubSchema(in interface{}, context *compiler.Context) (*HeaderParameterSubSchema, error) { + errors := make([]error, 0) + x := &HeaderParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [header] + if ok && !compiler.StringArrayContainsValue([]string{"header"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 5; + v5 := compiler.MapValueForKey(m, "type") + if v5 != nil { + x.Type, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 6; + v6 := compiler.MapValueForKey(m, "format") + if v6 != nil { + x.Format, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 7; + v7 := compiler.MapValueForKey(m, "items") + if v7 != nil { + var err error + x.Items, err = NewPrimitivesItems(v7, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 8; + v8 := compiler.MapValueForKey(m, "collectionFormat") + if v8 != nil { + x.CollectionFormat, ok = v8.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 9; + v9 := compiler.MapValueForKey(m, "default") + if v9 != nil { + var err error + x.Default, err = NewAny(v9, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 10; + v10 := compiler.MapValueForKey(m, "maximum") + if v10 != nil { + switch v10 := v10.(type) { + case float64: + x.Maximum = v10 + case float32: + x.Maximum = float64(v10) + case uint64: + x.Maximum = float64(v10) + case uint32: + x.Maximum = float64(v10) + case int64: + x.Maximum = float64(v10) + case int32: + x.Maximum = float64(v10) + case int: + x.Maximum = float64(v10) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 11; + v11 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v11 != nil { + x.ExclusiveMaximum, ok = v11.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 12; + v12 := compiler.MapValueForKey(m, "minimum") + if v12 != nil { + switch v12 := v12.(type) { + case float64: + x.Minimum = v12 + case float32: + x.Minimum = float64(v12) + case uint64: + x.Minimum = float64(v12) + case uint32: + x.Minimum = float64(v12) + case int64: + x.Minimum = float64(v12) + case int32: + x.Minimum = float64(v12) + case int: + x.Minimum = float64(v12) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 13; + v13 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v13 != nil { + x.ExclusiveMinimum, ok = v13.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 14; + v14 := compiler.MapValueForKey(m, "maxLength") + if v14 != nil { + t, ok := v14.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 15; + v15 := compiler.MapValueForKey(m, "minLength") + if v15 != nil { + t, ok := v15.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 16; + v16 := compiler.MapValueForKey(m, "pattern") + if v16 != nil { + x.Pattern, ok = v16.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 17; + v17 := compiler.MapValueForKey(m, "maxItems") + if v17 != nil { + t, ok := v17.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 18; + v18 := compiler.MapValueForKey(m, "minItems") + if v18 != nil { + t, ok := v18.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 19; + v19 := compiler.MapValueForKey(m, "uniqueItems") + if v19 != nil { + x.UniqueItems, ok = v19.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 20; + v20 := compiler.MapValueForKey(m, "enum") + if v20 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v20.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 21; + v21 := compiler.MapValueForKey(m, "multipleOf") + if v21 != nil { + switch v21 := v21.(type) { + case float64: + x.MultipleOf = v21 + case float32: + x.MultipleOf = float64(v21) + case uint64: + x.MultipleOf = float64(v21) + case uint32: + x.MultipleOf = float64(v21) + case int64: + x.MultipleOf = float64(v21) + case int32: + x.MultipleOf = float64(v21) + case int: + x.MultipleOf = float64(v21) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v21, v21) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 22; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeaders creates an object of type Headers if possible, returning an error if not. +func NewHeaders(in interface{}, context *compiler.Context) (*Headers, error) { + errors := make([]error, 0) + x := &Headers{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedHeader additional_properties = 1; + // MAP: Header + x.AdditionalProperties = make([]*NamedHeader, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedHeader{} + pair.Name = k + var err error + pair.Value, err = NewHeader(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewInfo creates an object of type Info if possible, returning an error if not. +func NewInfo(in interface{}, context *compiler.Context) (*Info, error) { + errors := make([]error, 0) + x := &Info{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"title", "version"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"contact", "description", "license", "termsOfService", "title", "version"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string title = 1; + v1 := compiler.MapValueForKey(m, "title") + if v1 != nil { + x.Title, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string version = 2; + v2 := compiler.MapValueForKey(m, "version") + if v2 != nil { + x.Version, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for version: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string terms_of_service = 4; + v4 := compiler.MapValueForKey(m, "termsOfService") + if v4 != nil { + x.TermsOfService, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for termsOfService: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Contact contact = 5; + v5 := compiler.MapValueForKey(m, "contact") + if v5 != nil { + var err error + x.Contact, err = NewContact(v5, compiler.NewContext("contact", context)) + if err != nil { + errors = append(errors, err) + } + } + // License license = 6; + v6 := compiler.MapValueForKey(m, "license") + if v6 != nil { + var err error + x.License, err = NewLicense(v6, compiler.NewContext("license", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 7; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewItemsItem creates an object of type ItemsItem if possible, returning an error if not. +func NewItemsItem(in interface{}, context *compiler.Context) (*ItemsItem, error) { + errors := make([]error, 0) + x := &ItemsItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value for item array: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + x.Schema = make([]*Schema, 0) + y, err := NewSchema(m, compiler.NewContext("", context)) + if err != nil { + return nil, err + } + x.Schema = append(x.Schema, y) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewJsonReference creates an object of type JsonReference if possible, returning an error if not. +func NewJsonReference(in interface{}, context *compiler.Context) (*JsonReference, error) { + errors := make([]error, 0) + x := &JsonReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"$ref"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"$ref", "description"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLicense creates an object of type License if possible, returning an error if not. +func NewLicense(in interface{}, context *compiler.Context) (*License, error) { + errors := make([]error, 0) + x := &License{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"name", "url"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 3; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedAny creates an object of type NamedAny if possible, returning an error if not. +func NewNamedAny(in interface{}, context *compiler.Context) (*NamedAny, error) { + errors := make([]error, 0) + x := &NamedAny{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewAny(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedHeader creates an object of type NamedHeader if possible, returning an error if not. +func NewNamedHeader(in interface{}, context *compiler.Context) (*NamedHeader, error) { + errors := make([]error, 0) + x := &NamedHeader{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Header value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewHeader(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedParameter creates an object of type NamedParameter if possible, returning an error if not. +func NewNamedParameter(in interface{}, context *compiler.Context) (*NamedParameter, error) { + errors := make([]error, 0) + x := &NamedParameter{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Parameter value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewParameter(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedPathItem creates an object of type NamedPathItem if possible, returning an error if not. +func NewNamedPathItem(in interface{}, context *compiler.Context) (*NamedPathItem, error) { + errors := make([]error, 0) + x := &NamedPathItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PathItem value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewPathItem(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedResponse creates an object of type NamedResponse if possible, returning an error if not. +func NewNamedResponse(in interface{}, context *compiler.Context) (*NamedResponse, error) { + errors := make([]error, 0) + x := &NamedResponse{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Response value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewResponse(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedResponseValue creates an object of type NamedResponseValue if possible, returning an error if not. +func NewNamedResponseValue(in interface{}, context *compiler.Context) (*NamedResponseValue, error) { + errors := make([]error, 0) + x := &NamedResponseValue{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ResponseValue value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewResponseValue(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSchema creates an object of type NamedSchema if possible, returning an error if not. +func NewNamedSchema(in interface{}, context *compiler.Context) (*NamedSchema, error) { + errors := make([]error, 0) + x := &NamedSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Schema value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSchema(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSecurityDefinitionsItem creates an object of type NamedSecurityDefinitionsItem if possible, returning an error if not. +func NewNamedSecurityDefinitionsItem(in interface{}, context *compiler.Context) (*NamedSecurityDefinitionsItem, error) { + errors := make([]error, 0) + x := &NamedSecurityDefinitionsItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SecurityDefinitionsItem value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSecurityDefinitionsItem(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedString creates an object of type NamedString if possible, returning an error if not. +func NewNamedString(in interface{}, context *compiler.Context) (*NamedString, error) { + errors := make([]error, 0) + x := &NamedString{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + x.Value, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for value: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedStringArray creates an object of type NamedStringArray if possible, returning an error if not. +func NewNamedStringArray(in interface{}, context *compiler.Context) (*NamedStringArray, error) { + errors := make([]error, 0) + x := &NamedStringArray{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // StringArray value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewStringArray(v2, compiler.NewContext("value", context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNonBodyParameter creates an object of type NonBodyParameter if possible, returning an error if not. +func NewNonBodyParameter(in interface{}, context *compiler.Context) (*NonBodyParameter, error) { + errors := make([]error, 0) + x := &NonBodyParameter{} + matched := false + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // HeaderParameterSubSchema header_parameter_sub_schema = 1; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewHeaderParameterSubSchema(m, compiler.NewContext("headerParameterSubSchema", context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_HeaderParameterSubSchema{HeaderParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + // FormDataParameterSubSchema form_data_parameter_sub_schema = 2; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewFormDataParameterSubSchema(m, compiler.NewContext("formDataParameterSubSchema", context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_FormDataParameterSubSchema{FormDataParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + // QueryParameterSubSchema query_parameter_sub_schema = 3; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewQueryParameterSubSchema(m, compiler.NewContext("queryParameterSubSchema", context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_QueryParameterSubSchema{QueryParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + // PathParameterSubSchema path_parameter_sub_schema = 4; + { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewPathParameterSubSchema(m, compiler.NewContext("pathParameterSubSchema", context)) + if matchingError == nil { + x.Oneof = &NonBodyParameter_PathParameterSubSchema{PathParameterSubSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2AccessCodeSecurity creates an object of type Oauth2AccessCodeSecurity if possible, returning an error if not. +func NewOauth2AccessCodeSecurity(in interface{}, context *compiler.Context) (*Oauth2AccessCodeSecurity, error) { + errors := make([]error, 0) + x := &Oauth2AccessCodeSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"authorizationUrl", "flow", "tokenUrl", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"authorizationUrl", "description", "flow", "scopes", "tokenUrl", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [accessCode] + if ok && !compiler.StringArrayContainsValue([]string{"accessCode"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) + if err != nil { + errors = append(errors, err) + } + } + // string authorization_url = 4; + v4 := compiler.MapValueForKey(m, "authorizationUrl") + if v4 != nil { + x.AuthorizationUrl, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for authorizationUrl: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string token_url = 5; + v5 := compiler.MapValueForKey(m, "tokenUrl") + if v5 != nil { + x.TokenUrl, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 6; + v6 := compiler.MapValueForKey(m, "description") + if v6 != nil { + x.Description, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 7; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2ApplicationSecurity creates an object of type Oauth2ApplicationSecurity if possible, returning an error if not. +func NewOauth2ApplicationSecurity(in interface{}, context *compiler.Context) (*Oauth2ApplicationSecurity, error) { + errors := make([]error, 0) + x := &Oauth2ApplicationSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"flow", "tokenUrl", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "flow", "scopes", "tokenUrl", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [application] + if ok && !compiler.StringArrayContainsValue([]string{"application"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) + if err != nil { + errors = append(errors, err) + } + } + // string token_url = 4; + v4 := compiler.MapValueForKey(m, "tokenUrl") + if v4 != nil { + x.TokenUrl, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2ImplicitSecurity creates an object of type Oauth2ImplicitSecurity if possible, returning an error if not. +func NewOauth2ImplicitSecurity(in interface{}, context *compiler.Context) (*Oauth2ImplicitSecurity, error) { + errors := make([]error, 0) + x := &Oauth2ImplicitSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"authorizationUrl", "flow", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"authorizationUrl", "description", "flow", "scopes", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [implicit] + if ok && !compiler.StringArrayContainsValue([]string{"implicit"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) + if err != nil { + errors = append(errors, err) + } + } + // string authorization_url = 4; + v4 := compiler.MapValueForKey(m, "authorizationUrl") + if v4 != nil { + x.AuthorizationUrl, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for authorizationUrl: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2PasswordSecurity creates an object of type Oauth2PasswordSecurity if possible, returning an error if not. +func NewOauth2PasswordSecurity(in interface{}, context *compiler.Context) (*Oauth2PasswordSecurity, error) { + errors := make([]error, 0) + x := &Oauth2PasswordSecurity{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"flow", "tokenUrl", "type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "flow", "scopes", "tokenUrl", "type"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [oauth2] + if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string flow = 2; + v2 := compiler.MapValueForKey(m, "flow") + if v2 != nil { + x.Flow, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [password] + if ok && !compiler.StringArrayContainsValue([]string{"password"}, x.Flow) { + message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Oauth2Scopes scopes = 3; + v3 := compiler.MapValueForKey(m, "scopes") + if v3 != nil { + var err error + x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) + if err != nil { + errors = append(errors, err) + } + } + // string token_url = 4; + v4 := compiler.MapValueForKey(m, "tokenUrl") + if v4 != nil { + x.TokenUrl, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauth2Scopes creates an object of type Oauth2Scopes if possible, returning an error if not. +func NewOauth2Scopes(in interface{}, context *compiler.Context) (*Oauth2Scopes, error) { + errors := make([]error, 0) + x := &Oauth2Scopes{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedString additional_properties = 1; + // MAP: string + x.AdditionalProperties = make([]*NamedString, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedString{} + pair.Name = k + pair.Value = v.(string) + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOperation creates an object of type Operation if possible, returning an error if not. +func NewOperation(in interface{}, context *compiler.Context) (*Operation, error) { + errors := make([]error, 0) + x := &Operation{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"responses"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"consumes", "deprecated", "description", "externalDocs", "operationId", "parameters", "produces", "responses", "schemes", "security", "summary", "tags"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated string tags = 1; + v1 := compiler.MapValueForKey(m, "tags") + if v1 != nil { + v, ok := v1.([]interface{}) + if ok { + x.Tags = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for tags: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 4; + v4 := compiler.MapValueForKey(m, "externalDocs") + if v4 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v4, compiler.NewContext("externalDocs", context)) + if err != nil { + errors = append(errors, err) + } + } + // string operation_id = 5; + v5 := compiler.MapValueForKey(m, "operationId") + if v5 != nil { + x.OperationId, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for operationId: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string produces = 6; + v6 := compiler.MapValueForKey(m, "produces") + if v6 != nil { + v, ok := v6.([]interface{}) + if ok { + x.Produces = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for produces: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string consumes = 7; + v7 := compiler.MapValueForKey(m, "consumes") + if v7 != nil { + v, ok := v7.([]interface{}) + if ok { + x.Consumes = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for consumes: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated ParametersItem parameters = 8; + v8 := compiler.MapValueForKey(m, "parameters") + if v8 != nil { + // repeated ParametersItem + x.Parameters = make([]*ParametersItem, 0) + a, ok := v8.([]interface{}) + if ok { + for _, item := range a { + y, err := NewParametersItem(item, compiler.NewContext("parameters", context)) + if err != nil { + errors = append(errors, err) + } + x.Parameters = append(x.Parameters, y) + } + } + } + // Responses responses = 9; + v9 := compiler.MapValueForKey(m, "responses") + if v9 != nil { + var err error + x.Responses, err = NewResponses(v9, compiler.NewContext("responses", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated string schemes = 10; + v10 := compiler.MapValueForKey(m, "schemes") + if v10 != nil { + v, ok := v10.([]interface{}) + if ok { + x.Schemes = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for schemes: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [http https ws wss] + if ok && !compiler.StringArrayContainsValues([]string{"http", "https", "ws", "wss"}, x.Schemes) { + message := fmt.Sprintf("has unexpected value for schemes: %+v", v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool deprecated = 11; + v11 := compiler.MapValueForKey(m, "deprecated") + if v11 != nil { + x.Deprecated, ok = v11.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated SecurityRequirement security = 12; + v12 := compiler.MapValueForKey(m, "security") + if v12 != nil { + // repeated SecurityRequirement + x.Security = make([]*SecurityRequirement, 0) + a, ok := v12.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", context)) + if err != nil { + errors = append(errors, err) + } + x.Security = append(x.Security, y) + } + } + } + // repeated NamedAny vendor_extension = 13; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameter creates an object of type Parameter if possible, returning an error if not. +func NewParameter(in interface{}, context *compiler.Context) (*Parameter, error) { + errors := make([]error, 0) + x := &Parameter{} + matched := false + // BodyParameter body_parameter = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewBodyParameter(m, compiler.NewContext("bodyParameter", context)) + if matchingError == nil { + x.Oneof = &Parameter_BodyParameter{BodyParameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // NonBodyParameter non_body_parameter = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewNonBodyParameter(m, compiler.NewContext("nonBodyParameter", context)) + if matchingError == nil { + x.Oneof = &Parameter_NonBodyParameter{NonBodyParameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameterDefinitions creates an object of type ParameterDefinitions if possible, returning an error if not. +func NewParameterDefinitions(in interface{}, context *compiler.Context) (*ParameterDefinitions, error) { + errors := make([]error, 0) + x := &ParameterDefinitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedParameter additional_properties = 1; + // MAP: Parameter + x.AdditionalProperties = make([]*NamedParameter, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedParameter{} + pair.Name = k + var err error + pair.Value, err = NewParameter(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParametersItem creates an object of type ParametersItem if possible, returning an error if not. +func NewParametersItem(in interface{}, context *compiler.Context) (*ParametersItem, error) { + errors := make([]error, 0) + x := &ParametersItem{} + matched := false + // Parameter parameter = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewParameter(m, compiler.NewContext("parameter", context)) + if matchingError == nil { + x.Oneof = &ParametersItem_Parameter{Parameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // JsonReference json_reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewJsonReference(m, compiler.NewContext("jsonReference", context)) + if matchingError == nil { + x.Oneof = &ParametersItem_JsonReference{JsonReference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPathItem creates an object of type PathItem if possible, returning an error if not. +func NewPathItem(in interface{}, context *compiler.Context) (*PathItem, error) { + errors := make([]error, 0) + x := &PathItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"$ref", "delete", "get", "head", "options", "parameters", "patch", "post", "put"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Operation get = 2; + v2 := compiler.MapValueForKey(m, "get") + if v2 != nil { + var err error + x.Get, err = NewOperation(v2, compiler.NewContext("get", context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation put = 3; + v3 := compiler.MapValueForKey(m, "put") + if v3 != nil { + var err error + x.Put, err = NewOperation(v3, compiler.NewContext("put", context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation post = 4; + v4 := compiler.MapValueForKey(m, "post") + if v4 != nil { + var err error + x.Post, err = NewOperation(v4, compiler.NewContext("post", context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation delete = 5; + v5 := compiler.MapValueForKey(m, "delete") + if v5 != nil { + var err error + x.Delete, err = NewOperation(v5, compiler.NewContext("delete", context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation options = 6; + v6 := compiler.MapValueForKey(m, "options") + if v6 != nil { + var err error + x.Options, err = NewOperation(v6, compiler.NewContext("options", context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation head = 7; + v7 := compiler.MapValueForKey(m, "head") + if v7 != nil { + var err error + x.Head, err = NewOperation(v7, compiler.NewContext("head", context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation patch = 8; + v8 := compiler.MapValueForKey(m, "patch") + if v8 != nil { + var err error + x.Patch, err = NewOperation(v8, compiler.NewContext("patch", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated ParametersItem parameters = 9; + v9 := compiler.MapValueForKey(m, "parameters") + if v9 != nil { + // repeated ParametersItem + x.Parameters = make([]*ParametersItem, 0) + a, ok := v9.([]interface{}) + if ok { + for _, item := range a { + y, err := NewParametersItem(item, compiler.NewContext("parameters", context)) + if err != nil { + errors = append(errors, err) + } + x.Parameters = append(x.Parameters, y) + } + } + } + // repeated NamedAny vendor_extension = 10; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPathParameterSubSchema creates an object of type PathParameterSubSchema if possible, returning an error if not. +func NewPathParameterSubSchema(in interface{}, context *compiler.Context) (*PathParameterSubSchema, error) { + errors := make([]error, 0) + x := &PathParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"required"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [path] + if ok && !compiler.StringArrayContainsValue([]string{"path"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 5; + v5 := compiler.MapValueForKey(m, "type") + if v5 != nil { + x.Type, ok = v5.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 6; + v6 := compiler.MapValueForKey(m, "format") + if v6 != nil { + x.Format, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 7; + v7 := compiler.MapValueForKey(m, "items") + if v7 != nil { + var err error + x.Items, err = NewPrimitivesItems(v7, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 8; + v8 := compiler.MapValueForKey(m, "collectionFormat") + if v8 != nil { + x.CollectionFormat, ok = v8.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 9; + v9 := compiler.MapValueForKey(m, "default") + if v9 != nil { + var err error + x.Default, err = NewAny(v9, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 10; + v10 := compiler.MapValueForKey(m, "maximum") + if v10 != nil { + switch v10 := v10.(type) { + case float64: + x.Maximum = v10 + case float32: + x.Maximum = float64(v10) + case uint64: + x.Maximum = float64(v10) + case uint32: + x.Maximum = float64(v10) + case int64: + x.Maximum = float64(v10) + case int32: + x.Maximum = float64(v10) + case int: + x.Maximum = float64(v10) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 11; + v11 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v11 != nil { + x.ExclusiveMaximum, ok = v11.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 12; + v12 := compiler.MapValueForKey(m, "minimum") + if v12 != nil { + switch v12 := v12.(type) { + case float64: + x.Minimum = v12 + case float32: + x.Minimum = float64(v12) + case uint64: + x.Minimum = float64(v12) + case uint32: + x.Minimum = float64(v12) + case int64: + x.Minimum = float64(v12) + case int32: + x.Minimum = float64(v12) + case int: + x.Minimum = float64(v12) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 13; + v13 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v13 != nil { + x.ExclusiveMinimum, ok = v13.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 14; + v14 := compiler.MapValueForKey(m, "maxLength") + if v14 != nil { + t, ok := v14.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 15; + v15 := compiler.MapValueForKey(m, "minLength") + if v15 != nil { + t, ok := v15.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 16; + v16 := compiler.MapValueForKey(m, "pattern") + if v16 != nil { + x.Pattern, ok = v16.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 17; + v17 := compiler.MapValueForKey(m, "maxItems") + if v17 != nil { + t, ok := v17.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 18; + v18 := compiler.MapValueForKey(m, "minItems") + if v18 != nil { + t, ok := v18.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 19; + v19 := compiler.MapValueForKey(m, "uniqueItems") + if v19 != nil { + x.UniqueItems, ok = v19.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 20; + v20 := compiler.MapValueForKey(m, "enum") + if v20 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v20.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 21; + v21 := compiler.MapValueForKey(m, "multipleOf") + if v21 != nil { + switch v21 := v21.(type) { + case float64: + x.MultipleOf = v21 + case float32: + x.MultipleOf = float64(v21) + case uint64: + x.MultipleOf = float64(v21) + case uint32: + x.MultipleOf = float64(v21) + case int64: + x.MultipleOf = float64(v21) + case int32: + x.MultipleOf = float64(v21) + case int: + x.MultipleOf = float64(v21) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v21, v21) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 22; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPaths creates an object of type Paths if possible, returning an error if not. +func NewPaths(in interface{}, context *compiler.Context) (*Paths, error) { + errors := make([]error, 0) + x := &Paths{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern0, pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated NamedAny vendor_extension = 1; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + // repeated NamedPathItem path = 2; + // MAP: PathItem ^/ + x.Path = make([]*NamedPathItem, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "/") { + pair := &NamedPathItem{} + pair.Name = k + var err error + pair.Value, err = NewPathItem(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.Path = append(x.Path, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPrimitivesItems creates an object of type PrimitivesItems if possible, returning an error if not. +func NewPrimitivesItems(in interface{}, context *compiler.Context) (*PrimitivesItems, error) { + errors := make([]error, 0) + x := &PrimitivesItems{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"collectionFormat", "default", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number integer boolean array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "integer", "boolean", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 2; + v2 := compiler.MapValueForKey(m, "format") + if v2 != nil { + x.Format, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 3; + v3 := compiler.MapValueForKey(m, "items") + if v3 != nil { + var err error + x.Items, err = NewPrimitivesItems(v3, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 4; + v4 := compiler.MapValueForKey(m, "collectionFormat") + if v4 != nil { + x.CollectionFormat, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + var err error + x.Default, err = NewAny(v5, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 6; + v6 := compiler.MapValueForKey(m, "maximum") + if v6 != nil { + switch v6 := v6.(type) { + case float64: + x.Maximum = v6 + case float32: + x.Maximum = float64(v6) + case uint64: + x.Maximum = float64(v6) + case uint32: + x.Maximum = float64(v6) + case int64: + x.Maximum = float64(v6) + case int32: + x.Maximum = float64(v6) + case int: + x.Maximum = float64(v6) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 7; + v7 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v7 != nil { + x.ExclusiveMaximum, ok = v7.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 8; + v8 := compiler.MapValueForKey(m, "minimum") + if v8 != nil { + switch v8 := v8.(type) { + case float64: + x.Minimum = v8 + case float32: + x.Minimum = float64(v8) + case uint64: + x.Minimum = float64(v8) + case uint32: + x.Minimum = float64(v8) + case int64: + x.Minimum = float64(v8) + case int32: + x.Minimum = float64(v8) + case int: + x.Minimum = float64(v8) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 9; + v9 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v9 != nil { + x.ExclusiveMinimum, ok = v9.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 10; + v10 := compiler.MapValueForKey(m, "maxLength") + if v10 != nil { + t, ok := v10.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 11; + v11 := compiler.MapValueForKey(m, "minLength") + if v11 != nil { + t, ok := v11.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 12; + v12 := compiler.MapValueForKey(m, "pattern") + if v12 != nil { + x.Pattern, ok = v12.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 13; + v13 := compiler.MapValueForKey(m, "maxItems") + if v13 != nil { + t, ok := v13.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 14; + v14 := compiler.MapValueForKey(m, "minItems") + if v14 != nil { + t, ok := v14.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 15; + v15 := compiler.MapValueForKey(m, "uniqueItems") + if v15 != nil { + x.UniqueItems, ok = v15.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 16; + v16 := compiler.MapValueForKey(m, "enum") + if v16 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v16.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 17; + v17 := compiler.MapValueForKey(m, "multipleOf") + if v17 != nil { + switch v17 := v17.(type) { + case float64: + x.MultipleOf = v17 + case float32: + x.MultipleOf = float64(v17) + case uint64: + x.MultipleOf = float64(v17) + case uint32: + x.MultipleOf = float64(v17) + case int64: + x.MultipleOf = float64(v17) + case int32: + x.MultipleOf = float64(v17) + case int: + x.MultipleOf = float64(v17) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 18; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewProperties creates an object of type Properties if possible, returning an error if not. +func NewProperties(in interface{}, context *compiler.Context) (*Properties, error) { + errors := make([]error, 0) + x := &Properties{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSchema additional_properties = 1; + // MAP: Schema + x.AdditionalProperties = make([]*NamedSchema, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSchema{} + pair.Name = k + var err error + pair.Value, err = NewSchema(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewQueryParameterSubSchema creates an object of type QueryParameterSubSchema if possible, returning an error if not. +func NewQueryParameterSubSchema(in interface{}, context *compiler.Context) (*QueryParameterSubSchema, error) { + errors := make([]error, 0) + x := &QueryParameterSubSchema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool required = 1; + v1 := compiler.MapValueForKey(m, "required") + if v1 != nil { + x.Required, ok = v1.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [query] + if ok && !compiler.StringArrayContainsValue([]string{"query"}, x.In) { + message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 4; + v4 := compiler.MapValueForKey(m, "name") + if v4 != nil { + x.Name, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 5; + v5 := compiler.MapValueForKey(m, "allowEmptyValue") + if v5 != nil { + x.AllowEmptyValue, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string type = 6; + v6 := compiler.MapValueForKey(m, "type") + if v6 != nil { + x.Type, ok = v6.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [string number boolean integer array] + if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { + message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 7; + v7 := compiler.MapValueForKey(m, "format") + if v7 != nil { + x.Format, ok = v7.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PrimitivesItems items = 8; + v8 := compiler.MapValueForKey(m, "items") + if v8 != nil { + var err error + x.Items, err = NewPrimitivesItems(v8, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // string collection_format = 9; + v9 := compiler.MapValueForKey(m, "collectionFormat") + if v9 != nil { + x.CollectionFormat, ok = v9.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + // check for valid enum values + // [csv ssv tsv pipes multi] + if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes", "multi"}, x.CollectionFormat) { + message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 10; + v10 := compiler.MapValueForKey(m, "default") + if v10 != nil { + var err error + x.Default, err = NewAny(v10, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float maximum = 11; + v11 := compiler.MapValueForKey(m, "maximum") + if v11 != nil { + switch v11 := v11.(type) { + case float64: + x.Maximum = v11 + case float32: + x.Maximum = float64(v11) + case uint64: + x.Maximum = float64(v11) + case uint32: + x.Maximum = float64(v11) + case int64: + x.Maximum = float64(v11) + case int32: + x.Maximum = float64(v11) + case int: + x.Maximum = float64(v11) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 12; + v12 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v12 != nil { + x.ExclusiveMaximum, ok = v12.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 13; + v13 := compiler.MapValueForKey(m, "minimum") + if v13 != nil { + switch v13 := v13.(type) { + case float64: + x.Minimum = v13 + case float32: + x.Minimum = float64(v13) + case uint64: + x.Minimum = float64(v13) + case uint32: + x.Minimum = float64(v13) + case int64: + x.Minimum = float64(v13) + case int32: + x.Minimum = float64(v13) + case int: + x.Minimum = float64(v13) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 14; + v14 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v14 != nil { + x.ExclusiveMinimum, ok = v14.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 15; + v15 := compiler.MapValueForKey(m, "maxLength") + if v15 != nil { + t, ok := v15.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 16; + v16 := compiler.MapValueForKey(m, "minLength") + if v16 != nil { + t, ok := v16.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 17; + v17 := compiler.MapValueForKey(m, "pattern") + if v17 != nil { + x.Pattern, ok = v17.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 18; + v18 := compiler.MapValueForKey(m, "maxItems") + if v18 != nil { + t, ok := v18.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 19; + v19 := compiler.MapValueForKey(m, "minItems") + if v19 != nil { + t, ok := v19.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 20; + v20 := compiler.MapValueForKey(m, "uniqueItems") + if v20 != nil { + x.UniqueItems, ok = v20.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v20, v20) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 21; + v21 := compiler.MapValueForKey(m, "enum") + if v21 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v21.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // float multiple_of = 22; + v22 := compiler.MapValueForKey(m, "multipleOf") + if v22 != nil { + switch v22 := v22.(type) { + case float64: + x.MultipleOf = v22 + case float32: + x.MultipleOf = float64(v22) + case uint64: + x.MultipleOf = float64(v22) + case uint32: + x.MultipleOf = float64(v22) + case int64: + x.MultipleOf = float64(v22) + case int32: + x.MultipleOf = float64(v22) + case int: + x.MultipleOf = float64(v22) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v22, v22) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 23; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponse creates an object of type Response if possible, returning an error if not. +func NewResponse(in interface{}, context *compiler.Context) (*Response, error) { + errors := make([]error, 0) + x := &Response{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"description"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "examples", "headers", "schema"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SchemaItem schema = 2; + v2 := compiler.MapValueForKey(m, "schema") + if v2 != nil { + var err error + x.Schema, err = NewSchemaItem(v2, compiler.NewContext("schema", context)) + if err != nil { + errors = append(errors, err) + } + } + // Headers headers = 3; + v3 := compiler.MapValueForKey(m, "headers") + if v3 != nil { + var err error + x.Headers, err = NewHeaders(v3, compiler.NewContext("headers", context)) + if err != nil { + errors = append(errors, err) + } + } + // Examples examples = 4; + v4 := compiler.MapValueForKey(m, "examples") + if v4 != nil { + var err error + x.Examples, err = NewExamples(v4, compiler.NewContext("examples", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 5; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponseDefinitions creates an object of type ResponseDefinitions if possible, returning an error if not. +func NewResponseDefinitions(in interface{}, context *compiler.Context) (*ResponseDefinitions, error) { + errors := make([]error, 0) + x := &ResponseDefinitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedResponse additional_properties = 1; + // MAP: Response + x.AdditionalProperties = make([]*NamedResponse, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedResponse{} + pair.Name = k + var err error + pair.Value, err = NewResponse(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponseValue creates an object of type ResponseValue if possible, returning an error if not. +func NewResponseValue(in interface{}, context *compiler.Context) (*ResponseValue, error) { + errors := make([]error, 0) + x := &ResponseValue{} + matched := false + // Response response = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewResponse(m, compiler.NewContext("response", context)) + if matchingError == nil { + x.Oneof = &ResponseValue_Response{Response: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // JsonReference json_reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewJsonReference(m, compiler.NewContext("jsonReference", context)) + if matchingError == nil { + x.Oneof = &ResponseValue_JsonReference{JsonReference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponses creates an object of type Responses if possible, returning an error if not. +func NewResponses(in interface{}, context *compiler.Context) (*Responses, error) { + errors := make([]error, 0) + x := &Responses{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern2, pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated NamedResponseValue response_code = 1; + // MAP: ResponseValue ^([0-9]{3})$|^(default)$ + x.ResponseCode = make([]*NamedResponseValue, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if pattern2.MatchString(k) { + pair := &NamedResponseValue{} + pair.Name = k + var err error + pair.Value, err = NewResponseValue(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.ResponseCode = append(x.ResponseCode, pair) + } + } + } + // repeated NamedAny vendor_extension = 2; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchema creates an object of type Schema if possible, returning an error if not. +func NewSchema(in interface{}, context *compiler.Context) (*Schema, error) { + errors := make([]error, 0) + x := &Schema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"$ref", "additionalProperties", "allOf", "default", "description", "discriminator", "enum", "example", "exclusiveMaximum", "exclusiveMinimum", "externalDocs", "format", "items", "maxItems", "maxLength", "maxProperties", "maximum", "minItems", "minLength", "minProperties", "minimum", "multipleOf", "pattern", "properties", "readOnly", "required", "title", "type", "uniqueItems", "xml"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 2; + v2 := compiler.MapValueForKey(m, "format") + if v2 != nil { + x.Format, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 3; + v3 := compiler.MapValueForKey(m, "title") + if v3 != nil { + x.Title, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 4; + v4 := compiler.MapValueForKey(m, "description") + if v4 != nil { + x.Description, ok = v4.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any default = 5; + v5 := compiler.MapValueForKey(m, "default") + if v5 != nil { + var err error + x.Default, err = NewAny(v5, compiler.NewContext("default", context)) + if err != nil { + errors = append(errors, err) + } + } + // float multiple_of = 6; + v6 := compiler.MapValueForKey(m, "multipleOf") + if v6 != nil { + switch v6 := v6.(type) { + case float64: + x.MultipleOf = v6 + case float32: + x.MultipleOf = float64(v6) + case uint64: + x.MultipleOf = float64(v6) + case uint32: + x.MultipleOf = float64(v6) + case int64: + x.MultipleOf = float64(v6) + case int32: + x.MultipleOf = float64(v6) + case int: + x.MultipleOf = float64(v6) + default: + message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v6, v6) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float maximum = 7; + v7 := compiler.MapValueForKey(m, "maximum") + if v7 != nil { + switch v7 := v7.(type) { + case float64: + x.Maximum = v7 + case float32: + x.Maximum = float64(v7) + case uint64: + x.Maximum = float64(v7) + case uint32: + x.Maximum = float64(v7) + case int64: + x.Maximum = float64(v7) + case int32: + x.Maximum = float64(v7) + case int: + x.Maximum = float64(v7) + default: + message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v7, v7) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 8; + v8 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v8 != nil { + x.ExclusiveMaximum, ok = v8.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v8, v8) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 9; + v9 := compiler.MapValueForKey(m, "minimum") + if v9 != nil { + switch v9 := v9.(type) { + case float64: + x.Minimum = v9 + case float32: + x.Minimum = float64(v9) + case uint64: + x.Minimum = float64(v9) + case uint32: + x.Minimum = float64(v9) + case int64: + x.Minimum = float64(v9) + case int32: + x.Minimum = float64(v9) + case int: + x.Minimum = float64(v9) + default: + message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v9, v9) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 10; + v10 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v10 != nil { + x.ExclusiveMinimum, ok = v10.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v10, v10) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 11; + v11 := compiler.MapValueForKey(m, "maxLength") + if v11 != nil { + t, ok := v11.(int) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v11, v11) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 12; + v12 := compiler.MapValueForKey(m, "minLength") + if v12 != nil { + t, ok := v12.(int) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v12, v12) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 13; + v13 := compiler.MapValueForKey(m, "pattern") + if v13 != nil { + x.Pattern, ok = v13.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v13, v13) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 14; + v14 := compiler.MapValueForKey(m, "maxItems") + if v14 != nil { + t, ok := v14.(int) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v14, v14) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 15; + v15 := compiler.MapValueForKey(m, "minItems") + if v15 != nil { + t, ok := v15.(int) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v15, v15) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 16; + v16 := compiler.MapValueForKey(m, "uniqueItems") + if v16 != nil { + x.UniqueItems, ok = v16.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v16, v16) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_properties = 17; + v17 := compiler.MapValueForKey(m, "maxProperties") + if v17 != nil { + t, ok := v17.(int) + if ok { + x.MaxProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxProperties: %+v (%T)", v17, v17) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_properties = 18; + v18 := compiler.MapValueForKey(m, "minProperties") + if v18 != nil { + t, ok := v18.(int) + if ok { + x.MinProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minProperties: %+v (%T)", v18, v18) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string required = 19; + v19 := compiler.MapValueForKey(m, "required") + if v19 != nil { + v, ok := v19.([]interface{}) + if ok { + x.Required = compiler.ConvertInterfaceArrayToStringArray(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v19, v19) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 20; + v20 := compiler.MapValueForKey(m, "enum") + if v20 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := v20.([]interface{}) + if ok { + for _, item := range a { + y, err := NewAny(item, compiler.NewContext("enum", context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // AdditionalPropertiesItem additional_properties = 21; + v21 := compiler.MapValueForKey(m, "additionalProperties") + if v21 != nil { + var err error + x.AdditionalProperties, err = NewAdditionalPropertiesItem(v21, compiler.NewContext("additionalProperties", context)) + if err != nil { + errors = append(errors, err) + } + } + // TypeItem type = 22; + v22 := compiler.MapValueForKey(m, "type") + if v22 != nil { + var err error + x.Type, err = NewTypeItem(v22, compiler.NewContext("type", context)) + if err != nil { + errors = append(errors, err) + } + } + // ItemsItem items = 23; + v23 := compiler.MapValueForKey(m, "items") + if v23 != nil { + var err error + x.Items, err = NewItemsItem(v23, compiler.NewContext("items", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated Schema all_of = 24; + v24 := compiler.MapValueForKey(m, "allOf") + if v24 != nil { + // repeated Schema + x.AllOf = make([]*Schema, 0) + a, ok := v24.([]interface{}) + if ok { + for _, item := range a { + y, err := NewSchema(item, compiler.NewContext("allOf", context)) + if err != nil { + errors = append(errors, err) + } + x.AllOf = append(x.AllOf, y) + } + } + } + // Properties properties = 25; + v25 := compiler.MapValueForKey(m, "properties") + if v25 != nil { + var err error + x.Properties, err = NewProperties(v25, compiler.NewContext("properties", context)) + if err != nil { + errors = append(errors, err) + } + } + // string discriminator = 26; + v26 := compiler.MapValueForKey(m, "discriminator") + if v26 != nil { + x.Discriminator, ok = v26.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for discriminator: %+v (%T)", v26, v26) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool read_only = 27; + v27 := compiler.MapValueForKey(m, "readOnly") + if v27 != nil { + x.ReadOnly, ok = v27.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %+v (%T)", v27, v27) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Xml xml = 28; + v28 := compiler.MapValueForKey(m, "xml") + if v28 != nil { + var err error + x.Xml, err = NewXml(v28, compiler.NewContext("xml", context)) + if err != nil { + errors = append(errors, err) + } + } + // ExternalDocs external_docs = 29; + v29 := compiler.MapValueForKey(m, "externalDocs") + if v29 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v29, compiler.NewContext("externalDocs", context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 30; + v30 := compiler.MapValueForKey(m, "example") + if v30 != nil { + var err error + x.Example, err = NewAny(v30, compiler.NewContext("example", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 31; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchemaItem creates an object of type SchemaItem if possible, returning an error if not. +func NewSchemaItem(in interface{}, context *compiler.Context) (*SchemaItem, error) { + errors := make([]error, 0) + x := &SchemaItem{} + matched := false + // Schema schema = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSchema(m, compiler.NewContext("schema", context)) + if matchingError == nil { + x.Oneof = &SchemaItem_Schema{Schema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // FileSchema file_schema = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewFileSchema(m, compiler.NewContext("fileSchema", context)) + if matchingError == nil { + x.Oneof = &SchemaItem_FileSchema{FileSchema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityDefinitions creates an object of type SecurityDefinitions if possible, returning an error if not. +func NewSecurityDefinitions(in interface{}, context *compiler.Context) (*SecurityDefinitions, error) { + errors := make([]error, 0) + x := &SecurityDefinitions{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSecurityDefinitionsItem additional_properties = 1; + // MAP: SecurityDefinitionsItem + x.AdditionalProperties = make([]*NamedSecurityDefinitionsItem, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedSecurityDefinitionsItem{} + pair.Name = k + var err error + pair.Value, err = NewSecurityDefinitionsItem(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityDefinitionsItem creates an object of type SecurityDefinitionsItem if possible, returning an error if not. +func NewSecurityDefinitionsItem(in interface{}, context *compiler.Context) (*SecurityDefinitionsItem, error) { + errors := make([]error, 0) + x := &SecurityDefinitionsItem{} + matched := false + // BasicAuthenticationSecurity basic_authentication_security = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewBasicAuthenticationSecurity(m, compiler.NewContext("basicAuthenticationSecurity", context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_BasicAuthenticationSecurity{BasicAuthenticationSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // ApiKeySecurity api_key_security = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewApiKeySecurity(m, compiler.NewContext("apiKeySecurity", context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_ApiKeySecurity{ApiKeySecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2ImplicitSecurity oauth2_implicit_security = 3; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2ImplicitSecurity(m, compiler.NewContext("oauth2ImplicitSecurity", context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2ImplicitSecurity{Oauth2ImplicitSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2PasswordSecurity oauth2_password_security = 4; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2PasswordSecurity(m, compiler.NewContext("oauth2PasswordSecurity", context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2PasswordSecurity{Oauth2PasswordSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2ApplicationSecurity oauth2_application_security = 5; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2ApplicationSecurity(m, compiler.NewContext("oauth2ApplicationSecurity", context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2ApplicationSecurity{Oauth2ApplicationSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Oauth2AccessCodeSecurity oauth2_access_code_security = 6; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewOauth2AccessCodeSecurity(m, compiler.NewContext("oauth2AccessCodeSecurity", context)) + if matchingError == nil { + x.Oneof = &SecurityDefinitionsItem_Oauth2AccessCodeSecurity{Oauth2AccessCodeSecurity: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityRequirement creates an object of type SecurityRequirement if possible, returning an error if not. +func NewSecurityRequirement(in interface{}, context *compiler.Context) (*SecurityRequirement, error) { + errors := make([]error, 0) + x := &SecurityRequirement{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedStringArray additional_properties = 1; + // MAP: StringArray + x.AdditionalProperties = make([]*NamedStringArray, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedStringArray{} + pair.Name = k + var err error + pair.Value, err = NewStringArray(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewStringArray creates an object of type StringArray if possible, returning an error if not. +func NewStringArray(in interface{}, context *compiler.Context) (*StringArray, error) { + errors := make([]error, 0) + x := &StringArray{} + a, ok := in.([]interface{}) + if !ok { + message := fmt.Sprintf("has unexpected value for StringArray: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + x.Value = make([]string, 0) + for _, s := range a { + x.Value = append(x.Value, s.(string)) + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewTag creates an object of type Tag if possible, returning an error if not. +func NewTag(in interface{}, context *compiler.Context) (*Tag, error) { + errors := make([]error, 0) + x := &Tag{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "externalDocs", "name"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 3; + v3 := compiler.MapValueForKey(m, "externalDocs") + if v3 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v3, compiler.NewContext("externalDocs", context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny vendor_extension = 4; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewTypeItem creates an object of type TypeItem if possible, returning an error if not. +func NewTypeItem(in interface{}, context *compiler.Context) (*TypeItem, error) { + errors := make([]error, 0) + x := &TypeItem{} + switch in := in.(type) { + case string: + x.Value = make([]string, 0) + x.Value = append(x.Value, in) + case []interface{}: + x.Value = make([]string, 0) + for _, v := range in { + value, ok := v.(string) + if ok { + x.Value = append(x.Value, value) + } else { + message := fmt.Sprintf("has unexpected value for string array element: %+v (%T)", value, value) + errors = append(errors, compiler.NewError(context, message)) + } + } + default: + message := fmt.Sprintf("has unexpected value for string array: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewVendorExtension creates an object of type VendorExtension if possible, returning an error if not. +func NewVendorExtension(in interface{}, context *compiler.Context) (*VendorExtension, error) { + errors := make([]error, 0) + x := &VendorExtension{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewXml creates an object of type Xml if possible, returning an error if not. +func NewXml(in interface{}, context *compiler.Context) (*Xml, error) { + errors := make([]error, 0) + x := &Xml{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"attribute", "name", "namespace", "prefix", "wrapped"} + allowedPatterns := []*regexp.Regexp{pattern0} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = v1.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string namespace = 2; + v2 := compiler.MapValueForKey(m, "namespace") + if v2 != nil { + x.Namespace, ok = v2.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for namespace: %+v (%T)", v2, v2) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string prefix = 3; + v3 := compiler.MapValueForKey(m, "prefix") + if v3 != nil { + x.Prefix, ok = v3.(string) + if !ok { + message := fmt.Sprintf("has unexpected value for prefix: %+v (%T)", v3, v3) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool attribute = 4; + v4 := compiler.MapValueForKey(m, "attribute") + if v4 != nil { + x.Attribute, ok = v4.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for attribute: %+v (%T)", v4, v4) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool wrapped = 5; + v5 := compiler.MapValueForKey(m, "wrapped") + if v5 != nil { + x.Wrapped, ok = v5.(bool) + if !ok { + message := fmt.Sprintf("has unexpected value for wrapped: %+v (%T)", v5, v5) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny vendor_extension = 6; + // MAP: Any ^x- + x.VendorExtension = make([]*NamedAny, 0) + for _, item := range m { + k, ok := compiler.StringValue(item.Key) + if ok { + v := item.Value + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.HandleExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes, _ := yaml.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, context)) + if err != nil { + errors = append(errors, err) + } + } + x.VendorExtension = append(x.VendorExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside AdditionalPropertiesItem objects. +func (m *AdditionalPropertiesItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*AdditionalPropertiesItem_Schema) + if ok { + _, err := p.Schema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Any objects. +func (m *Any) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ApiKeySecurity objects. +func (m *ApiKeySecurity) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside BasicAuthenticationSecurity objects. +func (m *BasicAuthenticationSecurity) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside BodyParameter objects. +func (m *BodyParameter) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Contact objects. +func (m *Contact) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Default objects. +func (m *Default) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Definitions objects. +func (m *Definitions) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Document objects. +func (m *Document) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Info != nil { + _, err := m.Info.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Paths != nil { + _, err := m.Paths.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Definitions != nil { + _, err := m.Definitions.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Parameters != nil { + _, err := m.Parameters.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Responses != nil { + _, err := m.Responses.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Security { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.SecurityDefinitions != nil { + _, err := m.SecurityDefinitions.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Tags { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Examples objects. +func (m *Examples) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ExternalDocs objects. +func (m *ExternalDocs) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside FileSchema objects. +func (m *FileSchema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside FormDataParameterSubSchema objects. +func (m *FormDataParameterSubSchema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Header objects. +func (m *Header) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside HeaderParameterSubSchema objects. +func (m *HeaderParameterSubSchema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Headers objects. +func (m *Headers) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Info objects. +func (m *Info) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Contact != nil { + _, err := m.Contact.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.License != nil { + _, err := m.License.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ItemsItem objects. +func (m *ItemsItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.Schema { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside JsonReference objects. +func (m *JsonReference) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewJsonReference(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside License objects. +func (m *License) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedAny objects. +func (m *NamedAny) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedHeader objects. +func (m *NamedHeader) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedParameter objects. +func (m *NamedParameter) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedPathItem objects. +func (m *NamedPathItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedResponse objects. +func (m *NamedResponse) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedResponseValue objects. +func (m *NamedResponseValue) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedSchema objects. +func (m *NamedSchema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedSecurityDefinitionsItem objects. +func (m *NamedSecurityDefinitionsItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedString objects. +func (m *NamedString) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedStringArray objects. +func (m *NamedStringArray) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NonBodyParameter objects. +func (m *NonBodyParameter) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*NonBodyParameter_HeaderParameterSubSchema) + if ok { + _, err := p.HeaderParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*NonBodyParameter_FormDataParameterSubSchema) + if ok { + _, err := p.FormDataParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*NonBodyParameter_QueryParameterSubSchema) + if ok { + _, err := p.QueryParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*NonBodyParameter_PathParameterSubSchema) + if ok { + _, err := p.PathParameterSubSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2AccessCodeSecurity objects. +func (m *Oauth2AccessCodeSecurity) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2ApplicationSecurity objects. +func (m *Oauth2ApplicationSecurity) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2ImplicitSecurity objects. +func (m *Oauth2ImplicitSecurity) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2PasswordSecurity objects. +func (m *Oauth2PasswordSecurity) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Oauth2Scopes objects. +func (m *Oauth2Scopes) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Operation objects. +func (m *Operation) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Parameters { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.Responses != nil { + _, err := m.Responses.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Security { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Parameter objects. +func (m *Parameter) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*Parameter_BodyParameter) + if ok { + _, err := p.BodyParameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*Parameter_NonBodyParameter) + if ok { + _, err := p.NonBodyParameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ParameterDefinitions objects. +func (m *ParameterDefinitions) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ParametersItem objects. +func (m *ParametersItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ParametersItem_Parameter) + if ok { + _, err := p.Parameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ParametersItem_JsonReference) + if ok { + info, err := p.JsonReference.ResolveReferences(root) + if err != nil { + return nil, err + } else if info != nil { + n, err := NewParametersItem(info, nil) + if err != nil { + return nil, err + } else if n != nil { + *m = *n + return nil, nil + } + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PathItem objects. +func (m *PathItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewPathItem(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + if m.Get != nil { + _, err := m.Get.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Put != nil { + _, err := m.Put.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Post != nil { + _, err := m.Post.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Delete != nil { + _, err := m.Delete.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Options != nil { + _, err := m.Options.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Head != nil { + _, err := m.Head.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Patch != nil { + _, err := m.Patch.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Parameters { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PathParameterSubSchema objects. +func (m *PathParameterSubSchema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Paths objects. +func (m *Paths) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.Path { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PrimitivesItems objects. +func (m *PrimitivesItems) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Properties objects. +func (m *Properties) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside QueryParameterSubSchema objects. +func (m *QueryParameterSubSchema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Response objects. +func (m *Response) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Headers != nil { + _, err := m.Headers.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Examples != nil { + _, err := m.Examples.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ResponseDefinitions objects. +func (m *ResponseDefinitions) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ResponseValue objects. +func (m *ResponseValue) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ResponseValue_Response) + if ok { + _, err := p.Response.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ResponseValue_JsonReference) + if ok { + info, err := p.JsonReference.ResolveReferences(root) + if err != nil { + return nil, err + } else if info != nil { + n, err := NewResponseValue(info, nil) + if err != nil { + return nil, err + } else if n != nil { + *m = *n + return nil, nil + } + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Responses objects. +func (m *Responses) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.ResponseCode { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Schema objects. +func (m *Schema) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewSchema(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.AdditionalProperties != nil { + _, err := m.AdditionalProperties.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Type != nil { + _, err := m.Type.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.AllOf { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.Properties != nil { + _, err := m.Properties.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Xml != nil { + _, err := m.Xml.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SchemaItem objects. +func (m *SchemaItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*SchemaItem_Schema) + if ok { + _, err := p.Schema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SchemaItem_FileSchema) + if ok { + _, err := p.FileSchema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityDefinitions objects. +func (m *SecurityDefinitions) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityDefinitionsItem objects. +func (m *SecurityDefinitionsItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_BasicAuthenticationSecurity) + if ok { + _, err := p.BasicAuthenticationSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_ApiKeySecurity) + if ok { + _, err := p.ApiKeySecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2ImplicitSecurity) + if ok { + _, err := p.Oauth2ImplicitSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2PasswordSecurity) + if ok { + _, err := p.Oauth2PasswordSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2ApplicationSecurity) + if ok { + _, err := p.Oauth2ApplicationSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) + if ok { + _, err := p.Oauth2AccessCodeSecurity.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityRequirement objects. +func (m *SecurityRequirement) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside StringArray objects. +func (m *StringArray) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Tag objects. +func (m *Tag) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside TypeItem objects. +func (m *TypeItem) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside VendorExtension objects. +func (m *VendorExtension) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Xml objects. +func (m *Xml) ResolveReferences(root string) (interface{}, error) { + errors := make([]error, 0) + for _, item := range m.VendorExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ToRawInfo returns a description of AdditionalPropertiesItem suitable for JSON or YAML export. +func (m *AdditionalPropertiesItem) ToRawInfo() interface{} { + // ONE OF WRAPPER + // AdditionalPropertiesItem + // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return v1.Boolean + } + return nil +} + +// ToRawInfo returns a description of Any suitable for JSON or YAML export. +func (m *Any) ToRawInfo() interface{} { + var err error + var info1 []yaml.MapSlice + err = yaml.Unmarshal([]byte(m.Yaml), &info1) + if err == nil { + return info1 + } + var info2 yaml.MapSlice + err = yaml.Unmarshal([]byte(m.Yaml), &info2) + if err == nil { + return info2 + } + var info3 interface{} + err = yaml.Unmarshal([]byte(m.Yaml), &info3) + if err == nil { + return info3 + } + return nil +} + +// ToRawInfo returns a description of ApiKeySecurity suitable for JSON or YAML export. +func (m *ApiKeySecurity) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of BasicAuthenticationSecurity suitable for JSON or YAML export. +func (m *BasicAuthenticationSecurity) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of BodyParameter suitable for JSON or YAML export. +func (m *BodyParameter) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.Schema != nil { + info = append(info, yaml.MapItem{Key: "schema", Value: m.Schema.ToRawInfo()}) + } + // &{Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Contact suitable for JSON or YAML export. +func (m *Contact) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Url != "" { + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + } + if m.Email != "" { + info = append(info, yaml.MapItem{Key: "email", Value: m.Email}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Default suitable for JSON or YAML export. +func (m *Default) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of Definitions suitable for JSON or YAML export. +func (m *Definitions) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSchema StringEnumValues:[] MapType:Schema Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Document suitable for JSON or YAML export. +func (m *Document) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Swagger != "" { + info = append(info, yaml.MapItem{Key: "swagger", Value: m.Swagger}) + } + if m.Info != nil { + info = append(info, yaml.MapItem{Key: "info", Value: m.Info.ToRawInfo()}) + } + // &{Name:info Type:Info StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Host != "" { + info = append(info, yaml.MapItem{Key: "host", Value: m.Host}) + } + if m.BasePath != "" { + info = append(info, yaml.MapItem{Key: "basePath", Value: m.BasePath}) + } + if len(m.Schemes) != 0 { + info = append(info, yaml.MapItem{Key: "schemes", Value: m.Schemes}) + } + if len(m.Consumes) != 0 { + info = append(info, yaml.MapItem{Key: "consumes", Value: m.Consumes}) + } + if len(m.Produces) != 0 { + info = append(info, yaml.MapItem{Key: "produces", Value: m.Produces}) + } + if m.Paths != nil { + info = append(info, yaml.MapItem{Key: "paths", Value: m.Paths.ToRawInfo()}) + } + // &{Name:paths Type:Paths StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Definitions != nil { + info = append(info, yaml.MapItem{Key: "definitions", Value: m.Definitions.ToRawInfo()}) + } + // &{Name:definitions Type:Definitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Parameters != nil { + info = append(info, yaml.MapItem{Key: "parameters", Value: m.Parameters.ToRawInfo()}) + } + // &{Name:parameters Type:ParameterDefinitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Responses != nil { + info = append(info, yaml.MapItem{Key: "responses", Value: m.Responses.ToRawInfo()}) + } + // &{Name:responses Type:ResponseDefinitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Security) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Security { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "security", Value: items}) + } + // &{Name:security Type:SecurityRequirement StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.SecurityDefinitions != nil { + info = append(info, yaml.MapItem{Key: "securityDefinitions", Value: m.SecurityDefinitions.ToRawInfo()}) + } + // &{Name:securityDefinitions Type:SecurityDefinitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Tags) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Tags { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "tags", Value: items}) + } + // &{Name:tags Type:Tag StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Examples suitable for JSON or YAML export. +func (m *Examples) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ExternalDocs suitable for JSON or YAML export. +func (m *ExternalDocs) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Url != "" { + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of FileSchema suitable for JSON or YAML export. +func (m *FileSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Title != "" { + info = append(info, yaml.MapItem{Key: "title", Value: m.Title}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Required) != 0 { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.ReadOnly != false { + info = append(info, yaml.MapItem{Key: "readOnly", Value: m.ReadOnly}) + } + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Example != nil { + info = append(info, yaml.MapItem{Key: "example", Value: m.Example.ToRawInfo()}) + } + // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of FormDataParameterSubSchema suitable for JSON or YAML export. +func (m *FormDataParameterSubSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.AllowEmptyValue != false { + info = append(info, yaml.MapItem{Key: "allowEmptyValue", Value: m.AllowEmptyValue}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.CollectionFormat != "" { + info = append(info, yaml.MapItem{Key: "collectionFormat", Value: m.CollectionFormat}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Header suitable for JSON or YAML export. +func (m *Header) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.CollectionFormat != "" { + info = append(info, yaml.MapItem{Key: "collectionFormat", Value: m.CollectionFormat}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of HeaderParameterSubSchema suitable for JSON or YAML export. +func (m *HeaderParameterSubSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.CollectionFormat != "" { + info = append(info, yaml.MapItem{Key: "collectionFormat", Value: m.CollectionFormat}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Headers suitable for JSON or YAML export. +func (m *Headers) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedHeader StringEnumValues:[] MapType:Header Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Info suitable for JSON or YAML export. +func (m *Info) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Title != "" { + info = append(info, yaml.MapItem{Key: "title", Value: m.Title}) + } + if m.Version != "" { + info = append(info, yaml.MapItem{Key: "version", Value: m.Version}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.TermsOfService != "" { + info = append(info, yaml.MapItem{Key: "termsOfService", Value: m.TermsOfService}) + } + if m.Contact != nil { + info = append(info, yaml.MapItem{Key: "contact", Value: m.Contact.ToRawInfo()}) + } + // &{Name:contact Type:Contact StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.License != nil { + info = append(info, yaml.MapItem{Key: "license", Value: m.License.ToRawInfo()}) + } + // &{Name:license Type:License StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ItemsItem suitable for JSON or YAML export. +func (m *ItemsItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if len(m.Schema) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Schema { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "schema", Value: items}) + } + // &{Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + return info +} + +// ToRawInfo returns a description of JsonReference suitable for JSON or YAML export. +func (m *JsonReference) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + return info +} + +// ToRawInfo returns a description of License suitable for JSON or YAML export. +func (m *License) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Url != "" { + info = append(info, yaml.MapItem{Key: "url", Value: m.Url}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of NamedAny suitable for JSON or YAML export. +func (m *NamedAny) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedHeader suitable for JSON or YAML export. +func (m *NamedHeader) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Header StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedParameter suitable for JSON or YAML export. +func (m *NamedParameter) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedPathItem suitable for JSON or YAML export. +func (m *NamedPathItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:PathItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedResponse suitable for JSON or YAML export. +func (m *NamedResponse) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedResponseValue suitable for JSON or YAML export. +func (m *NamedResponseValue) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:ResponseValue StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSchema suitable for JSON or YAML export. +func (m *NamedSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSecurityDefinitionsItem suitable for JSON or YAML export. +func (m *NamedSecurityDefinitionsItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:SecurityDefinitionsItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedString suitable for JSON or YAML export. +func (m *NamedString) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Value != "" { + info = append(info, yaml.MapItem{Key: "value", Value: m.Value}) + } + return info +} + +// ToRawInfo returns a description of NamedStringArray suitable for JSON or YAML export. +func (m *NamedStringArray) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + // &{Name:value Type:StringArray StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NonBodyParameter suitable for JSON or YAML export. +func (m *NonBodyParameter) ToRawInfo() interface{} { + // ONE OF WRAPPER + // NonBodyParameter + // {Name:headerParameterSubSchema Type:HeaderParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetHeaderParameterSubSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:formDataParameterSubSchema Type:FormDataParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetFormDataParameterSubSchema() + if v1 != nil { + return v1.ToRawInfo() + } + // {Name:queryParameterSubSchema Type:QueryParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v2 := m.GetQueryParameterSubSchema() + if v2 != nil { + return v2.ToRawInfo() + } + // {Name:pathParameterSubSchema Type:PathParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v3 := m.GetPathParameterSubSchema() + if v3 != nil { + return v3.ToRawInfo() + } + return nil +} + +// ToRawInfo returns a description of Oauth2AccessCodeSecurity suitable for JSON or YAML export. +func (m *Oauth2AccessCodeSecurity) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Flow != "" { + info = append(info, yaml.MapItem{Key: "flow", Value: m.Flow}) + } + if m.Scopes != nil { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes.ToRawInfo()}) + } + // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.AuthorizationUrl != "" { + info = append(info, yaml.MapItem{Key: "authorizationUrl", Value: m.AuthorizationUrl}) + } + if m.TokenUrl != "" { + info = append(info, yaml.MapItem{Key: "tokenUrl", Value: m.TokenUrl}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Oauth2ApplicationSecurity suitable for JSON or YAML export. +func (m *Oauth2ApplicationSecurity) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Flow != "" { + info = append(info, yaml.MapItem{Key: "flow", Value: m.Flow}) + } + if m.Scopes != nil { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes.ToRawInfo()}) + } + // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.TokenUrl != "" { + info = append(info, yaml.MapItem{Key: "tokenUrl", Value: m.TokenUrl}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Oauth2ImplicitSecurity suitable for JSON or YAML export. +func (m *Oauth2ImplicitSecurity) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Flow != "" { + info = append(info, yaml.MapItem{Key: "flow", Value: m.Flow}) + } + if m.Scopes != nil { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes.ToRawInfo()}) + } + // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.AuthorizationUrl != "" { + info = append(info, yaml.MapItem{Key: "authorizationUrl", Value: m.AuthorizationUrl}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Oauth2PasswordSecurity suitable for JSON or YAML export. +func (m *Oauth2PasswordSecurity) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Flow != "" { + info = append(info, yaml.MapItem{Key: "flow", Value: m.Flow}) + } + if m.Scopes != nil { + info = append(info, yaml.MapItem{Key: "scopes", Value: m.Scopes.ToRawInfo()}) + } + // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.TokenUrl != "" { + info = append(info, yaml.MapItem{Key: "tokenUrl", Value: m.TokenUrl}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Oauth2Scopes suitable for JSON or YAML export. +func (m *Oauth2Scopes) ToRawInfo() interface{} { + info := yaml.MapSlice{} + // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Operation suitable for JSON or YAML export. +func (m *Operation) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if len(m.Tags) != 0 { + info = append(info, yaml.MapItem{Key: "tags", Value: m.Tags}) + } + if m.Summary != "" { + info = append(info, yaml.MapItem{Key: "summary", Value: m.Summary}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.OperationId != "" { + info = append(info, yaml.MapItem{Key: "operationId", Value: m.OperationId}) + } + if len(m.Produces) != 0 { + info = append(info, yaml.MapItem{Key: "produces", Value: m.Produces}) + } + if len(m.Consumes) != 0 { + info = append(info, yaml.MapItem{Key: "consumes", Value: m.Consumes}) + } + if len(m.Parameters) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Parameters { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "parameters", Value: items}) + } + // &{Name:parameters Type:ParametersItem StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:The parameters needed to send a valid API call.} + if m.Responses != nil { + info = append(info, yaml.MapItem{Key: "responses", Value: m.Responses.ToRawInfo()}) + } + // &{Name:responses Type:Responses StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Schemes) != 0 { + info = append(info, yaml.MapItem{Key: "schemes", Value: m.Schemes}) + } + if m.Deprecated != false { + info = append(info, yaml.MapItem{Key: "deprecated", Value: m.Deprecated}) + } + if len(m.Security) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Security { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "security", Value: items}) + } + // &{Name:security Type:SecurityRequirement StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Parameter suitable for JSON or YAML export. +func (m *Parameter) ToRawInfo() interface{} { + // ONE OF WRAPPER + // Parameter + // {Name:bodyParameter Type:BodyParameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetBodyParameter() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:nonBodyParameter Type:NonBodyParameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetNonBodyParameter() + if v1 != nil { + return v1.ToRawInfo() + } + return nil +} + +// ToRawInfo returns a description of ParameterDefinitions suitable for JSON or YAML export. +func (m *ParameterDefinitions) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedParameter StringEnumValues:[] MapType:Parameter Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ParametersItem suitable for JSON or YAML export. +func (m *ParametersItem) ToRawInfo() interface{} { + // ONE OF WRAPPER + // ParametersItem + // {Name:parameter Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetParameter() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:jsonReference Type:JsonReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetJsonReference() + if v1 != nil { + return v1.ToRawInfo() + } + return nil +} + +// ToRawInfo returns a description of PathItem suitable for JSON or YAML export. +func (m *PathItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.Get != nil { + info = append(info, yaml.MapItem{Key: "get", Value: m.Get.ToRawInfo()}) + } + // &{Name:get Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Put != nil { + info = append(info, yaml.MapItem{Key: "put", Value: m.Put.ToRawInfo()}) + } + // &{Name:put Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Post != nil { + info = append(info, yaml.MapItem{Key: "post", Value: m.Post.ToRawInfo()}) + } + // &{Name:post Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Delete != nil { + info = append(info, yaml.MapItem{Key: "delete", Value: m.Delete.ToRawInfo()}) + } + // &{Name:delete Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Options != nil { + info = append(info, yaml.MapItem{Key: "options", Value: m.Options.ToRawInfo()}) + } + // &{Name:options Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Head != nil { + info = append(info, yaml.MapItem{Key: "head", Value: m.Head.ToRawInfo()}) + } + // &{Name:head Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Patch != nil { + info = append(info, yaml.MapItem{Key: "patch", Value: m.Patch.ToRawInfo()}) + } + // &{Name:patch Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.Parameters) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Parameters { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "parameters", Value: items}) + } + // &{Name:parameters Type:ParametersItem StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:The parameters needed to send a valid API call.} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of PathParameterSubSchema suitable for JSON or YAML export. +func (m *PathParameterSubSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.CollectionFormat != "" { + info = append(info, yaml.MapItem{Key: "collectionFormat", Value: m.CollectionFormat}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Paths suitable for JSON or YAML export. +func (m *Paths) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + if m.Path != nil { + for _, item := range m.Path { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:Path Type:NamedPathItem StringEnumValues:[] MapType:PathItem Repeated:true Pattern:^/ Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of PrimitivesItems suitable for JSON or YAML export. +func (m *PrimitivesItems) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.CollectionFormat != "" { + info = append(info, yaml.MapItem{Key: "collectionFormat", Value: m.CollectionFormat}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Properties suitable for JSON or YAML export. +func (m *Properties) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSchema StringEnumValues:[] MapType:Schema Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of QueryParameterSubSchema suitable for JSON or YAML export. +func (m *QueryParameterSubSchema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Required != false { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if m.In != "" { + info = append(info, yaml.MapItem{Key: "in", Value: m.In}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.AllowEmptyValue != false { + info = append(info, yaml.MapItem{Key: "allowEmptyValue", Value: m.AllowEmptyValue}) + } + if m.Type != "" { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Items != nil { + info = append(info, yaml.MapItem{Key: "items", Value: m.Items.ToRawInfo()}) + } + // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.CollectionFormat != "" { + info = append(info, yaml.MapItem{Key: "collectionFormat", Value: m.CollectionFormat}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Response suitable for JSON or YAML export. +func (m *Response) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Schema != nil { + info = append(info, yaml.MapItem{Key: "schema", Value: m.Schema.ToRawInfo()}) + } + // &{Name:schema Type:SchemaItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Headers != nil { + info = append(info, yaml.MapItem{Key: "headers", Value: m.Headers.ToRawInfo()}) + } + // &{Name:headers Type:Headers StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Examples != nil { + info = append(info, yaml.MapItem{Key: "examples", Value: m.Examples.ToRawInfo()}) + } + // &{Name:examples Type:Examples StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ResponseDefinitions suitable for JSON or YAML export. +func (m *ResponseDefinitions) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedResponse StringEnumValues:[] MapType:Response Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of ResponseValue suitable for JSON or YAML export. +func (m *ResponseValue) ToRawInfo() interface{} { + // ONE OF WRAPPER + // ResponseValue + // {Name:response Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetResponse() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:jsonReference Type:JsonReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetJsonReference() + if v1 != nil { + return v1.ToRawInfo() + } + return nil +} + +// ToRawInfo returns a description of Responses suitable for JSON or YAML export. +func (m *Responses) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.ResponseCode != nil { + for _, item := range m.ResponseCode { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:ResponseCode Type:NamedResponseValue StringEnumValues:[] MapType:ResponseValue Repeated:true Pattern:^([0-9]{3})$|^(default)$ Implicit:true Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Schema suitable for JSON or YAML export. +func (m *Schema) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.XRef != "" { + info = append(info, yaml.MapItem{Key: "$ref", Value: m.XRef}) + } + if m.Format != "" { + info = append(info, yaml.MapItem{Key: "format", Value: m.Format}) + } + if m.Title != "" { + info = append(info, yaml.MapItem{Key: "title", Value: m.Title}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.Default != nil { + info = append(info, yaml.MapItem{Key: "default", Value: m.Default.ToRawInfo()}) + } + // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.MultipleOf != 0.0 { + info = append(info, yaml.MapItem{Key: "multipleOf", Value: m.MultipleOf}) + } + if m.Maximum != 0.0 { + info = append(info, yaml.MapItem{Key: "maximum", Value: m.Maximum}) + } + if m.ExclusiveMaximum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMaximum", Value: m.ExclusiveMaximum}) + } + if m.Minimum != 0.0 { + info = append(info, yaml.MapItem{Key: "minimum", Value: m.Minimum}) + } + if m.ExclusiveMinimum != false { + info = append(info, yaml.MapItem{Key: "exclusiveMinimum", Value: m.ExclusiveMinimum}) + } + if m.MaxLength != 0 { + info = append(info, yaml.MapItem{Key: "maxLength", Value: m.MaxLength}) + } + if m.MinLength != 0 { + info = append(info, yaml.MapItem{Key: "minLength", Value: m.MinLength}) + } + if m.Pattern != "" { + info = append(info, yaml.MapItem{Key: "pattern", Value: m.Pattern}) + } + if m.MaxItems != 0 { + info = append(info, yaml.MapItem{Key: "maxItems", Value: m.MaxItems}) + } + if m.MinItems != 0 { + info = append(info, yaml.MapItem{Key: "minItems", Value: m.MinItems}) + } + if m.UniqueItems != false { + info = append(info, yaml.MapItem{Key: "uniqueItems", Value: m.UniqueItems}) + } + if m.MaxProperties != 0 { + info = append(info, yaml.MapItem{Key: "maxProperties", Value: m.MaxProperties}) + } + if m.MinProperties != 0 { + info = append(info, yaml.MapItem{Key: "minProperties", Value: m.MinProperties}) + } + if len(m.Required) != 0 { + info = append(info, yaml.MapItem{Key: "required", Value: m.Required}) + } + if len(m.Enum) != 0 { + items := make([]interface{}, 0) + for _, item := range m.Enum { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "enum", Value: items}) + } + // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.AdditionalProperties != nil { + info = append(info, yaml.MapItem{Key: "additionalProperties", Value: m.AdditionalProperties.ToRawInfo()}) + } + // &{Name:additionalProperties Type:AdditionalPropertiesItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Type != nil { + if len(m.Type.Value) == 1 { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type.Value[0]}) + } else { + info = append(info, yaml.MapItem{Key: "type", Value: m.Type.Value}) + } + } + // &{Name:type Type:TypeItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Items != nil { + items := make([]interface{}, 0) + for _, item := range m.Items.Schema { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "items", Value: items[0]}) + } + // &{Name:items Type:ItemsItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if len(m.AllOf) != 0 { + items := make([]interface{}, 0) + for _, item := range m.AllOf { + items = append(items, item.ToRawInfo()) + } + info = append(info, yaml.MapItem{Key: "allOf", Value: items}) + } + // &{Name:allOf Type:Schema StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} + if m.Properties != nil { + info = append(info, yaml.MapItem{Key: "properties", Value: m.Properties.ToRawInfo()}) + } + // &{Name:properties Type:Properties StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Discriminator != "" { + info = append(info, yaml.MapItem{Key: "discriminator", Value: m.Discriminator}) + } + if m.ReadOnly != false { + info = append(info, yaml.MapItem{Key: "readOnly", Value: m.ReadOnly}) + } + if m.Xml != nil { + info = append(info, yaml.MapItem{Key: "xml", Value: m.Xml.ToRawInfo()}) + } + // &{Name:xml Type:Xml StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.Example != nil { + info = append(info, yaml.MapItem{Key: "example", Value: m.Example.ToRawInfo()}) + } + // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of SchemaItem suitable for JSON or YAML export. +func (m *SchemaItem) ToRawInfo() interface{} { + // ONE OF WRAPPER + // SchemaItem + // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:fileSchema Type:FileSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetFileSchema() + if v1 != nil { + return v1.ToRawInfo() + } + return nil +} + +// ToRawInfo returns a description of SecurityDefinitions suitable for JSON or YAML export. +func (m *SecurityDefinitions) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedSecurityDefinitionsItem StringEnumValues:[] MapType:SecurityDefinitionsItem Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of SecurityDefinitionsItem suitable for JSON or YAML export. +func (m *SecurityDefinitionsItem) ToRawInfo() interface{} { + // ONE OF WRAPPER + // SecurityDefinitionsItem + // {Name:basicAuthenticationSecurity Type:BasicAuthenticationSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetBasicAuthenticationSecurity() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:apiKeySecurity Type:ApiKeySecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetApiKeySecurity() + if v1 != nil { + return v1.ToRawInfo() + } + // {Name:oauth2ImplicitSecurity Type:Oauth2ImplicitSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v2 := m.GetOauth2ImplicitSecurity() + if v2 != nil { + return v2.ToRawInfo() + } + // {Name:oauth2PasswordSecurity Type:Oauth2PasswordSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v3 := m.GetOauth2PasswordSecurity() + if v3 != nil { + return v3.ToRawInfo() + } + // {Name:oauth2ApplicationSecurity Type:Oauth2ApplicationSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v4 := m.GetOauth2ApplicationSecurity() + if v4 != nil { + return v4.ToRawInfo() + } + // {Name:oauth2AccessCodeSecurity Type:Oauth2AccessCodeSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v5 := m.GetOauth2AccessCodeSecurity() + if v5 != nil { + return v5.ToRawInfo() + } + return nil +} + +// ToRawInfo returns a description of SecurityRequirement suitable for JSON or YAML export. +func (m *SecurityRequirement) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedStringArray StringEnumValues:[] MapType:StringArray Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of StringArray suitable for JSON or YAML export. +func (m *StringArray) ToRawInfo() interface{} { + return m.Value +} + +// ToRawInfo returns a description of Tag suitable for JSON or YAML export. +func (m *Tag) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Description != "" { + info = append(info, yaml.MapItem{Key: "description", Value: m.Description}) + } + if m.ExternalDocs != nil { + info = append(info, yaml.MapItem{Key: "externalDocs", Value: m.ExternalDocs.ToRawInfo()}) + } + // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of TypeItem suitable for JSON or YAML export. +func (m *TypeItem) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if len(m.Value) != 0 { + info = append(info, yaml.MapItem{Key: "value", Value: m.Value}) + } + return info +} + +// ToRawInfo returns a description of VendorExtension suitable for JSON or YAML export. +func (m *VendorExtension) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Xml suitable for JSON or YAML export. +func (m *Xml) ToRawInfo() interface{} { + info := yaml.MapSlice{} + if m.Name != "" { + info = append(info, yaml.MapItem{Key: "name", Value: m.Name}) + } + if m.Namespace != "" { + info = append(info, yaml.MapItem{Key: "namespace", Value: m.Namespace}) + } + if m.Prefix != "" { + info = append(info, yaml.MapItem{Key: "prefix", Value: m.Prefix}) + } + if m.Attribute != false { + info = append(info, yaml.MapItem{Key: "attribute", Value: m.Attribute}) + } + if m.Wrapped != false { + info = append(info, yaml.MapItem{Key: "wrapped", Value: m.Wrapped}) + } + if m.VendorExtension != nil { + for _, item := range m.VendorExtension { + info = append(info, yaml.MapItem{Key: item.Name, Value: item.Value.ToRawInfo()}) + } + } + // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} + return info +} + +var ( + pattern0 = regexp.MustCompile("^x-") + pattern1 = regexp.MustCompile("^/") + pattern2 = regexp.MustCompile("^([0-9]{3})$|^(default)$") +) diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go new file mode 100644 index 000000000..a030fa676 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go @@ -0,0 +1,4455 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: OpenAPIv2/OpenAPIv2.proto + +/* +Package openapi_v2 is a generated protocol buffer package. + +It is generated from these files: + OpenAPIv2/OpenAPIv2.proto + +It has these top-level messages: + AdditionalPropertiesItem + Any + ApiKeySecurity + BasicAuthenticationSecurity + BodyParameter + Contact + Default + Definitions + Document + Examples + ExternalDocs + FileSchema + FormDataParameterSubSchema + Header + HeaderParameterSubSchema + Headers + Info + ItemsItem + JsonReference + License + NamedAny + NamedHeader + NamedParameter + NamedPathItem + NamedResponse + NamedResponseValue + NamedSchema + NamedSecurityDefinitionsItem + NamedString + NamedStringArray + NonBodyParameter + Oauth2AccessCodeSecurity + Oauth2ApplicationSecurity + Oauth2ImplicitSecurity + Oauth2PasswordSecurity + Oauth2Scopes + Operation + Parameter + ParameterDefinitions + ParametersItem + PathItem + PathParameterSubSchema + Paths + PrimitivesItems + Properties + QueryParameterSubSchema + Response + ResponseDefinitions + ResponseValue + Responses + Schema + SchemaItem + SecurityDefinitions + SecurityDefinitionsItem + SecurityRequirement + StringArray + Tag + TypeItem + VendorExtension + Xml +*/ +package openapi_v2 + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type AdditionalPropertiesItem struct { + // Types that are valid to be assigned to Oneof: + // *AdditionalPropertiesItem_Schema + // *AdditionalPropertiesItem_Boolean + Oneof isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"` +} + +func (m *AdditionalPropertiesItem) Reset() { *m = AdditionalPropertiesItem{} } +func (m *AdditionalPropertiesItem) String() string { return proto.CompactTextString(m) } +func (*AdditionalPropertiesItem) ProtoMessage() {} +func (*AdditionalPropertiesItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type isAdditionalPropertiesItem_Oneof interface { + isAdditionalPropertiesItem_Oneof() +} + +type AdditionalPropertiesItem_Schema struct { + Schema *Schema `protobuf:"bytes,1,opt,name=schema,oneof"` +} +type AdditionalPropertiesItem_Boolean struct { + Boolean bool `protobuf:"varint,2,opt,name=boolean,oneof"` +} + +func (*AdditionalPropertiesItem_Schema) isAdditionalPropertiesItem_Oneof() {} +func (*AdditionalPropertiesItem_Boolean) isAdditionalPropertiesItem_Oneof() {} + +func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *AdditionalPropertiesItem) GetSchema() *Schema { + if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Schema); ok { + return x.Schema + } + return nil +} + +func (m *AdditionalPropertiesItem) GetBoolean() bool { + if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return x.Boolean + } + return false +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*AdditionalPropertiesItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _AdditionalPropertiesItem_OneofMarshaler, _AdditionalPropertiesItem_OneofUnmarshaler, _AdditionalPropertiesItem_OneofSizer, []interface{}{ + (*AdditionalPropertiesItem_Schema)(nil), + (*AdditionalPropertiesItem_Boolean)(nil), + } +} + +func _AdditionalPropertiesItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*AdditionalPropertiesItem) + // oneof + switch x := m.Oneof.(type) { + case *AdditionalPropertiesItem_Schema: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Schema); err != nil { + return err + } + case *AdditionalPropertiesItem_Boolean: + t := uint64(0) + if x.Boolean { + t = 1 + } + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(t) + case nil: + default: + return fmt.Errorf("AdditionalPropertiesItem.Oneof has unexpected type %T", x) + } + return nil +} + +func _AdditionalPropertiesItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*AdditionalPropertiesItem) + switch tag { + case 1: // oneof.schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Schema) + err := b.DecodeMessage(msg) + m.Oneof = &AdditionalPropertiesItem_Schema{msg} + return true, err + case 2: // oneof.boolean + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Oneof = &AdditionalPropertiesItem_Boolean{x != 0} + return true, err + default: + return false, nil + } +} + +func _AdditionalPropertiesItem_OneofSizer(msg proto.Message) (n int) { + m := msg.(*AdditionalPropertiesItem) + // oneof + switch x := m.Oneof.(type) { + case *AdditionalPropertiesItem_Schema: + s := proto.Size(x.Schema) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *AdditionalPropertiesItem_Boolean: + n += proto.SizeVarint(2<<3 | proto.WireVarint) + n += 1 + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Any struct { + Value *google_protobuf.Any `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` + Yaml string `protobuf:"bytes,2,opt,name=yaml" json:"yaml,omitempty"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *Any) GetValue() *google_protobuf.Any { + if m != nil { + return m.Value + } + return nil +} + +func (m *Any) GetYaml() string { + if m != nil { + return m.Yaml + } + return "" +} + +type ApiKeySecurity struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + In string `protobuf:"bytes,3,opt,name=in" json:"in,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *ApiKeySecurity) Reset() { *m = ApiKeySecurity{} } +func (m *ApiKeySecurity) String() string { return proto.CompactTextString(m) } +func (*ApiKeySecurity) ProtoMessage() {} +func (*ApiKeySecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *ApiKeySecurity) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *ApiKeySecurity) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ApiKeySecurity) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *ApiKeySecurity) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *ApiKeySecurity) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type BasicAuthenticationSecurity struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *BasicAuthenticationSecurity) Reset() { *m = BasicAuthenticationSecurity{} } +func (m *BasicAuthenticationSecurity) String() string { return proto.CompactTextString(m) } +func (*BasicAuthenticationSecurity) ProtoMessage() {} +func (*BasicAuthenticationSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *BasicAuthenticationSecurity) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *BasicAuthenticationSecurity) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *BasicAuthenticationSecurity) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type BodyParameter struct { + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,3,opt,name=in" json:"in,omitempty"` + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,4,opt,name=required" json:"required,omitempty"` + Schema *Schema `protobuf:"bytes,5,opt,name=schema" json:"schema,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *BodyParameter) Reset() { *m = BodyParameter{} } +func (m *BodyParameter) String() string { return proto.CompactTextString(m) } +func (*BodyParameter) ProtoMessage() {} +func (*BodyParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *BodyParameter) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *BodyParameter) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *BodyParameter) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *BodyParameter) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *BodyParameter) GetSchema() *Schema { + if m != nil { + return m.Schema + } + return nil +} + +func (m *BodyParameter) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +// Contact information for the owners of the API. +type Contact struct { + // The identifying name of the contact person/organization. + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // The URL pointing to the contact information. + Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` + // The email address of the contact person/organization. + Email string `protobuf:"bytes,3,opt,name=email" json:"email,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Contact) Reset() { *m = Contact{} } +func (m *Contact) String() string { return proto.CompactTextString(m) } +func (*Contact) ProtoMessage() {} +func (*Contact) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *Contact) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Contact) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *Contact) GetEmail() string { + if m != nil { + return m.Email + } + return "" +} + +func (m *Contact) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Default struct { + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *Default) Reset() { *m = Default{} } +func (m *Default) String() string { return proto.CompactTextString(m) } +func (*Default) ProtoMessage() {} +func (*Default) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *Default) GetAdditionalProperties() []*NamedAny { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// One or more JSON objects describing the schemas being consumed and produced by the API. +type Definitions struct { + AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *Definitions) Reset() { *m = Definitions{} } +func (m *Definitions) String() string { return proto.CompactTextString(m) } +func (*Definitions) ProtoMessage() {} +func (*Definitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *Definitions) GetAdditionalProperties() []*NamedSchema { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Document struct { + // The Swagger version of this document. + Swagger string `protobuf:"bytes,1,opt,name=swagger" json:"swagger,omitempty"` + Info *Info `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"` + // The host (name or ip) of the API. Example: 'swagger.io' + Host string `protobuf:"bytes,3,opt,name=host" json:"host,omitempty"` + // The base path to the API. Example: '/api'. + BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath" json:"base_path,omitempty"` + // The transfer protocol of the API. + Schemes []string `protobuf:"bytes,5,rep,name=schemes" json:"schemes,omitempty"` + // A list of MIME types accepted by the API. + Consumes []string `protobuf:"bytes,6,rep,name=consumes" json:"consumes,omitempty"` + // A list of MIME types the API can produce. + Produces []string `protobuf:"bytes,7,rep,name=produces" json:"produces,omitempty"` + Paths *Paths `protobuf:"bytes,8,opt,name=paths" json:"paths,omitempty"` + Definitions *Definitions `protobuf:"bytes,9,opt,name=definitions" json:"definitions,omitempty"` + Parameters *ParameterDefinitions `protobuf:"bytes,10,opt,name=parameters" json:"parameters,omitempty"` + Responses *ResponseDefinitions `protobuf:"bytes,11,opt,name=responses" json:"responses,omitempty"` + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security" json:"security,omitempty"` + SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,13,opt,name=security_definitions,json=securityDefinitions" json:"security_definitions,omitempty"` + Tags []*Tag `protobuf:"bytes,14,rep,name=tags" json:"tags,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,15,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,16,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Document) Reset() { *m = Document{} } +func (m *Document) String() string { return proto.CompactTextString(m) } +func (*Document) ProtoMessage() {} +func (*Document) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *Document) GetSwagger() string { + if m != nil { + return m.Swagger + } + return "" +} + +func (m *Document) GetInfo() *Info { + if m != nil { + return m.Info + } + return nil +} + +func (m *Document) GetHost() string { + if m != nil { + return m.Host + } + return "" +} + +func (m *Document) GetBasePath() string { + if m != nil { + return m.BasePath + } + return "" +} + +func (m *Document) GetSchemes() []string { + if m != nil { + return m.Schemes + } + return nil +} + +func (m *Document) GetConsumes() []string { + if m != nil { + return m.Consumes + } + return nil +} + +func (m *Document) GetProduces() []string { + if m != nil { + return m.Produces + } + return nil +} + +func (m *Document) GetPaths() *Paths { + if m != nil { + return m.Paths + } + return nil +} + +func (m *Document) GetDefinitions() *Definitions { + if m != nil { + return m.Definitions + } + return nil +} + +func (m *Document) GetParameters() *ParameterDefinitions { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Document) GetResponses() *ResponseDefinitions { + if m != nil { + return m.Responses + } + return nil +} + +func (m *Document) GetSecurity() []*SecurityRequirement { + if m != nil { + return m.Security + } + return nil +} + +func (m *Document) GetSecurityDefinitions() *SecurityDefinitions { + if m != nil { + return m.SecurityDefinitions + } + return nil +} + +func (m *Document) GetTags() []*Tag { + if m != nil { + return m.Tags + } + return nil +} + +func (m *Document) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Document) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Examples struct { + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *Examples) Reset() { *m = Examples{} } +func (m *Examples) String() string { return proto.CompactTextString(m) } +func (*Examples) ProtoMessage() {} +func (*Examples) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +func (m *Examples) GetAdditionalProperties() []*NamedAny { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// information about external documentation +type ExternalDocs struct { + Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *ExternalDocs) Reset() { *m = ExternalDocs{} } +func (m *ExternalDocs) String() string { return proto.CompactTextString(m) } +func (*ExternalDocs) ProtoMessage() {} +func (*ExternalDocs) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +func (m *ExternalDocs) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *ExternalDocs) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *ExternalDocs) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +// A deterministic version of a JSON Schema object. +type FileSchema struct { + Format string `protobuf:"bytes,1,opt,name=format" json:"format,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title" json:"title,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + Default *Any `protobuf:"bytes,4,opt,name=default" json:"default,omitempty"` + Required []string `protobuf:"bytes,5,rep,name=required" json:"required,omitempty"` + Type string `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"` + ReadOnly bool `protobuf:"varint,7,opt,name=read_only,json=readOnly" json:"read_only,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,8,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` + Example *Any `protobuf:"bytes,9,opt,name=example" json:"example,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *FileSchema) Reset() { *m = FileSchema{} } +func (m *FileSchema) String() string { return proto.CompactTextString(m) } +func (*FileSchema) ProtoMessage() {} +func (*FileSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +func (m *FileSchema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *FileSchema) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *FileSchema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *FileSchema) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *FileSchema) GetRequired() []string { + if m != nil { + return m.Required + } + return nil +} + +func (m *FileSchema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *FileSchema) GetReadOnly() bool { + if m != nil { + return m.ReadOnly + } + return false +} + +func (m *FileSchema) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *FileSchema) GetExample() *Any { + if m != nil { + return m.Example + } + return nil +} + +func (m *FileSchema) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type FormDataParameterSubSchema struct { + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + // allows sending a parameter by name only or with an empty value. + AllowEmptyValue bool `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue" json:"allow_empty_value,omitempty"` + Type string `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"` + Format string `protobuf:"bytes,7,opt,name=format" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,8,opt,name=items" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,10,opt,name=default" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,21,rep,name=enum" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *FormDataParameterSubSchema) Reset() { *m = FormDataParameterSubSchema{} } +func (m *FormDataParameterSubSchema) String() string { return proto.CompactTextString(m) } +func (*FormDataParameterSubSchema) ProtoMessage() {} +func (*FormDataParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +func (m *FormDataParameterSubSchema) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *FormDataParameterSubSchema) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *FormDataParameterSubSchema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *FormDataParameterSubSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *FormDataParameterSubSchema) GetAllowEmptyValue() bool { + if m != nil { + return m.AllowEmptyValue + } + return false +} + +func (m *FormDataParameterSubSchema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *FormDataParameterSubSchema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *FormDataParameterSubSchema) GetItems() *PrimitivesItems { + if m != nil { + return m.Items + } + return nil +} + +func (m *FormDataParameterSubSchema) GetCollectionFormat() string { + if m != nil { + return m.CollectionFormat + } + return "" +} + +func (m *FormDataParameterSubSchema) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *FormDataParameterSubSchema) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *FormDataParameterSubSchema) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *FormDataParameterSubSchema) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *FormDataParameterSubSchema) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *FormDataParameterSubSchema) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *FormDataParameterSubSchema) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *FormDataParameterSubSchema) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Header struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,3,opt,name=items" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,6,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,8,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,10,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,11,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,12,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,13,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,14,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,16,rep,name=enum" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + Description string `protobuf:"bytes,18,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,19,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Header) Reset() { *m = Header{} } +func (m *Header) String() string { return proto.CompactTextString(m) } +func (*Header) ProtoMessage() {} +func (*Header) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +func (m *Header) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Header) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *Header) GetItems() *PrimitivesItems { + if m != nil { + return m.Items + } + return nil +} + +func (m *Header) GetCollectionFormat() string { + if m != nil { + return m.CollectionFormat + } + return "" +} + +func (m *Header) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *Header) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *Header) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *Header) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *Header) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *Header) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *Header) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *Header) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *Header) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *Header) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *Header) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *Header) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *Header) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *Header) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Header) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type HeaderParameterSubSchema struct { + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + Type string `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"` + Format string `protobuf:"bytes,6,opt,name=format" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,7,opt,name=items" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,9,opt,name=default" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,10,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,12,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,14,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,15,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,16,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,17,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,18,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *HeaderParameterSubSchema) Reset() { *m = HeaderParameterSubSchema{} } +func (m *HeaderParameterSubSchema) String() string { return proto.CompactTextString(m) } +func (*HeaderParameterSubSchema) ProtoMessage() {} +func (*HeaderParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *HeaderParameterSubSchema) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *HeaderParameterSubSchema) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *HeaderParameterSubSchema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *HeaderParameterSubSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *HeaderParameterSubSchema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *HeaderParameterSubSchema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *HeaderParameterSubSchema) GetItems() *PrimitivesItems { + if m != nil { + return m.Items + } + return nil +} + +func (m *HeaderParameterSubSchema) GetCollectionFormat() string { + if m != nil { + return m.CollectionFormat + } + return "" +} + +func (m *HeaderParameterSubSchema) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *HeaderParameterSubSchema) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *HeaderParameterSubSchema) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *HeaderParameterSubSchema) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *HeaderParameterSubSchema) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *HeaderParameterSubSchema) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *HeaderParameterSubSchema) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *HeaderParameterSubSchema) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Headers struct { + AdditionalProperties []*NamedHeader `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *Headers) Reset() { *m = Headers{} } +func (m *Headers) String() string { return proto.CompactTextString(m) } +func (*Headers) ProtoMessage() {} +func (*Headers) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +func (m *Headers) GetAdditionalProperties() []*NamedHeader { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +// General information about the API. +type Info struct { + // A unique and precise title of the API. + Title string `protobuf:"bytes,1,opt,name=title" json:"title,omitempty"` + // A semantic version number of the API. + Version string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` + // A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + // The terms of service for the API. + TermsOfService string `protobuf:"bytes,4,opt,name=terms_of_service,json=termsOfService" json:"terms_of_service,omitempty"` + Contact *Contact `protobuf:"bytes,5,opt,name=contact" json:"contact,omitempty"` + License *License `protobuf:"bytes,6,opt,name=license" json:"license,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Info) Reset() { *m = Info{} } +func (m *Info) String() string { return proto.CompactTextString(m) } +func (*Info) ProtoMessage() {} +func (*Info) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +func (m *Info) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *Info) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *Info) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Info) GetTermsOfService() string { + if m != nil { + return m.TermsOfService + } + return "" +} + +func (m *Info) GetContact() *Contact { + if m != nil { + return m.Contact + } + return nil +} + +func (m *Info) GetLicense() *License { + if m != nil { + return m.License + } + return nil +} + +func (m *Info) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type ItemsItem struct { + Schema []*Schema `protobuf:"bytes,1,rep,name=schema" json:"schema,omitempty"` +} + +func (m *ItemsItem) Reset() { *m = ItemsItem{} } +func (m *ItemsItem) String() string { return proto.CompactTextString(m) } +func (*ItemsItem) ProtoMessage() {} +func (*ItemsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +func (m *ItemsItem) GetSchema() []*Schema { + if m != nil { + return m.Schema + } + return nil +} + +type JsonReference struct { + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` +} + +func (m *JsonReference) Reset() { *m = JsonReference{} } +func (m *JsonReference) String() string { return proto.CompactTextString(m) } +func (*JsonReference) ProtoMessage() {} +func (*JsonReference) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *JsonReference) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *JsonReference) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type License struct { + // The name of the license type. It's encouraged to use an OSI compatible license. + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // The URL pointing to the license. + Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *License) Reset() { *m = License{} } +func (m *License) String() string { return proto.CompactTextString(m) } +func (*License) ProtoMessage() {} +func (*License) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *License) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *License) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *License) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. +type NamedAny struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *Any `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedAny) Reset() { *m = NamedAny{} } +func (m *NamedAny) String() string { return proto.CompactTextString(m) } +func (*NamedAny) ProtoMessage() {} +func (*NamedAny) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +func (m *NamedAny) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedAny) GetValue() *Any { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs. +type NamedHeader struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *Header `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedHeader) Reset() { *m = NamedHeader{} } +func (m *NamedHeader) String() string { return proto.CompactTextString(m) } +func (*NamedHeader) ProtoMessage() {} +func (*NamedHeader) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } + +func (m *NamedHeader) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedHeader) GetValue() *Header { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. +type NamedParameter struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *Parameter `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedParameter) Reset() { *m = NamedParameter{} } +func (m *NamedParameter) String() string { return proto.CompactTextString(m) } +func (*NamedParameter) ProtoMessage() {} +func (*NamedParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +func (m *NamedParameter) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedParameter) GetValue() *Parameter { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. +type NamedPathItem struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *PathItem `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedPathItem) Reset() { *m = NamedPathItem{} } +func (m *NamedPathItem) String() string { return proto.CompactTextString(m) } +func (*NamedPathItem) ProtoMessage() {} +func (*NamedPathItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +func (m *NamedPathItem) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedPathItem) GetValue() *PathItem { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs. +type NamedResponse struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *Response `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedResponse) Reset() { *m = NamedResponse{} } +func (m *NamedResponse) String() string { return proto.CompactTextString(m) } +func (*NamedResponse) ProtoMessage() {} +func (*NamedResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } + +func (m *NamedResponse) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedResponse) GetValue() *Response { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs. +type NamedResponseValue struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *ResponseValue `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedResponseValue) Reset() { *m = NamedResponseValue{} } +func (m *NamedResponseValue) String() string { return proto.CompactTextString(m) } +func (*NamedResponseValue) ProtoMessage() {} +func (*NamedResponseValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } + +func (m *NamedResponseValue) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedResponseValue) GetValue() *ResponseValue { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. +type NamedSchema struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *Schema `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedSchema) Reset() { *m = NamedSchema{} } +func (m *NamedSchema) String() string { return proto.CompactTextString(m) } +func (*NamedSchema) ProtoMessage() {} +func (*NamedSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } + +func (m *NamedSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedSchema) GetValue() *Schema { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs. +type NamedSecurityDefinitionsItem struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *SecurityDefinitionsItem `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedSecurityDefinitionsItem) Reset() { *m = NamedSecurityDefinitionsItem{} } +func (m *NamedSecurityDefinitionsItem) String() string { return proto.CompactTextString(m) } +func (*NamedSecurityDefinitionsItem) ProtoMessage() {} +func (*NamedSecurityDefinitionsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } + +func (m *NamedSecurityDefinitionsItem) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedSecurityDefinitionsItem) GetValue() *SecurityDefinitionsItem { + if m != nil { + return m.Value + } + return nil +} + +// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. +type NamedString struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedString) Reset() { *m = NamedString{} } +func (m *NamedString) String() string { return proto.CompactTextString(m) } +func (*NamedString) ProtoMessage() {} +func (*NamedString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } + +func (m *NamedString) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedString) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. +type NamedStringArray struct { + // Map key + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Mapped value + Value *StringArray `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *NamedStringArray) Reset() { *m = NamedStringArray{} } +func (m *NamedStringArray) String() string { return proto.CompactTextString(m) } +func (*NamedStringArray) ProtoMessage() {} +func (*NamedStringArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +func (m *NamedStringArray) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *NamedStringArray) GetValue() *StringArray { + if m != nil { + return m.Value + } + return nil +} + +type NonBodyParameter struct { + // Types that are valid to be assigned to Oneof: + // *NonBodyParameter_HeaderParameterSubSchema + // *NonBodyParameter_FormDataParameterSubSchema + // *NonBodyParameter_QueryParameterSubSchema + // *NonBodyParameter_PathParameterSubSchema + Oneof isNonBodyParameter_Oneof `protobuf_oneof:"oneof"` +} + +func (m *NonBodyParameter) Reset() { *m = NonBodyParameter{} } +func (m *NonBodyParameter) String() string { return proto.CompactTextString(m) } +func (*NonBodyParameter) ProtoMessage() {} +func (*NonBodyParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } + +type isNonBodyParameter_Oneof interface { + isNonBodyParameter_Oneof() +} + +type NonBodyParameter_HeaderParameterSubSchema struct { + HeaderParameterSubSchema *HeaderParameterSubSchema `protobuf:"bytes,1,opt,name=header_parameter_sub_schema,json=headerParameterSubSchema,oneof"` +} +type NonBodyParameter_FormDataParameterSubSchema struct { + FormDataParameterSubSchema *FormDataParameterSubSchema `protobuf:"bytes,2,opt,name=form_data_parameter_sub_schema,json=formDataParameterSubSchema,oneof"` +} +type NonBodyParameter_QueryParameterSubSchema struct { + QueryParameterSubSchema *QueryParameterSubSchema `protobuf:"bytes,3,opt,name=query_parameter_sub_schema,json=queryParameterSubSchema,oneof"` +} +type NonBodyParameter_PathParameterSubSchema struct { + PathParameterSubSchema *PathParameterSubSchema `protobuf:"bytes,4,opt,name=path_parameter_sub_schema,json=pathParameterSubSchema,oneof"` +} + +func (*NonBodyParameter_HeaderParameterSubSchema) isNonBodyParameter_Oneof() {} +func (*NonBodyParameter_FormDataParameterSubSchema) isNonBodyParameter_Oneof() {} +func (*NonBodyParameter_QueryParameterSubSchema) isNonBodyParameter_Oneof() {} +func (*NonBodyParameter_PathParameterSubSchema) isNonBodyParameter_Oneof() {} + +func (m *NonBodyParameter) GetOneof() isNonBodyParameter_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *NonBodyParameter) GetHeaderParameterSubSchema() *HeaderParameterSubSchema { + if x, ok := m.GetOneof().(*NonBodyParameter_HeaderParameterSubSchema); ok { + return x.HeaderParameterSubSchema + } + return nil +} + +func (m *NonBodyParameter) GetFormDataParameterSubSchema() *FormDataParameterSubSchema { + if x, ok := m.GetOneof().(*NonBodyParameter_FormDataParameterSubSchema); ok { + return x.FormDataParameterSubSchema + } + return nil +} + +func (m *NonBodyParameter) GetQueryParameterSubSchema() *QueryParameterSubSchema { + if x, ok := m.GetOneof().(*NonBodyParameter_QueryParameterSubSchema); ok { + return x.QueryParameterSubSchema + } + return nil +} + +func (m *NonBodyParameter) GetPathParameterSubSchema() *PathParameterSubSchema { + if x, ok := m.GetOneof().(*NonBodyParameter_PathParameterSubSchema); ok { + return x.PathParameterSubSchema + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*NonBodyParameter) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _NonBodyParameter_OneofMarshaler, _NonBodyParameter_OneofUnmarshaler, _NonBodyParameter_OneofSizer, []interface{}{ + (*NonBodyParameter_HeaderParameterSubSchema)(nil), + (*NonBodyParameter_FormDataParameterSubSchema)(nil), + (*NonBodyParameter_QueryParameterSubSchema)(nil), + (*NonBodyParameter_PathParameterSubSchema)(nil), + } +} + +func _NonBodyParameter_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*NonBodyParameter) + // oneof + switch x := m.Oneof.(type) { + case *NonBodyParameter_HeaderParameterSubSchema: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.HeaderParameterSubSchema); err != nil { + return err + } + case *NonBodyParameter_FormDataParameterSubSchema: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.FormDataParameterSubSchema); err != nil { + return err + } + case *NonBodyParameter_QueryParameterSubSchema: + b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.QueryParameterSubSchema); err != nil { + return err + } + case *NonBodyParameter_PathParameterSubSchema: + b.EncodeVarint(4<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.PathParameterSubSchema); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("NonBodyParameter.Oneof has unexpected type %T", x) + } + return nil +} + +func _NonBodyParameter_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*NonBodyParameter) + switch tag { + case 1: // oneof.header_parameter_sub_schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(HeaderParameterSubSchema) + err := b.DecodeMessage(msg) + m.Oneof = &NonBodyParameter_HeaderParameterSubSchema{msg} + return true, err + case 2: // oneof.form_data_parameter_sub_schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(FormDataParameterSubSchema) + err := b.DecodeMessage(msg) + m.Oneof = &NonBodyParameter_FormDataParameterSubSchema{msg} + return true, err + case 3: // oneof.query_parameter_sub_schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(QueryParameterSubSchema) + err := b.DecodeMessage(msg) + m.Oneof = &NonBodyParameter_QueryParameterSubSchema{msg} + return true, err + case 4: // oneof.path_parameter_sub_schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(PathParameterSubSchema) + err := b.DecodeMessage(msg) + m.Oneof = &NonBodyParameter_PathParameterSubSchema{msg} + return true, err + default: + return false, nil + } +} + +func _NonBodyParameter_OneofSizer(msg proto.Message) (n int) { + m := msg.(*NonBodyParameter) + // oneof + switch x := m.Oneof.(type) { + case *NonBodyParameter_HeaderParameterSubSchema: + s := proto.Size(x.HeaderParameterSubSchema) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *NonBodyParameter_FormDataParameterSubSchema: + s := proto.Size(x.FormDataParameterSubSchema) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *NonBodyParameter_QueryParameterSubSchema: + s := proto.Size(x.QueryParameterSubSchema) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *NonBodyParameter_PathParameterSubSchema: + s := proto.Size(x.PathParameterSubSchema) + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Oauth2AccessCodeSecurity struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` + AuthorizationUrl string `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl" json:"authorization_url,omitempty"` + TokenUrl string `protobuf:"bytes,5,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"` + Description string `protobuf:"bytes,6,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Oauth2AccessCodeSecurity) Reset() { *m = Oauth2AccessCodeSecurity{} } +func (m *Oauth2AccessCodeSecurity) String() string { return proto.CompactTextString(m) } +func (*Oauth2AccessCodeSecurity) ProtoMessage() {} +func (*Oauth2AccessCodeSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } + +func (m *Oauth2AccessCodeSecurity) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Oauth2AccessCodeSecurity) GetFlow() string { + if m != nil { + return m.Flow + } + return "" +} + +func (m *Oauth2AccessCodeSecurity) GetScopes() *Oauth2Scopes { + if m != nil { + return m.Scopes + } + return nil +} + +func (m *Oauth2AccessCodeSecurity) GetAuthorizationUrl() string { + if m != nil { + return m.AuthorizationUrl + } + return "" +} + +func (m *Oauth2AccessCodeSecurity) GetTokenUrl() string { + if m != nil { + return m.TokenUrl + } + return "" +} + +func (m *Oauth2AccessCodeSecurity) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Oauth2AccessCodeSecurity) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Oauth2ApplicationSecurity struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` + TokenUrl string `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Oauth2ApplicationSecurity) Reset() { *m = Oauth2ApplicationSecurity{} } +func (m *Oauth2ApplicationSecurity) String() string { return proto.CompactTextString(m) } +func (*Oauth2ApplicationSecurity) ProtoMessage() {} +func (*Oauth2ApplicationSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } + +func (m *Oauth2ApplicationSecurity) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Oauth2ApplicationSecurity) GetFlow() string { + if m != nil { + return m.Flow + } + return "" +} + +func (m *Oauth2ApplicationSecurity) GetScopes() *Oauth2Scopes { + if m != nil { + return m.Scopes + } + return nil +} + +func (m *Oauth2ApplicationSecurity) GetTokenUrl() string { + if m != nil { + return m.TokenUrl + } + return "" +} + +func (m *Oauth2ApplicationSecurity) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Oauth2ApplicationSecurity) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Oauth2ImplicitSecurity struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` + AuthorizationUrl string `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl" json:"authorization_url,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Oauth2ImplicitSecurity) Reset() { *m = Oauth2ImplicitSecurity{} } +func (m *Oauth2ImplicitSecurity) String() string { return proto.CompactTextString(m) } +func (*Oauth2ImplicitSecurity) ProtoMessage() {} +func (*Oauth2ImplicitSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } + +func (m *Oauth2ImplicitSecurity) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Oauth2ImplicitSecurity) GetFlow() string { + if m != nil { + return m.Flow + } + return "" +} + +func (m *Oauth2ImplicitSecurity) GetScopes() *Oauth2Scopes { + if m != nil { + return m.Scopes + } + return nil +} + +func (m *Oauth2ImplicitSecurity) GetAuthorizationUrl() string { + if m != nil { + return m.AuthorizationUrl + } + return "" +} + +func (m *Oauth2ImplicitSecurity) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Oauth2ImplicitSecurity) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Oauth2PasswordSecurity struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` + Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` + TokenUrl string `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Oauth2PasswordSecurity) Reset() { *m = Oauth2PasswordSecurity{} } +func (m *Oauth2PasswordSecurity) String() string { return proto.CompactTextString(m) } +func (*Oauth2PasswordSecurity) ProtoMessage() {} +func (*Oauth2PasswordSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } + +func (m *Oauth2PasswordSecurity) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Oauth2PasswordSecurity) GetFlow() string { + if m != nil { + return m.Flow + } + return "" +} + +func (m *Oauth2PasswordSecurity) GetScopes() *Oauth2Scopes { + if m != nil { + return m.Scopes + } + return nil +} + +func (m *Oauth2PasswordSecurity) GetTokenUrl() string { + if m != nil { + return m.TokenUrl + } + return "" +} + +func (m *Oauth2PasswordSecurity) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Oauth2PasswordSecurity) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Oauth2Scopes struct { + AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *Oauth2Scopes) Reset() { *m = Oauth2Scopes{} } +func (m *Oauth2Scopes) String() string { return proto.CompactTextString(m) } +func (*Oauth2Scopes) ProtoMessage() {} +func (*Oauth2Scopes) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } + +func (m *Oauth2Scopes) GetAdditionalProperties() []*NamedString { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Operation struct { + Tags []string `protobuf:"bytes,1,rep,name=tags" json:"tags,omitempty"` + // A brief summary of the operation. + Summary string `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"` + // A longer description of the operation, GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` + // A unique identifier of the operation. + OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId" json:"operation_id,omitempty"` + // A list of MIME types the API can produce. + Produces []string `protobuf:"bytes,6,rep,name=produces" json:"produces,omitempty"` + // A list of MIME types the API can consume. + Consumes []string `protobuf:"bytes,7,rep,name=consumes" json:"consumes,omitempty"` + // The parameters needed to send a valid API call. + Parameters []*ParametersItem `protobuf:"bytes,8,rep,name=parameters" json:"parameters,omitempty"` + Responses *Responses `protobuf:"bytes,9,opt,name=responses" json:"responses,omitempty"` + // The transfer protocol of the API. + Schemes []string `protobuf:"bytes,10,rep,name=schemes" json:"schemes,omitempty"` + Deprecated bool `protobuf:"varint,11,opt,name=deprecated" json:"deprecated,omitempty"` + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security" json:"security,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,13,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Operation) Reset() { *m = Operation{} } +func (m *Operation) String() string { return proto.CompactTextString(m) } +func (*Operation) ProtoMessage() {} +func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } + +func (m *Operation) GetTags() []string { + if m != nil { + return m.Tags + } + return nil +} + +func (m *Operation) GetSummary() string { + if m != nil { + return m.Summary + } + return "" +} + +func (m *Operation) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Operation) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Operation) GetOperationId() string { + if m != nil { + return m.OperationId + } + return "" +} + +func (m *Operation) GetProduces() []string { + if m != nil { + return m.Produces + } + return nil +} + +func (m *Operation) GetConsumes() []string { + if m != nil { + return m.Consumes + } + return nil +} + +func (m *Operation) GetParameters() []*ParametersItem { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *Operation) GetResponses() *Responses { + if m != nil { + return m.Responses + } + return nil +} + +func (m *Operation) GetSchemes() []string { + if m != nil { + return m.Schemes + } + return nil +} + +func (m *Operation) GetDeprecated() bool { + if m != nil { + return m.Deprecated + } + return false +} + +func (m *Operation) GetSecurity() []*SecurityRequirement { + if m != nil { + return m.Security + } + return nil +} + +func (m *Operation) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Parameter struct { + // Types that are valid to be assigned to Oneof: + // *Parameter_BodyParameter + // *Parameter_NonBodyParameter + Oneof isParameter_Oneof `protobuf_oneof:"oneof"` +} + +func (m *Parameter) Reset() { *m = Parameter{} } +func (m *Parameter) String() string { return proto.CompactTextString(m) } +func (*Parameter) ProtoMessage() {} +func (*Parameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } + +type isParameter_Oneof interface { + isParameter_Oneof() +} + +type Parameter_BodyParameter struct { + BodyParameter *BodyParameter `protobuf:"bytes,1,opt,name=body_parameter,json=bodyParameter,oneof"` +} +type Parameter_NonBodyParameter struct { + NonBodyParameter *NonBodyParameter `protobuf:"bytes,2,opt,name=non_body_parameter,json=nonBodyParameter,oneof"` +} + +func (*Parameter_BodyParameter) isParameter_Oneof() {} +func (*Parameter_NonBodyParameter) isParameter_Oneof() {} + +func (m *Parameter) GetOneof() isParameter_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *Parameter) GetBodyParameter() *BodyParameter { + if x, ok := m.GetOneof().(*Parameter_BodyParameter); ok { + return x.BodyParameter + } + return nil +} + +func (m *Parameter) GetNonBodyParameter() *NonBodyParameter { + if x, ok := m.GetOneof().(*Parameter_NonBodyParameter); ok { + return x.NonBodyParameter + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Parameter) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Parameter_OneofMarshaler, _Parameter_OneofUnmarshaler, _Parameter_OneofSizer, []interface{}{ + (*Parameter_BodyParameter)(nil), + (*Parameter_NonBodyParameter)(nil), + } +} + +func _Parameter_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Parameter) + // oneof + switch x := m.Oneof.(type) { + case *Parameter_BodyParameter: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.BodyParameter); err != nil { + return err + } + case *Parameter_NonBodyParameter: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.NonBodyParameter); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Parameter.Oneof has unexpected type %T", x) + } + return nil +} + +func _Parameter_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Parameter) + switch tag { + case 1: // oneof.body_parameter + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(BodyParameter) + err := b.DecodeMessage(msg) + m.Oneof = &Parameter_BodyParameter{msg} + return true, err + case 2: // oneof.non_body_parameter + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(NonBodyParameter) + err := b.DecodeMessage(msg) + m.Oneof = &Parameter_NonBodyParameter{msg} + return true, err + default: + return false, nil + } +} + +func _Parameter_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Parameter) + // oneof + switch x := m.Oneof.(type) { + case *Parameter_BodyParameter: + s := proto.Size(x.BodyParameter) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Parameter_NonBodyParameter: + s := proto.Size(x.NonBodyParameter) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// One or more JSON representations for parameters +type ParameterDefinitions struct { + AdditionalProperties []*NamedParameter `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *ParameterDefinitions) Reset() { *m = ParameterDefinitions{} } +func (m *ParameterDefinitions) String() string { return proto.CompactTextString(m) } +func (*ParameterDefinitions) ProtoMessage() {} +func (*ParameterDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } + +func (m *ParameterDefinitions) GetAdditionalProperties() []*NamedParameter { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type ParametersItem struct { + // Types that are valid to be assigned to Oneof: + // *ParametersItem_Parameter + // *ParametersItem_JsonReference + Oneof isParametersItem_Oneof `protobuf_oneof:"oneof"` +} + +func (m *ParametersItem) Reset() { *m = ParametersItem{} } +func (m *ParametersItem) String() string { return proto.CompactTextString(m) } +func (*ParametersItem) ProtoMessage() {} +func (*ParametersItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } + +type isParametersItem_Oneof interface { + isParametersItem_Oneof() +} + +type ParametersItem_Parameter struct { + Parameter *Parameter `protobuf:"bytes,1,opt,name=parameter,oneof"` +} +type ParametersItem_JsonReference struct { + JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,oneof"` +} + +func (*ParametersItem_Parameter) isParametersItem_Oneof() {} +func (*ParametersItem_JsonReference) isParametersItem_Oneof() {} + +func (m *ParametersItem) GetOneof() isParametersItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *ParametersItem) GetParameter() *Parameter { + if x, ok := m.GetOneof().(*ParametersItem_Parameter); ok { + return x.Parameter + } + return nil +} + +func (m *ParametersItem) GetJsonReference() *JsonReference { + if x, ok := m.GetOneof().(*ParametersItem_JsonReference); ok { + return x.JsonReference + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ParametersItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ParametersItem_OneofMarshaler, _ParametersItem_OneofUnmarshaler, _ParametersItem_OneofSizer, []interface{}{ + (*ParametersItem_Parameter)(nil), + (*ParametersItem_JsonReference)(nil), + } +} + +func _ParametersItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ParametersItem) + // oneof + switch x := m.Oneof.(type) { + case *ParametersItem_Parameter: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Parameter); err != nil { + return err + } + case *ParametersItem_JsonReference: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.JsonReference); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("ParametersItem.Oneof has unexpected type %T", x) + } + return nil +} + +func _ParametersItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ParametersItem) + switch tag { + case 1: // oneof.parameter + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Parameter) + err := b.DecodeMessage(msg) + m.Oneof = &ParametersItem_Parameter{msg} + return true, err + case 2: // oneof.json_reference + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(JsonReference) + err := b.DecodeMessage(msg) + m.Oneof = &ParametersItem_JsonReference{msg} + return true, err + default: + return false, nil + } +} + +func _ParametersItem_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ParametersItem) + // oneof + switch x := m.Oneof.(type) { + case *ParametersItem_Parameter: + s := proto.Size(x.Parameter) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *ParametersItem_JsonReference: + s := proto.Size(x.JsonReference) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type PathItem struct { + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"` + Get *Operation `protobuf:"bytes,2,opt,name=get" json:"get,omitempty"` + Put *Operation `protobuf:"bytes,3,opt,name=put" json:"put,omitempty"` + Post *Operation `protobuf:"bytes,4,opt,name=post" json:"post,omitempty"` + Delete *Operation `protobuf:"bytes,5,opt,name=delete" json:"delete,omitempty"` + Options *Operation `protobuf:"bytes,6,opt,name=options" json:"options,omitempty"` + Head *Operation `protobuf:"bytes,7,opt,name=head" json:"head,omitempty"` + Patch *Operation `protobuf:"bytes,8,opt,name=patch" json:"patch,omitempty"` + // The parameters needed to send a valid API call. + Parameters []*ParametersItem `protobuf:"bytes,9,rep,name=parameters" json:"parameters,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *PathItem) Reset() { *m = PathItem{} } +func (m *PathItem) String() string { return proto.CompactTextString(m) } +func (*PathItem) ProtoMessage() {} +func (*PathItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } + +func (m *PathItem) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *PathItem) GetGet() *Operation { + if m != nil { + return m.Get + } + return nil +} + +func (m *PathItem) GetPut() *Operation { + if m != nil { + return m.Put + } + return nil +} + +func (m *PathItem) GetPost() *Operation { + if m != nil { + return m.Post + } + return nil +} + +func (m *PathItem) GetDelete() *Operation { + if m != nil { + return m.Delete + } + return nil +} + +func (m *PathItem) GetOptions() *Operation { + if m != nil { + return m.Options + } + return nil +} + +func (m *PathItem) GetHead() *Operation { + if m != nil { + return m.Head + } + return nil +} + +func (m *PathItem) GetPatch() *Operation { + if m != nil { + return m.Patch + } + return nil +} + +func (m *PathItem) GetParameters() []*ParametersItem { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *PathItem) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type PathParameterSubSchema struct { + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + Type string `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"` + Format string `protobuf:"bytes,6,opt,name=format" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,7,opt,name=items" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,9,opt,name=default" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,10,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,12,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,14,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,15,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,16,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,17,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,18,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *PathParameterSubSchema) Reset() { *m = PathParameterSubSchema{} } +func (m *PathParameterSubSchema) String() string { return proto.CompactTextString(m) } +func (*PathParameterSubSchema) ProtoMessage() {} +func (*PathParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } + +func (m *PathParameterSubSchema) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *PathParameterSubSchema) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *PathParameterSubSchema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *PathParameterSubSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *PathParameterSubSchema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *PathParameterSubSchema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *PathParameterSubSchema) GetItems() *PrimitivesItems { + if m != nil { + return m.Items + } + return nil +} + +func (m *PathParameterSubSchema) GetCollectionFormat() string { + if m != nil { + return m.CollectionFormat + } + return "" +} + +func (m *PathParameterSubSchema) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *PathParameterSubSchema) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *PathParameterSubSchema) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *PathParameterSubSchema) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *PathParameterSubSchema) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *PathParameterSubSchema) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *PathParameterSubSchema) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *PathParameterSubSchema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *PathParameterSubSchema) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *PathParameterSubSchema) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *PathParameterSubSchema) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *PathParameterSubSchema) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *PathParameterSubSchema) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *PathParameterSubSchema) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +// Relative paths to the individual endpoints. They must be relative to the 'basePath'. +type Paths struct { + VendorExtension []*NamedAny `protobuf:"bytes,1,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` + Path []*NamedPathItem `protobuf:"bytes,2,rep,name=path" json:"path,omitempty"` +} + +func (m *Paths) Reset() { *m = Paths{} } +func (m *Paths) String() string { return proto.CompactTextString(m) } +func (*Paths) ProtoMessage() {} +func (*Paths) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } + +func (m *Paths) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +func (m *Paths) GetPath() []*NamedPathItem { + if m != nil { + return m.Path + } + return nil +} + +type PrimitivesItems struct { + Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,3,opt,name=items" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,6,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,8,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,10,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,11,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,12,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,13,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,14,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,16,rep,name=enum" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,18,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *PrimitivesItems) Reset() { *m = PrimitivesItems{} } +func (m *PrimitivesItems) String() string { return proto.CompactTextString(m) } +func (*PrimitivesItems) ProtoMessage() {} +func (*PrimitivesItems) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } + +func (m *PrimitivesItems) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *PrimitivesItems) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *PrimitivesItems) GetItems() *PrimitivesItems { + if m != nil { + return m.Items + } + return nil +} + +func (m *PrimitivesItems) GetCollectionFormat() string { + if m != nil { + return m.CollectionFormat + } + return "" +} + +func (m *PrimitivesItems) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *PrimitivesItems) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *PrimitivesItems) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *PrimitivesItems) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *PrimitivesItems) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *PrimitivesItems) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *PrimitivesItems) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *PrimitivesItems) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *PrimitivesItems) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *PrimitivesItems) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *PrimitivesItems) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *PrimitivesItems) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *PrimitivesItems) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *PrimitivesItems) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Properties struct { + AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *Properties) Reset() { *m = Properties{} } +func (m *Properties) String() string { return proto.CompactTextString(m) } +func (*Properties) ProtoMessage() {} +func (*Properties) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } + +func (m *Properties) GetAdditionalProperties() []*NamedSchema { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type QueryParameterSubSchema struct { + // Determines whether or not this parameter is required or optional. + Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` + // Determines the location of the parameter. + In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` + // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. + Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + // The name of the parameter. + Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + // allows sending a parameter by name only or with an empty value. + AllowEmptyValue bool `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue" json:"allow_empty_value,omitempty"` + Type string `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"` + Format string `protobuf:"bytes,7,opt,name=format" json:"format,omitempty"` + Items *PrimitivesItems `protobuf:"bytes,8,opt,name=items" json:"items,omitempty"` + CollectionFormat string `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` + Default *Any `protobuf:"bytes,10,opt,name=default" json:"default,omitempty"` + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + Enum []*Any `protobuf:"bytes,21,rep,name=enum" json:"enum,omitempty"` + MultipleOf float64 `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *QueryParameterSubSchema) Reset() { *m = QueryParameterSubSchema{} } +func (m *QueryParameterSubSchema) String() string { return proto.CompactTextString(m) } +func (*QueryParameterSubSchema) ProtoMessage() {} +func (*QueryParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} } + +func (m *QueryParameterSubSchema) GetRequired() bool { + if m != nil { + return m.Required + } + return false +} + +func (m *QueryParameterSubSchema) GetIn() string { + if m != nil { + return m.In + } + return "" +} + +func (m *QueryParameterSubSchema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *QueryParameterSubSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *QueryParameterSubSchema) GetAllowEmptyValue() bool { + if m != nil { + return m.AllowEmptyValue + } + return false +} + +func (m *QueryParameterSubSchema) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *QueryParameterSubSchema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *QueryParameterSubSchema) GetItems() *PrimitivesItems { + if m != nil { + return m.Items + } + return nil +} + +func (m *QueryParameterSubSchema) GetCollectionFormat() string { + if m != nil { + return m.CollectionFormat + } + return "" +} + +func (m *QueryParameterSubSchema) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *QueryParameterSubSchema) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *QueryParameterSubSchema) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *QueryParameterSubSchema) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *QueryParameterSubSchema) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *QueryParameterSubSchema) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *QueryParameterSubSchema) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *QueryParameterSubSchema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *QueryParameterSubSchema) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *QueryParameterSubSchema) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *QueryParameterSubSchema) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *QueryParameterSubSchema) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *QueryParameterSubSchema) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *QueryParameterSubSchema) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type Response struct { + Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` + Schema *SchemaItem `protobuf:"bytes,2,opt,name=schema" json:"schema,omitempty"` + Headers *Headers `protobuf:"bytes,3,opt,name=headers" json:"headers,omitempty"` + Examples *Examples `protobuf:"bytes,4,opt,name=examples" json:"examples,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} } + +func (m *Response) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Response) GetSchema() *SchemaItem { + if m != nil { + return m.Schema + } + return nil +} + +func (m *Response) GetHeaders() *Headers { + if m != nil { + return m.Headers + } + return nil +} + +func (m *Response) GetExamples() *Examples { + if m != nil { + return m.Examples + } + return nil +} + +func (m *Response) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +// One or more JSON representations for parameters +type ResponseDefinitions struct { + AdditionalProperties []*NamedResponse `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *ResponseDefinitions) Reset() { *m = ResponseDefinitions{} } +func (m *ResponseDefinitions) String() string { return proto.CompactTextString(m) } +func (*ResponseDefinitions) ProtoMessage() {} +func (*ResponseDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } + +func (m *ResponseDefinitions) GetAdditionalProperties() []*NamedResponse { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type ResponseValue struct { + // Types that are valid to be assigned to Oneof: + // *ResponseValue_Response + // *ResponseValue_JsonReference + Oneof isResponseValue_Oneof `protobuf_oneof:"oneof"` +} + +func (m *ResponseValue) Reset() { *m = ResponseValue{} } +func (m *ResponseValue) String() string { return proto.CompactTextString(m) } +func (*ResponseValue) ProtoMessage() {} +func (*ResponseValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} } + +type isResponseValue_Oneof interface { + isResponseValue_Oneof() +} + +type ResponseValue_Response struct { + Response *Response `protobuf:"bytes,1,opt,name=response,oneof"` +} +type ResponseValue_JsonReference struct { + JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,oneof"` +} + +func (*ResponseValue_Response) isResponseValue_Oneof() {} +func (*ResponseValue_JsonReference) isResponseValue_Oneof() {} + +func (m *ResponseValue) GetOneof() isResponseValue_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *ResponseValue) GetResponse() *Response { + if x, ok := m.GetOneof().(*ResponseValue_Response); ok { + return x.Response + } + return nil +} + +func (m *ResponseValue) GetJsonReference() *JsonReference { + if x, ok := m.GetOneof().(*ResponseValue_JsonReference); ok { + return x.JsonReference + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ResponseValue) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ResponseValue_OneofMarshaler, _ResponseValue_OneofUnmarshaler, _ResponseValue_OneofSizer, []interface{}{ + (*ResponseValue_Response)(nil), + (*ResponseValue_JsonReference)(nil), + } +} + +func _ResponseValue_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ResponseValue) + // oneof + switch x := m.Oneof.(type) { + case *ResponseValue_Response: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Response); err != nil { + return err + } + case *ResponseValue_JsonReference: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.JsonReference); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("ResponseValue.Oneof has unexpected type %T", x) + } + return nil +} + +func _ResponseValue_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ResponseValue) + switch tag { + case 1: // oneof.response + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Response) + err := b.DecodeMessage(msg) + m.Oneof = &ResponseValue_Response{msg} + return true, err + case 2: // oneof.json_reference + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(JsonReference) + err := b.DecodeMessage(msg) + m.Oneof = &ResponseValue_JsonReference{msg} + return true, err + default: + return false, nil + } +} + +func _ResponseValue_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ResponseValue) + // oneof + switch x := m.Oneof.(type) { + case *ResponseValue_Response: + s := proto.Size(x.Response) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *ResponseValue_JsonReference: + s := proto.Size(x.JsonReference) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// Response objects names can either be any valid HTTP status code or 'default'. +type Responses struct { + ResponseCode []*NamedResponseValue `protobuf:"bytes,1,rep,name=response_code,json=responseCode" json:"response_code,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,2,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Responses) Reset() { *m = Responses{} } +func (m *Responses) String() string { return proto.CompactTextString(m) } +func (*Responses) ProtoMessage() {} +func (*Responses) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} } + +func (m *Responses) GetResponseCode() []*NamedResponseValue { + if m != nil { + return m.ResponseCode + } + return nil +} + +func (m *Responses) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +// A deterministic version of a JSON Schema object. +type Schema struct { + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"` + Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title" json:"title,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"` + Default *Any `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"` + MultipleOf float64 `protobuf:"fixed64,6,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` + Maximum float64 `protobuf:"fixed64,7,opt,name=maximum" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,8,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,9,opt,name=minimum" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,10,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,11,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,12,opt,name=min_length,json=minLength" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,13,opt,name=pattern" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,14,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,15,opt,name=min_items,json=minItems" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,16,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` + MaxProperties int64 `protobuf:"varint,17,opt,name=max_properties,json=maxProperties" json:"max_properties,omitempty"` + MinProperties int64 `protobuf:"varint,18,opt,name=min_properties,json=minProperties" json:"min_properties,omitempty"` + Required []string `protobuf:"bytes,19,rep,name=required" json:"required,omitempty"` + Enum []*Any `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"` + AdditionalProperties *AdditionalPropertiesItem `protobuf:"bytes,21,opt,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` + Type *TypeItem `protobuf:"bytes,22,opt,name=type" json:"type,omitempty"` + Items *ItemsItem `protobuf:"bytes,23,opt,name=items" json:"items,omitempty"` + AllOf []*Schema `protobuf:"bytes,24,rep,name=all_of,json=allOf" json:"all_of,omitempty"` + Properties *Properties `protobuf:"bytes,25,opt,name=properties" json:"properties,omitempty"` + Discriminator string `protobuf:"bytes,26,opt,name=discriminator" json:"discriminator,omitempty"` + ReadOnly bool `protobuf:"varint,27,opt,name=read_only,json=readOnly" json:"read_only,omitempty"` + Xml *Xml `protobuf:"bytes,28,opt,name=xml" json:"xml,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,29,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` + Example *Any `protobuf:"bytes,30,opt,name=example" json:"example,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,31,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Schema) Reset() { *m = Schema{} } +func (m *Schema) String() string { return proto.CompactTextString(m) } +func (*Schema) ProtoMessage() {} +func (*Schema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} } + +func (m *Schema) GetXRef() string { + if m != nil { + return m.XRef + } + return "" +} + +func (m *Schema) GetFormat() string { + if m != nil { + return m.Format + } + return "" +} + +func (m *Schema) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *Schema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Schema) GetDefault() *Any { + if m != nil { + return m.Default + } + return nil +} + +func (m *Schema) GetMultipleOf() float64 { + if m != nil { + return m.MultipleOf + } + return 0 +} + +func (m *Schema) GetMaximum() float64 { + if m != nil { + return m.Maximum + } + return 0 +} + +func (m *Schema) GetExclusiveMaximum() bool { + if m != nil { + return m.ExclusiveMaximum + } + return false +} + +func (m *Schema) GetMinimum() float64 { + if m != nil { + return m.Minimum + } + return 0 +} + +func (m *Schema) GetExclusiveMinimum() bool { + if m != nil { + return m.ExclusiveMinimum + } + return false +} + +func (m *Schema) GetMaxLength() int64 { + if m != nil { + return m.MaxLength + } + return 0 +} + +func (m *Schema) GetMinLength() int64 { + if m != nil { + return m.MinLength + } + return 0 +} + +func (m *Schema) GetPattern() string { + if m != nil { + return m.Pattern + } + return "" +} + +func (m *Schema) GetMaxItems() int64 { + if m != nil { + return m.MaxItems + } + return 0 +} + +func (m *Schema) GetMinItems() int64 { + if m != nil { + return m.MinItems + } + return 0 +} + +func (m *Schema) GetUniqueItems() bool { + if m != nil { + return m.UniqueItems + } + return false +} + +func (m *Schema) GetMaxProperties() int64 { + if m != nil { + return m.MaxProperties + } + return 0 +} + +func (m *Schema) GetMinProperties() int64 { + if m != nil { + return m.MinProperties + } + return 0 +} + +func (m *Schema) GetRequired() []string { + if m != nil { + return m.Required + } + return nil +} + +func (m *Schema) GetEnum() []*Any { + if m != nil { + return m.Enum + } + return nil +} + +func (m *Schema) GetAdditionalProperties() *AdditionalPropertiesItem { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +func (m *Schema) GetType() *TypeItem { + if m != nil { + return m.Type + } + return nil +} + +func (m *Schema) GetItems() *ItemsItem { + if m != nil { + return m.Items + } + return nil +} + +func (m *Schema) GetAllOf() []*Schema { + if m != nil { + return m.AllOf + } + return nil +} + +func (m *Schema) GetProperties() *Properties { + if m != nil { + return m.Properties + } + return nil +} + +func (m *Schema) GetDiscriminator() string { + if m != nil { + return m.Discriminator + } + return "" +} + +func (m *Schema) GetReadOnly() bool { + if m != nil { + return m.ReadOnly + } + return false +} + +func (m *Schema) GetXml() *Xml { + if m != nil { + return m.Xml + } + return nil +} + +func (m *Schema) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Schema) GetExample() *Any { + if m != nil { + return m.Example + } + return nil +} + +func (m *Schema) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type SchemaItem struct { + // Types that are valid to be assigned to Oneof: + // *SchemaItem_Schema + // *SchemaItem_FileSchema + Oneof isSchemaItem_Oneof `protobuf_oneof:"oneof"` +} + +func (m *SchemaItem) Reset() { *m = SchemaItem{} } +func (m *SchemaItem) String() string { return proto.CompactTextString(m) } +func (*SchemaItem) ProtoMessage() {} +func (*SchemaItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} } + +type isSchemaItem_Oneof interface { + isSchemaItem_Oneof() +} + +type SchemaItem_Schema struct { + Schema *Schema `protobuf:"bytes,1,opt,name=schema,oneof"` +} +type SchemaItem_FileSchema struct { + FileSchema *FileSchema `protobuf:"bytes,2,opt,name=file_schema,json=fileSchema,oneof"` +} + +func (*SchemaItem_Schema) isSchemaItem_Oneof() {} +func (*SchemaItem_FileSchema) isSchemaItem_Oneof() {} + +func (m *SchemaItem) GetOneof() isSchemaItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *SchemaItem) GetSchema() *Schema { + if x, ok := m.GetOneof().(*SchemaItem_Schema); ok { + return x.Schema + } + return nil +} + +func (m *SchemaItem) GetFileSchema() *FileSchema { + if x, ok := m.GetOneof().(*SchemaItem_FileSchema); ok { + return x.FileSchema + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*SchemaItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _SchemaItem_OneofMarshaler, _SchemaItem_OneofUnmarshaler, _SchemaItem_OneofSizer, []interface{}{ + (*SchemaItem_Schema)(nil), + (*SchemaItem_FileSchema)(nil), + } +} + +func _SchemaItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*SchemaItem) + // oneof + switch x := m.Oneof.(type) { + case *SchemaItem_Schema: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Schema); err != nil { + return err + } + case *SchemaItem_FileSchema: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.FileSchema); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("SchemaItem.Oneof has unexpected type %T", x) + } + return nil +} + +func _SchemaItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*SchemaItem) + switch tag { + case 1: // oneof.schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Schema) + err := b.DecodeMessage(msg) + m.Oneof = &SchemaItem_Schema{msg} + return true, err + case 2: // oneof.file_schema + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(FileSchema) + err := b.DecodeMessage(msg) + m.Oneof = &SchemaItem_FileSchema{msg} + return true, err + default: + return false, nil + } +} + +func _SchemaItem_OneofSizer(msg proto.Message) (n int) { + m := msg.(*SchemaItem) + // oneof + switch x := m.Oneof.(type) { + case *SchemaItem_Schema: + s := proto.Size(x.Schema) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *SchemaItem_FileSchema: + s := proto.Size(x.FileSchema) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type SecurityDefinitions struct { + AdditionalProperties []*NamedSecurityDefinitionsItem `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *SecurityDefinitions) Reset() { *m = SecurityDefinitions{} } +func (m *SecurityDefinitions) String() string { return proto.CompactTextString(m) } +func (*SecurityDefinitions) ProtoMessage() {} +func (*SecurityDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} } + +func (m *SecurityDefinitions) GetAdditionalProperties() []*NamedSecurityDefinitionsItem { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type SecurityDefinitionsItem struct { + // Types that are valid to be assigned to Oneof: + // *SecurityDefinitionsItem_BasicAuthenticationSecurity + // *SecurityDefinitionsItem_ApiKeySecurity + // *SecurityDefinitionsItem_Oauth2ImplicitSecurity + // *SecurityDefinitionsItem_Oauth2PasswordSecurity + // *SecurityDefinitionsItem_Oauth2ApplicationSecurity + // *SecurityDefinitionsItem_Oauth2AccessCodeSecurity + Oneof isSecurityDefinitionsItem_Oneof `protobuf_oneof:"oneof"` +} + +func (m *SecurityDefinitionsItem) Reset() { *m = SecurityDefinitionsItem{} } +func (m *SecurityDefinitionsItem) String() string { return proto.CompactTextString(m) } +func (*SecurityDefinitionsItem) ProtoMessage() {} +func (*SecurityDefinitionsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} } + +type isSecurityDefinitionsItem_Oneof interface { + isSecurityDefinitionsItem_Oneof() +} + +type SecurityDefinitionsItem_BasicAuthenticationSecurity struct { + BasicAuthenticationSecurity *BasicAuthenticationSecurity `protobuf:"bytes,1,opt,name=basic_authentication_security,json=basicAuthenticationSecurity,oneof"` +} +type SecurityDefinitionsItem_ApiKeySecurity struct { + ApiKeySecurity *ApiKeySecurity `protobuf:"bytes,2,opt,name=api_key_security,json=apiKeySecurity,oneof"` +} +type SecurityDefinitionsItem_Oauth2ImplicitSecurity struct { + Oauth2ImplicitSecurity *Oauth2ImplicitSecurity `protobuf:"bytes,3,opt,name=oauth2_implicit_security,json=oauth2ImplicitSecurity,oneof"` +} +type SecurityDefinitionsItem_Oauth2PasswordSecurity struct { + Oauth2PasswordSecurity *Oauth2PasswordSecurity `protobuf:"bytes,4,opt,name=oauth2_password_security,json=oauth2PasswordSecurity,oneof"` +} +type SecurityDefinitionsItem_Oauth2ApplicationSecurity struct { + Oauth2ApplicationSecurity *Oauth2ApplicationSecurity `protobuf:"bytes,5,opt,name=oauth2_application_security,json=oauth2ApplicationSecurity,oneof"` +} +type SecurityDefinitionsItem_Oauth2AccessCodeSecurity struct { + Oauth2AccessCodeSecurity *Oauth2AccessCodeSecurity `protobuf:"bytes,6,opt,name=oauth2_access_code_security,json=oauth2AccessCodeSecurity,oneof"` +} + +func (*SecurityDefinitionsItem_BasicAuthenticationSecurity) isSecurityDefinitionsItem_Oneof() {} +func (*SecurityDefinitionsItem_ApiKeySecurity) isSecurityDefinitionsItem_Oneof() {} +func (*SecurityDefinitionsItem_Oauth2ImplicitSecurity) isSecurityDefinitionsItem_Oneof() {} +func (*SecurityDefinitionsItem_Oauth2PasswordSecurity) isSecurityDefinitionsItem_Oneof() {} +func (*SecurityDefinitionsItem_Oauth2ApplicationSecurity) isSecurityDefinitionsItem_Oneof() {} +func (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) isSecurityDefinitionsItem_Oneof() {} + +func (m *SecurityDefinitionsItem) GetOneof() isSecurityDefinitionsItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (m *SecurityDefinitionsItem) GetBasicAuthenticationSecurity() *BasicAuthenticationSecurity { + if x, ok := m.GetOneof().(*SecurityDefinitionsItem_BasicAuthenticationSecurity); ok { + return x.BasicAuthenticationSecurity + } + return nil +} + +func (m *SecurityDefinitionsItem) GetApiKeySecurity() *ApiKeySecurity { + if x, ok := m.GetOneof().(*SecurityDefinitionsItem_ApiKeySecurity); ok { + return x.ApiKeySecurity + } + return nil +} + +func (m *SecurityDefinitionsItem) GetOauth2ImplicitSecurity() *Oauth2ImplicitSecurity { + if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ImplicitSecurity); ok { + return x.Oauth2ImplicitSecurity + } + return nil +} + +func (m *SecurityDefinitionsItem) GetOauth2PasswordSecurity() *Oauth2PasswordSecurity { + if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2PasswordSecurity); ok { + return x.Oauth2PasswordSecurity + } + return nil +} + +func (m *SecurityDefinitionsItem) GetOauth2ApplicationSecurity() *Oauth2ApplicationSecurity { + if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ApplicationSecurity); ok { + return x.Oauth2ApplicationSecurity + } + return nil +} + +func (m *SecurityDefinitionsItem) GetOauth2AccessCodeSecurity() *Oauth2AccessCodeSecurity { + if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity); ok { + return x.Oauth2AccessCodeSecurity + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*SecurityDefinitionsItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _SecurityDefinitionsItem_OneofMarshaler, _SecurityDefinitionsItem_OneofUnmarshaler, _SecurityDefinitionsItem_OneofSizer, []interface{}{ + (*SecurityDefinitionsItem_BasicAuthenticationSecurity)(nil), + (*SecurityDefinitionsItem_ApiKeySecurity)(nil), + (*SecurityDefinitionsItem_Oauth2ImplicitSecurity)(nil), + (*SecurityDefinitionsItem_Oauth2PasswordSecurity)(nil), + (*SecurityDefinitionsItem_Oauth2ApplicationSecurity)(nil), + (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity)(nil), + } +} + +func _SecurityDefinitionsItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*SecurityDefinitionsItem) + // oneof + switch x := m.Oneof.(type) { + case *SecurityDefinitionsItem_BasicAuthenticationSecurity: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.BasicAuthenticationSecurity); err != nil { + return err + } + case *SecurityDefinitionsItem_ApiKeySecurity: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ApiKeySecurity); err != nil { + return err + } + case *SecurityDefinitionsItem_Oauth2ImplicitSecurity: + b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Oauth2ImplicitSecurity); err != nil { + return err + } + case *SecurityDefinitionsItem_Oauth2PasswordSecurity: + b.EncodeVarint(4<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Oauth2PasswordSecurity); err != nil { + return err + } + case *SecurityDefinitionsItem_Oauth2ApplicationSecurity: + b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Oauth2ApplicationSecurity); err != nil { + return err + } + case *SecurityDefinitionsItem_Oauth2AccessCodeSecurity: + b.EncodeVarint(6<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Oauth2AccessCodeSecurity); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("SecurityDefinitionsItem.Oneof has unexpected type %T", x) + } + return nil +} + +func _SecurityDefinitionsItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*SecurityDefinitionsItem) + switch tag { + case 1: // oneof.basic_authentication_security + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(BasicAuthenticationSecurity) + err := b.DecodeMessage(msg) + m.Oneof = &SecurityDefinitionsItem_BasicAuthenticationSecurity{msg} + return true, err + case 2: // oneof.api_key_security + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ApiKeySecurity) + err := b.DecodeMessage(msg) + m.Oneof = &SecurityDefinitionsItem_ApiKeySecurity{msg} + return true, err + case 3: // oneof.oauth2_implicit_security + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Oauth2ImplicitSecurity) + err := b.DecodeMessage(msg) + m.Oneof = &SecurityDefinitionsItem_Oauth2ImplicitSecurity{msg} + return true, err + case 4: // oneof.oauth2_password_security + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Oauth2PasswordSecurity) + err := b.DecodeMessage(msg) + m.Oneof = &SecurityDefinitionsItem_Oauth2PasswordSecurity{msg} + return true, err + case 5: // oneof.oauth2_application_security + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Oauth2ApplicationSecurity) + err := b.DecodeMessage(msg) + m.Oneof = &SecurityDefinitionsItem_Oauth2ApplicationSecurity{msg} + return true, err + case 6: // oneof.oauth2_access_code_security + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Oauth2AccessCodeSecurity) + err := b.DecodeMessage(msg) + m.Oneof = &SecurityDefinitionsItem_Oauth2AccessCodeSecurity{msg} + return true, err + default: + return false, nil + } +} + +func _SecurityDefinitionsItem_OneofSizer(msg proto.Message) (n int) { + m := msg.(*SecurityDefinitionsItem) + // oneof + switch x := m.Oneof.(type) { + case *SecurityDefinitionsItem_BasicAuthenticationSecurity: + s := proto.Size(x.BasicAuthenticationSecurity) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *SecurityDefinitionsItem_ApiKeySecurity: + s := proto.Size(x.ApiKeySecurity) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *SecurityDefinitionsItem_Oauth2ImplicitSecurity: + s := proto.Size(x.Oauth2ImplicitSecurity) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *SecurityDefinitionsItem_Oauth2PasswordSecurity: + s := proto.Size(x.Oauth2PasswordSecurity) + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *SecurityDefinitionsItem_Oauth2ApplicationSecurity: + s := proto.Size(x.Oauth2ApplicationSecurity) + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *SecurityDefinitionsItem_Oauth2AccessCodeSecurity: + s := proto.Size(x.Oauth2AccessCodeSecurity) + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type SecurityRequirement struct { + AdditionalProperties []*NamedStringArray `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *SecurityRequirement) Reset() { *m = SecurityRequirement{} } +func (m *SecurityRequirement) String() string { return proto.CompactTextString(m) } +func (*SecurityRequirement) ProtoMessage() {} +func (*SecurityRequirement) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} } + +func (m *SecurityRequirement) GetAdditionalProperties() []*NamedStringArray { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type StringArray struct { + Value []string `protobuf:"bytes,1,rep,name=value" json:"value,omitempty"` +} + +func (m *StringArray) Reset() { *m = StringArray{} } +func (m *StringArray) String() string { return proto.CompactTextString(m) } +func (*StringArray) ProtoMessage() {} +func (*StringArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} } + +func (m *StringArray) GetValue() []string { + if m != nil { + return m.Value + } + return nil +} + +type Tag struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Tag) Reset() { *m = Tag{} } +func (m *Tag) String() string { return proto.CompactTextString(m) } +func (*Tag) ProtoMessage() {} +func (*Tag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} } + +func (m *Tag) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Tag) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *Tag) GetExternalDocs() *ExternalDocs { + if m != nil { + return m.ExternalDocs + } + return nil +} + +func (m *Tag) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +type TypeItem struct { + Value []string `protobuf:"bytes,1,rep,name=value" json:"value,omitempty"` +} + +func (m *TypeItem) Reset() { *m = TypeItem{} } +func (m *TypeItem) String() string { return proto.CompactTextString(m) } +func (*TypeItem) ProtoMessage() {} +func (*TypeItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} } + +func (m *TypeItem) GetValue() []string { + if m != nil { + return m.Value + } + return nil +} + +// Any property starting with x- is valid. +type VendorExtension struct { + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` +} + +func (m *VendorExtension) Reset() { *m = VendorExtension{} } +func (m *VendorExtension) String() string { return proto.CompactTextString(m) } +func (*VendorExtension) ProtoMessage() {} +func (*VendorExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} } + +func (m *VendorExtension) GetAdditionalProperties() []*NamedAny { + if m != nil { + return m.AdditionalProperties + } + return nil +} + +type Xml struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + Prefix string `protobuf:"bytes,3,opt,name=prefix" json:"prefix,omitempty"` + Attribute bool `protobuf:"varint,4,opt,name=attribute" json:"attribute,omitempty"` + Wrapped bool `protobuf:"varint,5,opt,name=wrapped" json:"wrapped,omitempty"` + VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` +} + +func (m *Xml) Reset() { *m = Xml{} } +func (m *Xml) String() string { return proto.CompactTextString(m) } +func (*Xml) ProtoMessage() {} +func (*Xml) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} } + +func (m *Xml) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Xml) GetNamespace() string { + if m != nil { + return m.Namespace + } + return "" +} + +func (m *Xml) GetPrefix() string { + if m != nil { + return m.Prefix + } + return "" +} + +func (m *Xml) GetAttribute() bool { + if m != nil { + return m.Attribute + } + return false +} + +func (m *Xml) GetWrapped() bool { + if m != nil { + return m.Wrapped + } + return false +} + +func (m *Xml) GetVendorExtension() []*NamedAny { + if m != nil { + return m.VendorExtension + } + return nil +} + +func init() { + proto.RegisterType((*AdditionalPropertiesItem)(nil), "openapi.v2.AdditionalPropertiesItem") + proto.RegisterType((*Any)(nil), "openapi.v2.Any") + proto.RegisterType((*ApiKeySecurity)(nil), "openapi.v2.ApiKeySecurity") + proto.RegisterType((*BasicAuthenticationSecurity)(nil), "openapi.v2.BasicAuthenticationSecurity") + proto.RegisterType((*BodyParameter)(nil), "openapi.v2.BodyParameter") + proto.RegisterType((*Contact)(nil), "openapi.v2.Contact") + proto.RegisterType((*Default)(nil), "openapi.v2.Default") + proto.RegisterType((*Definitions)(nil), "openapi.v2.Definitions") + proto.RegisterType((*Document)(nil), "openapi.v2.Document") + proto.RegisterType((*Examples)(nil), "openapi.v2.Examples") + proto.RegisterType((*ExternalDocs)(nil), "openapi.v2.ExternalDocs") + proto.RegisterType((*FileSchema)(nil), "openapi.v2.FileSchema") + proto.RegisterType((*FormDataParameterSubSchema)(nil), "openapi.v2.FormDataParameterSubSchema") + proto.RegisterType((*Header)(nil), "openapi.v2.Header") + proto.RegisterType((*HeaderParameterSubSchema)(nil), "openapi.v2.HeaderParameterSubSchema") + proto.RegisterType((*Headers)(nil), "openapi.v2.Headers") + proto.RegisterType((*Info)(nil), "openapi.v2.Info") + proto.RegisterType((*ItemsItem)(nil), "openapi.v2.ItemsItem") + proto.RegisterType((*JsonReference)(nil), "openapi.v2.JsonReference") + proto.RegisterType((*License)(nil), "openapi.v2.License") + proto.RegisterType((*NamedAny)(nil), "openapi.v2.NamedAny") + proto.RegisterType((*NamedHeader)(nil), "openapi.v2.NamedHeader") + proto.RegisterType((*NamedParameter)(nil), "openapi.v2.NamedParameter") + proto.RegisterType((*NamedPathItem)(nil), "openapi.v2.NamedPathItem") + proto.RegisterType((*NamedResponse)(nil), "openapi.v2.NamedResponse") + proto.RegisterType((*NamedResponseValue)(nil), "openapi.v2.NamedResponseValue") + proto.RegisterType((*NamedSchema)(nil), "openapi.v2.NamedSchema") + proto.RegisterType((*NamedSecurityDefinitionsItem)(nil), "openapi.v2.NamedSecurityDefinitionsItem") + proto.RegisterType((*NamedString)(nil), "openapi.v2.NamedString") + proto.RegisterType((*NamedStringArray)(nil), "openapi.v2.NamedStringArray") + proto.RegisterType((*NonBodyParameter)(nil), "openapi.v2.NonBodyParameter") + proto.RegisterType((*Oauth2AccessCodeSecurity)(nil), "openapi.v2.Oauth2AccessCodeSecurity") + proto.RegisterType((*Oauth2ApplicationSecurity)(nil), "openapi.v2.Oauth2ApplicationSecurity") + proto.RegisterType((*Oauth2ImplicitSecurity)(nil), "openapi.v2.Oauth2ImplicitSecurity") + proto.RegisterType((*Oauth2PasswordSecurity)(nil), "openapi.v2.Oauth2PasswordSecurity") + proto.RegisterType((*Oauth2Scopes)(nil), "openapi.v2.Oauth2Scopes") + proto.RegisterType((*Operation)(nil), "openapi.v2.Operation") + proto.RegisterType((*Parameter)(nil), "openapi.v2.Parameter") + proto.RegisterType((*ParameterDefinitions)(nil), "openapi.v2.ParameterDefinitions") + proto.RegisterType((*ParametersItem)(nil), "openapi.v2.ParametersItem") + proto.RegisterType((*PathItem)(nil), "openapi.v2.PathItem") + proto.RegisterType((*PathParameterSubSchema)(nil), "openapi.v2.PathParameterSubSchema") + proto.RegisterType((*Paths)(nil), "openapi.v2.Paths") + proto.RegisterType((*PrimitivesItems)(nil), "openapi.v2.PrimitivesItems") + proto.RegisterType((*Properties)(nil), "openapi.v2.Properties") + proto.RegisterType((*QueryParameterSubSchema)(nil), "openapi.v2.QueryParameterSubSchema") + proto.RegisterType((*Response)(nil), "openapi.v2.Response") + proto.RegisterType((*ResponseDefinitions)(nil), "openapi.v2.ResponseDefinitions") + proto.RegisterType((*ResponseValue)(nil), "openapi.v2.ResponseValue") + proto.RegisterType((*Responses)(nil), "openapi.v2.Responses") + proto.RegisterType((*Schema)(nil), "openapi.v2.Schema") + proto.RegisterType((*SchemaItem)(nil), "openapi.v2.SchemaItem") + proto.RegisterType((*SecurityDefinitions)(nil), "openapi.v2.SecurityDefinitions") + proto.RegisterType((*SecurityDefinitionsItem)(nil), "openapi.v2.SecurityDefinitionsItem") + proto.RegisterType((*SecurityRequirement)(nil), "openapi.v2.SecurityRequirement") + proto.RegisterType((*StringArray)(nil), "openapi.v2.StringArray") + proto.RegisterType((*Tag)(nil), "openapi.v2.Tag") + proto.RegisterType((*TypeItem)(nil), "openapi.v2.TypeItem") + proto.RegisterType((*VendorExtension)(nil), "openapi.v2.VendorExtension") + proto.RegisterType((*Xml)(nil), "openapi.v2.Xml") +} + +func init() { proto.RegisterFile("OpenAPIv2/OpenAPIv2.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 3129 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4b, 0x73, 0x1c, 0x57, + 0xd5, 0xf3, 0x7e, 0x1c, 0x69, 0x46, 0xa3, 0x96, 0x2c, 0xb7, 0x24, 0xc7, 0x71, 0xe4, 0x3c, 0x6c, + 0xe7, 0xb3, 0x9c, 0x4f, 0x29, 0x48, 0x05, 0x2a, 0x05, 0xf2, 0xab, 0xc6, 0xc4, 0x44, 0x4a, 0xcb, + 0x0e, 0x09, 0x04, 0xba, 0xae, 0x66, 0xee, 0x48, 0x9d, 0x74, 0xf7, 0x6d, 0x77, 0xf7, 0xc8, 0x1a, + 0x16, 0x2c, 0xa0, 0x8a, 0x35, 0x50, 0x59, 0x53, 0x15, 0x16, 0x14, 0x55, 0x59, 0xb0, 0x62, 0xc5, + 0x1f, 0x60, 0xc7, 0x3f, 0x60, 0x0d, 0x5b, 0xaa, 0x58, 0x51, 0x3c, 0xea, 0xbe, 0xfa, 0x31, 0x7d, + 0x7b, 0x1e, 0x96, 0x0b, 0x28, 0xd0, 0x6a, 0xe6, 0xde, 0x73, 0xee, 0xb9, 0xa7, 0x4f, 0x9f, 0xd7, + 0x3d, 0xe7, 0x36, 0xac, 0xef, 0x79, 0xd8, 0xdd, 0xdd, 0x7f, 0x70, 0xb2, 0x73, 0x2b, 0xfa, 0xb7, + 0xed, 0xf9, 0x24, 0x24, 0x1a, 0x10, 0x0f, 0xbb, 0xc8, 0xb3, 0xb6, 0x4f, 0x76, 0x36, 0xd6, 0x8f, + 0x08, 0x39, 0xb2, 0xf1, 0x2d, 0x06, 0x39, 0x1c, 0x0e, 0x6e, 0x21, 0x77, 0xc4, 0xd1, 0xb6, 0x1c, + 0xd0, 0x77, 0xfb, 0x7d, 0x2b, 0xb4, 0x88, 0x8b, 0xec, 0x7d, 0x9f, 0x78, 0xd8, 0x0f, 0x2d, 0x1c, + 0x3c, 0x08, 0xb1, 0xa3, 0xfd, 0x1f, 0xd4, 0x82, 0xde, 0x31, 0x76, 0x90, 0x5e, 0xbc, 0x52, 0xbc, + 0xb6, 0xb0, 0xa3, 0x6d, 0xc7, 0x34, 0xb7, 0x0f, 0x18, 0xa4, 0x5b, 0x30, 0x04, 0x8e, 0xb6, 0x01, + 0xf5, 0x43, 0x42, 0x6c, 0x8c, 0x5c, 0xbd, 0x74, 0xa5, 0x78, 0xad, 0xd1, 0x2d, 0x18, 0x72, 0xe2, + 0x76, 0x1d, 0xaa, 0xc4, 0xc5, 0x64, 0xb0, 0x75, 0x0f, 0xca, 0xbb, 0xee, 0x48, 0xbb, 0x01, 0xd5, + 0x13, 0x64, 0x0f, 0xb1, 0x20, 0xbc, 0xba, 0xcd, 0x19, 0xdc, 0x96, 0x0c, 0x6e, 0xef, 0xba, 0x23, + 0x83, 0xa3, 0x68, 0x1a, 0x54, 0x46, 0xc8, 0xb1, 0x19, 0xd1, 0xa6, 0xc1, 0xfe, 0x6f, 0x7d, 0x51, + 0x84, 0xf6, 0xae, 0x67, 0xbd, 0x8b, 0x47, 0x07, 0xb8, 0x37, 0xf4, 0xad, 0x70, 0x44, 0xd1, 0xc2, + 0x91, 0xc7, 0x29, 0x36, 0x0d, 0xf6, 0x9f, 0xce, 0xb9, 0xc8, 0xc1, 0x72, 0x29, 0xfd, 0xaf, 0xb5, + 0xa1, 0x64, 0xb9, 0x7a, 0x99, 0xcd, 0x94, 0x2c, 0x57, 0xbb, 0x02, 0x0b, 0x7d, 0x1c, 0xf4, 0x7c, + 0xcb, 0xa3, 0x32, 0xd0, 0x2b, 0x0c, 0x90, 0x9c, 0xd2, 0xbe, 0x06, 0x9d, 0x13, 0xec, 0xf6, 0x89, + 0x6f, 0xe2, 0xd3, 0x10, 0xbb, 0x01, 0x45, 0xab, 0x5e, 0x29, 0x33, 0xbe, 0x13, 0x02, 0x79, 0x0f, + 0x39, 0xb8, 0x4f, 0xf9, 0x5e, 0xe2, 0xd8, 0xf7, 0x24, 0xf2, 0xd6, 0x67, 0x45, 0xd8, 0xbc, 0x8d, + 0x02, 0xab, 0xb7, 0x3b, 0x0c, 0x8f, 0xb1, 0x1b, 0x5a, 0x3d, 0x44, 0x09, 0x4f, 0x64, 0x7d, 0x8c, + 0xad, 0xd2, 0x6c, 0x6c, 0x95, 0xe7, 0x61, 0xeb, 0x0f, 0x45, 0x68, 0xdd, 0x26, 0xfd, 0xd1, 0x3e, + 0xf2, 0x91, 0x83, 0x43, 0xec, 0x8f, 0x6f, 0x5a, 0xcc, 0x6e, 0x3a, 0x8b, 0x44, 0x37, 0xa0, 0xe1, + 0xe3, 0x27, 0x43, 0xcb, 0xc7, 0x7d, 0x26, 0xce, 0x86, 0x11, 0x8d, 0xb5, 0x1b, 0x91, 0x4a, 0x55, + 0xf3, 0x54, 0x2a, 0x52, 0x28, 0xd5, 0x03, 0xd6, 0xe6, 0x79, 0xc0, 0x1f, 0x17, 0xa1, 0x7e, 0x87, + 0xb8, 0x21, 0xea, 0x85, 0x11, 0xe3, 0xc5, 0x04, 0xe3, 0x1d, 0x28, 0x0f, 0x7d, 0xa9, 0x58, 0xf4, + 0xaf, 0xb6, 0x0a, 0x55, 0xec, 0x20, 0xcb, 0x16, 0x4f, 0xc3, 0x07, 0x4a, 0x46, 0x2a, 0xf3, 0x30, + 0xf2, 0x08, 0xea, 0x77, 0xf1, 0x00, 0x0d, 0xed, 0x50, 0x7b, 0x00, 0x17, 0x50, 0x64, 0x6f, 0xa6, + 0x17, 0x19, 0x9c, 0x5e, 0x9c, 0x40, 0x70, 0x15, 0x29, 0x4c, 0x74, 0xeb, 0x3b, 0xb0, 0x70, 0x17, + 0x0f, 0x2c, 0x97, 0x41, 0x02, 0xed, 0xe1, 0x64, 0xca, 0x17, 0x33, 0x94, 0x85, 0xb8, 0xd5, 0xc4, + 0xff, 0x58, 0x85, 0xc6, 0x5d, 0xd2, 0x1b, 0x3a, 0xd8, 0x0d, 0x35, 0x1d, 0xea, 0xc1, 0x53, 0x74, + 0x74, 0x84, 0x7d, 0x21, 0x3f, 0x39, 0xd4, 0x5e, 0x86, 0x8a, 0xe5, 0x0e, 0x08, 0x93, 0xe1, 0xc2, + 0x4e, 0x27, 0xb9, 0xc7, 0x03, 0x77, 0x40, 0x0c, 0x06, 0xa5, 0xc2, 0x3f, 0x26, 0x41, 0x28, 0xa4, + 0xca, 0xfe, 0x6b, 0x9b, 0xd0, 0x3c, 0x44, 0x01, 0x36, 0x3d, 0x14, 0x1e, 0x0b, 0xab, 0x6b, 0xd0, + 0x89, 0x7d, 0x14, 0x1e, 0xb3, 0x0d, 0x29, 0x77, 0x38, 0x60, 0x96, 0x46, 0x37, 0xe4, 0x43, 0xaa, + 0x5c, 0x3d, 0xe2, 0x06, 0x43, 0x0a, 0xaa, 0x31, 0x50, 0x34, 0xa6, 0x30, 0xcf, 0x27, 0xfd, 0x61, + 0x0f, 0x07, 0x7a, 0x9d, 0xc3, 0xe4, 0x58, 0x7b, 0x0d, 0xaa, 0x74, 0xa7, 0x40, 0x6f, 0x30, 0x4e, + 0x97, 0x93, 0x9c, 0xd2, 0x2d, 0x03, 0x83, 0xc3, 0xb5, 0xb7, 0xa9, 0x0d, 0x44, 0x52, 0xd5, 0x9b, + 0x0c, 0x3d, 0x25, 0xbc, 0x84, 0xd0, 0x8d, 0x24, 0xae, 0xf6, 0x75, 0x00, 0x4f, 0xda, 0x52, 0xa0, + 0x03, 0x5b, 0x79, 0x25, 0xbd, 0x91, 0x80, 0x26, 0x49, 0x24, 0xd6, 0x68, 0xef, 0x40, 0xd3, 0xc7, + 0x81, 0x47, 0xdc, 0x00, 0x07, 0xfa, 0x02, 0x23, 0xf0, 0x62, 0x92, 0x80, 0x21, 0x80, 0xc9, 0xf5, + 0xf1, 0x0a, 0xed, 0xab, 0xd0, 0x08, 0x84, 0x53, 0xd1, 0x17, 0xd9, 0x5b, 0x4f, 0xad, 0x96, 0x0e, + 0xc7, 0xe0, 0xd6, 0x48, 0x5f, 0xad, 0x11, 0x2d, 0xd0, 0x0c, 0x58, 0x95, 0xff, 0xcd, 0xa4, 0x04, + 0x5a, 0x59, 0x36, 0x24, 0xa1, 0x24, 0x1b, 0x2b, 0x41, 0x76, 0x52, 0xbb, 0x0a, 0x95, 0x10, 0x1d, + 0x05, 0x7a, 0x9b, 0x31, 0xb3, 0x94, 0xa4, 0xf1, 0x08, 0x1d, 0x19, 0x0c, 0xa8, 0xbd, 0x03, 0x2d, + 0x6a, 0x57, 0x3e, 0x55, 0xdb, 0x3e, 0xe9, 0x05, 0xfa, 0x12, 0xdb, 0x51, 0x4f, 0x62, 0xdf, 0x13, + 0x08, 0x77, 0x49, 0x2f, 0x30, 0x16, 0x71, 0x62, 0xa4, 0xb4, 0xce, 0xce, 0x3c, 0xd6, 0xf9, 0x18, + 0x1a, 0xf7, 0x4e, 0x91, 0xe3, 0xd9, 0x38, 0x78, 0x9e, 0xe6, 0xf9, 0xa3, 0x22, 0x2c, 0x26, 0xd9, + 0x9e, 0xc1, 0xbb, 0x66, 0x1d, 0xd2, 0x99, 0x9d, 0xfc, 0x3f, 0x4a, 0x00, 0xf7, 0x2d, 0x1b, 0x73, + 0x63, 0xd7, 0xd6, 0xa0, 0x36, 0x20, 0xbe, 0x83, 0x42, 0xb1, 0xbd, 0x18, 0x51, 0xc7, 0x17, 0x5a, + 0xa1, 0x2d, 0x1d, 0x3b, 0x1f, 0x8c, 0x73, 0x5c, 0xce, 0x72, 0x7c, 0x1d, 0xea, 0x7d, 0xee, 0xd9, + 0x98, 0x0d, 0x8f, 0xbd, 0x63, 0xca, 0x91, 0x84, 0xa7, 0xc2, 0x02, 0x37, 0xea, 0x38, 0x2c, 0xc8, + 0x08, 0x58, 0x4b, 0x44, 0xc0, 0x4d, 0x6a, 0x0b, 0xa8, 0x6f, 0x12, 0xd7, 0x1e, 0xe9, 0x75, 0x19, + 0x47, 0x50, 0x7f, 0xcf, 0xb5, 0x47, 0x59, 0x9d, 0x69, 0xcc, 0xa5, 0x33, 0xd7, 0xa1, 0x8e, 0xf9, + 0x2b, 0x17, 0x06, 0x9e, 0x65, 0x5b, 0xc0, 0x95, 0x6f, 0x00, 0xe6, 0x79, 0x03, 0x5f, 0xd4, 0x60, + 0xe3, 0x3e, 0xf1, 0x9d, 0xbb, 0x28, 0x44, 0x91, 0x03, 0x38, 0x18, 0x1e, 0x1e, 0xc8, 0xb4, 0x29, + 0x16, 0x4b, 0x71, 0x2c, 0x5a, 0xf2, 0xc8, 0x5a, 0xca, 0xcb, 0x55, 0xca, 0xf9, 0xf1, 0xb9, 0x92, + 0x08, 0x73, 0x37, 0x60, 0x19, 0xd9, 0x36, 0x79, 0x6a, 0x62, 0xc7, 0x0b, 0x47, 0x26, 0x4f, 0xbc, + 0xaa, 0x6c, 0xab, 0x25, 0x06, 0xb8, 0x47, 0xe7, 0x3f, 0x90, 0xc9, 0x56, 0xe6, 0x45, 0xc4, 0x3a, + 0x53, 0x4f, 0xe9, 0xcc, 0xff, 0x43, 0xd5, 0x0a, 0xb1, 0x23, 0x65, 0xbf, 0x99, 0xf2, 0x74, 0xbe, + 0xe5, 0x58, 0xa1, 0x75, 0xc2, 0x33, 0xc9, 0xc0, 0xe0, 0x98, 0xda, 0xeb, 0xb0, 0xdc, 0x23, 0xb6, + 0x8d, 0x7b, 0x94, 0x59, 0x53, 0x50, 0x6d, 0x32, 0xaa, 0x9d, 0x18, 0x70, 0x9f, 0xd3, 0x4f, 0xe8, + 0x16, 0x4c, 0xd1, 0x2d, 0x1d, 0xea, 0x0e, 0x3a, 0xb5, 0x9c, 0xa1, 0xc3, 0xbc, 0x66, 0xd1, 0x90, + 0x43, 0xba, 0x23, 0x3e, 0xed, 0xd9, 0xc3, 0xc0, 0x3a, 0xc1, 0xa6, 0xc4, 0x59, 0x64, 0x0f, 0xdf, + 0x89, 0x00, 0xdf, 0x14, 0xc8, 0x94, 0x8c, 0xe5, 0x32, 0x94, 0x96, 0x20, 0xc3, 0x87, 0x63, 0x64, + 0x04, 0x4e, 0x7b, 0x9c, 0x8c, 0x40, 0x7e, 0x01, 0xc0, 0x41, 0xa7, 0xa6, 0x8d, 0xdd, 0xa3, 0xf0, + 0x98, 0x79, 0xb3, 0xb2, 0xd1, 0x74, 0xd0, 0xe9, 0x43, 0x36, 0xc1, 0xc0, 0x96, 0x2b, 0xc1, 0x1d, + 0x01, 0xb6, 0x5c, 0x01, 0xd6, 0xa1, 0xee, 0xa1, 0x90, 0x2a, 0xab, 0xbe, 0xcc, 0x83, 0xad, 0x18, + 0x52, 0x8b, 0xa0, 0x74, 0xb9, 0xd0, 0x35, 0xb6, 0xae, 0xe1, 0xa0, 0x53, 0x26, 0x61, 0x06, 0xb4, + 0x5c, 0x01, 0x5c, 0x11, 0x40, 0xcb, 0xe5, 0xc0, 0x97, 0x60, 0x71, 0xe8, 0x5a, 0x4f, 0x86, 0x58, + 0xc0, 0x57, 0x19, 0xe7, 0x0b, 0x7c, 0x8e, 0xa3, 0x5c, 0x85, 0x0a, 0x76, 0x87, 0x8e, 0x7e, 0x21, + 0xeb, 0xaa, 0xa9, 0xa8, 0x19, 0x50, 0x7b, 0x11, 0x16, 0x9c, 0xa1, 0x1d, 0x5a, 0x9e, 0x8d, 0x4d, + 0x32, 0xd0, 0xd7, 0x98, 0x90, 0x40, 0x4e, 0xed, 0x0d, 0x94, 0xd6, 0x72, 0x71, 0x2e, 0x6b, 0xa9, + 0x42, 0xad, 0x8b, 0x51, 0x1f, 0xfb, 0xca, 0xb4, 0x38, 0xd6, 0xc5, 0x92, 0x5a, 0x17, 0xcb, 0x67, + 0xd3, 0xc5, 0xca, 0x74, 0x5d, 0xac, 0xce, 0xae, 0x8b, 0xb5, 0x19, 0x74, 0xb1, 0x3e, 0x5d, 0x17, + 0x1b, 0x33, 0xe8, 0x62, 0x73, 0x26, 0x5d, 0x84, 0xc9, 0xba, 0xb8, 0x30, 0x41, 0x17, 0x17, 0x27, + 0xe8, 0x62, 0x6b, 0x92, 0x2e, 0xb6, 0xa7, 0xe8, 0xe2, 0x52, 0xbe, 0x2e, 0x76, 0xe6, 0xd0, 0xc5, + 0xe5, 0x8c, 0x2e, 0x8e, 0x79, 0x4b, 0x6d, 0xb6, 0x23, 0xd4, 0xca, 0x3c, 0xda, 0xfa, 0xb7, 0x2a, + 0xe8, 0x5c, 0x5b, 0xff, 0x2d, 0x9e, 0x5d, 0x5a, 0x48, 0x55, 0x69, 0x21, 0x35, 0xb5, 0x85, 0xd4, + 0xcf, 0x66, 0x21, 0x8d, 0xe9, 0x16, 0xd2, 0x9c, 0xdd, 0x42, 0x60, 0x06, 0x0b, 0x59, 0x98, 0x6e, + 0x21, 0x8b, 0x33, 0x58, 0x48, 0x6b, 0x26, 0x0b, 0x69, 0x4f, 0xb6, 0x90, 0xa5, 0x09, 0x16, 0xd2, + 0x99, 0x60, 0x21, 0xcb, 0x93, 0x2c, 0x44, 0x9b, 0x62, 0x21, 0x2b, 0xf9, 0x16, 0xb2, 0x3a, 0x87, + 0x85, 0x5c, 0x98, 0xc9, 0x5b, 0xaf, 0xcd, 0xa3, 0xff, 0xdf, 0x82, 0x3a, 0x57, 0xff, 0x67, 0x38, + 0x7e, 0xf2, 0x85, 0x39, 0xc9, 0xf3, 0xe7, 0x25, 0xa8, 0xd0, 0x03, 0x64, 0x9c, 0x98, 0x16, 0x93, + 0x89, 0xa9, 0x0e, 0xf5, 0x13, 0xec, 0x07, 0x71, 0x65, 0x44, 0x0e, 0x67, 0x30, 0xa4, 0x6b, 0xd0, + 0x09, 0xb1, 0xef, 0x04, 0x26, 0x19, 0x98, 0x01, 0xf6, 0x4f, 0xac, 0x9e, 0x34, 0xaa, 0x36, 0x9b, + 0xdf, 0x1b, 0x1c, 0xf0, 0x59, 0xed, 0x26, 0xd4, 0x7b, 0xbc, 0x7c, 0x20, 0x9c, 0xfe, 0x4a, 0xf2, + 0x21, 0x44, 0x65, 0xc1, 0x90, 0x38, 0x14, 0xdd, 0xb6, 0x7a, 0xd8, 0x0d, 0x78, 0xfa, 0x34, 0x86, + 0xfe, 0x90, 0x83, 0x0c, 0x89, 0xa3, 0x14, 0x7e, 0x7d, 0x1e, 0xe1, 0xbf, 0x05, 0x4d, 0xa6, 0x0c, + 0xac, 0x56, 0x77, 0x23, 0x51, 0xab, 0x2b, 0x4f, 0x2e, 0xac, 0x6c, 0xdd, 0x85, 0xd6, 0x37, 0x02, + 0xe2, 0x1a, 0x78, 0x80, 0x7d, 0xec, 0xf6, 0xb0, 0xb6, 0x0c, 0x15, 0xd3, 0xc7, 0x03, 0x21, 0xe3, + 0xb2, 0x81, 0x07, 0xd3, 0xeb, 0x4f, 0x5b, 0x1e, 0xd4, 0xc5, 0x33, 0xcd, 0x58, 0x5c, 0x39, 0xf3, + 0x59, 0xe6, 0x1e, 0x34, 0x24, 0x50, 0xb9, 0xe5, 0x2b, 0xb2, 0xaa, 0x58, 0x52, 0x3b, 0x20, 0x0e, + 0xdd, 0x7a, 0x17, 0x16, 0x12, 0x0a, 0xa8, 0xa4, 0x74, 0x2d, 0x4d, 0x29, 0x25, 0x4c, 0xa1, 0xb7, + 0x82, 0xd8, 0xfb, 0xd0, 0x66, 0xc4, 0xe2, 0x22, 0x9a, 0x8a, 0xde, 0xeb, 0x69, 0x7a, 0x17, 0x94, + 0x45, 0x01, 0x49, 0x72, 0x0f, 0x5a, 0x82, 0x64, 0x78, 0xcc, 0xde, 0xad, 0x8a, 0xe2, 0x8d, 0x34, + 0xc5, 0xd5, 0xf1, 0x7a, 0x06, 0x5d, 0x38, 0x4e, 0x50, 0x56, 0x0f, 0xe6, 0x26, 0x28, 0x17, 0x4a, + 0x82, 0x1f, 0x81, 0x96, 0x22, 0x18, 0x9d, 0x1d, 0x32, 0x54, 0x6f, 0xa5, 0xa9, 0xae, 0xab, 0xa8, + 0xb2, 0xd5, 0xe3, 0x2f, 0x47, 0xc4, 0xd0, 0x79, 0x5f, 0x8e, 0xd0, 0x74, 0x41, 0xcc, 0x81, 0x4b, + 0x9c, 0x58, 0xb6, 0x34, 0x91, 0x2b, 0xd8, 0xb7, 0xd3, 0xd4, 0xaf, 0x4e, 0xa9, 0x7b, 0x24, 0xe5, + 0xfc, 0x96, 0xe4, 0x3d, 0xf4, 0x2d, 0xf7, 0x48, 0x49, 0x7d, 0x35, 0x49, 0xbd, 0x29, 0x17, 0x3e, + 0x86, 0x4e, 0x62, 0xe1, 0xae, 0xef, 0x23, 0xb5, 0x82, 0xdf, 0x4c, 0xf3, 0x96, 0xf2, 0xa9, 0x89, + 0xb5, 0x92, 0xec, 0x6f, 0xca, 0xd0, 0x79, 0x8f, 0xb8, 0xe9, 0x1a, 0x2f, 0x86, 0xcd, 0x63, 0xa6, + 0xc1, 0x66, 0x54, 0x77, 0x32, 0x83, 0xe1, 0xa1, 0x99, 0xaa, 0xf4, 0xbf, 0x9c, 0x55, 0xf8, 0x6c, + 0x82, 0xd3, 0x2d, 0x18, 0xfa, 0x71, 0x5e, 0xf2, 0x63, 0xc3, 0x65, 0x9a, 0x30, 0x98, 0x7d, 0x14, + 0x22, 0xf5, 0x4e, 0xfc, 0x19, 0x5e, 0x4d, 0xee, 0x94, 0x7f, 0x4c, 0xee, 0x16, 0x8c, 0x8d, 0x41, + 0xfe, 0x21, 0xfa, 0x10, 0x36, 0x9e, 0x0c, 0xb1, 0x3f, 0x52, 0xef, 0x54, 0xce, 0xbe, 0xc9, 0xf7, + 0x29, 0xb6, 0x72, 0x9b, 0x8b, 0x4f, 0xd4, 0x20, 0xcd, 0x84, 0x75, 0x0f, 0x85, 0xc7, 0xea, 0x2d, + 0x78, 0xf1, 0x63, 0x6b, 0xdc, 0x0a, 0x95, 0x3b, 0xac, 0x79, 0x4a, 0x48, 0xdc, 0x24, 0xf9, 0xbc, + 0x04, 0xfa, 0x1e, 0x1a, 0x86, 0xc7, 0x3b, 0xbb, 0xbd, 0x1e, 0x0e, 0x82, 0x3b, 0xa4, 0x8f, 0xa7, + 0xf5, 0x39, 0x06, 0x36, 0x79, 0x2a, 0xab, 0xf2, 0xf4, 0xbf, 0xf6, 0x06, 0x0d, 0x08, 0xc4, 0xc3, + 0xf2, 0x48, 0x94, 0x2a, 0x8d, 0x70, 0xea, 0x07, 0x0c, 0x6e, 0x08, 0x3c, 0x9a, 0x35, 0xd1, 0x69, + 0xe2, 0x5b, 0xdf, 0x67, 0xfd, 0x09, 0x93, 0xfa, 0x6f, 0x71, 0x20, 0x4a, 0x01, 0x1e, 0xfb, 0x36, + 0x4d, 0x60, 0x42, 0xf2, 0x29, 0xe6, 0x48, 0x3c, 0xff, 0x6c, 0xb0, 0x09, 0x0a, 0x1c, 0x0b, 0x1e, + 0xb5, 0xd9, 0x32, 0xef, 0xb9, 0x82, 0xdf, 0x5f, 0x8a, 0xb0, 0x2e, 0x64, 0xe4, 0x79, 0xf6, 0x2c, + 0x1d, 0x95, 0xe7, 0x23, 0xa4, 0xd4, 0x73, 0x57, 0x26, 0x3f, 0x77, 0x75, 0xb6, 0xe7, 0x9e, 0xab, + 0xa7, 0xf1, 0xc3, 0x12, 0xac, 0x71, 0xc6, 0x1e, 0x38, 0xf4, 0xb9, 0xad, 0xf0, 0x3f, 0x4d, 0x33, + 0xfe, 0x05, 0x42, 0xf8, 0x73, 0x51, 0x0a, 0x61, 0x1f, 0x05, 0xc1, 0x53, 0xe2, 0xf7, 0xff, 0x07, + 0xde, 0xfc, 0xc7, 0xb0, 0x98, 0xe4, 0xeb, 0x19, 0xfa, 0x3d, 0x2c, 0x42, 0xe4, 0x24, 0xdc, 0x3f, + 0xaf, 0x40, 0x73, 0xcf, 0xc3, 0x3e, 0x92, 0x87, 0x4d, 0x56, 0xb7, 0x2f, 0xb2, 0x3a, 0x2d, 0x2f, + 0xd3, 0xeb, 0x50, 0x0f, 0x86, 0x8e, 0x83, 0xfc, 0x91, 0xcc, 0xb9, 0xc5, 0x70, 0x86, 0x9c, 0x3b, + 0x53, 0xae, 0xad, 0xcc, 0x55, 0xae, 0x7d, 0x09, 0x16, 0x89, 0xe4, 0xcd, 0xb4, 0xfa, 0x52, 0xbc, + 0xd1, 0xdc, 0x83, 0x7e, 0xaa, 0xf7, 0x53, 0x1b, 0xeb, 0xfd, 0x24, 0x7b, 0x46, 0xf5, 0xb1, 0x9e, + 0xd1, 0x57, 0x52, 0x3d, 0x9b, 0x06, 0x13, 0xdd, 0x86, 0x32, 0x3d, 0xe3, 0xa1, 0x3e, 0xd9, 0xad, + 0x79, 0x33, 0xd9, 0xad, 0x69, 0x66, 0x33, 0x3b, 0x99, 0xe0, 0xa4, 0x7a, 0x34, 0x89, 0xd6, 0x16, + 0xa4, 0x5b, 0x5b, 0x97, 0x01, 0xfa, 0xd8, 0xf3, 0x71, 0x0f, 0x85, 0xb8, 0x2f, 0x4e, 0xbd, 0x89, + 0x99, 0xb3, 0x75, 0x77, 0x54, 0xea, 0xd7, 0x9a, 0x47, 0xfd, 0x7e, 0x59, 0x84, 0x66, 0x9c, 0x45, + 0xdc, 0x86, 0xf6, 0x21, 0xe9, 0x27, 0xe2, 0xad, 0x48, 0x1c, 0x52, 0x09, 0x5e, 0x2a, 0xf1, 0xe8, + 0x16, 0x8c, 0xd6, 0x61, 0x2a, 0x13, 0x79, 0x08, 0x9a, 0x4b, 0x5c, 0x73, 0x8c, 0x0e, 0x4f, 0x0b, + 0x2e, 0xa5, 0x98, 0x1a, 0xcb, 0x61, 0xba, 0x05, 0xa3, 0xe3, 0x8e, 0xcd, 0xc5, 0xd1, 0xf3, 0x08, + 0x56, 0x55, 0x7d, 0x36, 0x6d, 0x6f, 0xb2, 0xbd, 0x6c, 0x64, 0xc4, 0x10, 0x27, 0xe6, 0x6a, 0x93, + 0xf9, 0xac, 0x08, 0xed, 0xb4, 0x76, 0x68, 0x5f, 0x82, 0xe6, 0xb8, 0x44, 0xd4, 0xb9, 0x7e, 0xb7, + 0x60, 0xc4, 0x98, 0x54, 0x9a, 0x9f, 0x04, 0xc4, 0xa5, 0x67, 0x30, 0x7e, 0x22, 0x53, 0xa5, 0xcb, + 0xa9, 0x23, 0x1b, 0x95, 0xe6, 0x27, 0xc9, 0x89, 0xf8, 0xf9, 0x7f, 0x5f, 0x86, 0x46, 0x74, 0x74, + 0x50, 0x9c, 0xec, 0x5e, 0x83, 0xf2, 0x11, 0x0e, 0x55, 0x27, 0x91, 0xc8, 0xfe, 0x0d, 0x8a, 0x41, + 0x11, 0xbd, 0x61, 0x28, 0xfc, 0x63, 0x1e, 0xa2, 0x37, 0x0c, 0xb5, 0xeb, 0x50, 0xf1, 0x48, 0x20, + 0x3b, 0x40, 0x39, 0x98, 0x0c, 0x45, 0xbb, 0x09, 0xb5, 0x3e, 0xb6, 0x71, 0x88, 0xc5, 0x89, 0x3a, + 0x07, 0x59, 0x20, 0x69, 0xb7, 0xa0, 0x4e, 0x3c, 0xde, 0x86, 0xac, 0x4d, 0xc2, 0x97, 0x58, 0x94, + 0x15, 0x9a, 0x92, 0x8a, 0x22, 0x57, 0x1e, 0x2b, 0x14, 0x85, 0x9e, 0xc9, 0x3c, 0x14, 0xf6, 0x8e, + 0x45, 0xfb, 0x22, 0x07, 0x97, 0xe3, 0x8c, 0xb9, 0x89, 0xe6, 0x5c, 0x6e, 0xe2, 0xcc, 0x1d, 0xa4, + 0xbf, 0x56, 0x61, 0x4d, 0x9d, 0x4d, 0x9e, 0xd7, 0x18, 0xcf, 0x6b, 0x8c, 0xff, 0xed, 0x35, 0xc6, + 0xa7, 0x50, 0x65, 0x17, 0x34, 0x94, 0x94, 0x8a, 0x73, 0x50, 0xd2, 0x6e, 0x42, 0x85, 0xdd, 0x36, + 0x29, 0xb1, 0x45, 0xeb, 0x0a, 0x87, 0x2f, 0xea, 0x26, 0x0c, 0x6d, 0xeb, 0x67, 0x55, 0x58, 0x1a, + 0xd3, 0xda, 0xf3, 0x9e, 0xd4, 0x79, 0x4f, 0xea, 0x4c, 0x3d, 0x29, 0x95, 0x0e, 0x6b, 0xf3, 0x58, + 0xc3, 0xb7, 0x01, 0xe2, 0x14, 0xe4, 0x39, 0xdf, 0xf9, 0xfa, 0x55, 0x0d, 0x2e, 0xe6, 0x14, 0x46, + 0xce, 0xaf, 0x29, 0x9c, 0x5f, 0x53, 0x38, 0xbf, 0xa6, 0x10, 0x9b, 0xe1, 0xdf, 0x8b, 0xd0, 0x88, + 0xca, 0xe9, 0xd3, 0x2f, 0x76, 0x6d, 0x47, 0xdd, 0x19, 0x9e, 0x76, 0xaf, 0x65, 0x6b, 0xd6, 0x2c, + 0xf0, 0xc8, 0xab, 0xaf, 0x37, 0xa1, 0xce, 0x2b, 0xab, 0x32, 0x78, 0xac, 0x64, 0x0b, 0xb2, 0x81, + 0x21, 0x71, 0xb4, 0x37, 0xa0, 0x21, 0xae, 0x2b, 0xc9, 0x93, 0xf5, 0x6a, 0xfa, 0x64, 0xcd, 0x61, + 0x46, 0x84, 0x75, 0xf6, 0x3b, 0xcd, 0x18, 0x56, 0x14, 0x97, 0x11, 0xb5, 0xf7, 0x26, 0x3b, 0xa4, + 0x6c, 0xcc, 0x8d, 0x5a, 0x0b, 0x6a, 0x97, 0xf4, 0x93, 0x22, 0xb4, 0xd2, 0x5d, 0x86, 0x1d, 0xea, + 0x88, 0xf8, 0x44, 0x74, 0x7b, 0x5c, 0x71, 0xe6, 0xee, 0x16, 0x8c, 0x08, 0xef, 0xf9, 0x9e, 0xaf, + 0x7e, 0x5a, 0x84, 0x66, 0x74, 0xb2, 0xd7, 0xee, 0x40, 0x4b, 0x6e, 0x63, 0xf6, 0x48, 0x1f, 0x8b, + 0x07, 0xbd, 0x9c, 0xfb, 0xa0, 0xbc, 0xdb, 0xb1, 0x28, 0x17, 0xdd, 0x21, 0x7d, 0x75, 0x2b, 0xb0, + 0x34, 0xcf, 0xdb, 0xf8, 0x75, 0x13, 0x6a, 0xc2, 0x51, 0x2b, 0x4e, 0x7c, 0x79, 0x09, 0x4a, 0xd4, + 0x5b, 0x2d, 0x4f, 0xb8, 0xf4, 0x57, 0x99, 0x78, 0xe9, 0x6f, 0x5a, 0xe2, 0x31, 0x66, 0x89, 0xb5, + 0x8c, 0x25, 0x26, 0x5c, 0x62, 0x7d, 0x06, 0x97, 0xd8, 0x98, 0xee, 0x12, 0x9b, 0x33, 0xb8, 0x44, + 0x98, 0xc9, 0x25, 0x2e, 0x4c, 0x76, 0x89, 0x8b, 0x13, 0x5c, 0x62, 0x6b, 0x82, 0x4b, 0x6c, 0x4f, + 0x72, 0x89, 0x4b, 0x53, 0x5c, 0x62, 0x27, 0xeb, 0x12, 0x5f, 0x81, 0x36, 0x25, 0x9e, 0x30, 0x36, + 0x7e, 0x12, 0x68, 0x39, 0xe8, 0x34, 0x91, 0x2b, 0x50, 0x34, 0xcb, 0x4d, 0xa2, 0x69, 0x02, 0xcd, + 0x72, 0x13, 0x68, 0xc9, 0x40, 0xbf, 0x32, 0x76, 0x4d, 0x73, 0xa6, 0x13, 0xc1, 0x47, 0x79, 0x2e, + 0xe0, 0x42, 0xb6, 0xb5, 0x94, 0xf7, 0xe9, 0x89, 0xda, 0x1b, 0x68, 0xd7, 0x44, 0xd8, 0x5f, 0xcb, + 0xda, 0xfd, 0xa3, 0x91, 0x87, 0x79, 0xee, 0xce, 0x92, 0x81, 0xd7, 0x65, 0xd0, 0xbf, 0x98, 0x3d, + 0xdc, 0x47, 0x4d, 0x73, 0x19, 0xee, 0xaf, 0x43, 0x0d, 0xd9, 0x36, 0xd5, 0x4f, 0x3d, 0xb7, 0x77, + 0x5e, 0x45, 0xb6, 0xbd, 0x37, 0xd0, 0xbe, 0x0c, 0x90, 0x78, 0xa2, 0xf5, 0xac, 0x33, 0x8f, 0xb9, + 0x35, 0x12, 0x98, 0xda, 0xcb, 0xd0, 0xea, 0x5b, 0xd4, 0x82, 0x1c, 0xcb, 0x45, 0x21, 0xf1, 0xf5, + 0x0d, 0xa6, 0x20, 0xe9, 0xc9, 0xf4, 0x95, 0xd7, 0xcd, 0xb1, 0x2b, 0xaf, 0x2f, 0x41, 0xf9, 0xd4, + 0xb1, 0xf5, 0x4b, 0x59, 0x8b, 0xfb, 0xd0, 0xb1, 0x0d, 0x0a, 0xcb, 0x96, 0x59, 0x5f, 0x78, 0xd6, + 0x5b, 0xb1, 0x97, 0x9f, 0xe1, 0x56, 0xec, 0x8b, 0xf3, 0x78, 0xac, 0x1f, 0x00, 0xc4, 0x71, 0x6f, + 0xce, 0x2f, 0x8d, 0xde, 0x86, 0x85, 0x81, 0x65, 0x63, 0x33, 0x3f, 0xa4, 0xc6, 0x37, 0x9e, 0xbb, + 0x05, 0x03, 0x06, 0xd1, 0x28, 0xf6, 0xe2, 0x21, 0xac, 0x28, 0xba, 0xb9, 0xda, 0x77, 0x27, 0xc7, + 0xaf, 0x6b, 0xd9, 0x84, 0x3a, 0xa7, 0x25, 0xac, 0x0e, 0x67, 0x7f, 0xaa, 0xc0, 0xc5, 0xbc, 0x66, + 0xb4, 0x03, 0x2f, 0x1c, 0xa2, 0xc0, 0xea, 0x99, 0x28, 0xf5, 0x95, 0x90, 0x19, 0xd5, 0x7c, 0xb9, + 0x68, 0x5e, 0x4b, 0x55, 0x58, 0xf3, 0xbf, 0x2a, 0xea, 0x16, 0x8c, 0xcd, 0xc3, 0x09, 0x1f, 0x1d, + 0xdd, 0x87, 0x0e, 0xf2, 0x2c, 0xf3, 0x53, 0x3c, 0x8a, 0x77, 0xe0, 0x92, 0x4c, 0xd5, 0xb5, 0xd2, + 0x5f, 0x59, 0x75, 0x0b, 0x46, 0x1b, 0xa5, 0xbf, 0xbb, 0xfa, 0x1e, 0xe8, 0x84, 0xb5, 0x25, 0x4c, + 0x4b, 0x34, 0xa4, 0x62, 0x7a, 0xe5, 0x6c, 0x57, 0x54, 0xdd, 0xbb, 0xea, 0x16, 0x8c, 0x35, 0xa2, + 0xee, 0x6a, 0xc5, 0xf4, 0x3d, 0xd1, 0xeb, 0x89, 0xe9, 0x57, 0xf2, 0xe8, 0x8f, 0xb7, 0x85, 0x62, + 0xfa, 0x99, 0x86, 0xd1, 0x11, 0x6c, 0x0a, 0xfa, 0x28, 0x6e, 0x24, 0xc6, 0x5b, 0xf0, 0x00, 0xf7, + 0x4a, 0x76, 0x0b, 0x45, 0xdb, 0xb1, 0x5b, 0x30, 0xd6, 0x49, 0x6e, 0x4f, 0x12, 0xc7, 0x1b, 0xb1, + 0xae, 0x2e, 0x4b, 0x17, 0xe2, 0x8d, 0x6a, 0x59, 0xef, 0x98, 0xd7, 0x03, 0xee, 0x16, 0x0c, 0x21, + 0x93, 0x2c, 0x2c, 0xd6, 0xf0, 0xe3, 0x58, 0xc3, 0x13, 0x2d, 0x01, 0xed, 0xfd, 0xc9, 0x1a, 0x7e, + 0x29, 0xa7, 0x6d, 0xc4, 0x2f, 0x16, 0xa8, 0xb5, 0xfa, 0x2a, 0x2c, 0x24, 0x6f, 0x2e, 0xac, 0xc6, + 0x1f, 0xf7, 0x95, 0xe3, 0x3b, 0x0e, 0xbf, 0x2d, 0x42, 0xf9, 0x11, 0x52, 0xdf, 0x8a, 0x98, 0xfe, + 0xb1, 0x5b, 0xc6, 0xb3, 0x95, 0xcf, 0xfc, 0x8d, 0xc8, 0x5c, 0x5f, 0x70, 0x5d, 0x81, 0x86, 0x8c, + 0x30, 0x39, 0xcf, 0xf7, 0x31, 0x2c, 0x7d, 0x30, 0x56, 0x6f, 0x7a, 0x8e, 0x1f, 0x93, 0xfc, 0xae, + 0x08, 0xe5, 0x0f, 0x1d, 0x5b, 0x29, 0xbd, 0x4b, 0xd0, 0xa4, 0xbf, 0x81, 0x87, 0x7a, 0xf2, 0x5e, + 0x49, 0x3c, 0x41, 0x93, 0x3f, 0xcf, 0xc7, 0x03, 0xeb, 0x54, 0x64, 0x79, 0x62, 0x44, 0x57, 0xa1, + 0x30, 0xf4, 0xad, 0xc3, 0x61, 0x88, 0xc5, 0x67, 0x7a, 0xf1, 0x04, 0x4d, 0x65, 0x9e, 0xfa, 0xc8, + 0xf3, 0x70, 0x5f, 0x1c, 0xc1, 0xe5, 0xf0, 0xcc, 0x7d, 0xcc, 0xdb, 0xaf, 0x42, 0x9b, 0xf8, 0x47, + 0x12, 0xd7, 0x3c, 0xd9, 0xb9, 0xbd, 0x28, 0xbe, 0x5d, 0xdd, 0xf7, 0x49, 0x48, 0xf6, 0x8b, 0xbf, + 0x28, 0x95, 0xf7, 0x76, 0x0f, 0x0e, 0x6b, 0xec, 0x63, 0xd0, 0x37, 0xff, 0x19, 0x00, 0x00, 0xff, + 0xff, 0xd4, 0x0a, 0xef, 0xca, 0xe4, 0x3a, 0x00, 0x00, +} diff --git a/vendor/github.com/googleapis/gnostic/compiler/context.go b/vendor/github.com/googleapis/gnostic/compiler/context.go new file mode 100644 index 000000000..a64c1b75d --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/compiler/context.go @@ -0,0 +1,43 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compiler + +// Context contains state of the compiler as it traverses a document. +type Context struct { + Parent *Context + Name string + ExtensionHandlers *[]ExtensionHandler +} + +// NewContextWithExtensions returns a new object representing the compiler state +func NewContextWithExtensions(name string, parent *Context, extensionHandlers *[]ExtensionHandler) *Context { + return &Context{Name: name, Parent: parent, ExtensionHandlers: extensionHandlers} +} + +// NewContext returns a new object representing the compiler state +func NewContext(name string, parent *Context) *Context { + if parent != nil { + return &Context{Name: name, Parent: parent, ExtensionHandlers: parent.ExtensionHandlers} + } + return &Context{Name: name, Parent: parent, ExtensionHandlers: nil} +} + +// Description returns a text description of the compiler state +func (context *Context) Description() string { + if context.Parent != nil { + return context.Parent.Description() + "." + context.Name + } + return context.Name +} diff --git a/vendor/github.com/googleapis/gnostic/compiler/error.go b/vendor/github.com/googleapis/gnostic/compiler/error.go new file mode 100644 index 000000000..d8672c100 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/compiler/error.go @@ -0,0 +1,61 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compiler + +// Error represents compiler errors and their location in the document. +type Error struct { + Context *Context + Message string +} + +// NewError creates an Error. +func NewError(context *Context, message string) *Error { + return &Error{Context: context, Message: message} +} + +// Error returns the string value of an Error. +func (err *Error) Error() string { + if err.Context == nil { + return "ERROR " + err.Message + } + return "ERROR " + err.Context.Description() + " " + err.Message +} + +// ErrorGroup is a container for groups of Error values. +type ErrorGroup struct { + Errors []error +} + +// NewErrorGroupOrNil returns a new ErrorGroup for a slice of errors or nil if the slice is empty. +func NewErrorGroupOrNil(errors []error) error { + if len(errors) == 0 { + return nil + } else if len(errors) == 1 { + return errors[0] + } else { + return &ErrorGroup{Errors: errors} + } +} + +func (group *ErrorGroup) Error() string { + result := "" + for i, err := range group.Errors { + if i > 0 { + result += "\n" + } + result += err.Error() + } + return result +} diff --git a/vendor/github.com/googleapis/gnostic/compiler/extension-handler.go b/vendor/github.com/googleapis/gnostic/compiler/extension-handler.go new file mode 100644 index 000000000..1f85b650e --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/compiler/extension-handler.go @@ -0,0 +1,101 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compiler + +import ( + "bytes" + "fmt" + "os/exec" + + "strings" + + "errors" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" + ext_plugin "github.com/googleapis/gnostic/extensions" + yaml "gopkg.in/yaml.v2" +) + +// ExtensionHandler describes a binary that is called by the compiler to handle specification extensions. +type ExtensionHandler struct { + Name string +} + +// HandleExtension calls a binary extension handler. +func HandleExtension(context *Context, in interface{}, extensionName string) (bool, *any.Any, error) { + handled := false + var errFromPlugin error + var outFromPlugin *any.Any + + if context != nil && context.ExtensionHandlers != nil && len(*(context.ExtensionHandlers)) != 0 { + for _, customAnyProtoGenerator := range *(context.ExtensionHandlers) { + outFromPlugin, errFromPlugin = customAnyProtoGenerator.handle(in, extensionName) + if outFromPlugin == nil { + continue + } else { + handled = true + break + } + } + } + return handled, outFromPlugin, errFromPlugin +} + +func (extensionHandlers *ExtensionHandler) handle(in interface{}, extensionName string) (*any.Any, error) { + if extensionHandlers.Name != "" { + binary, _ := yaml.Marshal(in) + + request := &ext_plugin.ExtensionHandlerRequest{} + + version := &ext_plugin.Version{} + version.Major = 0 + version.Minor = 1 + version.Patch = 0 + request.CompilerVersion = version + + request.Wrapper = &ext_plugin.Wrapper{} + + request.Wrapper.Version = "v2" + request.Wrapper.Yaml = string(binary) + request.Wrapper.ExtensionName = extensionName + + requestBytes, _ := proto.Marshal(request) + cmd := exec.Command(extensionHandlers.Name) + cmd.Stdin = bytes.NewReader(requestBytes) + output, err := cmd.Output() + + if err != nil { + fmt.Printf("Error: %+v\n", err) + return nil, err + } + response := &ext_plugin.ExtensionHandlerResponse{} + err = proto.Unmarshal(output, response) + if err != nil { + fmt.Printf("Error: %+v\n", err) + fmt.Printf("%s\n", string(output)) + return nil, err + } + if !response.Handled { + return nil, nil + } + if len(response.Error) != 0 { + message := fmt.Sprintf("Errors when parsing: %+v for field %s by vendor extension handler %s. Details %+v", in, extensionName, extensionHandlers.Name, strings.Join(response.Error, ",")) + return nil, errors.New(message) + } + return response.Value, nil + } + return nil, nil +} diff --git a/vendor/github.com/googleapis/gnostic/compiler/helpers.go b/vendor/github.com/googleapis/gnostic/compiler/helpers.go new file mode 100644 index 000000000..76df635ff --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/compiler/helpers.go @@ -0,0 +1,197 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compiler + +import ( + "fmt" + "gopkg.in/yaml.v2" + "regexp" + "sort" + "strconv" +) + +// compiler helper functions, usually called from generated code + +// UnpackMap gets a yaml.MapSlice if possible. +func UnpackMap(in interface{}) (yaml.MapSlice, bool) { + m, ok := in.(yaml.MapSlice) + if ok { + return m, true + } + // do we have an empty array? + a, ok := in.([]interface{}) + if ok && len(a) == 0 { + // if so, return an empty map + return yaml.MapSlice{}, true + } + return nil, false +} + +// SortedKeysForMap returns the sorted keys of a yaml.MapSlice. +func SortedKeysForMap(m yaml.MapSlice) []string { + keys := make([]string, 0) + for _, item := range m { + keys = append(keys, item.Key.(string)) + } + sort.Strings(keys) + return keys +} + +// MapHasKey returns true if a yaml.MapSlice contains a specified key. +func MapHasKey(m yaml.MapSlice, key string) bool { + for _, item := range m { + itemKey, ok := item.Key.(string) + if ok && key == itemKey { + return true + } + } + return false +} + +// MapValueForKey gets the value of a map value for a specified key. +func MapValueForKey(m yaml.MapSlice, key string) interface{} { + for _, item := range m { + itemKey, ok := item.Key.(string) + if ok && key == itemKey { + return item.Value + } + } + return nil +} + +// ConvertInterfaceArrayToStringArray converts an array of interfaces to an array of strings, if possible. +func ConvertInterfaceArrayToStringArray(interfaceArray []interface{}) []string { + stringArray := make([]string, 0) + for _, item := range interfaceArray { + v, ok := item.(string) + if ok { + stringArray = append(stringArray, v) + } + } + return stringArray +} + +// MissingKeysInMap identifies which keys from a list of required keys are not in a map. +func MissingKeysInMap(m yaml.MapSlice, requiredKeys []string) []string { + missingKeys := make([]string, 0) + for _, k := range requiredKeys { + if !MapHasKey(m, k) { + missingKeys = append(missingKeys, k) + } + } + return missingKeys +} + +// InvalidKeysInMap returns keys in a map that don't match a list of allowed keys and patterns. +func InvalidKeysInMap(m yaml.MapSlice, allowedKeys []string, allowedPatterns []*regexp.Regexp) []string { + invalidKeys := make([]string, 0) + for _, item := range m { + itemKey, ok := item.Key.(string) + if ok { + key := itemKey + found := false + // does the key match an allowed key? + for _, allowedKey := range allowedKeys { + if key == allowedKey { + found = true + break + } + } + if !found { + // does the key match an allowed pattern? + for _, allowedPattern := range allowedPatterns { + if allowedPattern.MatchString(key) { + found = true + break + } + } + if !found { + invalidKeys = append(invalidKeys, key) + } + } + } + } + return invalidKeys +} + +// DescribeMap describes a map (for debugging purposes). +func DescribeMap(in interface{}, indent string) string { + description := "" + m, ok := in.(map[string]interface{}) + if ok { + keys := make([]string, 0) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + v := m[k] + description += fmt.Sprintf("%s%s:\n", indent, k) + description += DescribeMap(v, indent+" ") + } + return description + } + a, ok := in.([]interface{}) + if ok { + for i, v := range a { + description += fmt.Sprintf("%s%d:\n", indent, i) + description += DescribeMap(v, indent+" ") + } + return description + } + description += fmt.Sprintf("%s%+v\n", indent, in) + return description +} + +// PluralProperties returns the string "properties" pluralized. +func PluralProperties(count int) string { + if count == 1 { + return "property" + } + return "properties" +} + +// StringArrayContainsValue returns true if a string array contains a specified value. +func StringArrayContainsValue(array []string, value string) bool { + for _, item := range array { + if item == value { + return true + } + } + return false +} + +// StringArrayContainsValues returns true if a string array contains all of a list of specified values. +func StringArrayContainsValues(array []string, values []string) bool { + for _, value := range values { + if !StringArrayContainsValue(array, value) { + return false + } + } + return true +} + +// StringValue returns the string value of an item. +func StringValue(item interface{}) (value string, ok bool) { + value, ok = item.(string) + if ok { + return value, ok + } + intValue, ok := item.(int) + if ok { + return strconv.Itoa(intValue), true + } + return "", false +} diff --git a/vendor/github.com/googleapis/gnostic/compiler/main.go b/vendor/github.com/googleapis/gnostic/compiler/main.go new file mode 100644 index 000000000..9713a21cc --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/compiler/main.go @@ -0,0 +1,16 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package compiler provides support functions to generated compiler code. +package compiler diff --git a/vendor/github.com/googleapis/gnostic/compiler/reader.go b/vendor/github.com/googleapis/gnostic/compiler/reader.go new file mode 100644 index 000000000..c954a2d9b --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/compiler/reader.go @@ -0,0 +1,175 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compiler + +import ( + "errors" + "fmt" + "gopkg.in/yaml.v2" + "io/ioutil" + "log" + "net/http" + "net/url" + "path/filepath" + "strings" +) + +var fileCache map[string][]byte +var infoCache map[string]interface{} +var count int64 + +var verboseReader = false + +func initializeFileCache() { + if fileCache == nil { + fileCache = make(map[string][]byte, 0) + } +} + +func initializeInfoCache() { + if infoCache == nil { + infoCache = make(map[string]interface{}, 0) + } +} + +// FetchFile gets a specified file from the local filesystem or a remote location. +func FetchFile(fileurl string) ([]byte, error) { + initializeFileCache() + bytes, ok := fileCache[fileurl] + if ok { + if verboseReader { + log.Printf("Cache hit %s", fileurl) + } + return bytes, nil + } + if verboseReader { + log.Printf("Fetching %s", fileurl) + } + response, err := http.Get(fileurl) + if err != nil { + return nil, err + } + if response.StatusCode != 200 { + return nil, errors.New(fmt.Sprintf("Error downloading %s: %s", fileurl, response.Status)) + } + defer response.Body.Close() + bytes, err = ioutil.ReadAll(response.Body) + if err == nil { + fileCache[fileurl] = bytes + } + return bytes, err +} + +// ReadBytesForFile reads the bytes of a file. +func ReadBytesForFile(filename string) ([]byte, error) { + // is the filename a url? + fileurl, _ := url.Parse(filename) + if fileurl.Scheme != "" { + // yes, fetch it + bytes, err := FetchFile(filename) + if err != nil { + return nil, err + } + return bytes, nil + } + // no, it's a local filename + bytes, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + return bytes, nil +} + +// ReadInfoFromBytes unmarshals a file as a yaml.MapSlice. +func ReadInfoFromBytes(filename string, bytes []byte) (interface{}, error) { + initializeInfoCache() + cachedInfo, ok := infoCache[filename] + if ok { + if verboseReader { + log.Printf("Cache hit info for file %s", filename) + } + return cachedInfo, nil + } + if verboseReader { + log.Printf("Reading info for file %s", filename) + } + var info yaml.MapSlice + err := yaml.Unmarshal(bytes, &info) + if err != nil { + return nil, err + } + if len(filename) > 0 { + infoCache[filename] = info + } + return info, nil +} + +// ReadInfoForRef reads a file and return the fragment needed to resolve a $ref. +func ReadInfoForRef(basefile string, ref string) (interface{}, error) { + initializeInfoCache() + { + info, ok := infoCache[ref] + if ok { + if verboseReader { + log.Printf("Cache hit for ref %s#%s", basefile, ref) + } + return info, nil + } + } + if verboseReader { + log.Printf("Reading info for ref %s#%s", basefile, ref) + } + count = count + 1 + basedir, _ := filepath.Split(basefile) + parts := strings.Split(ref, "#") + var filename string + if parts[0] != "" { + filename = basedir + parts[0] + } else { + filename = basefile + } + bytes, err := ReadBytesForFile(filename) + if err != nil { + return nil, err + } + info, err := ReadInfoFromBytes(filename, bytes) + if err != nil { + log.Printf("File error: %v\n", err) + } else { + if len(parts) > 1 { + path := strings.Split(parts[1], "/") + for i, key := range path { + if i > 0 { + m, ok := info.(yaml.MapSlice) + if ok { + found := false + for _, section := range m { + if section.Key == key { + info = section.Value + found = true + } + } + if !found { + infoCache[ref] = nil + return nil, NewError(nil, fmt.Sprintf("could not resolve %s", ref)) + } + } + } + } + } + } + infoCache[ref] = info + return info, nil +} diff --git a/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go b/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go new file mode 100644 index 000000000..749ff7841 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go @@ -0,0 +1,218 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: extension.proto + +/* +Package openapiextension_v1 is a generated protocol buffer package. + +It is generated from these files: + extension.proto + +It has these top-level messages: + Version + ExtensionHandlerRequest + ExtensionHandlerResponse + Wrapper +*/ +package openapiextension_v1 + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// The version number of OpenAPI compiler. +type Version struct { + Major int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix string `protobuf:"bytes,4,opt,name=suffix" json:"suffix,omitempty"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Version) GetMajor() int32 { + if m != nil { + return m.Major + } + return 0 +} + +func (m *Version) GetMinor() int32 { + if m != nil { + return m.Minor + } + return 0 +} + +func (m *Version) GetPatch() int32 { + if m != nil { + return m.Patch + } + return 0 +} + +func (m *Version) GetSuffix() string { + if m != nil { + return m.Suffix + } + return "" +} + +// An encoded Request is written to the ExtensionHandler's stdin. +type ExtensionHandlerRequest struct { + // The OpenAPI descriptions that were explicitly listed on the command line. + // The specifications will appear in the order they are specified to gnostic. + Wrapper *Wrapper `protobuf:"bytes,1,opt,name=wrapper" json:"wrapper,omitempty"` + // The version number of openapi compiler. + CompilerVersion *Version `protobuf:"bytes,3,opt,name=compiler_version,json=compilerVersion" json:"compiler_version,omitempty"` +} + +func (m *ExtensionHandlerRequest) Reset() { *m = ExtensionHandlerRequest{} } +func (m *ExtensionHandlerRequest) String() string { return proto.CompactTextString(m) } +func (*ExtensionHandlerRequest) ProtoMessage() {} +func (*ExtensionHandlerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *ExtensionHandlerRequest) GetWrapper() *Wrapper { + if m != nil { + return m.Wrapper + } + return nil +} + +func (m *ExtensionHandlerRequest) GetCompilerVersion() *Version { + if m != nil { + return m.CompilerVersion + } + return nil +} + +// The extensions writes an encoded ExtensionHandlerResponse to stdout. +type ExtensionHandlerResponse struct { + // true if the extension is handled by the extension handler; false otherwise + Handled bool `protobuf:"varint,1,opt,name=handled" json:"handled,omitempty"` + // Error message. If non-empty, the extension handling failed. + // The extension handler process should exit with status code zero + // even if it reports an error in this way. + // + // This should be used to indicate errors which prevent the extension from + // operating as intended. Errors which indicate a problem in gnostic + // itself -- such as the input Document being unparseable -- should be + // reported by writing a message to stderr and exiting with a non-zero + // status code. + Error []string `protobuf:"bytes,2,rep,name=error" json:"error,omitempty"` + // text output + Value *google_protobuf.Any `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` +} + +func (m *ExtensionHandlerResponse) Reset() { *m = ExtensionHandlerResponse{} } +func (m *ExtensionHandlerResponse) String() string { return proto.CompactTextString(m) } +func (*ExtensionHandlerResponse) ProtoMessage() {} +func (*ExtensionHandlerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *ExtensionHandlerResponse) GetHandled() bool { + if m != nil { + return m.Handled + } + return false +} + +func (m *ExtensionHandlerResponse) GetError() []string { + if m != nil { + return m.Error + } + return nil +} + +func (m *ExtensionHandlerResponse) GetValue() *google_protobuf.Any { + if m != nil { + return m.Value + } + return nil +} + +type Wrapper struct { + // version of the OpenAPI specification in which this extension was written. + Version string `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // Name of the extension + ExtensionName string `protobuf:"bytes,2,opt,name=extension_name,json=extensionName" json:"extension_name,omitempty"` + // Must be a valid yaml for the proto + Yaml string `protobuf:"bytes,3,opt,name=yaml" json:"yaml,omitempty"` +} + +func (m *Wrapper) Reset() { *m = Wrapper{} } +func (m *Wrapper) String() string { return proto.CompactTextString(m) } +func (*Wrapper) ProtoMessage() {} +func (*Wrapper) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *Wrapper) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *Wrapper) GetExtensionName() string { + if m != nil { + return m.ExtensionName + } + return "" +} + +func (m *Wrapper) GetYaml() string { + if m != nil { + return m.Yaml + } + return "" +} + +func init() { + proto.RegisterType((*Version)(nil), "openapiextension.v1.Version") + proto.RegisterType((*ExtensionHandlerRequest)(nil), "openapiextension.v1.ExtensionHandlerRequest") + proto.RegisterType((*ExtensionHandlerResponse)(nil), "openapiextension.v1.ExtensionHandlerResponse") + proto.RegisterType((*Wrapper)(nil), "openapiextension.v1.Wrapper") +} + +func init() { proto.RegisterFile("extension.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 357 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0x4d, 0x4b, 0xc3, 0x40, + 0x18, 0x84, 0x49, 0xbf, 0x62, 0x56, 0x6c, 0x65, 0x2d, 0x1a, 0xc5, 0x43, 0x09, 0x08, 0x45, 0x64, + 0x4b, 0x15, 0xbc, 0xb7, 0x50, 0xd4, 0x8b, 0x2d, 0x7b, 0xa8, 0x37, 0xcb, 0x36, 0x7d, 0x9b, 0x46, + 0x92, 0xdd, 0x75, 0xf3, 0x61, 0xfb, 0x57, 0x3c, 0xfa, 0x4b, 0x25, 0xbb, 0x49, 0x3d, 0xa8, 0xb7, + 0xcc, 0xc3, 0x24, 0xef, 0xcc, 0x04, 0x75, 0x60, 0x9b, 0x02, 0x4f, 0x42, 0xc1, 0x89, 0x54, 0x22, + 0x15, 0xf8, 0x44, 0x48, 0xe0, 0x4c, 0x86, 0x3f, 0x3c, 0x1f, 0x5e, 0x9c, 0x07, 0x42, 0x04, 0x11, + 0x0c, 0xb4, 0x65, 0x99, 0xad, 0x07, 0x8c, 0xef, 0x8c, 0xdf, 0xf3, 0x91, 0x3d, 0x07, 0x55, 0x18, + 0x71, 0x17, 0x35, 0x63, 0xf6, 0x26, 0x94, 0x6b, 0xf5, 0xac, 0x7e, 0x93, 0x1a, 0xa1, 0x69, 0xc8, + 0x85, 0x72, 0x6b, 0x25, 0x2d, 0x44, 0x41, 0x25, 0x4b, 0xfd, 0x8d, 0x5b, 0x37, 0x54, 0x0b, 0x7c, + 0x8a, 0x5a, 0x49, 0xb6, 0x5e, 0x87, 0x5b, 0xb7, 0xd1, 0xb3, 0xfa, 0x0e, 0x2d, 0x95, 0xf7, 0x69, + 0xa1, 0xb3, 0x49, 0x15, 0xe8, 0x91, 0xf1, 0x55, 0x04, 0x8a, 0xc2, 0x7b, 0x06, 0x49, 0x8a, 0xef, + 0x91, 0xfd, 0xa1, 0x98, 0x94, 0x60, 0xee, 0x1e, 0xde, 0x5e, 0x92, 0x3f, 0x2a, 0x90, 0x17, 0xe3, + 0xa1, 0x95, 0x19, 0x3f, 0xa0, 0x63, 0x5f, 0xc4, 0x32, 0x8c, 0x40, 0x2d, 0x72, 0xd3, 0x40, 0x87, + 0xf9, 0xef, 0x03, 0x65, 0x4b, 0xda, 0xa9, 0xde, 0x2a, 0x81, 0x97, 0x23, 0xf7, 0x77, 0xb6, 0x44, + 0x0a, 0x9e, 0x00, 0x76, 0x91, 0xbd, 0xd1, 0x68, 0xa5, 0xc3, 0x1d, 0xd0, 0x4a, 0x16, 0x03, 0x80, + 0x52, 0x7a, 0x96, 0x7a, 0xdf, 0xa1, 0x46, 0xe0, 0x6b, 0xd4, 0xcc, 0x59, 0x94, 0x41, 0x99, 0xa4, + 0x4b, 0xcc, 0xf0, 0xa4, 0x1a, 0x9e, 0x8c, 0xf8, 0x8e, 0x1a, 0x8b, 0xf7, 0x8a, 0xec, 0xb2, 0x54, + 0x71, 0xa6, 0xaa, 0x60, 0xe9, 0xe1, 0x2a, 0x89, 0xaf, 0x50, 0x7b, 0xdf, 0x62, 0xc1, 0x59, 0x0c, + 0xfa, 0x37, 0x38, 0xf4, 0x68, 0x4f, 0x9f, 0x59, 0x0c, 0x18, 0xa3, 0xc6, 0x8e, 0xc5, 0x91, 0x3e, + 0xeb, 0x50, 0xfd, 0x3c, 0xbe, 0x41, 0x6d, 0xa1, 0x02, 0x12, 0x70, 0x91, 0xa4, 0xa1, 0x4f, 0xf2, + 0xe1, 0x18, 0x4f, 0x25, 0xf0, 0xd1, 0xec, 0x69, 0x5f, 0x77, 0x3e, 0x9c, 0x59, 0x5f, 0xb5, 0xfa, + 0x74, 0x34, 0x59, 0xb6, 0x74, 0xc4, 0xbb, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x5c, 0x6b, + 0x80, 0x51, 0x02, 0x00, 0x00, +} diff --git a/vendor/github.com/googleapis/gnostic/extensions/extensions.go b/vendor/github.com/googleapis/gnostic/extensions/extensions.go new file mode 100644 index 000000000..94a8e62a7 --- /dev/null +++ b/vendor/github.com/googleapis/gnostic/extensions/extensions.go @@ -0,0 +1,82 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package openapiextension_v1 + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" +) + +type documentHandler func(version string, extensionName string, document string) +type extensionHandler func(name string, yamlInput string) (bool, proto.Message, error) + +func forInputYamlFromOpenapic(handler documentHandler) { + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + fmt.Println("File error:", err.Error()) + os.Exit(1) + } + if len(data) == 0 { + fmt.Println("No input data.") + os.Exit(1) + } + request := &ExtensionHandlerRequest{} + err = proto.Unmarshal(data, request) + if err != nil { + fmt.Println("Input error:", err.Error()) + os.Exit(1) + } + handler(request.Wrapper.Version, request.Wrapper.ExtensionName, request.Wrapper.Yaml) +} + +// ProcessExtension calles the handler for a specified extension. +func ProcessExtension(handleExtension extensionHandler) { + response := &ExtensionHandlerResponse{} + forInputYamlFromOpenapic( + func(version string, extensionName string, yamlInput string) { + var newObject proto.Message + var err error + + handled, newObject, err := handleExtension(extensionName, yamlInput) + if !handled { + responseBytes, _ := proto.Marshal(response) + os.Stdout.Write(responseBytes) + os.Exit(0) + } + + // If we reach here, then the extension is handled + response.Handled = true + if err != nil { + response.Error = append(response.Error, err.Error()) + responseBytes, _ := proto.Marshal(response) + os.Stdout.Write(responseBytes) + os.Exit(0) + } + response.Value, err = ptypes.MarshalAny(newObject) + if err != nil { + response.Error = append(response.Error, err.Error()) + responseBytes, _ := proto.Marshal(response) + os.Stdout.Write(responseBytes) + os.Exit(0) + } + }) + + responseBytes, _ := proto.Marshal(response) + os.Stdout.Write(responseBytes) +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/LICENSE.txt b/vendor/github.com/grpc-ecosystem/grpc-gateway/LICENSE.txt new file mode 100644 index 000000000..364516251 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2015, Gengo, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Gengo, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/internal/stream_chunk.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/internal/stream_chunk.pb.go new file mode 100644 index 000000000..1eca68e33 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/internal/stream_chunk.pb.go @@ -0,0 +1,119 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: internal/stream_chunk.proto + +package internal + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// StreamError is a response type which is returned when +// streaming rpc returns an error. +type StreamError struct { + GrpcCode int32 `protobuf:"varint,1,opt,name=grpc_code,json=grpcCode,proto3" json:"grpc_code,omitempty"` + HttpCode int32 `protobuf:"varint,2,opt,name=http_code,json=httpCode,proto3" json:"http_code,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + HttpStatus string `protobuf:"bytes,4,opt,name=http_status,json=httpStatus,proto3" json:"http_status,omitempty"` + Details []*any.Any `protobuf:"bytes,5,rep,name=details,proto3" json:"details,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StreamError) Reset() { *m = StreamError{} } +func (m *StreamError) String() string { return proto.CompactTextString(m) } +func (*StreamError) ProtoMessage() {} +func (*StreamError) Descriptor() ([]byte, []int) { + return fileDescriptor_9d15b670e96bbb5a, []int{0} +} + +func (m *StreamError) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StreamError.Unmarshal(m, b) +} +func (m *StreamError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StreamError.Marshal(b, m, deterministic) +} +func (m *StreamError) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamError.Merge(m, src) +} +func (m *StreamError) XXX_Size() int { + return xxx_messageInfo_StreamError.Size(m) +} +func (m *StreamError) XXX_DiscardUnknown() { + xxx_messageInfo_StreamError.DiscardUnknown(m) +} + +var xxx_messageInfo_StreamError proto.InternalMessageInfo + +func (m *StreamError) GetGrpcCode() int32 { + if m != nil { + return m.GrpcCode + } + return 0 +} + +func (m *StreamError) GetHttpCode() int32 { + if m != nil { + return m.HttpCode + } + return 0 +} + +func (m *StreamError) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +func (m *StreamError) GetHttpStatus() string { + if m != nil { + return m.HttpStatus + } + return "" +} + +func (m *StreamError) GetDetails() []*any.Any { + if m != nil { + return m.Details + } + return nil +} + +func init() { + proto.RegisterType((*StreamError)(nil), "grpc.gateway.runtime.StreamError") +} + +func init() { proto.RegisterFile("internal/stream_chunk.proto", fileDescriptor_9d15b670e96bbb5a) } + +var fileDescriptor_9d15b670e96bbb5a = []byte{ + // 223 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x34, 0x90, 0x41, 0x4e, 0xc3, 0x30, + 0x10, 0x45, 0x15, 0x4a, 0x69, 0x3b, 0xd9, 0x45, 0x5d, 0x18, 0xba, 0x20, 0x62, 0x95, 0x95, 0x23, + 0xc1, 0x09, 0x00, 0x71, 0x81, 0x74, 0xc7, 0xa6, 0x9a, 0x26, 0x83, 0x13, 0x91, 0xd8, 0xd1, 0x78, + 0x22, 0x94, 0x6b, 0x71, 0xc2, 0xca, 0x8e, 0xb2, 0xf4, 0x7b, 0x7f, 0xbe, 0xbe, 0x0c, 0xa7, 0xce, + 0x0a, 0xb1, 0xc5, 0xbe, 0xf4, 0xc2, 0x84, 0xc3, 0xa5, 0x6e, 0x27, 0xfb, 0xab, 0x47, 0x76, 0xe2, + 0xb2, 0xa3, 0xe1, 0xb1, 0xd6, 0x06, 0x85, 0xfe, 0x70, 0xd6, 0x3c, 0x59, 0xe9, 0x06, 0x7a, 0x7a, + 0x34, 0xce, 0x99, 0x9e, 0xca, 0x98, 0xb9, 0x4e, 0x3f, 0x25, 0xda, 0x79, 0x39, 0x78, 0xf9, 0x4f, + 0x20, 0x3d, 0xc7, 0x9e, 0x2f, 0x66, 0xc7, 0xd9, 0x09, 0x0e, 0xa1, 0xe2, 0x52, 0xbb, 0x86, 0x54, + 0x92, 0x27, 0xc5, 0xb6, 0xda, 0x07, 0xf0, 0xe9, 0x1a, 0x0a, 0xb2, 0x15, 0x19, 0x17, 0x79, 0xb7, + 0xc8, 0x00, 0xa2, 0x54, 0xb0, 0x1b, 0xc8, 0x7b, 0x34, 0xa4, 0x36, 0x79, 0x52, 0x1c, 0xaa, 0xf5, + 0x99, 0x3d, 0x43, 0x1a, 0xcf, 0xbc, 0xa0, 0x4c, 0x5e, 0xdd, 0x47, 0x0b, 0x01, 0x9d, 0x23, 0xc9, + 0x34, 0xec, 0x1a, 0x12, 0xec, 0x7a, 0xaf, 0xb6, 0xf9, 0xa6, 0x48, 0x5f, 0x8f, 0x7a, 0x59, 0xac, + 0xd7, 0xc5, 0xfa, 0xdd, 0xce, 0xd5, 0x1a, 0xfa, 0x80, 0xef, 0xfd, 0xfa, 0x09, 0xd7, 0x87, 0x18, + 0x79, 0xbb, 0x05, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x7d, 0xa5, 0x18, 0x17, 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go new file mode 100644 index 000000000..f8083821f --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go @@ -0,0 +1,236 @@ +package runtime + +import ( + "context" + "encoding/base64" + "fmt" + "net" + "net/http" + "net/textproto" + "strconv" + "strings" + "time" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// MetadataHeaderPrefix is the http prefix that represents custom metadata +// parameters to or from a gRPC call. +const MetadataHeaderPrefix = "Grpc-Metadata-" + +// MetadataPrefix is prepended to permanent HTTP header keys (as specified +// by the IANA) when added to the gRPC context. +const MetadataPrefix = "grpcgateway-" + +// MetadataTrailerPrefix is prepended to gRPC metadata as it is converted to +// HTTP headers in a response handled by grpc-gateway +const MetadataTrailerPrefix = "Grpc-Trailer-" + +const metadataGrpcTimeout = "Grpc-Timeout" +const metadataHeaderBinarySuffix = "-Bin" + +const xForwardedFor = "X-Forwarded-For" +const xForwardedHost = "X-Forwarded-Host" + +var ( + // DefaultContextTimeout is used for gRPC call context.WithTimeout whenever a Grpc-Timeout inbound + // header isn't present. If the value is 0 the sent `context` will not have a timeout. + DefaultContextTimeout = 0 * time.Second +) + +func decodeBinHeader(v string) ([]byte, error) { + if len(v)%4 == 0 { + // Input was padded, or padding was not necessary. + return base64.StdEncoding.DecodeString(v) + } + return base64.RawStdEncoding.DecodeString(v) +} + +/* +AnnotateContext adds context information such as metadata from the request. + +At a minimum, the RemoteAddr is included in the fashion of "X-Forwarded-For", +except that the forwarded destination is not another HTTP service but rather +a gRPC service. +*/ +func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) { + ctx, md, err := annotateContext(ctx, mux, req) + if err != nil { + return nil, err + } + if md == nil { + return ctx, nil + } + + return metadata.NewOutgoingContext(ctx, md), nil +} + +// AnnotateIncomingContext adds context information such as metadata from the request. +// Attach metadata as incoming context. +func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) { + ctx, md, err := annotateContext(ctx, mux, req) + if err != nil { + return nil, err + } + if md == nil { + return ctx, nil + } + + return metadata.NewIncomingContext(ctx, md), nil +} + +func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, metadata.MD, error) { + var pairs []string + timeout := DefaultContextTimeout + if tm := req.Header.Get(metadataGrpcTimeout); tm != "" { + var err error + timeout, err = timeoutDecode(tm) + if err != nil { + return nil, nil, status.Errorf(codes.InvalidArgument, "invalid grpc-timeout: %s", tm) + } + } + + for key, vals := range req.Header { + for _, val := range vals { + key = textproto.CanonicalMIMEHeaderKey(key) + // For backwards-compatibility, pass through 'authorization' header with no prefix. + if key == "Authorization" { + pairs = append(pairs, "authorization", val) + } + if h, ok := mux.incomingHeaderMatcher(key); ok { + // Handles "-bin" metadata in grpc, since grpc will do another base64 + // encode before sending to server, we need to decode it first. + if strings.HasSuffix(key, metadataHeaderBinarySuffix) { + b, err := decodeBinHeader(val) + if err != nil { + return nil, nil, status.Errorf(codes.InvalidArgument, "invalid binary header %s: %s", key, err) + } + + val = string(b) + } + pairs = append(pairs, h, val) + } + } + } + if host := req.Header.Get(xForwardedHost); host != "" { + pairs = append(pairs, strings.ToLower(xForwardedHost), host) + } else if req.Host != "" { + pairs = append(pairs, strings.ToLower(xForwardedHost), req.Host) + } + + if addr := req.RemoteAddr; addr != "" { + if remoteIP, _, err := net.SplitHostPort(addr); err == nil { + if fwd := req.Header.Get(xForwardedFor); fwd == "" { + pairs = append(pairs, strings.ToLower(xForwardedFor), remoteIP) + } else { + pairs = append(pairs, strings.ToLower(xForwardedFor), fmt.Sprintf("%s, %s", fwd, remoteIP)) + } + } else { + grpclog.Infof("invalid remote addr: %s", addr) + } + } + + if timeout != 0 { + ctx, _ = context.WithTimeout(ctx, timeout) + } + if len(pairs) == 0 { + return ctx, nil, nil + } + md := metadata.Pairs(pairs...) + for _, mda := range mux.metadataAnnotators { + md = metadata.Join(md, mda(ctx, req)) + } + return ctx, md, nil +} + +// ServerMetadata consists of metadata sent from gRPC server. +type ServerMetadata struct { + HeaderMD metadata.MD + TrailerMD metadata.MD +} + +type serverMetadataKey struct{} + +// NewServerMetadataContext creates a new context with ServerMetadata +func NewServerMetadataContext(ctx context.Context, md ServerMetadata) context.Context { + return context.WithValue(ctx, serverMetadataKey{}, md) +} + +// ServerMetadataFromContext returns the ServerMetadata in ctx +func ServerMetadataFromContext(ctx context.Context) (md ServerMetadata, ok bool) { + md, ok = ctx.Value(serverMetadataKey{}).(ServerMetadata) + return +} + +func timeoutDecode(s string) (time.Duration, error) { + size := len(s) + if size < 2 { + return 0, fmt.Errorf("timeout string is too short: %q", s) + } + d, ok := timeoutUnitToDuration(s[size-1]) + if !ok { + return 0, fmt.Errorf("timeout unit is not recognized: %q", s) + } + t, err := strconv.ParseInt(s[:size-1], 10, 64) + if err != nil { + return 0, err + } + return d * time.Duration(t), nil +} + +func timeoutUnitToDuration(u uint8) (d time.Duration, ok bool) { + switch u { + case 'H': + return time.Hour, true + case 'M': + return time.Minute, true + case 'S': + return time.Second, true + case 'm': + return time.Millisecond, true + case 'u': + return time.Microsecond, true + case 'n': + return time.Nanosecond, true + default: + } + return +} + +// isPermanentHTTPHeader checks whether hdr belongs to the list of +// permenant request headers maintained by IANA. +// http://www.iana.org/assignments/message-headers/message-headers.xml +func isPermanentHTTPHeader(hdr string) bool { + switch hdr { + case + "Accept", + "Accept-Charset", + "Accept-Language", + "Accept-Ranges", + "Authorization", + "Cache-Control", + "Content-Type", + "Cookie", + "Date", + "Expect", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Schedule-Tag-Match", + "If-Unmodified-Since", + "Max-Forwards", + "Origin", + "Pragma", + "Referer", + "User-Agent", + "Via", + "Warning": + return true + } + return false +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go new file mode 100644 index 000000000..2c279344d --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go @@ -0,0 +1,318 @@ +package runtime + +import ( + "encoding/base64" + "fmt" + "strconv" + "strings" + + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/ptypes/duration" + "github.com/golang/protobuf/ptypes/timestamp" + "github.com/golang/protobuf/ptypes/wrappers" +) + +// String just returns the given string. +// It is just for compatibility to other types. +func String(val string) (string, error) { + return val, nil +} + +// StringSlice converts 'val' where individual strings are separated by +// 'sep' into a string slice. +func StringSlice(val, sep string) ([]string, error) { + return strings.Split(val, sep), nil +} + +// Bool converts the given string representation of a boolean value into bool. +func Bool(val string) (bool, error) { + return strconv.ParseBool(val) +} + +// BoolSlice converts 'val' where individual booleans are separated by +// 'sep' into a bool slice. +func BoolSlice(val, sep string) ([]bool, error) { + s := strings.Split(val, sep) + values := make([]bool, len(s)) + for i, v := range s { + value, err := Bool(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Float64 converts the given string representation into representation of a floating point number into float64. +func Float64(val string) (float64, error) { + return strconv.ParseFloat(val, 64) +} + +// Float64Slice converts 'val' where individual floating point numbers are separated by +// 'sep' into a float64 slice. +func Float64Slice(val, sep string) ([]float64, error) { + s := strings.Split(val, sep) + values := make([]float64, len(s)) + for i, v := range s { + value, err := Float64(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Float32 converts the given string representation of a floating point number into float32. +func Float32(val string) (float32, error) { + f, err := strconv.ParseFloat(val, 32) + if err != nil { + return 0, err + } + return float32(f), nil +} + +// Float32Slice converts 'val' where individual floating point numbers are separated by +// 'sep' into a float32 slice. +func Float32Slice(val, sep string) ([]float32, error) { + s := strings.Split(val, sep) + values := make([]float32, len(s)) + for i, v := range s { + value, err := Float32(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Int64 converts the given string representation of an integer into int64. +func Int64(val string) (int64, error) { + return strconv.ParseInt(val, 0, 64) +} + +// Int64Slice converts 'val' where individual integers are separated by +// 'sep' into a int64 slice. +func Int64Slice(val, sep string) ([]int64, error) { + s := strings.Split(val, sep) + values := make([]int64, len(s)) + for i, v := range s { + value, err := Int64(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Int32 converts the given string representation of an integer into int32. +func Int32(val string) (int32, error) { + i, err := strconv.ParseInt(val, 0, 32) + if err != nil { + return 0, err + } + return int32(i), nil +} + +// Int32Slice converts 'val' where individual integers are separated by +// 'sep' into a int32 slice. +func Int32Slice(val, sep string) ([]int32, error) { + s := strings.Split(val, sep) + values := make([]int32, len(s)) + for i, v := range s { + value, err := Int32(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Uint64 converts the given string representation of an integer into uint64. +func Uint64(val string) (uint64, error) { + return strconv.ParseUint(val, 0, 64) +} + +// Uint64Slice converts 'val' where individual integers are separated by +// 'sep' into a uint64 slice. +func Uint64Slice(val, sep string) ([]uint64, error) { + s := strings.Split(val, sep) + values := make([]uint64, len(s)) + for i, v := range s { + value, err := Uint64(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Uint32 converts the given string representation of an integer into uint32. +func Uint32(val string) (uint32, error) { + i, err := strconv.ParseUint(val, 0, 32) + if err != nil { + return 0, err + } + return uint32(i), nil +} + +// Uint32Slice converts 'val' where individual integers are separated by +// 'sep' into a uint32 slice. +func Uint32Slice(val, sep string) ([]uint32, error) { + s := strings.Split(val, sep) + values := make([]uint32, len(s)) + for i, v := range s { + value, err := Uint32(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Bytes converts the given string representation of a byte sequence into a slice of bytes +// A bytes sequence is encoded in URL-safe base64 without padding +func Bytes(val string) ([]byte, error) { + b, err := base64.StdEncoding.DecodeString(val) + if err != nil { + b, err = base64.URLEncoding.DecodeString(val) + if err != nil { + return nil, err + } + } + return b, nil +} + +// BytesSlice converts 'val' where individual bytes sequences, encoded in URL-safe +// base64 without padding, are separated by 'sep' into a slice of bytes slices slice. +func BytesSlice(val, sep string) ([][]byte, error) { + s := strings.Split(val, sep) + values := make([][]byte, len(s)) + for i, v := range s { + value, err := Bytes(v) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +// Timestamp converts the given RFC3339 formatted string into a timestamp.Timestamp. +func Timestamp(val string) (*timestamp.Timestamp, error) { + var r timestamp.Timestamp + err := jsonpb.UnmarshalString(val, &r) + if err != nil { + return nil, err + } + return &r, nil +} + +// Duration converts the given string into a timestamp.Duration. +func Duration(val string) (*duration.Duration, error) { + var r duration.Duration + err := jsonpb.UnmarshalString(val, &r) + if err != nil { + return nil, err + } + return &r, nil +} + +// Enum converts the given string into an int32 that should be type casted into the +// correct enum proto type. +func Enum(val string, enumValMap map[string]int32) (int32, error) { + e, ok := enumValMap[val] + if ok { + return e, nil + } + + i, err := Int32(val) + if err != nil { + return 0, fmt.Errorf("%s is not valid", val) + } + for _, v := range enumValMap { + if v == i { + return i, nil + } + } + return 0, fmt.Errorf("%s is not valid", val) +} + +// EnumSlice converts 'val' where individual enums are separated by 'sep' +// into a int32 slice. Each individual int32 should be type casted into the +// correct enum proto type. +func EnumSlice(val, sep string, enumValMap map[string]int32) ([]int32, error) { + s := strings.Split(val, sep) + values := make([]int32, len(s)) + for i, v := range s { + value, err := Enum(v, enumValMap) + if err != nil { + return values, err + } + values[i] = value + } + return values, nil +} + +/* + Support fot google.protobuf.wrappers on top of primitive types +*/ + +// StringValue well-known type support as wrapper around string type +func StringValue(val string) (*wrappers.StringValue, error) { + return &wrappers.StringValue{Value: val}, nil +} + +// FloatValue well-known type support as wrapper around float32 type +func FloatValue(val string) (*wrappers.FloatValue, error) { + parsedVal, err := Float32(val) + return &wrappers.FloatValue{Value: parsedVal}, err +} + +// DoubleValue well-known type support as wrapper around float64 type +func DoubleValue(val string) (*wrappers.DoubleValue, error) { + parsedVal, err := Float64(val) + return &wrappers.DoubleValue{Value: parsedVal}, err +} + +// BoolValue well-known type support as wrapper around bool type +func BoolValue(val string) (*wrappers.BoolValue, error) { + parsedVal, err := Bool(val) + return &wrappers.BoolValue{Value: parsedVal}, err +} + +// Int32Value well-known type support as wrapper around int32 type +func Int32Value(val string) (*wrappers.Int32Value, error) { + parsedVal, err := Int32(val) + return &wrappers.Int32Value{Value: parsedVal}, err +} + +// UInt32Value well-known type support as wrapper around uint32 type +func UInt32Value(val string) (*wrappers.UInt32Value, error) { + parsedVal, err := Uint32(val) + return &wrappers.UInt32Value{Value: parsedVal}, err +} + +// Int64Value well-known type support as wrapper around int64 type +func Int64Value(val string) (*wrappers.Int64Value, error) { + parsedVal, err := Int64(val) + return &wrappers.Int64Value{Value: parsedVal}, err +} + +// UInt64Value well-known type support as wrapper around uint64 type +func UInt64Value(val string) (*wrappers.UInt64Value, error) { + parsedVal, err := Uint64(val) + return &wrappers.UInt64Value{Value: parsedVal}, err +} + +// BytesValue well-known type support as wrapper around bytes[] type +func BytesValue(val string) (*wrappers.BytesValue, error) { + parsedVal, err := Bytes(val) + return &wrappers.BytesValue{Value: parsedVal}, err +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go new file mode 100644 index 000000000..b6e5ddf7a --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go @@ -0,0 +1,5 @@ +/* +Package runtime contains runtime helper functions used by +servers which protoc-gen-grpc-gateway generates. +*/ +package runtime diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go new file mode 100644 index 000000000..a36080713 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go @@ -0,0 +1,146 @@ +package runtime + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status. +// See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto +func HTTPStatusFromCode(code codes.Code) int { + switch code { + case codes.OK: + return http.StatusOK + case codes.Canceled: + return http.StatusRequestTimeout + case codes.Unknown: + return http.StatusInternalServerError + case codes.InvalidArgument: + return http.StatusBadRequest + case codes.DeadlineExceeded: + return http.StatusGatewayTimeout + case codes.NotFound: + return http.StatusNotFound + case codes.AlreadyExists: + return http.StatusConflict + case codes.PermissionDenied: + return http.StatusForbidden + case codes.Unauthenticated: + return http.StatusUnauthorized + case codes.ResourceExhausted: + return http.StatusTooManyRequests + case codes.FailedPrecondition: + // Note, this deliberately doesn't translate to the similarly named '412 Precondition Failed' HTTP response status. + return http.StatusBadRequest + case codes.Aborted: + return http.StatusConflict + case codes.OutOfRange: + return http.StatusBadRequest + case codes.Unimplemented: + return http.StatusNotImplemented + case codes.Internal: + return http.StatusInternalServerError + case codes.Unavailable: + return http.StatusServiceUnavailable + case codes.DataLoss: + return http.StatusInternalServerError + } + + grpclog.Infof("Unknown gRPC error code: %v", code) + return http.StatusInternalServerError +} + +var ( + // HTTPError replies to the request with the error. + // You can set a custom function to this variable to customize error format. + HTTPError = DefaultHTTPError + // OtherErrorHandler handles the following error used by the gateway: StatusMethodNotAllowed StatusNotFound and StatusBadRequest + OtherErrorHandler = DefaultOtherErrorHandler +) + +type errorBody struct { + Error string `protobuf:"bytes,100,name=error" json:"error"` + // This is to make the error more compatible with users that expect errors to be Status objects: + // https://github.com/grpc/grpc/blob/master/src/proto/grpc/status/status.proto + // It should be the exact same message as the Error field. + Code int32 `protobuf:"varint,1,name=code" json:"code"` + Message string `protobuf:"bytes,2,name=message" json:"message"` + Details []*any.Any `protobuf:"bytes,3,rep,name=details" json:"details,omitempty"` +} + +// Make this also conform to proto.Message for builtin JSONPb Marshaler +func (e *errorBody) Reset() { *e = errorBody{} } +func (e *errorBody) String() string { return proto.CompactTextString(e) } +func (*errorBody) ProtoMessage() {} + +// DefaultHTTPError is the default implementation of HTTPError. +// If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode. +// If otherwise, it replies with http.StatusInternalServerError. +// +// The response body returned by this function is a JSON object, +// which contains a member whose key is "error" and whose value is err.Error(). +func DefaultHTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, _ *http.Request, err error) { + const fallback = `{"error": "failed to marshal error message"}` + + s, ok := status.FromError(err) + if !ok { + s = status.New(codes.Unknown, err.Error()) + } + + w.Header().Del("Trailer") + + contentType := marshaler.ContentType() + // Check marshaler on run time in order to keep backwards compatability + // An interface param needs to be added to the ContentType() function on + // the Marshal interface to be able to remove this check + if httpBodyMarshaler, ok := marshaler.(*HTTPBodyMarshaler); ok { + pb := s.Proto() + contentType = httpBodyMarshaler.ContentTypeFromMessage(pb) + } + w.Header().Set("Content-Type", contentType) + + body := &errorBody{ + Error: s.Message(), + Message: s.Message(), + Code: int32(s.Code()), + Details: s.Proto().GetDetails(), + } + + buf, merr := marshaler.Marshal(body) + if merr != nil { + grpclog.Infof("Failed to marshal error message %q: %v", body, merr) + w.WriteHeader(http.StatusInternalServerError) + if _, err := io.WriteString(w, fallback); err != nil { + grpclog.Infof("Failed to write response: %v", err) + } + return + } + + md, ok := ServerMetadataFromContext(ctx) + if !ok { + grpclog.Infof("Failed to extract ServerMetadata from context") + } + + handleForwardResponseServerMetadata(w, mux, md) + handleForwardResponseTrailerHeader(w, md) + st := HTTPStatusFromCode(s.Code()) + w.WriteHeader(st) + if _, err := w.Write(buf); err != nil { + grpclog.Infof("Failed to write response: %v", err) + } + + handleForwardResponseTrailer(w, md) +} + +// DefaultOtherErrorHandler is the default implementation of OtherErrorHandler. +// It simply writes a string representation of the given error into "w". +func DefaultOtherErrorHandler(w http.ResponseWriter, _ *http.Request, msg string, code int) { + http.Error(w, msg, code) +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go new file mode 100644 index 000000000..341aad5a3 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go @@ -0,0 +1,82 @@ +package runtime + +import ( + "encoding/json" + "io" + "strings" + + descriptor2 "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/protoc-gen-go/descriptor" + "google.golang.org/genproto/protobuf/field_mask" +) + +func translateName(name string, md *descriptor.DescriptorProto) (string, *descriptor.DescriptorProto) { + // TODO - should really gate this with a test that the marshaller has used json names + if md != nil { + for _, f := range md.Field { + if f.JsonName != nil && f.Name != nil && *f.JsonName == name { + var subType *descriptor.DescriptorProto + + // If the field has a TypeName then we retrieve the nested type for translating the embedded message names. + if f.TypeName != nil { + typeSplit := strings.Split(*f.TypeName, ".") + typeName := typeSplit[len(typeSplit)-1] + for _, t := range md.NestedType { + if typeName == *t.Name { + subType = t + } + } + } + return *f.Name, subType + } + } + } + return name, nil +} + +// FieldMaskFromRequestBody creates a FieldMask printing all complete paths from the JSON body. +func FieldMaskFromRequestBody(r io.Reader, md *descriptor.DescriptorProto) (*field_mask.FieldMask, error) { + fm := &field_mask.FieldMask{} + var root interface{} + if err := json.NewDecoder(r).Decode(&root); err != nil { + if err == io.EOF { + return fm, nil + } + return nil, err + } + + queue := []fieldMaskPathItem{{node: root, md: md}} + for len(queue) > 0 { + // dequeue an item + item := queue[0] + queue = queue[1:] + + if m, ok := item.node.(map[string]interface{}); ok { + // if the item is an object, then enqueue all of its children + for k, v := range m { + protoName, subMd := translateName(k, item.md) + if subMsg, ok := v.(descriptor2.Message); ok { + _, subMd = descriptor2.ForMessage(subMsg) + } + queue = append(queue, fieldMaskPathItem{path: append(item.path, protoName), node: v, md: subMd}) + } + } else if len(item.path) > 0 { + // otherwise, it's a leaf node so print its path + fm.Paths = append(fm.Paths, strings.Join(item.path, ".")) + } + } + + return fm, nil +} + +// fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask +type fieldMaskPathItem struct { + // the list of prior fields leading up to node + path []string + + // a generic decoded json object the current item to inspect for further path extraction + node interface{} + + // descriptor for parent message + md *descriptor.DescriptorProto +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go new file mode 100644 index 000000000..2af900650 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go @@ -0,0 +1,209 @@ +package runtime + +import ( + "errors" + "fmt" + "io" + "net/http" + "net/textproto" + + "context" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/internal" + "google.golang.org/grpc/grpclog" +) + +var errEmptyResponse = errors.New("empty response") + +// ForwardResponseStream forwards the stream from gRPC server to REST client. +func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, recv func() (proto.Message, error), opts ...func(context.Context, http.ResponseWriter, proto.Message) error) { + f, ok := w.(http.Flusher) + if !ok { + grpclog.Infof("Flush not supported in %T", w) + http.Error(w, "unexpected type of web server", http.StatusInternalServerError) + return + } + + md, ok := ServerMetadataFromContext(ctx) + if !ok { + grpclog.Infof("Failed to extract ServerMetadata from context") + http.Error(w, "unexpected error", http.StatusInternalServerError) + return + } + handleForwardResponseServerMetadata(w, mux, md) + + w.Header().Set("Transfer-Encoding", "chunked") + w.Header().Set("Content-Type", marshaler.ContentType()) + if err := handleForwardResponseOptions(ctx, w, nil, opts); err != nil { + HTTPError(ctx, mux, marshaler, w, req, err) + return + } + + var delimiter []byte + if d, ok := marshaler.(Delimited); ok { + delimiter = d.Delimiter() + } else { + delimiter = []byte("\n") + } + + var wroteHeader bool + for { + resp, err := recv() + if err == io.EOF { + return + } + if err != nil { + handleForwardResponseStreamError(ctx, wroteHeader, marshaler, w, req, mux, err) + return + } + if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil { + handleForwardResponseStreamError(ctx, wroteHeader, marshaler, w, req, mux, err) + return + } + + buf, err := marshaler.Marshal(streamChunk(ctx, resp, mux.streamErrorHandler)) + if err != nil { + grpclog.Infof("Failed to marshal response chunk: %v", err) + handleForwardResponseStreamError(ctx, wroteHeader, marshaler, w, req, mux, err) + return + } + if _, err = w.Write(buf); err != nil { + grpclog.Infof("Failed to send response chunk: %v", err) + return + } + wroteHeader = true + if _, err = w.Write(delimiter); err != nil { + grpclog.Infof("Failed to send delimiter chunk: %v", err) + return + } + f.Flush() + } +} + +func handleForwardResponseServerMetadata(w http.ResponseWriter, mux *ServeMux, md ServerMetadata) { + for k, vs := range md.HeaderMD { + if h, ok := mux.outgoingHeaderMatcher(k); ok { + for _, v := range vs { + w.Header().Add(h, v) + } + } + } +} + +func handleForwardResponseTrailerHeader(w http.ResponseWriter, md ServerMetadata) { + for k := range md.TrailerMD { + tKey := textproto.CanonicalMIMEHeaderKey(fmt.Sprintf("%s%s", MetadataTrailerPrefix, k)) + w.Header().Add("Trailer", tKey) + } +} + +func handleForwardResponseTrailer(w http.ResponseWriter, md ServerMetadata) { + for k, vs := range md.TrailerMD { + tKey := fmt.Sprintf("%s%s", MetadataTrailerPrefix, k) + for _, v := range vs { + w.Header().Add(tKey, v) + } + } +} + +// responseBody interface contains method for getting field for marshaling to the response body +// this method is generated for response struct from the value of `response_body` in the `google.api.HttpRule` +type responseBody interface { + XXX_ResponseBody() interface{} +} + +// ForwardResponseMessage forwards the message "resp" from gRPC server to REST client. +func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, resp proto.Message, opts ...func(context.Context, http.ResponseWriter, proto.Message) error) { + md, ok := ServerMetadataFromContext(ctx) + if !ok { + grpclog.Infof("Failed to extract ServerMetadata from context") + } + + handleForwardResponseServerMetadata(w, mux, md) + handleForwardResponseTrailerHeader(w, md) + + contentType := marshaler.ContentType() + // Check marshaler on run time in order to keep backwards compatability + // An interface param needs to be added to the ContentType() function on + // the Marshal interface to be able to remove this check + if httpBodyMarshaler, ok := marshaler.(*HTTPBodyMarshaler); ok { + contentType = httpBodyMarshaler.ContentTypeFromMessage(resp) + } + w.Header().Set("Content-Type", contentType) + + if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil { + HTTPError(ctx, mux, marshaler, w, req, err) + return + } + var buf []byte + var err error + if rb, ok := resp.(responseBody); ok { + buf, err = marshaler.Marshal(rb.XXX_ResponseBody()) + } else { + buf, err = marshaler.Marshal(resp) + } + if err != nil { + grpclog.Infof("Marshal error: %v", err) + HTTPError(ctx, mux, marshaler, w, req, err) + return + } + + if _, err = w.Write(buf); err != nil { + grpclog.Infof("Failed to write response: %v", err) + } + + handleForwardResponseTrailer(w, md) +} + +func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, resp proto.Message, opts []func(context.Context, http.ResponseWriter, proto.Message) error) error { + if len(opts) == 0 { + return nil + } + for _, opt := range opts { + if err := opt(ctx, w, resp); err != nil { + grpclog.Infof("Error handling ForwardResponseOptions: %v", err) + return err + } + } + return nil +} + +func handleForwardResponseStreamError(ctx context.Context, wroteHeader bool, marshaler Marshaler, w http.ResponseWriter, req *http.Request, mux *ServeMux, err error) { + serr := streamError(ctx, mux.streamErrorHandler, err) + if !wroteHeader { + w.WriteHeader(int(serr.HttpCode)) + } + buf, merr := marshaler.Marshal(errorChunk(serr)) + if merr != nil { + grpclog.Infof("Failed to marshal an error: %v", merr) + return + } + if _, werr := w.Write(buf); werr != nil { + grpclog.Infof("Failed to notify error to client: %v", werr) + return + } +} + +// streamChunk returns a chunk in a response stream for the given result. The +// given errHandler is used to render an error chunk if result is nil. +func streamChunk(ctx context.Context, result proto.Message, errHandler StreamErrorHandlerFunc) map[string]proto.Message { + if result == nil { + return errorChunk(streamError(ctx, errHandler, errEmptyResponse)) + } + return map[string]proto.Message{"result": result} +} + +// streamError returns the payload for the final message in a response stream +// that represents the given err. +func streamError(ctx context.Context, errHandler StreamErrorHandlerFunc, err error) *StreamError { + serr := errHandler(ctx, err) + if serr != nil { + return serr + } + // TODO: log about misbehaving stream error handler? + return DefaultHTTPStreamErrorHandler(ctx, err) +} + +func errorChunk(err *StreamError) map[string]proto.Message { + return map[string]proto.Message{"error": (*internal.StreamError)(err)} +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_httpbodyproto.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_httpbodyproto.go new file mode 100644 index 000000000..f55285b5d --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_httpbodyproto.go @@ -0,0 +1,43 @@ +package runtime + +import ( + "google.golang.org/genproto/googleapis/api/httpbody" +) + +// SetHTTPBodyMarshaler overwrite the default marshaler with the HTTPBodyMarshaler +func SetHTTPBodyMarshaler(serveMux *ServeMux) { + serveMux.marshalers.mimeMap[MIMEWildcard] = &HTTPBodyMarshaler{ + Marshaler: &JSONPb{OrigName: true}, + } +} + +// HTTPBodyMarshaler is a Marshaler which supports marshaling of a +// google.api.HttpBody message as the full response body if it is +// the actual message used as the response. If not, then this will +// simply fallback to the Marshaler specified as its default Marshaler. +type HTTPBodyMarshaler struct { + Marshaler +} + +// ContentType implementation to keep backwards compatability with marshal interface +func (h *HTTPBodyMarshaler) ContentType() string { + return h.ContentTypeFromMessage(nil) +} + +// ContentTypeFromMessage in case v is a google.api.HttpBody message it returns +// its specified content type otherwise fall back to the default Marshaler. +func (h *HTTPBodyMarshaler) ContentTypeFromMessage(v interface{}) string { + if httpBody, ok := v.(*httpbody.HttpBody); ok { + return httpBody.GetContentType() + } + return h.Marshaler.ContentType() +} + +// Marshal marshals "v" by returning the body bytes if v is a +// google.api.HttpBody message, otherwise it falls back to the default Marshaler. +func (h *HTTPBodyMarshaler) Marshal(v interface{}) ([]byte, error) { + if httpBody, ok := v.(*httpbody.HttpBody); ok { + return httpBody.Data, nil + } + return h.Marshaler.Marshal(v) +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go new file mode 100644 index 000000000..f9d3a585a --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go @@ -0,0 +1,45 @@ +package runtime + +import ( + "encoding/json" + "io" +) + +// JSONBuiltin is a Marshaler which marshals/unmarshals into/from JSON +// with the standard "encoding/json" package of Golang. +// Although it is generally faster for simple proto messages than JSONPb, +// it does not support advanced features of protobuf, e.g. map, oneof, .... +// +// The NewEncoder and NewDecoder types return *json.Encoder and +// *json.Decoder respectively. +type JSONBuiltin struct{} + +// ContentType always Returns "application/json". +func (*JSONBuiltin) ContentType() string { + return "application/json" +} + +// Marshal marshals "v" into JSON +func (j *JSONBuiltin) Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +// Unmarshal unmarshals JSON data into "v". +func (j *JSONBuiltin) Unmarshal(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} + +// NewDecoder returns a Decoder which reads JSON stream from "r". +func (j *JSONBuiltin) NewDecoder(r io.Reader) Decoder { + return json.NewDecoder(r) +} + +// NewEncoder returns an Encoder which writes JSON stream into "w". +func (j *JSONBuiltin) NewEncoder(w io.Writer) Encoder { + return json.NewEncoder(w) +} + +// Delimiter for newline encoded JSON streams. +func (j *JSONBuiltin) Delimiter() []byte { + return []byte("\n") +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go new file mode 100644 index 000000000..f0de351b2 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go @@ -0,0 +1,262 @@ +package runtime + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "reflect" + + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" +) + +// JSONPb is a Marshaler which marshals/unmarshals into/from JSON +// with the "github.com/golang/protobuf/jsonpb". +// It supports fully functionality of protobuf unlike JSONBuiltin. +// +// The NewDecoder method returns a DecoderWrapper, so the underlying +// *json.Decoder methods can be used. +type JSONPb jsonpb.Marshaler + +// ContentType always returns "application/json". +func (*JSONPb) ContentType() string { + return "application/json" +} + +// Marshal marshals "v" into JSON. +func (j *JSONPb) Marshal(v interface{}) ([]byte, error) { + if _, ok := v.(proto.Message); !ok { + return j.marshalNonProtoField(v) + } + + var buf bytes.Buffer + if err := j.marshalTo(&buf, v); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (j *JSONPb) marshalTo(w io.Writer, v interface{}) error { + p, ok := v.(proto.Message) + if !ok { + buf, err := j.marshalNonProtoField(v) + if err != nil { + return err + } + _, err = w.Write(buf) + return err + } + return (*jsonpb.Marshaler)(j).Marshal(w, p) +} + +var ( + // protoMessageType is stored to prevent constant lookup of the same type at runtime. + protoMessageType = reflect.TypeOf((*proto.Message)(nil)).Elem() +) + +// marshalNonProto marshals a non-message field of a protobuf message. +// This function does not correctly marshals arbitrary data structure into JSON, +// but it is only capable of marshaling non-message field values of protobuf, +// i.e. primitive types, enums; pointers to primitives or enums; maps from +// integer/string types to primitives/enums/pointers to messages. +func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) { + if v == nil { + return []byte("null"), nil + } + rv := reflect.ValueOf(v) + for rv.Kind() == reflect.Ptr { + if rv.IsNil() { + return []byte("null"), nil + } + rv = rv.Elem() + } + + if rv.Kind() == reflect.Slice { + if rv.IsNil() { + if j.EmitDefaults { + return []byte("[]"), nil + } + return []byte("null"), nil + } + + if rv.Type().Elem().Implements(protoMessageType) { + var buf bytes.Buffer + err := buf.WriteByte('[') + if err != nil { + return nil, err + } + for i := 0; i < rv.Len(); i++ { + if i != 0 { + err = buf.WriteByte(',') + if err != nil { + return nil, err + } + } + if err = (*jsonpb.Marshaler)(j).Marshal(&buf, rv.Index(i).Interface().(proto.Message)); err != nil { + return nil, err + } + } + err = buf.WriteByte(']') + if err != nil { + return nil, err + } + + return buf.Bytes(), nil + } + } + + if rv.Kind() == reflect.Map { + m := make(map[string]*json.RawMessage) + for _, k := range rv.MapKeys() { + buf, err := j.Marshal(rv.MapIndex(k).Interface()) + if err != nil { + return nil, err + } + m[fmt.Sprintf("%v", k.Interface())] = (*json.RawMessage)(&buf) + } + if j.Indent != "" { + return json.MarshalIndent(m, "", j.Indent) + } + return json.Marshal(m) + } + if enum, ok := rv.Interface().(protoEnum); ok && !j.EnumsAsInts { + return json.Marshal(enum.String()) + } + return json.Marshal(rv.Interface()) +} + +// Unmarshal unmarshals JSON "data" into "v" +func (j *JSONPb) Unmarshal(data []byte, v interface{}) error { + return unmarshalJSONPb(data, v) +} + +// NewDecoder returns a Decoder which reads JSON stream from "r". +func (j *JSONPb) NewDecoder(r io.Reader) Decoder { + d := json.NewDecoder(r) + return DecoderWrapper{Decoder: d} +} + +// DecoderWrapper is a wrapper around a *json.Decoder that adds +// support for protos to the Decode method. +type DecoderWrapper struct { + *json.Decoder +} + +// Decode wraps the embedded decoder's Decode method to support +// protos using a jsonpb.Unmarshaler. +func (d DecoderWrapper) Decode(v interface{}) error { + return decodeJSONPb(d.Decoder, v) +} + +// NewEncoder returns an Encoder which writes JSON stream into "w". +func (j *JSONPb) NewEncoder(w io.Writer) Encoder { + return EncoderFunc(func(v interface{}) error { + if err := j.marshalTo(w, v); err != nil { + return err + } + // mimic json.Encoder by adding a newline (makes output + // easier to read when it contains multiple encoded items) + _, err := w.Write(j.Delimiter()) + return err + }) +} + +func unmarshalJSONPb(data []byte, v interface{}) error { + d := json.NewDecoder(bytes.NewReader(data)) + return decodeJSONPb(d, v) +} + +func decodeJSONPb(d *json.Decoder, v interface{}) error { + p, ok := v.(proto.Message) + if !ok { + return decodeNonProtoField(d, v) + } + unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownFields} + return unmarshaler.UnmarshalNext(d, p) +} + +func decodeNonProtoField(d *json.Decoder, v interface{}) error { + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Ptr { + return fmt.Errorf("%T is not a pointer", v) + } + for rv.Kind() == reflect.Ptr { + if rv.IsNil() { + rv.Set(reflect.New(rv.Type().Elem())) + } + if rv.Type().ConvertibleTo(typeProtoMessage) { + unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownFields} + return unmarshaler.UnmarshalNext(d, rv.Interface().(proto.Message)) + } + rv = rv.Elem() + } + if rv.Kind() == reflect.Map { + if rv.IsNil() { + rv.Set(reflect.MakeMap(rv.Type())) + } + conv, ok := convFromType[rv.Type().Key().Kind()] + if !ok { + return fmt.Errorf("unsupported type of map field key: %v", rv.Type().Key()) + } + + m := make(map[string]*json.RawMessage) + if err := d.Decode(&m); err != nil { + return err + } + for k, v := range m { + result := conv.Call([]reflect.Value{reflect.ValueOf(k)}) + if err := result[1].Interface(); err != nil { + return err.(error) + } + bk := result[0] + bv := reflect.New(rv.Type().Elem()) + if err := unmarshalJSONPb([]byte(*v), bv.Interface()); err != nil { + return err + } + rv.SetMapIndex(bk, bv.Elem()) + } + return nil + } + if _, ok := rv.Interface().(protoEnum); ok { + var repr interface{} + if err := d.Decode(&repr); err != nil { + return err + } + switch repr.(type) { + case string: + // TODO(yugui) Should use proto.StructProperties? + return fmt.Errorf("unmarshaling of symbolic enum %q not supported: %T", repr, rv.Interface()) + case float64: + rv.Set(reflect.ValueOf(int32(repr.(float64))).Convert(rv.Type())) + return nil + default: + return fmt.Errorf("cannot assign %#v into Go type %T", repr, rv.Interface()) + } + } + return d.Decode(v) +} + +type protoEnum interface { + fmt.Stringer + EnumDescriptor() ([]byte, []int) +} + +var typeProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem() + +// Delimiter for newline encoded JSON streams. +func (j *JSONPb) Delimiter() []byte { + return []byte("\n") +} + +// allowUnknownFields helps not to return an error when the destination +// is a struct and the input contains object keys which do not match any +// non-ignored, exported fields in the destination. +var allowUnknownFields = true + +// DisallowUnknownFields enables option in decoder (unmarshaller) to +// return an error when it finds an unknown field. This function must be +// called before using the JSON marshaller. +func DisallowUnknownFields() { + allowUnknownFields = false +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go new file mode 100644 index 000000000..f65d1a267 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go @@ -0,0 +1,62 @@ +package runtime + +import ( + "io" + + "errors" + "github.com/golang/protobuf/proto" + "io/ioutil" +) + +// ProtoMarshaller is a Marshaller which marshals/unmarshals into/from serialize proto bytes +type ProtoMarshaller struct{} + +// ContentType always returns "application/octet-stream". +func (*ProtoMarshaller) ContentType() string { + return "application/octet-stream" +} + +// Marshal marshals "value" into Proto +func (*ProtoMarshaller) Marshal(value interface{}) ([]byte, error) { + message, ok := value.(proto.Message) + if !ok { + return nil, errors.New("unable to marshal non proto field") + } + return proto.Marshal(message) +} + +// Unmarshal unmarshals proto "data" into "value" +func (*ProtoMarshaller) Unmarshal(data []byte, value interface{}) error { + message, ok := value.(proto.Message) + if !ok { + return errors.New("unable to unmarshal non proto field") + } + return proto.Unmarshal(data, message) +} + +// NewDecoder returns a Decoder which reads proto stream from "reader". +func (marshaller *ProtoMarshaller) NewDecoder(reader io.Reader) Decoder { + return DecoderFunc(func(value interface{}) error { + buffer, err := ioutil.ReadAll(reader) + if err != nil { + return err + } + return marshaller.Unmarshal(buffer, value) + }) +} + +// NewEncoder returns an Encoder which writes proto stream into "writer". +func (marshaller *ProtoMarshaller) NewEncoder(writer io.Writer) Encoder { + return EncoderFunc(func(value interface{}) error { + buffer, err := marshaller.Marshal(value) + if err != nil { + return err + } + _, err = writer.Write(buffer) + if err != nil { + return err + } + + return nil + }) +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go new file mode 100644 index 000000000..98fe6e88a --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go @@ -0,0 +1,48 @@ +package runtime + +import ( + "io" +) + +// Marshaler defines a conversion between byte sequence and gRPC payloads / fields. +type Marshaler interface { + // Marshal marshals "v" into byte sequence. + Marshal(v interface{}) ([]byte, error) + // Unmarshal unmarshals "data" into "v". + // "v" must be a pointer value. + Unmarshal(data []byte, v interface{}) error + // NewDecoder returns a Decoder which reads byte sequence from "r". + NewDecoder(r io.Reader) Decoder + // NewEncoder returns an Encoder which writes bytes sequence into "w". + NewEncoder(w io.Writer) Encoder + // ContentType returns the Content-Type which this marshaler is responsible for. + ContentType() string +} + +// Decoder decodes a byte sequence +type Decoder interface { + Decode(v interface{}) error +} + +// Encoder encodes gRPC payloads / fields into byte sequence. +type Encoder interface { + Encode(v interface{}) error +} + +// DecoderFunc adapts an decoder function into Decoder. +type DecoderFunc func(v interface{}) error + +// Decode delegates invocations to the underlying function itself. +func (f DecoderFunc) Decode(v interface{}) error { return f(v) } + +// EncoderFunc adapts an encoder function into Encoder +type EncoderFunc func(v interface{}) error + +// Encode delegates invocations to the underlying function itself. +func (f EncoderFunc) Encode(v interface{}) error { return f(v) } + +// Delimited defines the streaming delimiter. +type Delimited interface { + // Delimiter returns the record seperator for the stream. + Delimiter() []byte +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go new file mode 100644 index 000000000..5cc53ae4f --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go @@ -0,0 +1,91 @@ +package runtime + +import ( + "errors" + "net/http" +) + +// MIMEWildcard is the fallback MIME type used for requests which do not match +// a registered MIME type. +const MIMEWildcard = "*" + +var ( + acceptHeader = http.CanonicalHeaderKey("Accept") + contentTypeHeader = http.CanonicalHeaderKey("Content-Type") + + defaultMarshaler = &JSONPb{OrigName: true} +) + +// MarshalerForRequest returns the inbound/outbound marshalers for this request. +// It checks the registry on the ServeMux for the MIME type set by the Content-Type header. +// If it isn't set (or the request Content-Type is empty), checks for "*". +// If there are multiple Content-Type headers set, choose the first one that it can +// exactly match in the registry. +// Otherwise, it follows the above logic for "*"/InboundMarshaler/OutboundMarshaler. +func MarshalerForRequest(mux *ServeMux, r *http.Request) (inbound Marshaler, outbound Marshaler) { + for _, acceptVal := range r.Header[acceptHeader] { + if m, ok := mux.marshalers.mimeMap[acceptVal]; ok { + outbound = m + break + } + } + + for _, contentTypeVal := range r.Header[contentTypeHeader] { + if m, ok := mux.marshalers.mimeMap[contentTypeVal]; ok { + inbound = m + break + } + } + + if inbound == nil { + inbound = mux.marshalers.mimeMap[MIMEWildcard] + } + if outbound == nil { + outbound = inbound + } + + return inbound, outbound +} + +// marshalerRegistry is a mapping from MIME types to Marshalers. +type marshalerRegistry struct { + mimeMap map[string]Marshaler +} + +// add adds a marshaler for a case-sensitive MIME type string ("*" to match any +// MIME type). +func (m marshalerRegistry) add(mime string, marshaler Marshaler) error { + if len(mime) == 0 { + return errors.New("empty MIME type") + } + + m.mimeMap[mime] = marshaler + + return nil +} + +// makeMarshalerMIMERegistry returns a new registry of marshalers. +// It allows for a mapping of case-sensitive Content-Type MIME type string to runtime.Marshaler interfaces. +// +// For example, you could allow the client to specify the use of the runtime.JSONPb marshaler +// with a "application/jsonpb" Content-Type and the use of the runtime.JSONBuiltin marshaler +// with a "application/json" Content-Type. +// "*" can be used to match any Content-Type. +// This can be attached to a ServerMux with the marshaler option. +func makeMarshalerMIMERegistry() marshalerRegistry { + return marshalerRegistry{ + mimeMap: map[string]Marshaler{ + MIMEWildcard: defaultMarshaler, + }, + } +} + +// WithMarshalerOption returns a ServeMuxOption which associates inbound and outbound +// Marshalers to a MIME type in mux. +func WithMarshalerOption(mime string, marshaler Marshaler) ServeMuxOption { + return func(mux *ServeMux) { + if err := mux.marshalers.add(mime, marshaler); err != nil { + panic(err) + } + } +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go new file mode 100644 index 000000000..1da3a5885 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go @@ -0,0 +1,303 @@ +package runtime + +import ( + "context" + "fmt" + "net/http" + "net/textproto" + "strings" + + "github.com/golang/protobuf/proto" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// A HandlerFunc handles a specific pair of path pattern and HTTP method. +type HandlerFunc func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) + +// ErrUnknownURI is the error supplied to a custom ProtoErrorHandlerFunc when +// a request is received with a URI path that does not match any registered +// service method. +// +// Since gRPC servers return an "Unimplemented" code for requests with an +// unrecognized URI path, this error also has a gRPC "Unimplemented" code. +var ErrUnknownURI = status.Error(codes.Unimplemented, http.StatusText(http.StatusNotImplemented)) + +// ServeMux is a request multiplexer for grpc-gateway. +// It matches http requests to patterns and invokes the corresponding handler. +type ServeMux struct { + // handlers maps HTTP method to a list of handlers. + handlers map[string][]handler + forwardResponseOptions []func(context.Context, http.ResponseWriter, proto.Message) error + marshalers marshalerRegistry + incomingHeaderMatcher HeaderMatcherFunc + outgoingHeaderMatcher HeaderMatcherFunc + metadataAnnotators []func(context.Context, *http.Request) metadata.MD + streamErrorHandler StreamErrorHandlerFunc + protoErrorHandler ProtoErrorHandlerFunc + disablePathLengthFallback bool + lastMatchWins bool +} + +// ServeMuxOption is an option that can be given to a ServeMux on construction. +type ServeMuxOption func(*ServeMux) + +// WithForwardResponseOption returns a ServeMuxOption representing the forwardResponseOption. +// +// forwardResponseOption is an option that will be called on the relevant context.Context, +// http.ResponseWriter, and proto.Message before every forwarded response. +// +// The message may be nil in the case where just a header is being sent. +func WithForwardResponseOption(forwardResponseOption func(context.Context, http.ResponseWriter, proto.Message) error) ServeMuxOption { + return func(serveMux *ServeMux) { + serveMux.forwardResponseOptions = append(serveMux.forwardResponseOptions, forwardResponseOption) + } +} + +// HeaderMatcherFunc checks whether a header key should be forwarded to/from gRPC context. +type HeaderMatcherFunc func(string) (string, bool) + +// DefaultHeaderMatcher is used to pass http request headers to/from gRPC context. This adds permanent HTTP header +// keys (as specified by the IANA) to gRPC context with grpcgateway- prefix. HTTP headers that start with +// 'Grpc-Metadata-' are mapped to gRPC metadata after removing prefix 'Grpc-Metadata-'. +func DefaultHeaderMatcher(key string) (string, bool) { + key = textproto.CanonicalMIMEHeaderKey(key) + if isPermanentHTTPHeader(key) { + return MetadataPrefix + key, true + } else if strings.HasPrefix(key, MetadataHeaderPrefix) { + return key[len(MetadataHeaderPrefix):], true + } + return "", false +} + +// WithIncomingHeaderMatcher returns a ServeMuxOption representing a headerMatcher for incoming request to gateway. +// +// This matcher will be called with each header in http.Request. If matcher returns true, that header will be +// passed to gRPC context. To transform the header before passing to gRPC context, matcher should return modified header. +func WithIncomingHeaderMatcher(fn HeaderMatcherFunc) ServeMuxOption { + return func(mux *ServeMux) { + mux.incomingHeaderMatcher = fn + } +} + +// WithOutgoingHeaderMatcher returns a ServeMuxOption representing a headerMatcher for outgoing response from gateway. +// +// This matcher will be called with each header in response header metadata. If matcher returns true, that header will be +// passed to http response returned from gateway. To transform the header before passing to response, +// matcher should return modified header. +func WithOutgoingHeaderMatcher(fn HeaderMatcherFunc) ServeMuxOption { + return func(mux *ServeMux) { + mux.outgoingHeaderMatcher = fn + } +} + +// WithMetadata returns a ServeMuxOption for passing metadata to a gRPC context. +// +// This can be used by services that need to read from http.Request and modify gRPC context. A common use case +// is reading token from cookie and adding it in gRPC context. +func WithMetadata(annotator func(context.Context, *http.Request) metadata.MD) ServeMuxOption { + return func(serveMux *ServeMux) { + serveMux.metadataAnnotators = append(serveMux.metadataAnnotators, annotator) + } +} + +// WithProtoErrorHandler returns a ServeMuxOption for passing metadata to a gRPC context. +// +// This can be used to handle an error as general proto message defined by gRPC. +// The response including body and status is not backward compatible with the default error handler. +// When this option is used, HTTPError and OtherErrorHandler are overwritten on initialization. +func WithProtoErrorHandler(fn ProtoErrorHandlerFunc) ServeMuxOption { + return func(serveMux *ServeMux) { + serveMux.protoErrorHandler = fn + } +} + +// WithDisablePathLengthFallback returns a ServeMuxOption for disable path length fallback. +func WithDisablePathLengthFallback() ServeMuxOption { + return func(serveMux *ServeMux) { + serveMux.disablePathLengthFallback = true + } +} + +// WithStreamErrorHandler returns a ServeMuxOption that will use the given custom stream +// error handler, which allows for customizing the error trailer for server-streaming +// calls. +// +// For stream errors that occur before any response has been written, the mux's +// ProtoErrorHandler will be invoked. However, once data has been written, the errors must +// be handled differently: they must be included in the response body. The response body's +// final message will include the error details returned by the stream error handler. +func WithStreamErrorHandler(fn StreamErrorHandlerFunc) ServeMuxOption { + return func(serveMux *ServeMux) { + serveMux.streamErrorHandler = fn + } +} + +// WithLastMatchWins returns a ServeMuxOption that will enable "last +// match wins" behavior, where if multiple path patterns match a +// request path, the last one defined in the .proto file will be used. +func WithLastMatchWins() ServeMuxOption { + return func(serveMux *ServeMux) { + serveMux.lastMatchWins = true + } +} + +// NewServeMux returns a new ServeMux whose internal mapping is empty. +func NewServeMux(opts ...ServeMuxOption) *ServeMux { + serveMux := &ServeMux{ + handlers: make(map[string][]handler), + forwardResponseOptions: make([]func(context.Context, http.ResponseWriter, proto.Message) error, 0), + marshalers: makeMarshalerMIMERegistry(), + streamErrorHandler: DefaultHTTPStreamErrorHandler, + } + + for _, opt := range opts { + opt(serveMux) + } + + if serveMux.protoErrorHandler != nil { + HTTPError = serveMux.protoErrorHandler + // OtherErrorHandler is no longer used when protoErrorHandler is set. + // Overwritten by a special error handler to return Unknown. + OtherErrorHandler = func(w http.ResponseWriter, r *http.Request, _ string, _ int) { + ctx := context.Background() + _, outboundMarshaler := MarshalerForRequest(serveMux, r) + sterr := status.Error(codes.Unknown, "unexpected use of OtherErrorHandler") + serveMux.protoErrorHandler(ctx, serveMux, outboundMarshaler, w, r, sterr) + } + } + + if serveMux.incomingHeaderMatcher == nil { + serveMux.incomingHeaderMatcher = DefaultHeaderMatcher + } + + if serveMux.outgoingHeaderMatcher == nil { + serveMux.outgoingHeaderMatcher = func(key string) (string, bool) { + return fmt.Sprintf("%s%s", MetadataHeaderPrefix, key), true + } + } + + return serveMux +} + +// Handle associates "h" to the pair of HTTP method and path pattern. +func (s *ServeMux) Handle(meth string, pat Pattern, h HandlerFunc) { + if s.lastMatchWins { + s.handlers[meth] = append([]handler{handler{pat: pat, h: h}}, s.handlers[meth]...) + } else { + s.handlers[meth] = append(s.handlers[meth], handler{pat: pat, h: h}) + } +} + +// ServeHTTP dispatches the request to the first handler whose pattern matches to r.Method and r.Path. +func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + path := r.URL.Path + if !strings.HasPrefix(path, "/") { + if s.protoErrorHandler != nil { + _, outboundMarshaler := MarshalerForRequest(s, r) + sterr := status.Error(codes.InvalidArgument, http.StatusText(http.StatusBadRequest)) + s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) + } else { + OtherErrorHandler(w, r, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) + } + return + } + + components := strings.Split(path[1:], "/") + l := len(components) + var verb string + if idx := strings.LastIndex(components[l-1], ":"); idx == 0 { + if s.protoErrorHandler != nil { + _, outboundMarshaler := MarshalerForRequest(s, r) + s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI) + } else { + OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound) + } + return + } else if idx > 0 { + c := components[l-1] + components[l-1], verb = c[:idx], c[idx+1:] + } + + if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && s.isPathLengthFallback(r) { + r.Method = strings.ToUpper(override) + if err := r.ParseForm(); err != nil { + if s.protoErrorHandler != nil { + _, outboundMarshaler := MarshalerForRequest(s, r) + sterr := status.Error(codes.InvalidArgument, err.Error()) + s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) + } else { + OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest) + } + return + } + } + for _, h := range s.handlers[r.Method] { + pathParams, err := h.pat.Match(components, verb) + if err != nil { + continue + } + h.h(w, r, pathParams) + return + } + + // lookup other methods to handle fallback from GET to POST and + // to determine if it is MethodNotAllowed or NotFound. + for m, handlers := range s.handlers { + if m == r.Method { + continue + } + for _, h := range handlers { + pathParams, err := h.pat.Match(components, verb) + if err != nil { + continue + } + // X-HTTP-Method-Override is optional. Always allow fallback to POST. + if s.isPathLengthFallback(r) { + if err := r.ParseForm(); err != nil { + if s.protoErrorHandler != nil { + _, outboundMarshaler := MarshalerForRequest(s, r) + sterr := status.Error(codes.InvalidArgument, err.Error()) + s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr) + } else { + OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest) + } + return + } + h.h(w, r, pathParams) + return + } + if s.protoErrorHandler != nil { + _, outboundMarshaler := MarshalerForRequest(s, r) + s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI) + } else { + OtherErrorHandler(w, r, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + } + return + } + } + + if s.protoErrorHandler != nil { + _, outboundMarshaler := MarshalerForRequest(s, r) + s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI) + } else { + OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound) + } +} + +// GetForwardResponseOptions returns the ForwardResponseOptions associated with this ServeMux. +func (s *ServeMux) GetForwardResponseOptions() []func(context.Context, http.ResponseWriter, proto.Message) error { + return s.forwardResponseOptions +} + +func (s *ServeMux) isPathLengthFallback(r *http.Request) bool { + return !s.disablePathLengthFallback && r.Method == "POST" && r.Header.Get("Content-Type") == "application/x-www-form-urlencoded" +} + +type handler struct { + pat Pattern + h HandlerFunc +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go new file mode 100644 index 000000000..09053695d --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go @@ -0,0 +1,262 @@ +package runtime + +import ( + "errors" + "fmt" + "strings" + + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc/grpclog" +) + +var ( + // ErrNotMatch indicates that the given HTTP request path does not match to the pattern. + ErrNotMatch = errors.New("not match to the path pattern") + // ErrInvalidPattern indicates that the given definition of Pattern is not valid. + ErrInvalidPattern = errors.New("invalid pattern") +) + +type op struct { + code utilities.OpCode + operand int +} + +// Pattern is a template pattern of http request paths defined in github.com/googleapis/googleapis/google/api/http.proto. +type Pattern struct { + // ops is a list of operations + ops []op + // pool is a constant pool indexed by the operands or vars. + pool []string + // vars is a list of variables names to be bound by this pattern + vars []string + // stacksize is the max depth of the stack + stacksize int + // tailLen is the length of the fixed-size segments after a deep wildcard + tailLen int + // verb is the VERB part of the path pattern. It is empty if the pattern does not have VERB part. + verb string + // assumeColonVerb indicates whether a path suffix after a final + // colon may only be interpreted as a verb. + assumeColonVerb bool +} + +type patternOptions struct { + assumeColonVerb bool +} + +// PatternOpt is an option for creating Patterns. +type PatternOpt func(*patternOptions) + +// NewPattern returns a new Pattern from the given definition values. +// "ops" is a sequence of op codes. "pool" is a constant pool. +// "verb" is the verb part of the pattern. It is empty if the pattern does not have the part. +// "version" must be 1 for now. +// It returns an error if the given definition is invalid. +func NewPattern(version int, ops []int, pool []string, verb string, opts ...PatternOpt) (Pattern, error) { + options := patternOptions{ + assumeColonVerb: true, + } + for _, o := range opts { + o(&options) + } + + if version != 1 { + grpclog.Infof("unsupported version: %d", version) + return Pattern{}, ErrInvalidPattern + } + + l := len(ops) + if l%2 != 0 { + grpclog.Infof("odd number of ops codes: %d", l) + return Pattern{}, ErrInvalidPattern + } + + var ( + typedOps []op + stack, maxstack int + tailLen int + pushMSeen bool + vars []string + ) + for i := 0; i < l; i += 2 { + op := op{code: utilities.OpCode(ops[i]), operand: ops[i+1]} + switch op.code { + case utilities.OpNop: + continue + case utilities.OpPush: + if pushMSeen { + tailLen++ + } + stack++ + case utilities.OpPushM: + if pushMSeen { + grpclog.Infof("pushM appears twice") + return Pattern{}, ErrInvalidPattern + } + pushMSeen = true + stack++ + case utilities.OpLitPush: + if op.operand < 0 || len(pool) <= op.operand { + grpclog.Infof("negative literal index: %d", op.operand) + return Pattern{}, ErrInvalidPattern + } + if pushMSeen { + tailLen++ + } + stack++ + case utilities.OpConcatN: + if op.operand <= 0 { + grpclog.Infof("negative concat size: %d", op.operand) + return Pattern{}, ErrInvalidPattern + } + stack -= op.operand + if stack < 0 { + grpclog.Print("stack underflow") + return Pattern{}, ErrInvalidPattern + } + stack++ + case utilities.OpCapture: + if op.operand < 0 || len(pool) <= op.operand { + grpclog.Infof("variable name index out of bound: %d", op.operand) + return Pattern{}, ErrInvalidPattern + } + v := pool[op.operand] + op.operand = len(vars) + vars = append(vars, v) + stack-- + if stack < 0 { + grpclog.Infof("stack underflow") + return Pattern{}, ErrInvalidPattern + } + default: + grpclog.Infof("invalid opcode: %d", op.code) + return Pattern{}, ErrInvalidPattern + } + + if maxstack < stack { + maxstack = stack + } + typedOps = append(typedOps, op) + } + return Pattern{ + ops: typedOps, + pool: pool, + vars: vars, + stacksize: maxstack, + tailLen: tailLen, + verb: verb, + assumeColonVerb: options.assumeColonVerb, + }, nil +} + +// MustPattern is a helper function which makes it easier to call NewPattern in variable initialization. +func MustPattern(p Pattern, err error) Pattern { + if err != nil { + grpclog.Fatalf("Pattern initialization failed: %v", err) + } + return p +} + +// Match examines components if it matches to the Pattern. +// If it matches, the function returns a mapping from field paths to their captured values. +// If otherwise, the function returns an error. +func (p Pattern) Match(components []string, verb string) (map[string]string, error) { + if p.verb != verb { + if p.assumeColonVerb || p.verb != "" { + return nil, ErrNotMatch + } + if len(components) == 0 { + components = []string{":" + verb} + } else { + components = append([]string{}, components...) + components[len(components)-1] += ":" + verb + } + verb = "" + } + + var pos int + stack := make([]string, 0, p.stacksize) + captured := make([]string, len(p.vars)) + l := len(components) + for _, op := range p.ops { + switch op.code { + case utilities.OpNop: + continue + case utilities.OpPush, utilities.OpLitPush: + if pos >= l { + return nil, ErrNotMatch + } + c := components[pos] + if op.code == utilities.OpLitPush { + if lit := p.pool[op.operand]; c != lit { + return nil, ErrNotMatch + } + } + stack = append(stack, c) + pos++ + case utilities.OpPushM: + end := len(components) + if end < pos+p.tailLen { + return nil, ErrNotMatch + } + end -= p.tailLen + stack = append(stack, strings.Join(components[pos:end], "/")) + pos = end + case utilities.OpConcatN: + n := op.operand + l := len(stack) - n + stack = append(stack[:l], strings.Join(stack[l:], "/")) + case utilities.OpCapture: + n := len(stack) - 1 + captured[op.operand] = stack[n] + stack = stack[:n] + } + } + if pos < l { + return nil, ErrNotMatch + } + bindings := make(map[string]string) + for i, val := range captured { + bindings[p.vars[i]] = val + } + return bindings, nil +} + +// Verb returns the verb part of the Pattern. +func (p Pattern) Verb() string { return p.verb } + +func (p Pattern) String() string { + var stack []string + for _, op := range p.ops { + switch op.code { + case utilities.OpNop: + continue + case utilities.OpPush: + stack = append(stack, "*") + case utilities.OpLitPush: + stack = append(stack, p.pool[op.operand]) + case utilities.OpPushM: + stack = append(stack, "**") + case utilities.OpConcatN: + n := op.operand + l := len(stack) - n + stack = append(stack[:l], strings.Join(stack[l:], "/")) + case utilities.OpCapture: + n := len(stack) - 1 + stack[n] = fmt.Sprintf("{%s=%s}", p.vars[op.operand], stack[n]) + } + } + segs := strings.Join(stack, "/") + if p.verb != "" { + return fmt.Sprintf("/%s:%s", segs, p.verb) + } + return "/" + segs +} + +// AssumeColonVerbOpt indicates whether a path suffix after a final +// colon may only be interpreted as a verb. +func AssumeColonVerbOpt(val bool) PatternOpt { + return PatternOpt(func(o *patternOptions) { + o.assumeColonVerb = val + }) +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go new file mode 100644 index 000000000..a3151e2a5 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go @@ -0,0 +1,80 @@ +package runtime + +import ( + "github.com/golang/protobuf/proto" +) + +// StringP returns a pointer to a string whose pointee is same as the given string value. +func StringP(val string) (*string, error) { + return proto.String(val), nil +} + +// BoolP parses the given string representation of a boolean value, +// and returns a pointer to a bool whose value is same as the parsed value. +func BoolP(val string) (*bool, error) { + b, err := Bool(val) + if err != nil { + return nil, err + } + return proto.Bool(b), nil +} + +// Float64P parses the given string representation of a floating point number, +// and returns a pointer to a float64 whose value is same as the parsed number. +func Float64P(val string) (*float64, error) { + f, err := Float64(val) + if err != nil { + return nil, err + } + return proto.Float64(f), nil +} + +// Float32P parses the given string representation of a floating point number, +// and returns a pointer to a float32 whose value is same as the parsed number. +func Float32P(val string) (*float32, error) { + f, err := Float32(val) + if err != nil { + return nil, err + } + return proto.Float32(f), nil +} + +// Int64P parses the given string representation of an integer +// and returns a pointer to a int64 whose value is same as the parsed integer. +func Int64P(val string) (*int64, error) { + i, err := Int64(val) + if err != nil { + return nil, err + } + return proto.Int64(i), nil +} + +// Int32P parses the given string representation of an integer +// and returns a pointer to a int32 whose value is same as the parsed integer. +func Int32P(val string) (*int32, error) { + i, err := Int32(val) + if err != nil { + return nil, err + } + return proto.Int32(i), err +} + +// Uint64P parses the given string representation of an integer +// and returns a pointer to a uint64 whose value is same as the parsed integer. +func Uint64P(val string) (*uint64, error) { + i, err := Uint64(val) + if err != nil { + return nil, err + } + return proto.Uint64(i), err +} + +// Uint32P parses the given string representation of an integer +// and returns a pointer to a uint32 whose value is same as the parsed integer. +func Uint32P(val string) (*uint32, error) { + i, err := Uint32(val) + if err != nil { + return nil, err + } + return proto.Uint32(i), err +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go new file mode 100644 index 000000000..ca76324ef --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go @@ -0,0 +1,106 @@ +package runtime + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/ptypes/any" + "github.com/grpc-ecosystem/grpc-gateway/internal" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// StreamErrorHandlerFunc accepts an error as a gRPC error generated via status package and translates it into a +// a proto struct used to represent error at the end of a stream. +type StreamErrorHandlerFunc func(context.Context, error) *StreamError + +// StreamError is the payload for the final message in a server stream in the event that the server returns an +// error after a response message has already been sent. +type StreamError internal.StreamError + +// ProtoErrorHandlerFunc handles the error as a gRPC error generated via status package and replies to the request. +type ProtoErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, error) + +var _ ProtoErrorHandlerFunc = DefaultHTTPProtoErrorHandler + +// DefaultHTTPProtoErrorHandler is an implementation of HTTPError. +// If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode. +// If otherwise, it replies with http.StatusInternalServerError. +// +// The response body returned by this function is a Status message marshaled by a Marshaler. +// +// Do not set this function to HTTPError variable directly, use WithProtoErrorHandler option instead. +func DefaultHTTPProtoErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, _ *http.Request, err error) { + // return Internal when Marshal failed + const fallback = `{"code": 13, "message": "failed to marshal error message"}` + + s, ok := status.FromError(err) + if !ok { + s = status.New(codes.Unknown, err.Error()) + } + + w.Header().Del("Trailer") + + contentType := marshaler.ContentType() + // Check marshaler on run time in order to keep backwards compatability + // An interface param needs to be added to the ContentType() function on + // the Marshal interface to be able to remove this check + if httpBodyMarshaler, ok := marshaler.(*HTTPBodyMarshaler); ok { + pb := s.Proto() + contentType = httpBodyMarshaler.ContentTypeFromMessage(pb) + } + w.Header().Set("Content-Type", contentType) + + buf, merr := marshaler.Marshal(s.Proto()) + if merr != nil { + grpclog.Infof("Failed to marshal error message %q: %v", s.Proto(), merr) + w.WriteHeader(http.StatusInternalServerError) + if _, err := io.WriteString(w, fallback); err != nil { + grpclog.Infof("Failed to write response: %v", err) + } + return + } + + md, ok := ServerMetadataFromContext(ctx) + if !ok { + grpclog.Infof("Failed to extract ServerMetadata from context") + } + + handleForwardResponseServerMetadata(w, mux, md) + handleForwardResponseTrailerHeader(w, md) + st := HTTPStatusFromCode(s.Code()) + w.WriteHeader(st) + if _, err := w.Write(buf); err != nil { + grpclog.Infof("Failed to write response: %v", err) + } + + handleForwardResponseTrailer(w, md) +} + +// DefaultHTTPStreamErrorHandler converts the given err into a *StreamError via +// default logic. +// +// It extracts the gRPC status from err if possible. The fields of the status are +// used to populate the returned StreamError, and the HTTP status code is derived +// from the gRPC code via HTTPStatusFromCode. If the given err does not contain a +// gRPC status, an "Unknown" gRPC code is used and "Internal Server Error" HTTP code. +func DefaultHTTPStreamErrorHandler(_ context.Context, err error) *StreamError { + grpcCode := codes.Unknown + grpcMessage := err.Error() + var grpcDetails []*any.Any + if s, ok := status.FromError(err); ok { + grpcCode = s.Code() + grpcMessage = s.Message() + grpcDetails = s.Proto().GetDetails() + } + httpCode := HTTPStatusFromCode(grpcCode) + return &StreamError{ + GrpcCode: int32(grpcCode), + HttpCode: int32(httpCode), + Message: grpcMessage, + HttpStatus: http.StatusText(httpCode), + Details: grpcDetails, + } +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go new file mode 100644 index 000000000..80ff21c3a --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go @@ -0,0 +1,391 @@ +package runtime + +import ( + "encoding/base64" + "fmt" + "net/url" + "reflect" + "regexp" + "strconv" + "strings" + "time" + + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc/grpclog" +) + +var valuesKeyRegexp = regexp.MustCompile("^(.*)\\[(.*)\\]$") + +// PopulateQueryParameters populates "values" into "msg". +// A value is ignored if its key starts with one of the elements in "filter". +func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error { + for key, values := range values { + match := valuesKeyRegexp.FindStringSubmatch(key) + if len(match) == 3 { + key = match[1] + values = append([]string{match[2]}, values...) + } + fieldPath := strings.Split(key, ".") + if filter.HasCommonPrefix(fieldPath) { + continue + } + if err := populateFieldValueFromPath(msg, fieldPath, values); err != nil { + return err + } + } + return nil +} + +// PopulateFieldFromPath sets a value in a nested Protobuf structure. +// It instantiates missing protobuf fields as it goes. +func PopulateFieldFromPath(msg proto.Message, fieldPathString string, value string) error { + fieldPath := strings.Split(fieldPathString, ".") + return populateFieldValueFromPath(msg, fieldPath, []string{value}) +} + +func populateFieldValueFromPath(msg proto.Message, fieldPath []string, values []string) error { + m := reflect.ValueOf(msg) + if m.Kind() != reflect.Ptr { + return fmt.Errorf("unexpected type %T: %v", msg, msg) + } + var props *proto.Properties + m = m.Elem() + for i, fieldName := range fieldPath { + isLast := i == len(fieldPath)-1 + if !isLast && m.Kind() != reflect.Struct { + return fmt.Errorf("non-aggregate type in the mid of path: %s", strings.Join(fieldPath, ".")) + } + var f reflect.Value + var err error + f, props, err = fieldByProtoName(m, fieldName) + if err != nil { + return err + } else if !f.IsValid() { + grpclog.Infof("field not found in %T: %s", msg, strings.Join(fieldPath, ".")) + return nil + } + + switch f.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, reflect.String, reflect.Uint32, reflect.Uint64: + if !isLast { + return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], ".")) + } + m = f + case reflect.Slice: + if !isLast { + return fmt.Errorf("unexpected repeated field in %s", strings.Join(fieldPath, ".")) + } + // Handle []byte + if f.Type().Elem().Kind() == reflect.Uint8 { + m = f + break + } + return populateRepeatedField(f, values, props) + case reflect.Ptr: + if f.IsNil() { + m = reflect.New(f.Type().Elem()) + f.Set(m.Convert(f.Type())) + } + m = f.Elem() + continue + case reflect.Struct: + m = f + continue + case reflect.Map: + if !isLast { + return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], ".")) + } + return populateMapField(f, values, props) + default: + return fmt.Errorf("unexpected type %s in %T", f.Type(), msg) + } + } + switch len(values) { + case 0: + return fmt.Errorf("no value of field: %s", strings.Join(fieldPath, ".")) + case 1: + default: + grpclog.Infof("too many field values: %s", strings.Join(fieldPath, ".")) + } + return populateField(m, values[0], props) +} + +// fieldByProtoName looks up a field whose corresponding protobuf field name is "name". +// "m" must be a struct value. It returns zero reflect.Value if no such field found. +func fieldByProtoName(m reflect.Value, name string) (reflect.Value, *proto.Properties, error) { + props := proto.GetProperties(m.Type()) + + // look up field name in oneof map + for _, op := range props.OneofTypes { + if name == op.Prop.OrigName || name == op.Prop.JSONName { + v := reflect.New(op.Type.Elem()) + field := m.Field(op.Field) + if !field.IsNil() { + return reflect.Value{}, nil, fmt.Errorf("field already set for %s oneof", props.Prop[op.Field].OrigName) + } + field.Set(v) + return v.Elem().Field(0), op.Prop, nil + } + } + + for _, p := range props.Prop { + if p.OrigName == name { + return m.FieldByName(p.Name), p, nil + } + if p.JSONName == name { + return m.FieldByName(p.Name), p, nil + } + } + return reflect.Value{}, nil, nil +} + +func populateMapField(f reflect.Value, values []string, props *proto.Properties) error { + if len(values) != 2 { + return fmt.Errorf("more than one value provided for key %s in map %s", values[0], props.Name) + } + + key, value := values[0], values[1] + keyType := f.Type().Key() + valueType := f.Type().Elem() + if f.IsNil() { + f.Set(reflect.MakeMap(f.Type())) + } + + keyConv, ok := convFromType[keyType.Kind()] + if !ok { + return fmt.Errorf("unsupported key type %s in map %s", keyType, props.Name) + } + valueConv, ok := convFromType[valueType.Kind()] + if !ok { + return fmt.Errorf("unsupported value type %s in map %s", valueType, props.Name) + } + + keyV := keyConv.Call([]reflect.Value{reflect.ValueOf(key)}) + if err := keyV[1].Interface(); err != nil { + return err.(error) + } + valueV := valueConv.Call([]reflect.Value{reflect.ValueOf(value)}) + if err := valueV[1].Interface(); err != nil { + return err.(error) + } + + f.SetMapIndex(keyV[0].Convert(keyType), valueV[0].Convert(valueType)) + + return nil +} + +func populateRepeatedField(f reflect.Value, values []string, props *proto.Properties) error { + elemType := f.Type().Elem() + + // is the destination field a slice of an enumeration type? + if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil { + return populateFieldEnumRepeated(f, values, enumValMap) + } + + conv, ok := convFromType[elemType.Kind()] + if !ok { + return fmt.Errorf("unsupported field type %s", elemType) + } + f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type())) + for i, v := range values { + result := conv.Call([]reflect.Value{reflect.ValueOf(v)}) + if err := result[1].Interface(); err != nil { + return err.(error) + } + f.Index(i).Set(result[0].Convert(f.Index(i).Type())) + } + return nil +} + +func populateField(f reflect.Value, value string, props *proto.Properties) error { + i := f.Addr().Interface() + + // Handle protobuf well known types + var name string + switch m := i.(type) { + case interface{ XXX_WellKnownType() string }: + name = m.XXX_WellKnownType() + case proto.Message: + const wktPrefix = "google.protobuf." + if fullName := proto.MessageName(m); strings.HasPrefix(fullName, wktPrefix) { + name = fullName[len(wktPrefix):] + } + } + switch name { + case "Timestamp": + if value == "null" { + f.FieldByName("Seconds").SetInt(0) + f.FieldByName("Nanos").SetInt(0) + return nil + } + + t, err := time.Parse(time.RFC3339Nano, value) + if err != nil { + return fmt.Errorf("bad Timestamp: %v", err) + } + f.FieldByName("Seconds").SetInt(int64(t.Unix())) + f.FieldByName("Nanos").SetInt(int64(t.Nanosecond())) + return nil + case "Duration": + if value == "null" { + f.FieldByName("Seconds").SetInt(0) + f.FieldByName("Nanos").SetInt(0) + return nil + } + d, err := time.ParseDuration(value) + if err != nil { + return fmt.Errorf("bad Duration: %v", err) + } + + ns := d.Nanoseconds() + s := ns / 1e9 + ns %= 1e9 + f.FieldByName("Seconds").SetInt(s) + f.FieldByName("Nanos").SetInt(ns) + return nil + case "DoubleValue": + fallthrough + case "FloatValue": + float64Val, err := strconv.ParseFloat(value, 64) + if err != nil { + return fmt.Errorf("bad DoubleValue: %s", value) + } + f.FieldByName("Value").SetFloat(float64Val) + return nil + case "Int64Value": + fallthrough + case "Int32Value": + int64Val, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return fmt.Errorf("bad DoubleValue: %s", value) + } + f.FieldByName("Value").SetInt(int64Val) + return nil + case "UInt64Value": + fallthrough + case "UInt32Value": + uint64Val, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return fmt.Errorf("bad DoubleValue: %s", value) + } + f.FieldByName("Value").SetUint(uint64Val) + return nil + case "BoolValue": + if value == "true" { + f.FieldByName("Value").SetBool(true) + } else if value == "false" { + f.FieldByName("Value").SetBool(false) + } else { + return fmt.Errorf("bad BoolValue: %s", value) + } + return nil + case "StringValue": + f.FieldByName("Value").SetString(value) + return nil + case "BytesValue": + bytesVal, err := base64.StdEncoding.DecodeString(value) + if err != nil { + return fmt.Errorf("bad BytesValue: %s", value) + } + f.FieldByName("Value").SetBytes(bytesVal) + return nil + case "FieldMask": + p := f.FieldByName("Paths") + for _, v := range strings.Split(value, ",") { + if v != "" { + p.Set(reflect.Append(p, reflect.ValueOf(v))) + } + } + return nil + } + + // Handle Time and Duration stdlib types + switch t := i.(type) { + case *time.Time: + pt, err := time.Parse(time.RFC3339Nano, value) + if err != nil { + return fmt.Errorf("bad Timestamp: %v", err) + } + *t = pt + return nil + case *time.Duration: + d, err := time.ParseDuration(value) + if err != nil { + return fmt.Errorf("bad Duration: %v", err) + } + *t = d + return nil + } + + // is the destination field an enumeration type? + if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil { + return populateFieldEnum(f, value, enumValMap) + } + + conv, ok := convFromType[f.Kind()] + if !ok { + return fmt.Errorf("field type %T is not supported in query parameters", i) + } + result := conv.Call([]reflect.Value{reflect.ValueOf(value)}) + if err := result[1].Interface(); err != nil { + return err.(error) + } + f.Set(result[0].Convert(f.Type())) + return nil +} + +func convertEnum(value string, t reflect.Type, enumValMap map[string]int32) (reflect.Value, error) { + // see if it's an enumeration string + if enumVal, ok := enumValMap[value]; ok { + return reflect.ValueOf(enumVal).Convert(t), nil + } + + // check for an integer that matches an enumeration value + eVal, err := strconv.Atoi(value) + if err != nil { + return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t) + } + for _, v := range enumValMap { + if v == int32(eVal) { + return reflect.ValueOf(eVal).Convert(t), nil + } + } + return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t) +} + +func populateFieldEnum(f reflect.Value, value string, enumValMap map[string]int32) error { + cval, err := convertEnum(value, f.Type(), enumValMap) + if err != nil { + return err + } + f.Set(cval) + return nil +} + +func populateFieldEnumRepeated(f reflect.Value, values []string, enumValMap map[string]int32) error { + elemType := f.Type().Elem() + f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type())) + for i, v := range values { + result, err := convertEnum(v, elemType, enumValMap) + if err != nil { + return err + } + f.Index(i).Set(result) + } + return nil +} + +var ( + convFromType = map[reflect.Kind]reflect.Value{ + reflect.String: reflect.ValueOf(String), + reflect.Bool: reflect.ValueOf(Bool), + reflect.Float64: reflect.ValueOf(Float64), + reflect.Float32: reflect.ValueOf(Float32), + reflect.Int64: reflect.ValueOf(Int64), + reflect.Int32: reflect.ValueOf(Int32), + reflect.Uint64: reflect.ValueOf(Uint64), + reflect.Uint32: reflect.ValueOf(Uint32), + reflect.Slice: reflect.ValueOf(Bytes), + } +) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/LICENSE b/vendor/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/doc.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/doc.go new file mode 100644 index 000000000..cf79a4d58 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/doc.go @@ -0,0 +1,2 @@ +// Package utilities provides members for internal use in grpc-gateway. +package utilities diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/pattern.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/pattern.go new file mode 100644 index 000000000..dfe7de486 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/pattern.go @@ -0,0 +1,22 @@ +package utilities + +// An OpCode is a opcode of compiled path patterns. +type OpCode int + +// These constants are the valid values of OpCode. +const ( + // OpNop does nothing + OpNop = OpCode(iota) + // OpPush pushes a component to stack + OpPush + // OpLitPush pushes a component to stack if it matches to the literal + OpLitPush + // OpPushM concatenates the remaining components and pushes it to stack + OpPushM + // OpConcatN pops N items from stack, concatenates them and pushes it back to stack + OpConcatN + // OpCapture pops an item and binds it to the variable + OpCapture + // OpEnd is the least positive invalid opcode. + OpEnd +) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/readerfactory.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/readerfactory.go new file mode 100644 index 000000000..6dd385466 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/readerfactory.go @@ -0,0 +1,20 @@ +package utilities + +import ( + "bytes" + "io" + "io/ioutil" +) + +// IOReaderFactory takes in an io.Reader and returns a function that will allow you to create a new reader that begins +// at the start of the stream +func IOReaderFactory(r io.Reader) (func() io.Reader, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return func() io.Reader { + return bytes.NewReader(b) + }, nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/trie.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/trie.go new file mode 100644 index 000000000..c2b7b30dd --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/trie.go @@ -0,0 +1,177 @@ +package utilities + +import ( + "sort" +) + +// DoubleArray is a Double Array implementation of trie on sequences of strings. +type DoubleArray struct { + // Encoding keeps an encoding from string to int + Encoding map[string]int + // Base is the base array of Double Array + Base []int + // Check is the check array of Double Array + Check []int +} + +// NewDoubleArray builds a DoubleArray from a set of sequences of strings. +func NewDoubleArray(seqs [][]string) *DoubleArray { + da := &DoubleArray{Encoding: make(map[string]int)} + if len(seqs) == 0 { + return da + } + + encoded := registerTokens(da, seqs) + sort.Sort(byLex(encoded)) + + root := node{row: -1, col: -1, left: 0, right: len(encoded)} + addSeqs(da, encoded, 0, root) + + for i := len(da.Base); i > 0; i-- { + if da.Check[i-1] != 0 { + da.Base = da.Base[:i] + da.Check = da.Check[:i] + break + } + } + return da +} + +func registerTokens(da *DoubleArray, seqs [][]string) [][]int { + var result [][]int + for _, seq := range seqs { + var encoded []int + for _, token := range seq { + if _, ok := da.Encoding[token]; !ok { + da.Encoding[token] = len(da.Encoding) + } + encoded = append(encoded, da.Encoding[token]) + } + result = append(result, encoded) + } + for i := range result { + result[i] = append(result[i], len(da.Encoding)) + } + return result +} + +type node struct { + row, col int + left, right int +} + +func (n node) value(seqs [][]int) int { + return seqs[n.row][n.col] +} + +func (n node) children(seqs [][]int) []*node { + var result []*node + lastVal := int(-1) + last := new(node) + for i := n.left; i < n.right; i++ { + if lastVal == seqs[i][n.col+1] { + continue + } + last.right = i + last = &node{ + row: i, + col: n.col + 1, + left: i, + } + result = append(result, last) + } + last.right = n.right + return result +} + +func addSeqs(da *DoubleArray, seqs [][]int, pos int, n node) { + ensureSize(da, pos) + + children := n.children(seqs) + var i int + for i = 1; ; i++ { + ok := func() bool { + for _, child := range children { + code := child.value(seqs) + j := i + code + ensureSize(da, j) + if da.Check[j] != 0 { + return false + } + } + return true + }() + if ok { + break + } + } + da.Base[pos] = i + for _, child := range children { + code := child.value(seqs) + j := i + code + da.Check[j] = pos + 1 + } + terminator := len(da.Encoding) + for _, child := range children { + code := child.value(seqs) + if code == terminator { + continue + } + j := i + code + addSeqs(da, seqs, j, *child) + } +} + +func ensureSize(da *DoubleArray, i int) { + for i >= len(da.Base) { + da.Base = append(da.Base, make([]int, len(da.Base)+1)...) + da.Check = append(da.Check, make([]int, len(da.Check)+1)...) + } +} + +type byLex [][]int + +func (l byLex) Len() int { return len(l) } +func (l byLex) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l byLex) Less(i, j int) bool { + si := l[i] + sj := l[j] + var k int + for k = 0; k < len(si) && k < len(sj); k++ { + if si[k] < sj[k] { + return true + } + if si[k] > sj[k] { + return false + } + } + if k < len(sj) { + return true + } + return false +} + +// HasCommonPrefix determines if any sequence in the DoubleArray is a prefix of the given sequence. +func (da *DoubleArray) HasCommonPrefix(seq []string) bool { + if len(da.Base) == 0 { + return false + } + + var i int + for _, t := range seq { + code, ok := da.Encoding[t] + if !ok { + break + } + j := da.Base[i] + code + if len(da.Check) <= j || da.Check[j] != i+1 { + break + } + i = j + } + j := da.Base[i] + len(da.Encoding) + if len(da.Check) <= j || da.Check[j] != i+1 { + return false + } + return true +} diff --git a/vendor/github.com/hashicorp/golang-lru/2q.go b/vendor/github.com/hashicorp/golang-lru/2q.go new file mode 100644 index 000000000..e474cd075 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/2q.go @@ -0,0 +1,223 @@ +package lru + +import ( + "fmt" + "sync" + + "github.com/hashicorp/golang-lru/simplelru" +) + +const ( + // Default2QRecentRatio is the ratio of the 2Q cache dedicated + // to recently added entries that have only been accessed once. + Default2QRecentRatio = 0.25 + + // Default2QGhostEntries is the default ratio of ghost + // entries kept to track entries recently evicted + Default2QGhostEntries = 0.50 +) + +// TwoQueueCache is a thread-safe fixed size 2Q cache. +// 2Q is an enhancement over the standard LRU cache +// in that it tracks both frequently and recently used +// entries separately. This avoids a burst in access to new +// entries from evicting frequently used entries. It adds some +// additional tracking overhead to the standard LRU cache, and is +// computationally about 2x the cost, and adds some metadata over +// head. The ARCCache is similar, but does not require setting any +// parameters. +type TwoQueueCache struct { + size int + recentSize int + + recent simplelru.LRUCache + frequent simplelru.LRUCache + recentEvict simplelru.LRUCache + lock sync.RWMutex +} + +// New2Q creates a new TwoQueueCache using the default +// values for the parameters. +func New2Q(size int) (*TwoQueueCache, error) { + return New2QParams(size, Default2QRecentRatio, Default2QGhostEntries) +} + +// New2QParams creates a new TwoQueueCache using the provided +// parameter values. +func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { + if size <= 0 { + return nil, fmt.Errorf("invalid size") + } + if recentRatio < 0.0 || recentRatio > 1.0 { + return nil, fmt.Errorf("invalid recent ratio") + } + if ghostRatio < 0.0 || ghostRatio > 1.0 { + return nil, fmt.Errorf("invalid ghost ratio") + } + + // Determine the sub-sizes + recentSize := int(float64(size) * recentRatio) + evictSize := int(float64(size) * ghostRatio) + + // Allocate the LRUs + recent, err := simplelru.NewLRU(size, nil) + if err != nil { + return nil, err + } + frequent, err := simplelru.NewLRU(size, nil) + if err != nil { + return nil, err + } + recentEvict, err := simplelru.NewLRU(evictSize, nil) + if err != nil { + return nil, err + } + + // Initialize the cache + c := &TwoQueueCache{ + size: size, + recentSize: recentSize, + recent: recent, + frequent: frequent, + recentEvict: recentEvict, + } + return c, nil +} + +// Get looks up a key's value from the cache. +func (c *TwoQueueCache) Get(key interface{}) (value interface{}, ok bool) { + c.lock.Lock() + defer c.lock.Unlock() + + // Check if this is a frequent value + if val, ok := c.frequent.Get(key); ok { + return val, ok + } + + // If the value is contained in recent, then we + // promote it to frequent + if val, ok := c.recent.Peek(key); ok { + c.recent.Remove(key) + c.frequent.Add(key, val) + return val, ok + } + + // No hit + return nil, false +} + +// Add adds a value to the cache. +func (c *TwoQueueCache) Add(key, value interface{}) { + c.lock.Lock() + defer c.lock.Unlock() + + // Check if the value is frequently used already, + // and just update the value + if c.frequent.Contains(key) { + c.frequent.Add(key, value) + return + } + + // Check if the value is recently used, and promote + // the value into the frequent list + if c.recent.Contains(key) { + c.recent.Remove(key) + c.frequent.Add(key, value) + return + } + + // If the value was recently evicted, add it to the + // frequently used list + if c.recentEvict.Contains(key) { + c.ensureSpace(true) + c.recentEvict.Remove(key) + c.frequent.Add(key, value) + return + } + + // Add to the recently seen list + c.ensureSpace(false) + c.recent.Add(key, value) + return +} + +// ensureSpace is used to ensure we have space in the cache +func (c *TwoQueueCache) ensureSpace(recentEvict bool) { + // If we have space, nothing to do + recentLen := c.recent.Len() + freqLen := c.frequent.Len() + if recentLen+freqLen < c.size { + return + } + + // If the recent buffer is larger than + // the target, evict from there + if recentLen > 0 && (recentLen > c.recentSize || (recentLen == c.recentSize && !recentEvict)) { + k, _, _ := c.recent.RemoveOldest() + c.recentEvict.Add(k, nil) + return + } + + // Remove from the frequent list otherwise + c.frequent.RemoveOldest() +} + +// Len returns the number of items in the cache. +func (c *TwoQueueCache) Len() int { + c.lock.RLock() + defer c.lock.RUnlock() + return c.recent.Len() + c.frequent.Len() +} + +// Keys returns a slice of the keys in the cache. +// The frequently used keys are first in the returned slice. +func (c *TwoQueueCache) Keys() []interface{} { + c.lock.RLock() + defer c.lock.RUnlock() + k1 := c.frequent.Keys() + k2 := c.recent.Keys() + return append(k1, k2...) +} + +// Remove removes the provided key from the cache. +func (c *TwoQueueCache) Remove(key interface{}) { + c.lock.Lock() + defer c.lock.Unlock() + if c.frequent.Remove(key) { + return + } + if c.recent.Remove(key) { + return + } + if c.recentEvict.Remove(key) { + return + } +} + +// Purge is used to completely clear the cache. +func (c *TwoQueueCache) Purge() { + c.lock.Lock() + defer c.lock.Unlock() + c.recent.Purge() + c.frequent.Purge() + c.recentEvict.Purge() +} + +// Contains is used to check if the cache contains a key +// without updating recency or frequency. +func (c *TwoQueueCache) Contains(key interface{}) bool { + c.lock.RLock() + defer c.lock.RUnlock() + return c.frequent.Contains(key) || c.recent.Contains(key) +} + +// Peek is used to inspect the cache value of a key +// without updating recency or frequency. +func (c *TwoQueueCache) Peek(key interface{}) (value interface{}, ok bool) { + c.lock.RLock() + defer c.lock.RUnlock() + if val, ok := c.frequent.Peek(key); ok { + return val, ok + } + return c.recent.Peek(key) +} diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE new file mode 100644 index 000000000..be2cc4dfb --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/LICENSE @@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/hashicorp/golang-lru/arc.go b/vendor/github.com/hashicorp/golang-lru/arc.go new file mode 100644 index 000000000..555225a21 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/arc.go @@ -0,0 +1,257 @@ +package lru + +import ( + "sync" + + "github.com/hashicorp/golang-lru/simplelru" +) + +// ARCCache is a thread-safe fixed size Adaptive Replacement Cache (ARC). +// ARC is an enhancement over the standard LRU cache in that tracks both +// frequency and recency of use. This avoids a burst in access to new +// entries from evicting the frequently used older entries. It adds some +// additional tracking overhead to a standard LRU cache, computationally +// it is roughly 2x the cost, and the extra memory overhead is linear +// with the size of the cache. ARC has been patented by IBM, but is +// similar to the TwoQueueCache (2Q) which requires setting parameters. +type ARCCache struct { + size int // Size is the total capacity of the cache + p int // P is the dynamic preference towards T1 or T2 + + t1 simplelru.LRUCache // T1 is the LRU for recently accessed items + b1 simplelru.LRUCache // B1 is the LRU for evictions from t1 + + t2 simplelru.LRUCache // T2 is the LRU for frequently accessed items + b2 simplelru.LRUCache // B2 is the LRU for evictions from t2 + + lock sync.RWMutex +} + +// NewARC creates an ARC of the given size +func NewARC(size int) (*ARCCache, error) { + // Create the sub LRUs + b1, err := simplelru.NewLRU(size, nil) + if err != nil { + return nil, err + } + b2, err := simplelru.NewLRU(size, nil) + if err != nil { + return nil, err + } + t1, err := simplelru.NewLRU(size, nil) + if err != nil { + return nil, err + } + t2, err := simplelru.NewLRU(size, nil) + if err != nil { + return nil, err + } + + // Initialize the ARC + c := &ARCCache{ + size: size, + p: 0, + t1: t1, + b1: b1, + t2: t2, + b2: b2, + } + return c, nil +} + +// Get looks up a key's value from the cache. +func (c *ARCCache) Get(key interface{}) (value interface{}, ok bool) { + c.lock.Lock() + defer c.lock.Unlock() + + // If the value is contained in T1 (recent), then + // promote it to T2 (frequent) + if val, ok := c.t1.Peek(key); ok { + c.t1.Remove(key) + c.t2.Add(key, val) + return val, ok + } + + // Check if the value is contained in T2 (frequent) + if val, ok := c.t2.Get(key); ok { + return val, ok + } + + // No hit + return nil, false +} + +// Add adds a value to the cache. +func (c *ARCCache) Add(key, value interface{}) { + c.lock.Lock() + defer c.lock.Unlock() + + // Check if the value is contained in T1 (recent), and potentially + // promote it to frequent T2 + if c.t1.Contains(key) { + c.t1.Remove(key) + c.t2.Add(key, value) + return + } + + // Check if the value is already in T2 (frequent) and update it + if c.t2.Contains(key) { + c.t2.Add(key, value) + return + } + + // Check if this value was recently evicted as part of the + // recently used list + if c.b1.Contains(key) { + // T1 set is too small, increase P appropriately + delta := 1 + b1Len := c.b1.Len() + b2Len := c.b2.Len() + if b2Len > b1Len { + delta = b2Len / b1Len + } + if c.p+delta >= c.size { + c.p = c.size + } else { + c.p += delta + } + + // Potentially need to make room in the cache + if c.t1.Len()+c.t2.Len() >= c.size { + c.replace(false) + } + + // Remove from B1 + c.b1.Remove(key) + + // Add the key to the frequently used list + c.t2.Add(key, value) + return + } + + // Check if this value was recently evicted as part of the + // frequently used list + if c.b2.Contains(key) { + // T2 set is too small, decrease P appropriately + delta := 1 + b1Len := c.b1.Len() + b2Len := c.b2.Len() + if b1Len > b2Len { + delta = b1Len / b2Len + } + if delta >= c.p { + c.p = 0 + } else { + c.p -= delta + } + + // Potentially need to make room in the cache + if c.t1.Len()+c.t2.Len() >= c.size { + c.replace(true) + } + + // Remove from B2 + c.b2.Remove(key) + + // Add the key to the frequently used list + c.t2.Add(key, value) + return + } + + // Potentially need to make room in the cache + if c.t1.Len()+c.t2.Len() >= c.size { + c.replace(false) + } + + // Keep the size of the ghost buffers trim + if c.b1.Len() > c.size-c.p { + c.b1.RemoveOldest() + } + if c.b2.Len() > c.p { + c.b2.RemoveOldest() + } + + // Add to the recently seen list + c.t1.Add(key, value) + return +} + +// replace is used to adaptively evict from either T1 or T2 +// based on the current learned value of P +func (c *ARCCache) replace(b2ContainsKey bool) { + t1Len := c.t1.Len() + if t1Len > 0 && (t1Len > c.p || (t1Len == c.p && b2ContainsKey)) { + k, _, ok := c.t1.RemoveOldest() + if ok { + c.b1.Add(k, nil) + } + } else { + k, _, ok := c.t2.RemoveOldest() + if ok { + c.b2.Add(k, nil) + } + } +} + +// Len returns the number of cached entries +func (c *ARCCache) Len() int { + c.lock.RLock() + defer c.lock.RUnlock() + return c.t1.Len() + c.t2.Len() +} + +// Keys returns all the cached keys +func (c *ARCCache) Keys() []interface{} { + c.lock.RLock() + defer c.lock.RUnlock() + k1 := c.t1.Keys() + k2 := c.t2.Keys() + return append(k1, k2...) +} + +// Remove is used to purge a key from the cache +func (c *ARCCache) Remove(key interface{}) { + c.lock.Lock() + defer c.lock.Unlock() + if c.t1.Remove(key) { + return + } + if c.t2.Remove(key) { + return + } + if c.b1.Remove(key) { + return + } + if c.b2.Remove(key) { + return + } +} + +// Purge is used to clear the cache +func (c *ARCCache) Purge() { + c.lock.Lock() + defer c.lock.Unlock() + c.t1.Purge() + c.t2.Purge() + c.b1.Purge() + c.b2.Purge() +} + +// Contains is used to check if the cache contains a key +// without updating recency or frequency. +func (c *ARCCache) Contains(key interface{}) bool { + c.lock.RLock() + defer c.lock.RUnlock() + return c.t1.Contains(key) || c.t2.Contains(key) +} + +// Peek is used to inspect the cache value of a key +// without updating recency or frequency. +func (c *ARCCache) Peek(key interface{}) (value interface{}, ok bool) { + c.lock.RLock() + defer c.lock.RUnlock() + if val, ok := c.t1.Peek(key); ok { + return val, ok + } + return c.t2.Peek(key) +} diff --git a/vendor/github.com/hashicorp/golang-lru/doc.go b/vendor/github.com/hashicorp/golang-lru/doc.go new file mode 100644 index 000000000..2547df979 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/doc.go @@ -0,0 +1,21 @@ +// Package lru provides three different LRU caches of varying sophistication. +// +// Cache is a simple LRU cache. It is based on the +// LRU implementation in groupcache: +// https://github.com/golang/groupcache/tree/master/lru +// +// TwoQueueCache tracks frequently used and recently used entries separately. +// This avoids a burst of accesses from taking out frequently used entries, +// at the cost of about 2x computational overhead and some extra bookkeeping. +// +// ARCCache is an adaptive replacement cache. It tracks recent evictions as +// well as recent usage in both the frequent and recent caches. Its +// computational overhead is comparable to TwoQueueCache, but the memory +// overhead is linear with the size of the cache. +// +// ARC has been patented by IBM, so do not use it if that is problematic for +// your program. +// +// All caches in this package take locks while operating, and are therefore +// thread-safe for consumers. +package lru diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go new file mode 100644 index 000000000..c8d9b0a23 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/lru.go @@ -0,0 +1,110 @@ +package lru + +import ( + "sync" + + "github.com/hashicorp/golang-lru/simplelru" +) + +// Cache is a thread-safe fixed size LRU cache. +type Cache struct { + lru simplelru.LRUCache + lock sync.RWMutex +} + +// New creates an LRU of the given size. +func New(size int) (*Cache, error) { + return NewWithEvict(size, nil) +} + +// NewWithEvict constructs a fixed size cache with the given eviction +// callback. +func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { + lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) + if err != nil { + return nil, err + } + c := &Cache{ + lru: lru, + } + return c, nil +} + +// Purge is used to completely clear the cache. +func (c *Cache) Purge() { + c.lock.Lock() + c.lru.Purge() + c.lock.Unlock() +} + +// Add adds a value to the cache. Returns true if an eviction occurred. +func (c *Cache) Add(key, value interface{}) (evicted bool) { + c.lock.Lock() + defer c.lock.Unlock() + return c.lru.Add(key, value) +} + +// Get looks up a key's value from the cache. +func (c *Cache) Get(key interface{}) (value interface{}, ok bool) { + c.lock.Lock() + defer c.lock.Unlock() + return c.lru.Get(key) +} + +// Contains checks if a key is in the cache, without updating the +// recent-ness or deleting it for being stale. +func (c *Cache) Contains(key interface{}) bool { + c.lock.RLock() + defer c.lock.RUnlock() + return c.lru.Contains(key) +} + +// Peek returns the key value (or undefined if not found) without updating +// the "recently used"-ness of the key. +func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { + c.lock.RLock() + defer c.lock.RUnlock() + return c.lru.Peek(key) +} + +// ContainsOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. +// Returns whether found and whether an eviction occurred. +func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { + c.lock.Lock() + defer c.lock.Unlock() + + if c.lru.Contains(key) { + return true, false + } + evicted = c.lru.Add(key, value) + return false, evicted +} + +// Remove removes the provided key from the cache. +func (c *Cache) Remove(key interface{}) { + c.lock.Lock() + c.lru.Remove(key) + c.lock.Unlock() +} + +// RemoveOldest removes the oldest item from the cache. +func (c *Cache) RemoveOldest() { + c.lock.Lock() + c.lru.RemoveOldest() + c.lock.Unlock() +} + +// Keys returns a slice of the keys in the cache, from oldest to newest. +func (c *Cache) Keys() []interface{} { + c.lock.RLock() + defer c.lock.RUnlock() + return c.lru.Keys() +} + +// Len returns the number of items in the cache. +func (c *Cache) Len() int { + c.lock.RLock() + defer c.lock.RUnlock() + return c.lru.Len() +} diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go new file mode 100644 index 000000000..5673773b2 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go @@ -0,0 +1,161 @@ +package simplelru + +import ( + "container/list" + "errors" +) + +// EvictCallback is used to get a callback when a cache entry is evicted +type EvictCallback func(key interface{}, value interface{}) + +// LRU implements a non-thread safe fixed size LRU cache +type LRU struct { + size int + evictList *list.List + items map[interface{}]*list.Element + onEvict EvictCallback +} + +// entry is used to hold a value in the evictList +type entry struct { + key interface{} + value interface{} +} + +// NewLRU constructs an LRU of the given size +func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { + if size <= 0 { + return nil, errors.New("Must provide a positive size") + } + c := &LRU{ + size: size, + evictList: list.New(), + items: make(map[interface{}]*list.Element), + onEvict: onEvict, + } + return c, nil +} + +// Purge is used to completely clear the cache. +func (c *LRU) Purge() { + for k, v := range c.items { + if c.onEvict != nil { + c.onEvict(k, v.Value.(*entry).value) + } + delete(c.items, k) + } + c.evictList.Init() +} + +// Add adds a value to the cache. Returns true if an eviction occurred. +func (c *LRU) Add(key, value interface{}) (evicted bool) { + // Check for existing item + if ent, ok := c.items[key]; ok { + c.evictList.MoveToFront(ent) + ent.Value.(*entry).value = value + return false + } + + // Add new item + ent := &entry{key, value} + entry := c.evictList.PushFront(ent) + c.items[key] = entry + + evict := c.evictList.Len() > c.size + // Verify size not exceeded + if evict { + c.removeOldest() + } + return evict +} + +// Get looks up a key's value from the cache. +func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { + if ent, ok := c.items[key]; ok { + c.evictList.MoveToFront(ent) + return ent.Value.(*entry).value, true + } + return +} + +// Contains checks if a key is in the cache, without updating the recent-ness +// or deleting it for being stale. +func (c *LRU) Contains(key interface{}) (ok bool) { + _, ok = c.items[key] + return ok +} + +// Peek returns the key value (or undefined if not found) without updating +// the "recently used"-ness of the key. +func (c *LRU) Peek(key interface{}) (value interface{}, ok bool) { + var ent *list.Element + if ent, ok = c.items[key]; ok { + return ent.Value.(*entry).value, true + } + return nil, ok +} + +// Remove removes the provided key from the cache, returning if the +// key was contained. +func (c *LRU) Remove(key interface{}) (present bool) { + if ent, ok := c.items[key]; ok { + c.removeElement(ent) + return true + } + return false +} + +// RemoveOldest removes the oldest item from the cache. +func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { + ent := c.evictList.Back() + if ent != nil { + c.removeElement(ent) + kv := ent.Value.(*entry) + return kv.key, kv.value, true + } + return nil, nil, false +} + +// GetOldest returns the oldest entry +func (c *LRU) GetOldest() (key interface{}, value interface{}, ok bool) { + ent := c.evictList.Back() + if ent != nil { + kv := ent.Value.(*entry) + return kv.key, kv.value, true + } + return nil, nil, false +} + +// Keys returns a slice of the keys in the cache, from oldest to newest. +func (c *LRU) Keys() []interface{} { + keys := make([]interface{}, len(c.items)) + i := 0 + for ent := c.evictList.Back(); ent != nil; ent = ent.Prev() { + keys[i] = ent.Value.(*entry).key + i++ + } + return keys +} + +// Len returns the number of items in the cache. +func (c *LRU) Len() int { + return c.evictList.Len() +} + +// removeOldest removes the oldest item from the cache. +func (c *LRU) removeOldest() { + ent := c.evictList.Back() + if ent != nil { + c.removeElement(ent) + } +} + +// removeElement is used to remove a given list element from the cache +func (c *LRU) removeElement(e *list.Element) { + c.evictList.Remove(e) + kv := e.Value.(*entry) + delete(c.items, kv.key) + if c.onEvict != nil { + c.onEvict(kv.key, kv.value) + } +} diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go new file mode 100644 index 000000000..74c707744 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go @@ -0,0 +1,36 @@ +package simplelru + +// LRUCache is the interface for simple LRU cache. +type LRUCache interface { + // Adds a value to the cache, returns true if an eviction occurred and + // updates the "recently used"-ness of the key. + Add(key, value interface{}) bool + + // Returns key's value from the cache and + // updates the "recently used"-ness of the key. #value, isFound + Get(key interface{}) (value interface{}, ok bool) + + // Check if a key exsists in cache without updating the recent-ness. + Contains(key interface{}) (ok bool) + + // Returns key's value without updating the "recently used"-ness of the key. + Peek(key interface{}) (value interface{}, ok bool) + + // Removes a key from the cache. + Remove(key interface{}) bool + + // Removes the oldest entry from cache. + RemoveOldest() (interface{}, interface{}, bool) + + // Returns the oldest entry from the cache. #key, value, isFound + GetOldest() (interface{}, interface{}, bool) + + // Returns a slice of the keys in the cache, from oldest to newest. + Keys() []interface{} + + // Returns the number of items in the cache. + Len() int + + // Clear all cache entries + Purge() +} diff --git a/vendor/github.com/imdario/mergo/LICENSE b/vendor/github.com/imdario/mergo/LICENSE new file mode 100644 index 000000000..686680298 --- /dev/null +++ b/vendor/github.com/imdario/mergo/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2013 Dario Castañé. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/imdario/mergo/doc.go b/vendor/github.com/imdario/mergo/doc.go new file mode 100644 index 000000000..6e9aa7baf --- /dev/null +++ b/vendor/github.com/imdario/mergo/doc.go @@ -0,0 +1,44 @@ +// Copyright 2013 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package mergo merges same-type structs and maps by setting default values in zero-value fields. + +Mergo won't merge unexported (private) fields but will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). + +Usage + +From my own work-in-progress project: + + type networkConfig struct { + Protocol string + Address string + ServerType string `json: "server_type"` + Port uint16 + } + + type FssnConfig struct { + Network networkConfig + } + + var fssnDefault = FssnConfig { + networkConfig { + "tcp", + "127.0.0.1", + "http", + 31560, + }, + } + + // Inside a function [...] + + if err := mergo.Merge(&config, fssnDefault); err != nil { + log.Fatal(err) + } + + // More code [...] + +*/ +package mergo diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go new file mode 100644 index 000000000..3f5afa83a --- /dev/null +++ b/vendor/github.com/imdario/mergo/map.go @@ -0,0 +1,175 @@ +// Copyright 2014 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on src/pkg/reflect/deepequal.go from official +// golang's stdlib. + +package mergo + +import ( + "fmt" + "reflect" + "unicode" + "unicode/utf8" +) + +func changeInitialCase(s string, mapper func(rune) rune) string { + if s == "" { + return s + } + r, n := utf8.DecodeRuneInString(s) + return string(mapper(r)) + s[n:] +} + +func isExported(field reflect.StructField) bool { + r, _ := utf8.DecodeRuneInString(field.Name) + return r >= 'A' && r <= 'Z' +} + +// Traverses recursively both values, assigning src's fields values to dst. +// The map argument tracks comparisons that have already been seen, which allows +// short circuiting on recursive types. +func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { + overwrite := config.Overwrite + if dst.CanAddr() { + addr := dst.UnsafeAddr() + h := 17 * addr + seen := visited[h] + typ := dst.Type() + for p := seen; p != nil; p = p.next { + if p.ptr == addr && p.typ == typ { + return nil + } + } + // Remember, remember... + visited[h] = &visit{addr, typ, seen} + } + zeroValue := reflect.Value{} + switch dst.Kind() { + case reflect.Map: + dstMap := dst.Interface().(map[string]interface{}) + for i, n := 0, src.NumField(); i < n; i++ { + srcType := src.Type() + field := srcType.Field(i) + if !isExported(field) { + continue + } + fieldName := field.Name + fieldName = changeInitialCase(fieldName, unicode.ToLower) + if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v)) || overwrite) { + dstMap[fieldName] = src.Field(i).Interface() + } + } + case reflect.Ptr: + if dst.IsNil() { + v := reflect.New(dst.Type().Elem()) + dst.Set(v) + } + dst = dst.Elem() + fallthrough + case reflect.Struct: + srcMap := src.Interface().(map[string]interface{}) + for key := range srcMap { + config.overwriteWithEmptyValue = true + srcValue := srcMap[key] + fieldName := changeInitialCase(key, unicode.ToUpper) + dstElement := dst.FieldByName(fieldName) + if dstElement == zeroValue { + // We discard it because the field doesn't exist. + continue + } + srcElement := reflect.ValueOf(srcValue) + dstKind := dstElement.Kind() + srcKind := srcElement.Kind() + if srcKind == reflect.Ptr && dstKind != reflect.Ptr { + srcElement = srcElement.Elem() + srcKind = reflect.TypeOf(srcElement.Interface()).Kind() + } else if dstKind == reflect.Ptr { + // Can this work? I guess it can't. + if srcKind != reflect.Ptr && srcElement.CanAddr() { + srcPtr := srcElement.Addr() + srcElement = reflect.ValueOf(srcPtr) + srcKind = reflect.Ptr + } + } + + if !srcElement.IsValid() { + continue + } + if srcKind == dstKind { + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface { + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } else if srcKind == reflect.Map { + if err = deepMap(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } else { + return fmt.Errorf("type mismatch on %s field: found %v, expected %v", fieldName, srcKind, dstKind) + } + } + } + return +} + +// Map sets fields' values in dst from src. +// src can be a map with string keys or a struct. dst must be the opposite: +// if src is a map, dst must be a valid pointer to struct. If src is a struct, +// dst must be map[string]interface{}. +// It won't merge unexported (private) fields and will do recursively +// any exported field. +// If dst is a map, keys will be src fields' names in lower camel case. +// Missing key in src that doesn't match a field in dst will be skipped. This +// doesn't apply if dst is a map. +// This is separated method from Merge because it is cleaner and it keeps sane +// semantics: merging equal types, mapping different (restricted) types. +func Map(dst, src interface{}, opts ...func(*Config)) error { + return _map(dst, src, opts...) +} + +// MapWithOverwrite will do the same as Map except that non-empty dst attributes will be overridden by +// non-empty src attribute values. +// Deprecated: Use Map(…) with WithOverride +func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { + return _map(dst, src, append(opts, WithOverride)...) +} + +func _map(dst, src interface{}, opts ...func(*Config)) error { + var ( + vDst, vSrc reflect.Value + err error + ) + config := &Config{} + + for _, opt := range opts { + opt(config) + } + + if vDst, vSrc, err = resolveValues(dst, src); err != nil { + return err + } + // To be friction-less, we redirect equal-type arguments + // to deepMerge. Only because arguments can be anything. + if vSrc.Kind() == vDst.Kind() { + return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) + } + switch vSrc.Kind() { + case reflect.Struct: + if vDst.Kind() != reflect.Map { + return ErrExpectedMapAsDestination + } + case reflect.Map: + if vDst.Kind() != reflect.Struct { + return ErrExpectedStructAsDestination + } + default: + return ErrNotSupported + } + return deepMap(vDst, vSrc, make(map[uintptr]*visit), 0, config) +} diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go new file mode 100644 index 000000000..f8de6c543 --- /dev/null +++ b/vendor/github.com/imdario/mergo/merge.go @@ -0,0 +1,255 @@ +// Copyright 2013 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on src/pkg/reflect/deepequal.go from official +// golang's stdlib. + +package mergo + +import ( + "fmt" + "reflect" +) + +func hasExportedField(dst reflect.Value) (exported bool) { + for i, n := 0, dst.NumField(); i < n; i++ { + field := dst.Type().Field(i) + if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { + exported = exported || hasExportedField(dst.Field(i)) + } else { + exported = exported || len(field.PkgPath) == 0 + } + } + return +} + +type Config struct { + Overwrite bool + AppendSlice bool + Transformers Transformers + overwriteWithEmptyValue bool +} + +type Transformers interface { + Transformer(reflect.Type) func(dst, src reflect.Value) error +} + +// Traverses recursively both values, assigning src's fields values to dst. +// The map argument tracks comparisons that have already been seen, which allows +// short circuiting on recursive types. +func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { + overwrite := config.Overwrite + overwriteWithEmptySrc := config.overwriteWithEmptyValue + config.overwriteWithEmptyValue = false + + if !src.IsValid() { + return + } + if dst.CanAddr() { + addr := dst.UnsafeAddr() + h := 17 * addr + seen := visited[h] + typ := dst.Type() + for p := seen; p != nil; p = p.next { + if p.ptr == addr && p.typ == typ { + return nil + } + } + // Remember, remember... + visited[h] = &visit{addr, typ, seen} + } + + if config.Transformers != nil && !isEmptyValue(dst) { + if fn := config.Transformers.Transformer(dst.Type()); fn != nil { + err = fn(dst, src) + return + } + } + + switch dst.Kind() { + case reflect.Struct: + if hasExportedField(dst) { + for i, n := 0, dst.NumField(); i < n; i++ { + if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { + return + } + } + } else { + if dst.CanSet() && (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) { + dst.Set(src) + } + } + case reflect.Map: + if dst.IsNil() && !src.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + for _, key := range src.MapKeys() { + srcElement := src.MapIndex(key) + if !srcElement.IsValid() { + continue + } + dstElement := dst.MapIndex(key) + switch srcElement.Kind() { + case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: + if srcElement.IsNil() { + continue + } + fallthrough + default: + if !srcElement.CanInterface() { + continue + } + switch reflect.TypeOf(srcElement.Interface()).Kind() { + case reflect.Struct: + fallthrough + case reflect.Ptr: + fallthrough + case reflect.Map: + srcMapElm := srcElement + dstMapElm := dstElement + if srcMapElm.CanInterface() { + srcMapElm = reflect.ValueOf(srcMapElm.Interface()) + if dstMapElm.IsValid() { + dstMapElm = reflect.ValueOf(dstMapElm.Interface()) + } + } + if err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil { + return + } + case reflect.Slice: + srcSlice := reflect.ValueOf(srcElement.Interface()) + + var dstSlice reflect.Value + if !dstElement.IsValid() || dstElement.IsNil() { + dstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len()) + } else { + dstSlice = reflect.ValueOf(dstElement.Interface()) + } + + if (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + dstSlice = srcSlice + } else if config.AppendSlice { + if srcSlice.Type() != dstSlice.Type() { + return fmt.Errorf("cannot append two slice with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) + } + dstSlice = reflect.AppendSlice(dstSlice, srcSlice) + } + dst.SetMapIndex(key, dstSlice) + } + } + if dstElement.IsValid() && !isEmptyValue(dstElement) && (reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map || reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice) { + continue + } + + if srcElement.IsValid() && (overwrite || (!dstElement.IsValid() || isEmptyValue(dstElement))) { + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + dst.SetMapIndex(key, srcElement) + } + } + case reflect.Slice: + if !dst.CanSet() { + break + } + if (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + dst.Set(src) + } else if config.AppendSlice { + if src.Type() != dst.Type() { + return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) + } + dst.Set(reflect.AppendSlice(dst, src)) + } + case reflect.Ptr: + fallthrough + case reflect.Interface: + if src.IsNil() { + break + } + if src.Kind() != reflect.Interface { + if dst.IsNil() || overwrite { + if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + dst.Set(src) + } + } else if src.Kind() == reflect.Ptr { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + } else if dst.Elem().Type() == src.Type() { + if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { + return + } + } else { + return ErrDifferentArgumentsTypes + } + break + } + if dst.IsNil() || overwrite { + if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + dst.Set(src) + } + } else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + default: + if dst.CanSet() && (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) { + dst.Set(src) + } + } + return +} + +// Merge will fill any empty for value type attributes on the dst struct using corresponding +// src attributes if they themselves are not empty. dst and src must be valid same-type structs +// and dst must be a pointer to struct. +// It won't merge unexported (private) fields and will do recursively any exported field. +func Merge(dst, src interface{}, opts ...func(*Config)) error { + return merge(dst, src, opts...) +} + +// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overriden by +// non-empty src attribute values. +// Deprecated: use Merge(…) with WithOverride +func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { + return merge(dst, src, append(opts, WithOverride)...) +} + +// WithTransformers adds transformers to merge, allowing to customize the merging of some types. +func WithTransformers(transformers Transformers) func(*Config) { + return func(config *Config) { + config.Transformers = transformers + } +} + +// WithOverride will make merge override non-empty dst attributes with non-empty src attributes values. +func WithOverride(config *Config) { + config.Overwrite = true +} + +// WithAppendSlice will make merge append slices instead of overwriting it +func WithAppendSlice(config *Config) { + config.AppendSlice = true +} + +func merge(dst, src interface{}, opts ...func(*Config)) error { + var ( + vDst, vSrc reflect.Value + err error + ) + + config := &Config{} + + for _, opt := range opts { + opt(config) + } + + if vDst, vSrc, err = resolveValues(dst, src); err != nil { + return err + } + if vDst.Type() != vSrc.Type() { + return ErrDifferentArgumentsTypes + } + return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) +} diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go new file mode 100644 index 000000000..a82fea2fd --- /dev/null +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -0,0 +1,97 @@ +// Copyright 2013 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on src/pkg/reflect/deepequal.go from official +// golang's stdlib. + +package mergo + +import ( + "errors" + "reflect" +) + +// Errors reported by Mergo when it finds invalid arguments. +var ( + ErrNilArguments = errors.New("src and dst must not be nil") + ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") + ErrNotSupported = errors.New("only structs and maps are supported") + ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") + ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") +) + +// During deepMerge, must keep track of checks that are +// in progress. The comparison algorithm assumes that all +// checks in progress are true when it reencounters them. +// Visited are stored in a map indexed by 17 * a1 + a2; +type visit struct { + ptr uintptr + typ reflect.Type + next *visit +} + +// From src/pkg/encoding/json/encode.go. +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + if v.IsNil() { + return true + } + return isEmptyValue(v.Elem()) + case reflect.Func: + return v.IsNil() + case reflect.Invalid: + return true + } + return false +} + +func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { + if dst == nil || src == nil { + err = ErrNilArguments + return + } + vDst = reflect.ValueOf(dst).Elem() + if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map { + err = ErrNotSupported + return + } + vSrc = reflect.ValueOf(src) + // We check if vSrc is a pointer to dereference it. + if vSrc.Kind() == reflect.Ptr { + vSrc = vSrc.Elem() + } + return +} + +// Traverses recursively both values, assigning src's fields values to dst. +// The map argument tracks comparisons that have already been seen, which allows +// short circuiting on recursive types. +func deeper(dst, src reflect.Value, visited map[uintptr]*visit, depth int) (err error) { + if dst.CanAddr() { + addr := dst.UnsafeAddr() + h := 17 * addr + seen := visited[h] + typ := dst.Type() + for p := seen; p != nil; p = p.next { + if p.ptr == addr && p.typ == typ { + return nil + } + } + // Remember, remember... + visited[h] = &visit{addr, typ, seen} + } + return // TODO refactor +} diff --git a/vendor/github.com/imdario/mergo/testdata/license.yml b/vendor/github.com/imdario/mergo/testdata/license.yml new file mode 100644 index 000000000..2f1ad0082 --- /dev/null +++ b/vendor/github.com/imdario/mergo/testdata/license.yml @@ -0,0 +1,4 @@ +import: ../../../../fossene/db/schema/thing.yml +fields: + site: string + author: root diff --git a/vendor/github.com/jmespath/go-jmespath/LICENSE b/vendor/github.com/jmespath/go-jmespath/LICENSE new file mode 100644 index 000000000..b03310a91 --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/LICENSE @@ -0,0 +1,13 @@ +Copyright 2015 James Saryerwinnie + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/jmespath/go-jmespath/api.go b/vendor/github.com/jmespath/go-jmespath/api.go new file mode 100644 index 000000000..8e26ffeec --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/api.go @@ -0,0 +1,49 @@ +package jmespath + +import "strconv" + +// JMESPath is the epresentation of a compiled JMES path query. A JMESPath is +// safe for concurrent use by multiple goroutines. +type JMESPath struct { + ast ASTNode + intr *treeInterpreter +} + +// Compile parses a JMESPath expression and returns, if successful, a JMESPath +// object that can be used to match against data. +func Compile(expression string) (*JMESPath, error) { + parser := NewParser() + ast, err := parser.Parse(expression) + if err != nil { + return nil, err + } + jmespath := &JMESPath{ast: ast, intr: newInterpreter()} + return jmespath, nil +} + +// MustCompile is like Compile but panics if the expression cannot be parsed. +// It simplifies safe initialization of global variables holding compiled +// JMESPaths. +func MustCompile(expression string) *JMESPath { + jmespath, err := Compile(expression) + if err != nil { + panic(`jmespath: Compile(` + strconv.Quote(expression) + `): ` + err.Error()) + } + return jmespath +} + +// Search evaluates a JMESPath expression against input data and returns the result. +func (jp *JMESPath) Search(data interface{}) (interface{}, error) { + return jp.intr.Execute(jp.ast, data) +} + +// Search evaluates a JMESPath expression against input data and returns the result. +func Search(expression string, data interface{}) (interface{}, error) { + intr := newInterpreter() + parser := NewParser() + ast, err := parser.Parse(expression) + if err != nil { + return nil, err + } + return intr.Execute(ast, data) +} diff --git a/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go b/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go new file mode 100644 index 000000000..1cd2d239c --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go @@ -0,0 +1,16 @@ +// generated by stringer -type astNodeType; DO NOT EDIT + +package jmespath + +import "fmt" + +const _astNodeType_name = "ASTEmptyASTComparatorASTCurrentNodeASTExpRefASTFunctionExpressionASTFieldASTFilterProjectionASTFlattenASTIdentityASTIndexASTIndexExpressionASTKeyValPairASTLiteralASTMultiSelectHashASTMultiSelectListASTOrExpressionASTAndExpressionASTNotExpressionASTPipeASTProjectionASTSubexpressionASTSliceASTValueProjection" + +var _astNodeType_index = [...]uint16{0, 8, 21, 35, 44, 65, 73, 92, 102, 113, 121, 139, 152, 162, 180, 198, 213, 229, 245, 252, 265, 281, 289, 307} + +func (i astNodeType) String() string { + if i < 0 || i >= astNodeType(len(_astNodeType_index)-1) { + return fmt.Sprintf("astNodeType(%d)", i) + } + return _astNodeType_name[_astNodeType_index[i]:_astNodeType_index[i+1]] +} diff --git a/vendor/github.com/jmespath/go-jmespath/functions.go b/vendor/github.com/jmespath/go-jmespath/functions.go new file mode 100644 index 000000000..9b7cd89b4 --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/functions.go @@ -0,0 +1,842 @@ +package jmespath + +import ( + "encoding/json" + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "unicode/utf8" +) + +type jpFunction func(arguments []interface{}) (interface{}, error) + +type jpType string + +const ( + jpUnknown jpType = "unknown" + jpNumber jpType = "number" + jpString jpType = "string" + jpArray jpType = "array" + jpObject jpType = "object" + jpArrayNumber jpType = "array[number]" + jpArrayString jpType = "array[string]" + jpExpref jpType = "expref" + jpAny jpType = "any" +) + +type functionEntry struct { + name string + arguments []argSpec + handler jpFunction + hasExpRef bool +} + +type argSpec struct { + types []jpType + variadic bool +} + +type byExprString struct { + intr *treeInterpreter + node ASTNode + items []interface{} + hasError bool +} + +func (a *byExprString) Len() int { + return len(a.items) +} +func (a *byExprString) Swap(i, j int) { + a.items[i], a.items[j] = a.items[j], a.items[i] +} +func (a *byExprString) Less(i, j int) bool { + first, err := a.intr.Execute(a.node, a.items[i]) + if err != nil { + a.hasError = true + // Return a dummy value. + return true + } + ith, ok := first.(string) + if !ok { + a.hasError = true + return true + } + second, err := a.intr.Execute(a.node, a.items[j]) + if err != nil { + a.hasError = true + // Return a dummy value. + return true + } + jth, ok := second.(string) + if !ok { + a.hasError = true + return true + } + return ith < jth +} + +type byExprFloat struct { + intr *treeInterpreter + node ASTNode + items []interface{} + hasError bool +} + +func (a *byExprFloat) Len() int { + return len(a.items) +} +func (a *byExprFloat) Swap(i, j int) { + a.items[i], a.items[j] = a.items[j], a.items[i] +} +func (a *byExprFloat) Less(i, j int) bool { + first, err := a.intr.Execute(a.node, a.items[i]) + if err != nil { + a.hasError = true + // Return a dummy value. + return true + } + ith, ok := first.(float64) + if !ok { + a.hasError = true + return true + } + second, err := a.intr.Execute(a.node, a.items[j]) + if err != nil { + a.hasError = true + // Return a dummy value. + return true + } + jth, ok := second.(float64) + if !ok { + a.hasError = true + return true + } + return ith < jth +} + +type functionCaller struct { + functionTable map[string]functionEntry +} + +func newFunctionCaller() *functionCaller { + caller := &functionCaller{} + caller.functionTable = map[string]functionEntry{ + "length": { + name: "length", + arguments: []argSpec{ + {types: []jpType{jpString, jpArray, jpObject}}, + }, + handler: jpfLength, + }, + "starts_with": { + name: "starts_with", + arguments: []argSpec{ + {types: []jpType{jpString}}, + {types: []jpType{jpString}}, + }, + handler: jpfStartsWith, + }, + "abs": { + name: "abs", + arguments: []argSpec{ + {types: []jpType{jpNumber}}, + }, + handler: jpfAbs, + }, + "avg": { + name: "avg", + arguments: []argSpec{ + {types: []jpType{jpArrayNumber}}, + }, + handler: jpfAvg, + }, + "ceil": { + name: "ceil", + arguments: []argSpec{ + {types: []jpType{jpNumber}}, + }, + handler: jpfCeil, + }, + "contains": { + name: "contains", + arguments: []argSpec{ + {types: []jpType{jpArray, jpString}}, + {types: []jpType{jpAny}}, + }, + handler: jpfContains, + }, + "ends_with": { + name: "ends_with", + arguments: []argSpec{ + {types: []jpType{jpString}}, + {types: []jpType{jpString}}, + }, + handler: jpfEndsWith, + }, + "floor": { + name: "floor", + arguments: []argSpec{ + {types: []jpType{jpNumber}}, + }, + handler: jpfFloor, + }, + "map": { + name: "amp", + arguments: []argSpec{ + {types: []jpType{jpExpref}}, + {types: []jpType{jpArray}}, + }, + handler: jpfMap, + hasExpRef: true, + }, + "max": { + name: "max", + arguments: []argSpec{ + {types: []jpType{jpArrayNumber, jpArrayString}}, + }, + handler: jpfMax, + }, + "merge": { + name: "merge", + arguments: []argSpec{ + {types: []jpType{jpObject}, variadic: true}, + }, + handler: jpfMerge, + }, + "max_by": { + name: "max_by", + arguments: []argSpec{ + {types: []jpType{jpArray}}, + {types: []jpType{jpExpref}}, + }, + handler: jpfMaxBy, + hasExpRef: true, + }, + "sum": { + name: "sum", + arguments: []argSpec{ + {types: []jpType{jpArrayNumber}}, + }, + handler: jpfSum, + }, + "min": { + name: "min", + arguments: []argSpec{ + {types: []jpType{jpArrayNumber, jpArrayString}}, + }, + handler: jpfMin, + }, + "min_by": { + name: "min_by", + arguments: []argSpec{ + {types: []jpType{jpArray}}, + {types: []jpType{jpExpref}}, + }, + handler: jpfMinBy, + hasExpRef: true, + }, + "type": { + name: "type", + arguments: []argSpec{ + {types: []jpType{jpAny}}, + }, + handler: jpfType, + }, + "keys": { + name: "keys", + arguments: []argSpec{ + {types: []jpType{jpObject}}, + }, + handler: jpfKeys, + }, + "values": { + name: "values", + arguments: []argSpec{ + {types: []jpType{jpObject}}, + }, + handler: jpfValues, + }, + "sort": { + name: "sort", + arguments: []argSpec{ + {types: []jpType{jpArrayString, jpArrayNumber}}, + }, + handler: jpfSort, + }, + "sort_by": { + name: "sort_by", + arguments: []argSpec{ + {types: []jpType{jpArray}}, + {types: []jpType{jpExpref}}, + }, + handler: jpfSortBy, + hasExpRef: true, + }, + "join": { + name: "join", + arguments: []argSpec{ + {types: []jpType{jpString}}, + {types: []jpType{jpArrayString}}, + }, + handler: jpfJoin, + }, + "reverse": { + name: "reverse", + arguments: []argSpec{ + {types: []jpType{jpArray, jpString}}, + }, + handler: jpfReverse, + }, + "to_array": { + name: "to_array", + arguments: []argSpec{ + {types: []jpType{jpAny}}, + }, + handler: jpfToArray, + }, + "to_string": { + name: "to_string", + arguments: []argSpec{ + {types: []jpType{jpAny}}, + }, + handler: jpfToString, + }, + "to_number": { + name: "to_number", + arguments: []argSpec{ + {types: []jpType{jpAny}}, + }, + handler: jpfToNumber, + }, + "not_null": { + name: "not_null", + arguments: []argSpec{ + {types: []jpType{jpAny}, variadic: true}, + }, + handler: jpfNotNull, + }, + } + return caller +} + +func (e *functionEntry) resolveArgs(arguments []interface{}) ([]interface{}, error) { + if len(e.arguments) == 0 { + return arguments, nil + } + if !e.arguments[len(e.arguments)-1].variadic { + if len(e.arguments) != len(arguments) { + return nil, errors.New("incorrect number of args") + } + for i, spec := range e.arguments { + userArg := arguments[i] + err := spec.typeCheck(userArg) + if err != nil { + return nil, err + } + } + return arguments, nil + } + if len(arguments) < len(e.arguments) { + return nil, errors.New("Invalid arity.") + } + return arguments, nil +} + +func (a *argSpec) typeCheck(arg interface{}) error { + for _, t := range a.types { + switch t { + case jpNumber: + if _, ok := arg.(float64); ok { + return nil + } + case jpString: + if _, ok := arg.(string); ok { + return nil + } + case jpArray: + if isSliceType(arg) { + return nil + } + case jpObject: + if _, ok := arg.(map[string]interface{}); ok { + return nil + } + case jpArrayNumber: + if _, ok := toArrayNum(arg); ok { + return nil + } + case jpArrayString: + if _, ok := toArrayStr(arg); ok { + return nil + } + case jpAny: + return nil + case jpExpref: + if _, ok := arg.(expRef); ok { + return nil + } + } + } + return fmt.Errorf("Invalid type for: %v, expected: %#v", arg, a.types) +} + +func (f *functionCaller) CallFunction(name string, arguments []interface{}, intr *treeInterpreter) (interface{}, error) { + entry, ok := f.functionTable[name] + if !ok { + return nil, errors.New("unknown function: " + name) + } + resolvedArgs, err := entry.resolveArgs(arguments) + if err != nil { + return nil, err + } + if entry.hasExpRef { + var extra []interface{} + extra = append(extra, intr) + resolvedArgs = append(extra, resolvedArgs...) + } + return entry.handler(resolvedArgs) +} + +func jpfAbs(arguments []interface{}) (interface{}, error) { + num := arguments[0].(float64) + return math.Abs(num), nil +} + +func jpfLength(arguments []interface{}) (interface{}, error) { + arg := arguments[0] + if c, ok := arg.(string); ok { + return float64(utf8.RuneCountInString(c)), nil + } else if isSliceType(arg) { + v := reflect.ValueOf(arg) + return float64(v.Len()), nil + } else if c, ok := arg.(map[string]interface{}); ok { + return float64(len(c)), nil + } + return nil, errors.New("could not compute length()") +} + +func jpfStartsWith(arguments []interface{}) (interface{}, error) { + search := arguments[0].(string) + prefix := arguments[1].(string) + return strings.HasPrefix(search, prefix), nil +} + +func jpfAvg(arguments []interface{}) (interface{}, error) { + // We've already type checked the value so we can safely use + // type assertions. + args := arguments[0].([]interface{}) + length := float64(len(args)) + numerator := 0.0 + for _, n := range args { + numerator += n.(float64) + } + return numerator / length, nil +} +func jpfCeil(arguments []interface{}) (interface{}, error) { + val := arguments[0].(float64) + return math.Ceil(val), nil +} +func jpfContains(arguments []interface{}) (interface{}, error) { + search := arguments[0] + el := arguments[1] + if searchStr, ok := search.(string); ok { + if elStr, ok := el.(string); ok { + return strings.Index(searchStr, elStr) != -1, nil + } + return false, nil + } + // Otherwise this is a generic contains for []interface{} + general := search.([]interface{}) + for _, item := range general { + if item == el { + return true, nil + } + } + return false, nil +} +func jpfEndsWith(arguments []interface{}) (interface{}, error) { + search := arguments[0].(string) + suffix := arguments[1].(string) + return strings.HasSuffix(search, suffix), nil +} +func jpfFloor(arguments []interface{}) (interface{}, error) { + val := arguments[0].(float64) + return math.Floor(val), nil +} +func jpfMap(arguments []interface{}) (interface{}, error) { + intr := arguments[0].(*treeInterpreter) + exp := arguments[1].(expRef) + node := exp.ref + arr := arguments[2].([]interface{}) + mapped := make([]interface{}, 0, len(arr)) + for _, value := range arr { + current, err := intr.Execute(node, value) + if err != nil { + return nil, err + } + mapped = append(mapped, current) + } + return mapped, nil +} +func jpfMax(arguments []interface{}) (interface{}, error) { + if items, ok := toArrayNum(arguments[0]); ok { + if len(items) == 0 { + return nil, nil + } + if len(items) == 1 { + return items[0], nil + } + best := items[0] + for _, item := range items[1:] { + if item > best { + best = item + } + } + return best, nil + } + // Otherwise we're dealing with a max() of strings. + items, _ := toArrayStr(arguments[0]) + if len(items) == 0 { + return nil, nil + } + if len(items) == 1 { + return items[0], nil + } + best := items[0] + for _, item := range items[1:] { + if item > best { + best = item + } + } + return best, nil +} +func jpfMerge(arguments []interface{}) (interface{}, error) { + final := make(map[string]interface{}) + for _, m := range arguments { + mapped := m.(map[string]interface{}) + for key, value := range mapped { + final[key] = value + } + } + return final, nil +} +func jpfMaxBy(arguments []interface{}) (interface{}, error) { + intr := arguments[0].(*treeInterpreter) + arr := arguments[1].([]interface{}) + exp := arguments[2].(expRef) + node := exp.ref + if len(arr) == 0 { + return nil, nil + } else if len(arr) == 1 { + return arr[0], nil + } + start, err := intr.Execute(node, arr[0]) + if err != nil { + return nil, err + } + switch t := start.(type) { + case float64: + bestVal := t + bestItem := arr[0] + for _, item := range arr[1:] { + result, err := intr.Execute(node, item) + if err != nil { + return nil, err + } + current, ok := result.(float64) + if !ok { + return nil, errors.New("invalid type, must be number") + } + if current > bestVal { + bestVal = current + bestItem = item + } + } + return bestItem, nil + case string: + bestVal := t + bestItem := arr[0] + for _, item := range arr[1:] { + result, err := intr.Execute(node, item) + if err != nil { + return nil, err + } + current, ok := result.(string) + if !ok { + return nil, errors.New("invalid type, must be string") + } + if current > bestVal { + bestVal = current + bestItem = item + } + } + return bestItem, nil + default: + return nil, errors.New("invalid type, must be number of string") + } +} +func jpfSum(arguments []interface{}) (interface{}, error) { + items, _ := toArrayNum(arguments[0]) + sum := 0.0 + for _, item := range items { + sum += item + } + return sum, nil +} + +func jpfMin(arguments []interface{}) (interface{}, error) { + if items, ok := toArrayNum(arguments[0]); ok { + if len(items) == 0 { + return nil, nil + } + if len(items) == 1 { + return items[0], nil + } + best := items[0] + for _, item := range items[1:] { + if item < best { + best = item + } + } + return best, nil + } + items, _ := toArrayStr(arguments[0]) + if len(items) == 0 { + return nil, nil + } + if len(items) == 1 { + return items[0], nil + } + best := items[0] + for _, item := range items[1:] { + if item < best { + best = item + } + } + return best, nil +} + +func jpfMinBy(arguments []interface{}) (interface{}, error) { + intr := arguments[0].(*treeInterpreter) + arr := arguments[1].([]interface{}) + exp := arguments[2].(expRef) + node := exp.ref + if len(arr) == 0 { + return nil, nil + } else if len(arr) == 1 { + return arr[0], nil + } + start, err := intr.Execute(node, arr[0]) + if err != nil { + return nil, err + } + if t, ok := start.(float64); ok { + bestVal := t + bestItem := arr[0] + for _, item := range arr[1:] { + result, err := intr.Execute(node, item) + if err != nil { + return nil, err + } + current, ok := result.(float64) + if !ok { + return nil, errors.New("invalid type, must be number") + } + if current < bestVal { + bestVal = current + bestItem = item + } + } + return bestItem, nil + } else if t, ok := start.(string); ok { + bestVal := t + bestItem := arr[0] + for _, item := range arr[1:] { + result, err := intr.Execute(node, item) + if err != nil { + return nil, err + } + current, ok := result.(string) + if !ok { + return nil, errors.New("invalid type, must be string") + } + if current < bestVal { + bestVal = current + bestItem = item + } + } + return bestItem, nil + } else { + return nil, errors.New("invalid type, must be number of string") + } +} +func jpfType(arguments []interface{}) (interface{}, error) { + arg := arguments[0] + if _, ok := arg.(float64); ok { + return "number", nil + } + if _, ok := arg.(string); ok { + return "string", nil + } + if _, ok := arg.([]interface{}); ok { + return "array", nil + } + if _, ok := arg.(map[string]interface{}); ok { + return "object", nil + } + if arg == nil { + return "null", nil + } + if arg == true || arg == false { + return "boolean", nil + } + return nil, errors.New("unknown type") +} +func jpfKeys(arguments []interface{}) (interface{}, error) { + arg := arguments[0].(map[string]interface{}) + collected := make([]interface{}, 0, len(arg)) + for key := range arg { + collected = append(collected, key) + } + return collected, nil +} +func jpfValues(arguments []interface{}) (interface{}, error) { + arg := arguments[0].(map[string]interface{}) + collected := make([]interface{}, 0, len(arg)) + for _, value := range arg { + collected = append(collected, value) + } + return collected, nil +} +func jpfSort(arguments []interface{}) (interface{}, error) { + if items, ok := toArrayNum(arguments[0]); ok { + d := sort.Float64Slice(items) + sort.Stable(d) + final := make([]interface{}, len(d)) + for i, val := range d { + final[i] = val + } + return final, nil + } + // Otherwise we're dealing with sort()'ing strings. + items, _ := toArrayStr(arguments[0]) + d := sort.StringSlice(items) + sort.Stable(d) + final := make([]interface{}, len(d)) + for i, val := range d { + final[i] = val + } + return final, nil +} +func jpfSortBy(arguments []interface{}) (interface{}, error) { + intr := arguments[0].(*treeInterpreter) + arr := arguments[1].([]interface{}) + exp := arguments[2].(expRef) + node := exp.ref + if len(arr) == 0 { + return arr, nil + } else if len(arr) == 1 { + return arr, nil + } + start, err := intr.Execute(node, arr[0]) + if err != nil { + return nil, err + } + if _, ok := start.(float64); ok { + sortable := &byExprFloat{intr, node, arr, false} + sort.Stable(sortable) + if sortable.hasError { + return nil, errors.New("error in sort_by comparison") + } + return arr, nil + } else if _, ok := start.(string); ok { + sortable := &byExprString{intr, node, arr, false} + sort.Stable(sortable) + if sortable.hasError { + return nil, errors.New("error in sort_by comparison") + } + return arr, nil + } else { + return nil, errors.New("invalid type, must be number of string") + } +} +func jpfJoin(arguments []interface{}) (interface{}, error) { + sep := arguments[0].(string) + // We can't just do arguments[1].([]string), we have to + // manually convert each item to a string. + arrayStr := []string{} + for _, item := range arguments[1].([]interface{}) { + arrayStr = append(arrayStr, item.(string)) + } + return strings.Join(arrayStr, sep), nil +} +func jpfReverse(arguments []interface{}) (interface{}, error) { + if s, ok := arguments[0].(string); ok { + r := []rune(s) + for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { + r[i], r[j] = r[j], r[i] + } + return string(r), nil + } + items := arguments[0].([]interface{}) + length := len(items) + reversed := make([]interface{}, length) + for i, item := range items { + reversed[length-(i+1)] = item + } + return reversed, nil +} +func jpfToArray(arguments []interface{}) (interface{}, error) { + if _, ok := arguments[0].([]interface{}); ok { + return arguments[0], nil + } + return arguments[:1:1], nil +} +func jpfToString(arguments []interface{}) (interface{}, error) { + if v, ok := arguments[0].(string); ok { + return v, nil + } + result, err := json.Marshal(arguments[0]) + if err != nil { + return nil, err + } + return string(result), nil +} +func jpfToNumber(arguments []interface{}) (interface{}, error) { + arg := arguments[0] + if v, ok := arg.(float64); ok { + return v, nil + } + if v, ok := arg.(string); ok { + conv, err := strconv.ParseFloat(v, 64) + if err != nil { + return nil, nil + } + return conv, nil + } + if _, ok := arg.([]interface{}); ok { + return nil, nil + } + if _, ok := arg.(map[string]interface{}); ok { + return nil, nil + } + if arg == nil { + return nil, nil + } + if arg == true || arg == false { + return nil, nil + } + return nil, errors.New("unknown type") +} +func jpfNotNull(arguments []interface{}) (interface{}, error) { + for _, arg := range arguments { + if arg != nil { + return arg, nil + } + } + return nil, nil +} diff --git a/vendor/github.com/jmespath/go-jmespath/interpreter.go b/vendor/github.com/jmespath/go-jmespath/interpreter.go new file mode 100644 index 000000000..13c74604c --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/interpreter.go @@ -0,0 +1,418 @@ +package jmespath + +import ( + "errors" + "reflect" + "unicode" + "unicode/utf8" +) + +/* This is a tree based interpreter. It walks the AST and directly + interprets the AST to search through a JSON document. +*/ + +type treeInterpreter struct { + fCall *functionCaller +} + +func newInterpreter() *treeInterpreter { + interpreter := treeInterpreter{} + interpreter.fCall = newFunctionCaller() + return &interpreter +} + +type expRef struct { + ref ASTNode +} + +// Execute takes an ASTNode and input data and interprets the AST directly. +// It will produce the result of applying the JMESPath expression associated +// with the ASTNode to the input data "value". +func (intr *treeInterpreter) Execute(node ASTNode, value interface{}) (interface{}, error) { + switch node.nodeType { + case ASTComparator: + left, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, err + } + right, err := intr.Execute(node.children[1], value) + if err != nil { + return nil, err + } + switch node.value { + case tEQ: + return objsEqual(left, right), nil + case tNE: + return !objsEqual(left, right), nil + } + leftNum, ok := left.(float64) + if !ok { + return nil, nil + } + rightNum, ok := right.(float64) + if !ok { + return nil, nil + } + switch node.value { + case tGT: + return leftNum > rightNum, nil + case tGTE: + return leftNum >= rightNum, nil + case tLT: + return leftNum < rightNum, nil + case tLTE: + return leftNum <= rightNum, nil + } + case ASTExpRef: + return expRef{ref: node.children[0]}, nil + case ASTFunctionExpression: + resolvedArgs := []interface{}{} + for _, arg := range node.children { + current, err := intr.Execute(arg, value) + if err != nil { + return nil, err + } + resolvedArgs = append(resolvedArgs, current) + } + return intr.fCall.CallFunction(node.value.(string), resolvedArgs, intr) + case ASTField: + if m, ok := value.(map[string]interface{}); ok { + key := node.value.(string) + return m[key], nil + } + return intr.fieldFromStruct(node.value.(string), value) + case ASTFilterProjection: + left, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, nil + } + sliceType, ok := left.([]interface{}) + if !ok { + if isSliceType(left) { + return intr.filterProjectionWithReflection(node, left) + } + return nil, nil + } + compareNode := node.children[2] + collected := []interface{}{} + for _, element := range sliceType { + result, err := intr.Execute(compareNode, element) + if err != nil { + return nil, err + } + if !isFalse(result) { + current, err := intr.Execute(node.children[1], element) + if err != nil { + return nil, err + } + if current != nil { + collected = append(collected, current) + } + } + } + return collected, nil + case ASTFlatten: + left, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, nil + } + sliceType, ok := left.([]interface{}) + if !ok { + // If we can't type convert to []interface{}, there's + // a chance this could still work via reflection if we're + // dealing with user provided types. + if isSliceType(left) { + return intr.flattenWithReflection(left) + } + return nil, nil + } + flattened := []interface{}{} + for _, element := range sliceType { + if elementSlice, ok := element.([]interface{}); ok { + flattened = append(flattened, elementSlice...) + } else if isSliceType(element) { + reflectFlat := []interface{}{} + v := reflect.ValueOf(element) + for i := 0; i < v.Len(); i++ { + reflectFlat = append(reflectFlat, v.Index(i).Interface()) + } + flattened = append(flattened, reflectFlat...) + } else { + flattened = append(flattened, element) + } + } + return flattened, nil + case ASTIdentity, ASTCurrentNode: + return value, nil + case ASTIndex: + if sliceType, ok := value.([]interface{}); ok { + index := node.value.(int) + if index < 0 { + index += len(sliceType) + } + if index < len(sliceType) && index >= 0 { + return sliceType[index], nil + } + return nil, nil + } + // Otherwise try via reflection. + rv := reflect.ValueOf(value) + if rv.Kind() == reflect.Slice { + index := node.value.(int) + if index < 0 { + index += rv.Len() + } + if index < rv.Len() && index >= 0 { + v := rv.Index(index) + return v.Interface(), nil + } + } + return nil, nil + case ASTKeyValPair: + return intr.Execute(node.children[0], value) + case ASTLiteral: + return node.value, nil + case ASTMultiSelectHash: + if value == nil { + return nil, nil + } + collected := make(map[string]interface{}) + for _, child := range node.children { + current, err := intr.Execute(child, value) + if err != nil { + return nil, err + } + key := child.value.(string) + collected[key] = current + } + return collected, nil + case ASTMultiSelectList: + if value == nil { + return nil, nil + } + collected := []interface{}{} + for _, child := range node.children { + current, err := intr.Execute(child, value) + if err != nil { + return nil, err + } + collected = append(collected, current) + } + return collected, nil + case ASTOrExpression: + matched, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, err + } + if isFalse(matched) { + matched, err = intr.Execute(node.children[1], value) + if err != nil { + return nil, err + } + } + return matched, nil + case ASTAndExpression: + matched, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, err + } + if isFalse(matched) { + return matched, nil + } + return intr.Execute(node.children[1], value) + case ASTNotExpression: + matched, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, err + } + if isFalse(matched) { + return true, nil + } + return false, nil + case ASTPipe: + result := value + var err error + for _, child := range node.children { + result, err = intr.Execute(child, result) + if err != nil { + return nil, err + } + } + return result, nil + case ASTProjection: + left, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, err + } + sliceType, ok := left.([]interface{}) + if !ok { + if isSliceType(left) { + return intr.projectWithReflection(node, left) + } + return nil, nil + } + collected := []interface{}{} + var current interface{} + for _, element := range sliceType { + current, err = intr.Execute(node.children[1], element) + if err != nil { + return nil, err + } + if current != nil { + collected = append(collected, current) + } + } + return collected, nil + case ASTSubexpression, ASTIndexExpression: + left, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, err + } + return intr.Execute(node.children[1], left) + case ASTSlice: + sliceType, ok := value.([]interface{}) + if !ok { + if isSliceType(value) { + return intr.sliceWithReflection(node, value) + } + return nil, nil + } + parts := node.value.([]*int) + sliceParams := make([]sliceParam, 3) + for i, part := range parts { + if part != nil { + sliceParams[i].Specified = true + sliceParams[i].N = *part + } + } + return slice(sliceType, sliceParams) + case ASTValueProjection: + left, err := intr.Execute(node.children[0], value) + if err != nil { + return nil, nil + } + mapType, ok := left.(map[string]interface{}) + if !ok { + return nil, nil + } + values := make([]interface{}, len(mapType)) + for _, value := range mapType { + values = append(values, value) + } + collected := []interface{}{} + for _, element := range values { + current, err := intr.Execute(node.children[1], element) + if err != nil { + return nil, err + } + if current != nil { + collected = append(collected, current) + } + } + return collected, nil + } + return nil, errors.New("Unknown AST node: " + node.nodeType.String()) +} + +func (intr *treeInterpreter) fieldFromStruct(key string, value interface{}) (interface{}, error) { + rv := reflect.ValueOf(value) + first, n := utf8.DecodeRuneInString(key) + fieldName := string(unicode.ToUpper(first)) + key[n:] + if rv.Kind() == reflect.Struct { + v := rv.FieldByName(fieldName) + if !v.IsValid() { + return nil, nil + } + return v.Interface(), nil + } else if rv.Kind() == reflect.Ptr { + // Handle multiple levels of indirection? + if rv.IsNil() { + return nil, nil + } + rv = rv.Elem() + v := rv.FieldByName(fieldName) + if !v.IsValid() { + return nil, nil + } + return v.Interface(), nil + } + return nil, nil +} + +func (intr *treeInterpreter) flattenWithReflection(value interface{}) (interface{}, error) { + v := reflect.ValueOf(value) + flattened := []interface{}{} + for i := 0; i < v.Len(); i++ { + element := v.Index(i).Interface() + if reflect.TypeOf(element).Kind() == reflect.Slice { + // Then insert the contents of the element + // slice into the flattened slice, + // i.e flattened = append(flattened, mySlice...) + elementV := reflect.ValueOf(element) + for j := 0; j < elementV.Len(); j++ { + flattened = append( + flattened, elementV.Index(j).Interface()) + } + } else { + flattened = append(flattened, element) + } + } + return flattened, nil +} + +func (intr *treeInterpreter) sliceWithReflection(node ASTNode, value interface{}) (interface{}, error) { + v := reflect.ValueOf(value) + parts := node.value.([]*int) + sliceParams := make([]sliceParam, 3) + for i, part := range parts { + if part != nil { + sliceParams[i].Specified = true + sliceParams[i].N = *part + } + } + final := []interface{}{} + for i := 0; i < v.Len(); i++ { + element := v.Index(i).Interface() + final = append(final, element) + } + return slice(final, sliceParams) +} + +func (intr *treeInterpreter) filterProjectionWithReflection(node ASTNode, value interface{}) (interface{}, error) { + compareNode := node.children[2] + collected := []interface{}{} + v := reflect.ValueOf(value) + for i := 0; i < v.Len(); i++ { + element := v.Index(i).Interface() + result, err := intr.Execute(compareNode, element) + if err != nil { + return nil, err + } + if !isFalse(result) { + current, err := intr.Execute(node.children[1], element) + if err != nil { + return nil, err + } + if current != nil { + collected = append(collected, current) + } + } + } + return collected, nil +} + +func (intr *treeInterpreter) projectWithReflection(node ASTNode, value interface{}) (interface{}, error) { + collected := []interface{}{} + v := reflect.ValueOf(value) + for i := 0; i < v.Len(); i++ { + element := v.Index(i).Interface() + result, err := intr.Execute(node.children[1], element) + if err != nil { + return nil, err + } + if result != nil { + collected = append(collected, result) + } + } + return collected, nil +} diff --git a/vendor/github.com/jmespath/go-jmespath/lexer.go b/vendor/github.com/jmespath/go-jmespath/lexer.go new file mode 100644 index 000000000..817900c8f --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/lexer.go @@ -0,0 +1,420 @@ +package jmespath + +import ( + "bytes" + "encoding/json" + "fmt" + "strconv" + "strings" + "unicode/utf8" +) + +type token struct { + tokenType tokType + value string + position int + length int +} + +type tokType int + +const eof = -1 + +// Lexer contains information about the expression being tokenized. +type Lexer struct { + expression string // The expression provided by the user. + currentPos int // The current position in the string. + lastWidth int // The width of the current rune. This + buf bytes.Buffer // Internal buffer used for building up values. +} + +// SyntaxError is the main error used whenever a lexing or parsing error occurs. +type SyntaxError struct { + msg string // Error message displayed to user + Expression string // Expression that generated a SyntaxError + Offset int // The location in the string where the error occurred +} + +func (e SyntaxError) Error() string { + // In the future, it would be good to underline the specific + // location where the error occurred. + return "SyntaxError: " + e.msg +} + +// HighlightLocation will show where the syntax error occurred. +// It will place a "^" character on a line below the expression +// at the point where the syntax error occurred. +func (e SyntaxError) HighlightLocation() string { + return e.Expression + "\n" + strings.Repeat(" ", e.Offset) + "^" +} + +//go:generate stringer -type=tokType +const ( + tUnknown tokType = iota + tStar + tDot + tFilter + tFlatten + tLparen + tRparen + tLbracket + tRbracket + tLbrace + tRbrace + tOr + tPipe + tNumber + tUnquotedIdentifier + tQuotedIdentifier + tComma + tColon + tLT + tLTE + tGT + tGTE + tEQ + tNE + tJSONLiteral + tStringLiteral + tCurrent + tExpref + tAnd + tNot + tEOF +) + +var basicTokens = map[rune]tokType{ + '.': tDot, + '*': tStar, + ',': tComma, + ':': tColon, + '{': tLbrace, + '}': tRbrace, + ']': tRbracket, // tLbracket not included because it could be "[]" + '(': tLparen, + ')': tRparen, + '@': tCurrent, +} + +// Bit mask for [a-zA-Z_] shifted down 64 bits to fit in a single uint64. +// When using this bitmask just be sure to shift the rune down 64 bits +// before checking against identifierStartBits. +const identifierStartBits uint64 = 576460745995190270 + +// Bit mask for [a-zA-Z0-9], 128 bits -> 2 uint64s. +var identifierTrailingBits = [2]uint64{287948901175001088, 576460745995190270} + +var whiteSpace = map[rune]bool{ + ' ': true, '\t': true, '\n': true, '\r': true, +} + +func (t token) String() string { + return fmt.Sprintf("Token{%+v, %s, %d, %d}", + t.tokenType, t.value, t.position, t.length) +} + +// NewLexer creates a new JMESPath lexer. +func NewLexer() *Lexer { + lexer := Lexer{} + return &lexer +} + +func (lexer *Lexer) next() rune { + if lexer.currentPos >= len(lexer.expression) { + lexer.lastWidth = 0 + return eof + } + r, w := utf8.DecodeRuneInString(lexer.expression[lexer.currentPos:]) + lexer.lastWidth = w + lexer.currentPos += w + return r +} + +func (lexer *Lexer) back() { + lexer.currentPos -= lexer.lastWidth +} + +func (lexer *Lexer) peek() rune { + t := lexer.next() + lexer.back() + return t +} + +// tokenize takes an expression and returns corresponding tokens. +func (lexer *Lexer) tokenize(expression string) ([]token, error) { + var tokens []token + lexer.expression = expression + lexer.currentPos = 0 + lexer.lastWidth = 0 +loop: + for { + r := lexer.next() + if identifierStartBits&(1<<(uint64(r)-64)) > 0 { + t := lexer.consumeUnquotedIdentifier() + tokens = append(tokens, t) + } else if val, ok := basicTokens[r]; ok { + // Basic single char token. + t := token{ + tokenType: val, + value: string(r), + position: lexer.currentPos - lexer.lastWidth, + length: 1, + } + tokens = append(tokens, t) + } else if r == '-' || (r >= '0' && r <= '9') { + t := lexer.consumeNumber() + tokens = append(tokens, t) + } else if r == '[' { + t := lexer.consumeLBracket() + tokens = append(tokens, t) + } else if r == '"' { + t, err := lexer.consumeQuotedIdentifier() + if err != nil { + return tokens, err + } + tokens = append(tokens, t) + } else if r == '\'' { + t, err := lexer.consumeRawStringLiteral() + if err != nil { + return tokens, err + } + tokens = append(tokens, t) + } else if r == '`' { + t, err := lexer.consumeLiteral() + if err != nil { + return tokens, err + } + tokens = append(tokens, t) + } else if r == '|' { + t := lexer.matchOrElse(r, '|', tOr, tPipe) + tokens = append(tokens, t) + } else if r == '<' { + t := lexer.matchOrElse(r, '=', tLTE, tLT) + tokens = append(tokens, t) + } else if r == '>' { + t := lexer.matchOrElse(r, '=', tGTE, tGT) + tokens = append(tokens, t) + } else if r == '!' { + t := lexer.matchOrElse(r, '=', tNE, tNot) + tokens = append(tokens, t) + } else if r == '=' { + t := lexer.matchOrElse(r, '=', tEQ, tUnknown) + tokens = append(tokens, t) + } else if r == '&' { + t := lexer.matchOrElse(r, '&', tAnd, tExpref) + tokens = append(tokens, t) + } else if r == eof { + break loop + } else if _, ok := whiteSpace[r]; ok { + // Ignore whitespace + } else { + return tokens, lexer.syntaxError(fmt.Sprintf("Unknown char: %s", strconv.QuoteRuneToASCII(r))) + } + } + tokens = append(tokens, token{tEOF, "", len(lexer.expression), 0}) + return tokens, nil +} + +// Consume characters until the ending rune "r" is reached. +// If the end of the expression is reached before seeing the +// terminating rune "r", then an error is returned. +// If no error occurs then the matching substring is returned. +// The returned string will not include the ending rune. +func (lexer *Lexer) consumeUntil(end rune) (string, error) { + start := lexer.currentPos + current := lexer.next() + for current != end && current != eof { + if current == '\\' && lexer.peek() != eof { + lexer.next() + } + current = lexer.next() + } + if lexer.lastWidth == 0 { + // Then we hit an EOF so we never reached the closing + // delimiter. + return "", SyntaxError{ + msg: "Unclosed delimiter: " + string(end), + Expression: lexer.expression, + Offset: len(lexer.expression), + } + } + return lexer.expression[start : lexer.currentPos-lexer.lastWidth], nil +} + +func (lexer *Lexer) consumeLiteral() (token, error) { + start := lexer.currentPos + value, err := lexer.consumeUntil('`') + if err != nil { + return token{}, err + } + value = strings.Replace(value, "\\`", "`", -1) + return token{ + tokenType: tJSONLiteral, + value: value, + position: start, + length: len(value), + }, nil +} + +func (lexer *Lexer) consumeRawStringLiteral() (token, error) { + start := lexer.currentPos + currentIndex := start + current := lexer.next() + for current != '\'' && lexer.peek() != eof { + if current == '\\' && lexer.peek() == '\'' { + chunk := lexer.expression[currentIndex : lexer.currentPos-1] + lexer.buf.WriteString(chunk) + lexer.buf.WriteString("'") + lexer.next() + currentIndex = lexer.currentPos + } + current = lexer.next() + } + if lexer.lastWidth == 0 { + // Then we hit an EOF so we never reached the closing + // delimiter. + return token{}, SyntaxError{ + msg: "Unclosed delimiter: '", + Expression: lexer.expression, + Offset: len(lexer.expression), + } + } + if currentIndex < lexer.currentPos { + lexer.buf.WriteString(lexer.expression[currentIndex : lexer.currentPos-1]) + } + value := lexer.buf.String() + // Reset the buffer so it can reused again. + lexer.buf.Reset() + return token{ + tokenType: tStringLiteral, + value: value, + position: start, + length: len(value), + }, nil +} + +func (lexer *Lexer) syntaxError(msg string) SyntaxError { + return SyntaxError{ + msg: msg, + Expression: lexer.expression, + Offset: lexer.currentPos - 1, + } +} + +// Checks for a two char token, otherwise matches a single character +// token. This is used whenever a two char token overlaps a single +// char token, e.g. "||" -> tPipe, "|" -> tOr. +func (lexer *Lexer) matchOrElse(first rune, second rune, matchedType tokType, singleCharType tokType) token { + start := lexer.currentPos - lexer.lastWidth + nextRune := lexer.next() + var t token + if nextRune == second { + t = token{ + tokenType: matchedType, + value: string(first) + string(second), + position: start, + length: 2, + } + } else { + lexer.back() + t = token{ + tokenType: singleCharType, + value: string(first), + position: start, + length: 1, + } + } + return t +} + +func (lexer *Lexer) consumeLBracket() token { + // There's three options here: + // 1. A filter expression "[?" + // 2. A flatten operator "[]" + // 3. A bare rbracket "[" + start := lexer.currentPos - lexer.lastWidth + nextRune := lexer.next() + var t token + if nextRune == '?' { + t = token{ + tokenType: tFilter, + value: "[?", + position: start, + length: 2, + } + } else if nextRune == ']' { + t = token{ + tokenType: tFlatten, + value: "[]", + position: start, + length: 2, + } + } else { + t = token{ + tokenType: tLbracket, + value: "[", + position: start, + length: 1, + } + lexer.back() + } + return t +} + +func (lexer *Lexer) consumeQuotedIdentifier() (token, error) { + start := lexer.currentPos + value, err := lexer.consumeUntil('"') + if err != nil { + return token{}, err + } + var decoded string + asJSON := []byte("\"" + value + "\"") + if err := json.Unmarshal([]byte(asJSON), &decoded); err != nil { + return token{}, err + } + return token{ + tokenType: tQuotedIdentifier, + value: decoded, + position: start - 1, + length: len(decoded), + }, nil +} + +func (lexer *Lexer) consumeUnquotedIdentifier() token { + // Consume runes until we reach the end of an unquoted + // identifier. + start := lexer.currentPos - lexer.lastWidth + for { + r := lexer.next() + if r < 0 || r > 128 || identifierTrailingBits[uint64(r)/64]&(1<<(uint64(r)%64)) == 0 { + lexer.back() + break + } + } + value := lexer.expression[start:lexer.currentPos] + return token{ + tokenType: tUnquotedIdentifier, + value: value, + position: start, + length: lexer.currentPos - start, + } +} + +func (lexer *Lexer) consumeNumber() token { + // Consume runes until we reach something that's not a number. + start := lexer.currentPos - lexer.lastWidth + for { + r := lexer.next() + if r < '0' || r > '9' { + lexer.back() + break + } + } + value := lexer.expression[start:lexer.currentPos] + return token{ + tokenType: tNumber, + value: value, + position: start, + length: lexer.currentPos - start, + } +} diff --git a/vendor/github.com/jmespath/go-jmespath/parser.go b/vendor/github.com/jmespath/go-jmespath/parser.go new file mode 100644 index 000000000..1240a1755 --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/parser.go @@ -0,0 +1,603 @@ +package jmespath + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) + +type astNodeType int + +//go:generate stringer -type astNodeType +const ( + ASTEmpty astNodeType = iota + ASTComparator + ASTCurrentNode + ASTExpRef + ASTFunctionExpression + ASTField + ASTFilterProjection + ASTFlatten + ASTIdentity + ASTIndex + ASTIndexExpression + ASTKeyValPair + ASTLiteral + ASTMultiSelectHash + ASTMultiSelectList + ASTOrExpression + ASTAndExpression + ASTNotExpression + ASTPipe + ASTProjection + ASTSubexpression + ASTSlice + ASTValueProjection +) + +// ASTNode represents the abstract syntax tree of a JMESPath expression. +type ASTNode struct { + nodeType astNodeType + value interface{} + children []ASTNode +} + +func (node ASTNode) String() string { + return node.PrettyPrint(0) +} + +// PrettyPrint will pretty print the parsed AST. +// The AST is an implementation detail and this pretty print +// function is provided as a convenience method to help with +// debugging. You should not rely on its output as the internal +// structure of the AST may change at any time. +func (node ASTNode) PrettyPrint(indent int) string { + spaces := strings.Repeat(" ", indent) + output := fmt.Sprintf("%s%s {\n", spaces, node.nodeType) + nextIndent := indent + 2 + if node.value != nil { + if converted, ok := node.value.(fmt.Stringer); ok { + // Account for things like comparator nodes + // that are enums with a String() method. + output += fmt.Sprintf("%svalue: %s\n", strings.Repeat(" ", nextIndent), converted.String()) + } else { + output += fmt.Sprintf("%svalue: %#v\n", strings.Repeat(" ", nextIndent), node.value) + } + } + lastIndex := len(node.children) + if lastIndex > 0 { + output += fmt.Sprintf("%schildren: {\n", strings.Repeat(" ", nextIndent)) + childIndent := nextIndent + 2 + for _, elem := range node.children { + output += elem.PrettyPrint(childIndent) + } + } + output += fmt.Sprintf("%s}\n", spaces) + return output +} + +var bindingPowers = map[tokType]int{ + tEOF: 0, + tUnquotedIdentifier: 0, + tQuotedIdentifier: 0, + tRbracket: 0, + tRparen: 0, + tComma: 0, + tRbrace: 0, + tNumber: 0, + tCurrent: 0, + tExpref: 0, + tColon: 0, + tPipe: 1, + tOr: 2, + tAnd: 3, + tEQ: 5, + tLT: 5, + tLTE: 5, + tGT: 5, + tGTE: 5, + tNE: 5, + tFlatten: 9, + tStar: 20, + tFilter: 21, + tDot: 40, + tNot: 45, + tLbrace: 50, + tLbracket: 55, + tLparen: 60, +} + +// Parser holds state about the current expression being parsed. +type Parser struct { + expression string + tokens []token + index int +} + +// NewParser creates a new JMESPath parser. +func NewParser() *Parser { + p := Parser{} + return &p +} + +// Parse will compile a JMESPath expression. +func (p *Parser) Parse(expression string) (ASTNode, error) { + lexer := NewLexer() + p.expression = expression + p.index = 0 + tokens, err := lexer.tokenize(expression) + if err != nil { + return ASTNode{}, err + } + p.tokens = tokens + parsed, err := p.parseExpression(0) + if err != nil { + return ASTNode{}, err + } + if p.current() != tEOF { + return ASTNode{}, p.syntaxError(fmt.Sprintf( + "Unexpected token at the end of the expresssion: %s", p.current())) + } + return parsed, nil +} + +func (p *Parser) parseExpression(bindingPower int) (ASTNode, error) { + var err error + leftToken := p.lookaheadToken(0) + p.advance() + leftNode, err := p.nud(leftToken) + if err != nil { + return ASTNode{}, err + } + currentToken := p.current() + for bindingPower < bindingPowers[currentToken] { + p.advance() + leftNode, err = p.led(currentToken, leftNode) + if err != nil { + return ASTNode{}, err + } + currentToken = p.current() + } + return leftNode, nil +} + +func (p *Parser) parseIndexExpression() (ASTNode, error) { + if p.lookahead(0) == tColon || p.lookahead(1) == tColon { + return p.parseSliceExpression() + } + indexStr := p.lookaheadToken(0).value + parsedInt, err := strconv.Atoi(indexStr) + if err != nil { + return ASTNode{}, err + } + indexNode := ASTNode{nodeType: ASTIndex, value: parsedInt} + p.advance() + if err := p.match(tRbracket); err != nil { + return ASTNode{}, err + } + return indexNode, nil +} + +func (p *Parser) parseSliceExpression() (ASTNode, error) { + parts := []*int{nil, nil, nil} + index := 0 + current := p.current() + for current != tRbracket && index < 3 { + if current == tColon { + index++ + p.advance() + } else if current == tNumber { + parsedInt, err := strconv.Atoi(p.lookaheadToken(0).value) + if err != nil { + return ASTNode{}, err + } + parts[index] = &parsedInt + p.advance() + } else { + return ASTNode{}, p.syntaxError( + "Expected tColon or tNumber" + ", received: " + p.current().String()) + } + current = p.current() + } + if err := p.match(tRbracket); err != nil { + return ASTNode{}, err + } + return ASTNode{ + nodeType: ASTSlice, + value: parts, + }, nil +} + +func (p *Parser) match(tokenType tokType) error { + if p.current() == tokenType { + p.advance() + return nil + } + return p.syntaxError("Expected " + tokenType.String() + ", received: " + p.current().String()) +} + +func (p *Parser) led(tokenType tokType, node ASTNode) (ASTNode, error) { + switch tokenType { + case tDot: + if p.current() != tStar { + right, err := p.parseDotRHS(bindingPowers[tDot]) + return ASTNode{ + nodeType: ASTSubexpression, + children: []ASTNode{node, right}, + }, err + } + p.advance() + right, err := p.parseProjectionRHS(bindingPowers[tDot]) + return ASTNode{ + nodeType: ASTValueProjection, + children: []ASTNode{node, right}, + }, err + case tPipe: + right, err := p.parseExpression(bindingPowers[tPipe]) + return ASTNode{nodeType: ASTPipe, children: []ASTNode{node, right}}, err + case tOr: + right, err := p.parseExpression(bindingPowers[tOr]) + return ASTNode{nodeType: ASTOrExpression, children: []ASTNode{node, right}}, err + case tAnd: + right, err := p.parseExpression(bindingPowers[tAnd]) + return ASTNode{nodeType: ASTAndExpression, children: []ASTNode{node, right}}, err + case tLparen: + name := node.value + var args []ASTNode + for p.current() != tRparen { + expression, err := p.parseExpression(0) + if err != nil { + return ASTNode{}, err + } + if p.current() == tComma { + if err := p.match(tComma); err != nil { + return ASTNode{}, err + } + } + args = append(args, expression) + } + if err := p.match(tRparen); err != nil { + return ASTNode{}, err + } + return ASTNode{ + nodeType: ASTFunctionExpression, + value: name, + children: args, + }, nil + case tFilter: + return p.parseFilter(node) + case tFlatten: + left := ASTNode{nodeType: ASTFlatten, children: []ASTNode{node}} + right, err := p.parseProjectionRHS(bindingPowers[tFlatten]) + return ASTNode{ + nodeType: ASTProjection, + children: []ASTNode{left, right}, + }, err + case tEQ, tNE, tGT, tGTE, tLT, tLTE: + right, err := p.parseExpression(bindingPowers[tokenType]) + if err != nil { + return ASTNode{}, err + } + return ASTNode{ + nodeType: ASTComparator, + value: tokenType, + children: []ASTNode{node, right}, + }, nil + case tLbracket: + tokenType := p.current() + var right ASTNode + var err error + if tokenType == tNumber || tokenType == tColon { + right, err = p.parseIndexExpression() + if err != nil { + return ASTNode{}, err + } + return p.projectIfSlice(node, right) + } + // Otherwise this is a projection. + if err := p.match(tStar); err != nil { + return ASTNode{}, err + } + if err := p.match(tRbracket); err != nil { + return ASTNode{}, err + } + right, err = p.parseProjectionRHS(bindingPowers[tStar]) + if err != nil { + return ASTNode{}, err + } + return ASTNode{ + nodeType: ASTProjection, + children: []ASTNode{node, right}, + }, nil + } + return ASTNode{}, p.syntaxError("Unexpected token: " + tokenType.String()) +} + +func (p *Parser) nud(token token) (ASTNode, error) { + switch token.tokenType { + case tJSONLiteral: + var parsed interface{} + err := json.Unmarshal([]byte(token.value), &parsed) + if err != nil { + return ASTNode{}, err + } + return ASTNode{nodeType: ASTLiteral, value: parsed}, nil + case tStringLiteral: + return ASTNode{nodeType: ASTLiteral, value: token.value}, nil + case tUnquotedIdentifier: + return ASTNode{ + nodeType: ASTField, + value: token.value, + }, nil + case tQuotedIdentifier: + node := ASTNode{nodeType: ASTField, value: token.value} + if p.current() == tLparen { + return ASTNode{}, p.syntaxErrorToken("Can't have quoted identifier as function name.", token) + } + return node, nil + case tStar: + left := ASTNode{nodeType: ASTIdentity} + var right ASTNode + var err error + if p.current() == tRbracket { + right = ASTNode{nodeType: ASTIdentity} + } else { + right, err = p.parseProjectionRHS(bindingPowers[tStar]) + } + return ASTNode{nodeType: ASTValueProjection, children: []ASTNode{left, right}}, err + case tFilter: + return p.parseFilter(ASTNode{nodeType: ASTIdentity}) + case tLbrace: + return p.parseMultiSelectHash() + case tFlatten: + left := ASTNode{ + nodeType: ASTFlatten, + children: []ASTNode{{nodeType: ASTIdentity}}, + } + right, err := p.parseProjectionRHS(bindingPowers[tFlatten]) + if err != nil { + return ASTNode{}, err + } + return ASTNode{nodeType: ASTProjection, children: []ASTNode{left, right}}, nil + case tLbracket: + tokenType := p.current() + //var right ASTNode + if tokenType == tNumber || tokenType == tColon { + right, err := p.parseIndexExpression() + if err != nil { + return ASTNode{}, nil + } + return p.projectIfSlice(ASTNode{nodeType: ASTIdentity}, right) + } else if tokenType == tStar && p.lookahead(1) == tRbracket { + p.advance() + p.advance() + right, err := p.parseProjectionRHS(bindingPowers[tStar]) + if err != nil { + return ASTNode{}, err + } + return ASTNode{ + nodeType: ASTProjection, + children: []ASTNode{{nodeType: ASTIdentity}, right}, + }, nil + } else { + return p.parseMultiSelectList() + } + case tCurrent: + return ASTNode{nodeType: ASTCurrentNode}, nil + case tExpref: + expression, err := p.parseExpression(bindingPowers[tExpref]) + if err != nil { + return ASTNode{}, err + } + return ASTNode{nodeType: ASTExpRef, children: []ASTNode{expression}}, nil + case tNot: + expression, err := p.parseExpression(bindingPowers[tNot]) + if err != nil { + return ASTNode{}, err + } + return ASTNode{nodeType: ASTNotExpression, children: []ASTNode{expression}}, nil + case tLparen: + expression, err := p.parseExpression(0) + if err != nil { + return ASTNode{}, err + } + if err := p.match(tRparen); err != nil { + return ASTNode{}, err + } + return expression, nil + case tEOF: + return ASTNode{}, p.syntaxErrorToken("Incomplete expression", token) + } + + return ASTNode{}, p.syntaxErrorToken("Invalid token: "+token.tokenType.String(), token) +} + +func (p *Parser) parseMultiSelectList() (ASTNode, error) { + var expressions []ASTNode + for { + expression, err := p.parseExpression(0) + if err != nil { + return ASTNode{}, err + } + expressions = append(expressions, expression) + if p.current() == tRbracket { + break + } + err = p.match(tComma) + if err != nil { + return ASTNode{}, err + } + } + err := p.match(tRbracket) + if err != nil { + return ASTNode{}, err + } + return ASTNode{ + nodeType: ASTMultiSelectList, + children: expressions, + }, nil +} + +func (p *Parser) parseMultiSelectHash() (ASTNode, error) { + var children []ASTNode + for { + keyToken := p.lookaheadToken(0) + if err := p.match(tUnquotedIdentifier); err != nil { + if err := p.match(tQuotedIdentifier); err != nil { + return ASTNode{}, p.syntaxError("Expected tQuotedIdentifier or tUnquotedIdentifier") + } + } + keyName := keyToken.value + err := p.match(tColon) + if err != nil { + return ASTNode{}, err + } + value, err := p.parseExpression(0) + if err != nil { + return ASTNode{}, err + } + node := ASTNode{ + nodeType: ASTKeyValPair, + value: keyName, + children: []ASTNode{value}, + } + children = append(children, node) + if p.current() == tComma { + err := p.match(tComma) + if err != nil { + return ASTNode{}, nil + } + } else if p.current() == tRbrace { + err := p.match(tRbrace) + if err != nil { + return ASTNode{}, nil + } + break + } + } + return ASTNode{ + nodeType: ASTMultiSelectHash, + children: children, + }, nil +} + +func (p *Parser) projectIfSlice(left ASTNode, right ASTNode) (ASTNode, error) { + indexExpr := ASTNode{ + nodeType: ASTIndexExpression, + children: []ASTNode{left, right}, + } + if right.nodeType == ASTSlice { + right, err := p.parseProjectionRHS(bindingPowers[tStar]) + return ASTNode{ + nodeType: ASTProjection, + children: []ASTNode{indexExpr, right}, + }, err + } + return indexExpr, nil +} +func (p *Parser) parseFilter(node ASTNode) (ASTNode, error) { + var right, condition ASTNode + var err error + condition, err = p.parseExpression(0) + if err != nil { + return ASTNode{}, err + } + if err := p.match(tRbracket); err != nil { + return ASTNode{}, err + } + if p.current() == tFlatten { + right = ASTNode{nodeType: ASTIdentity} + } else { + right, err = p.parseProjectionRHS(bindingPowers[tFilter]) + if err != nil { + return ASTNode{}, err + } + } + + return ASTNode{ + nodeType: ASTFilterProjection, + children: []ASTNode{node, right, condition}, + }, nil +} + +func (p *Parser) parseDotRHS(bindingPower int) (ASTNode, error) { + lookahead := p.current() + if tokensOneOf([]tokType{tQuotedIdentifier, tUnquotedIdentifier, tStar}, lookahead) { + return p.parseExpression(bindingPower) + } else if lookahead == tLbracket { + if err := p.match(tLbracket); err != nil { + return ASTNode{}, err + } + return p.parseMultiSelectList() + } else if lookahead == tLbrace { + if err := p.match(tLbrace); err != nil { + return ASTNode{}, err + } + return p.parseMultiSelectHash() + } + return ASTNode{}, p.syntaxError("Expected identifier, lbracket, or lbrace") +} + +func (p *Parser) parseProjectionRHS(bindingPower int) (ASTNode, error) { + current := p.current() + if bindingPowers[current] < 10 { + return ASTNode{nodeType: ASTIdentity}, nil + } else if current == tLbracket { + return p.parseExpression(bindingPower) + } else if current == tFilter { + return p.parseExpression(bindingPower) + } else if current == tDot { + err := p.match(tDot) + if err != nil { + return ASTNode{}, err + } + return p.parseDotRHS(bindingPower) + } else { + return ASTNode{}, p.syntaxError("Error") + } +} + +func (p *Parser) lookahead(number int) tokType { + return p.lookaheadToken(number).tokenType +} + +func (p *Parser) current() tokType { + return p.lookahead(0) +} + +func (p *Parser) lookaheadToken(number int) token { + return p.tokens[p.index+number] +} + +func (p *Parser) advance() { + p.index++ +} + +func tokensOneOf(elements []tokType, token tokType) bool { + for _, elem := range elements { + if elem == token { + return true + } + } + return false +} + +func (p *Parser) syntaxError(msg string) SyntaxError { + return SyntaxError{ + msg: msg, + Expression: p.expression, + Offset: p.lookaheadToken(0).position, + } +} + +// Create a SyntaxError based on the provided token. +// This differs from syntaxError() which creates a SyntaxError +// based on the current lookahead token. +func (p *Parser) syntaxErrorToken(msg string, t token) SyntaxError { + return SyntaxError{ + msg: msg, + Expression: p.expression, + Offset: t.position, + } +} diff --git a/vendor/github.com/jmespath/go-jmespath/toktype_string.go b/vendor/github.com/jmespath/go-jmespath/toktype_string.go new file mode 100644 index 000000000..dae79cbdf --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/toktype_string.go @@ -0,0 +1,16 @@ +// generated by stringer -type=tokType; DO NOT EDIT + +package jmespath + +import "fmt" + +const _tokType_name = "tUnknowntStartDottFiltertFlattentLparentRparentLbrackettRbrackettLbracetRbracetOrtPipetNumbertUnquotedIdentifiertQuotedIdentifiertCommatColontLTtLTEtGTtGTEtEQtNEtJSONLiteraltStringLiteraltCurrenttExpreftAndtNottEOF" + +var _tokType_index = [...]uint8{0, 8, 13, 17, 24, 32, 39, 46, 55, 64, 71, 78, 81, 86, 93, 112, 129, 135, 141, 144, 148, 151, 155, 158, 161, 173, 187, 195, 202, 206, 210, 214} + +func (i tokType) String() string { + if i < 0 || i >= tokType(len(_tokType_index)-1) { + return fmt.Sprintf("tokType(%d)", i) + } + return _tokType_name[_tokType_index[i]:_tokType_index[i+1]] +} diff --git a/vendor/github.com/jmespath/go-jmespath/util.go b/vendor/github.com/jmespath/go-jmespath/util.go new file mode 100644 index 000000000..ddc1b7d7d --- /dev/null +++ b/vendor/github.com/jmespath/go-jmespath/util.go @@ -0,0 +1,185 @@ +package jmespath + +import ( + "errors" + "reflect" +) + +// IsFalse determines if an object is false based on the JMESPath spec. +// JMESPath defines false values to be any of: +// - An empty string array, or hash. +// - The boolean value false. +// - nil +func isFalse(value interface{}) bool { + switch v := value.(type) { + case bool: + return !v + case []interface{}: + return len(v) == 0 + case map[string]interface{}: + return len(v) == 0 + case string: + return len(v) == 0 + case nil: + return true + } + // Try the reflection cases before returning false. + rv := reflect.ValueOf(value) + switch rv.Kind() { + case reflect.Struct: + // A struct type will never be false, even if + // all of its values are the zero type. + return false + case reflect.Slice, reflect.Map: + return rv.Len() == 0 + case reflect.Ptr: + if rv.IsNil() { + return true + } + // If it's a pointer type, we'll try to deref the pointer + // and evaluate the pointer value for isFalse. + element := rv.Elem() + return isFalse(element.Interface()) + } + return false +} + +// ObjsEqual is a generic object equality check. +// It will take two arbitrary objects and recursively determine +// if they are equal. +func objsEqual(left interface{}, right interface{}) bool { + return reflect.DeepEqual(left, right) +} + +// SliceParam refers to a single part of a slice. +// A slice consists of a start, a stop, and a step, similar to +// python slices. +type sliceParam struct { + N int + Specified bool +} + +// Slice supports [start:stop:step] style slicing that's supported in JMESPath. +func slice(slice []interface{}, parts []sliceParam) ([]interface{}, error) { + computed, err := computeSliceParams(len(slice), parts) + if err != nil { + return nil, err + } + start, stop, step := computed[0], computed[1], computed[2] + result := []interface{}{} + if step > 0 { + for i := start; i < stop; i += step { + result = append(result, slice[i]) + } + } else { + for i := start; i > stop; i += step { + result = append(result, slice[i]) + } + } + return result, nil +} + +func computeSliceParams(length int, parts []sliceParam) ([]int, error) { + var start, stop, step int + if !parts[2].Specified { + step = 1 + } else if parts[2].N == 0 { + return nil, errors.New("Invalid slice, step cannot be 0") + } else { + step = parts[2].N + } + var stepValueNegative bool + if step < 0 { + stepValueNegative = true + } else { + stepValueNegative = false + } + + if !parts[0].Specified { + if stepValueNegative { + start = length - 1 + } else { + start = 0 + } + } else { + start = capSlice(length, parts[0].N, step) + } + + if !parts[1].Specified { + if stepValueNegative { + stop = -1 + } else { + stop = length + } + } else { + stop = capSlice(length, parts[1].N, step) + } + return []int{start, stop, step}, nil +} + +func capSlice(length int, actual int, step int) int { + if actual < 0 { + actual += length + if actual < 0 { + if step < 0 { + actual = -1 + } else { + actual = 0 + } + } + } else if actual >= length { + if step < 0 { + actual = length - 1 + } else { + actual = length + } + } + return actual +} + +// ToArrayNum converts an empty interface type to a slice of float64. +// If any element in the array cannot be converted, then nil is returned +// along with a second value of false. +func toArrayNum(data interface{}) ([]float64, bool) { + // Is there a better way to do this with reflect? + if d, ok := data.([]interface{}); ok { + result := make([]float64, len(d)) + for i, el := range d { + item, ok := el.(float64) + if !ok { + return nil, false + } + result[i] = item + } + return result, true + } + return nil, false +} + +// ToArrayStr converts an empty interface type to a slice of strings. +// If any element in the array cannot be converted, then nil is returned +// along with a second value of false. If the input data could be entirely +// converted, then the converted data, along with a second value of true, +// will be returned. +func toArrayStr(data interface{}) ([]string, bool) { + // Is there a better way to do this with reflect? + if d, ok := data.([]interface{}); ok { + result := make([]string, len(d)) + for i, el := range d { + item, ok := el.(string) + if !ok { + return nil, false + } + result[i] = item + } + return result, true + } + return nil, false +} + +func isSliceType(v interface{}) bool { + if v == nil { + return false + } + return reflect.TypeOf(v).Kind() == reflect.Slice +} diff --git a/vendor/github.com/joho/godotenv/LICENCE b/vendor/github.com/joho/godotenv/LICENCE new file mode 100644 index 000000000..e7ddd51be --- /dev/null +++ b/vendor/github.com/joho/godotenv/LICENCE @@ -0,0 +1,23 @@ +Copyright (c) 2013 John Barton + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/joho/godotenv/godotenv.go b/vendor/github.com/joho/godotenv/godotenv.go new file mode 100644 index 000000000..29b436c77 --- /dev/null +++ b/vendor/github.com/joho/godotenv/godotenv.go @@ -0,0 +1,346 @@ +// Package godotenv is a go port of the ruby dotenv library (https://github.com/bkeepers/dotenv) +// +// Examples/readme can be found on the github page at https://github.com/joho/godotenv +// +// The TL;DR is that you make a .env file that looks something like +// +// SOME_ENV_VAR=somevalue +// +// and then in your go code you can call +// +// godotenv.Load() +// +// and all the env vars declared in .env will be available through os.Getenv("SOME_ENV_VAR") +package godotenv + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "os/exec" + "regexp" + "sort" + "strings" +) + +const doubleQuoteSpecialChars = "\\\n\r\"!$`" + +// Load will read your env file(s) and load them into ENV for this process. +// +// Call this function as close as possible to the start of your program (ideally in main) +// +// If you call Load without any args it will default to loading .env in the current path +// +// You can otherwise tell it which files to load (there can be more than one) like +// +// godotenv.Load("fileone", "filetwo") +// +// It's important to note that it WILL NOT OVERRIDE an env variable that already exists - consider the .env file to set dev vars or sensible defaults +func Load(filenames ...string) (err error) { + filenames = filenamesOrDefault(filenames) + + for _, filename := range filenames { + err = loadFile(filename, false) + if err != nil { + return // return early on a spazout + } + } + return +} + +// Overload will read your env file(s) and load them into ENV for this process. +// +// Call this function as close as possible to the start of your program (ideally in main) +// +// If you call Overload without any args it will default to loading .env in the current path +// +// You can otherwise tell it which files to load (there can be more than one) like +// +// godotenv.Overload("fileone", "filetwo") +// +// It's important to note this WILL OVERRIDE an env variable that already exists - consider the .env file to forcefilly set all vars. +func Overload(filenames ...string) (err error) { + filenames = filenamesOrDefault(filenames) + + for _, filename := range filenames { + err = loadFile(filename, true) + if err != nil { + return // return early on a spazout + } + } + return +} + +// Read all env (with same file loading semantics as Load) but return values as +// a map rather than automatically writing values into env +func Read(filenames ...string) (envMap map[string]string, err error) { + filenames = filenamesOrDefault(filenames) + envMap = make(map[string]string) + + for _, filename := range filenames { + individualEnvMap, individualErr := readFile(filename) + + if individualErr != nil { + err = individualErr + return // return early on a spazout + } + + for key, value := range individualEnvMap { + envMap[key] = value + } + } + + return +} + +// Parse reads an env file from io.Reader, returning a map of keys and values. +func Parse(r io.Reader) (envMap map[string]string, err error) { + envMap = make(map[string]string) + + var lines []string + scanner := bufio.NewScanner(r) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + + if err = scanner.Err(); err != nil { + return + } + + for _, fullLine := range lines { + if !isIgnoredLine(fullLine) { + var key, value string + key, value, err = parseLine(fullLine, envMap) + + if err != nil { + return + } + envMap[key] = value + } + } + return +} + +//Unmarshal reads an env file from a string, returning a map of keys and values. +func Unmarshal(str string) (envMap map[string]string, err error) { + return Parse(strings.NewReader(str)) +} + +// Exec loads env vars from the specified filenames (empty map falls back to default) +// then executes the cmd specified. +// +// Simply hooks up os.Stdin/err/out to the command and calls Run() +// +// If you want more fine grained control over your command it's recommended +// that you use `Load()` or `Read()` and the `os/exec` package yourself. +func Exec(filenames []string, cmd string, cmdArgs []string) error { + Load(filenames...) + + command := exec.Command(cmd, cmdArgs...) + command.Stdin = os.Stdin + command.Stdout = os.Stdout + command.Stderr = os.Stderr + return command.Run() +} + +// Write serializes the given environment and writes it to a file +func Write(envMap map[string]string, filename string) error { + content, error := Marshal(envMap) + if error != nil { + return error + } + file, error := os.Create(filename) + if error != nil { + return error + } + _, err := file.WriteString(content) + return err +} + +// Marshal outputs the given environment as a dotenv-formatted environment file. +// Each line is in the format: KEY="VALUE" where VALUE is backslash-escaped. +func Marshal(envMap map[string]string) (string, error) { + lines := make([]string, 0, len(envMap)) + for k, v := range envMap { + lines = append(lines, fmt.Sprintf(`%s="%s"`, k, doubleQuoteEscape(v))) + } + sort.Strings(lines) + return strings.Join(lines, "\n"), nil +} + +func filenamesOrDefault(filenames []string) []string { + if len(filenames) == 0 { + return []string{".env"} + } + return filenames +} + +func loadFile(filename string, overload bool) error { + envMap, err := readFile(filename) + if err != nil { + return err + } + + currentEnv := map[string]bool{} + rawEnv := os.Environ() + for _, rawEnvLine := range rawEnv { + key := strings.Split(rawEnvLine, "=")[0] + currentEnv[key] = true + } + + for key, value := range envMap { + if !currentEnv[key] || overload { + os.Setenv(key, value) + } + } + + return nil +} + +func readFile(filename string) (envMap map[string]string, err error) { + file, err := os.Open(filename) + if err != nil { + return + } + defer file.Close() + + return Parse(file) +} + +func parseLine(line string, envMap map[string]string) (key string, value string, err error) { + if len(line) == 0 { + err = errors.New("zero length string") + return + } + + // ditch the comments (but keep quoted hashes) + if strings.Contains(line, "#") { + segmentsBetweenHashes := strings.Split(line, "#") + quotesAreOpen := false + var segmentsToKeep []string + for _, segment := range segmentsBetweenHashes { + if strings.Count(segment, "\"") == 1 || strings.Count(segment, "'") == 1 { + if quotesAreOpen { + quotesAreOpen = false + segmentsToKeep = append(segmentsToKeep, segment) + } else { + quotesAreOpen = true + } + } + + if len(segmentsToKeep) == 0 || quotesAreOpen { + segmentsToKeep = append(segmentsToKeep, segment) + } + } + + line = strings.Join(segmentsToKeep, "#") + } + + firstEquals := strings.Index(line, "=") + firstColon := strings.Index(line, ":") + splitString := strings.SplitN(line, "=", 2) + if firstColon != -1 && (firstColon < firstEquals || firstEquals == -1) { + //this is a yaml-style line + splitString = strings.SplitN(line, ":", 2) + } + + if len(splitString) != 2 { + err = errors.New("Can't separate key from value") + return + } + + // Parse the key + key = splitString[0] + if strings.HasPrefix(key, "export") { + key = strings.TrimPrefix(key, "export") + } + key = strings.Trim(key, " ") + + // Parse the value + value = parseValue(splitString[1], envMap) + return +} + +func parseValue(value string, envMap map[string]string) string { + + // trim + value = strings.Trim(value, " ") + + // check if we've got quoted values or possible escapes + if len(value) > 1 { + rs := regexp.MustCompile(`\A'(.*)'\z`) + singleQuotes := rs.FindStringSubmatch(value) + + rd := regexp.MustCompile(`\A"(.*)"\z`) + doubleQuotes := rd.FindStringSubmatch(value) + + if singleQuotes != nil || doubleQuotes != nil { + // pull the quotes off the edges + value = value[1 : len(value)-1] + } + + if doubleQuotes != nil { + // expand newlines + escapeRegex := regexp.MustCompile(`\\.`) + value = escapeRegex.ReplaceAllStringFunc(value, func(match string) string { + c := strings.TrimPrefix(match, `\`) + switch c { + case "n": + return "\n" + case "r": + return "\r" + default: + return match + } + }) + // unescape characters + e := regexp.MustCompile(`\\([^$])`) + value = e.ReplaceAllString(value, "$1") + } + + if singleQuotes == nil { + value = expandVariables(value, envMap) + } + } + + return value +} + +func expandVariables(v string, m map[string]string) string { + r := regexp.MustCompile(`(\\)?(\$)(\()?\{?([A-Z0-9_]+)?\}?`) + + return r.ReplaceAllStringFunc(v, func(s string) string { + submatch := r.FindStringSubmatch(s) + + if submatch == nil { + return s + } + if submatch[1] == "\\" || submatch[2] == "(" { + return submatch[0][1:] + } else if submatch[4] != "" { + return m[submatch[4]] + } + return s + }) +} + +func isIgnoredLine(line string) bool { + trimmedLine := strings.Trim(line, " \n\t") + return len(trimmedLine) == 0 || strings.HasPrefix(trimmedLine, "#") +} + +func doubleQuoteEscape(line string) string { + for _, c := range doubleQuoteSpecialChars { + toReplace := "\\" + string(c) + if c == '\n' { + toReplace = `\n` + } + if c == '\r' { + toReplace = `\r` + } + line = strings.Replace(line, string(c), toReplace, -1) + } + return line +} diff --git a/vendor/github.com/json-iterator/go/LICENSE b/vendor/github.com/json-iterator/go/LICENSE new file mode 100644 index 000000000..2cf4f5ab2 --- /dev/null +++ b/vendor/github.com/json-iterator/go/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 json-iterator + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/json-iterator/go/adapter.go b/vendor/github.com/json-iterator/go/adapter.go new file mode 100644 index 000000000..f371bfed7 --- /dev/null +++ b/vendor/github.com/json-iterator/go/adapter.go @@ -0,0 +1,148 @@ +package jsoniter + +import ( + "bytes" + "io" +) + +// RawMessage to make replace json with jsoniter +type RawMessage []byte + +// Unmarshal adapts to json/encoding Unmarshal API +// +// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. +// Refer to https://godoc.org/encoding/json#Unmarshal for more information +func Unmarshal(data []byte, v interface{}) error { + return ConfigDefault.Unmarshal(data, v) +} + +// UnmarshalFromString convenient method to read from string instead of []byte +func UnmarshalFromString(str string, v interface{}) error { + return ConfigDefault.UnmarshalFromString(str, v) +} + +// Get quick method to get value from deeply nested JSON structure +func Get(data []byte, path ...interface{}) Any { + return ConfigDefault.Get(data, path...) +} + +// Marshal adapts to json/encoding Marshal API +// +// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API +// Refer to https://godoc.org/encoding/json#Marshal for more information +func Marshal(v interface{}) ([]byte, error) { + return ConfigDefault.Marshal(v) +} + +// MarshalIndent same as json.MarshalIndent. Prefix is not supported. +func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { + return ConfigDefault.MarshalIndent(v, prefix, indent) +} + +// MarshalToString convenient method to write as string instead of []byte +func MarshalToString(v interface{}) (string, error) { + return ConfigDefault.MarshalToString(v) +} + +// NewDecoder adapts to json/stream NewDecoder API. +// +// NewDecoder returns a new decoder that reads from r. +// +// Instead of a json/encoding Decoder, an Decoder is returned +// Refer to https://godoc.org/encoding/json#NewDecoder for more information +func NewDecoder(reader io.Reader) *Decoder { + return ConfigDefault.NewDecoder(reader) +} + +// Decoder reads and decodes JSON values from an input stream. +// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress) +type Decoder struct { + iter *Iterator +} + +// Decode decode JSON into interface{} +func (adapter *Decoder) Decode(obj interface{}) error { + if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil { + if !adapter.iter.loadMore() { + return io.EOF + } + } + adapter.iter.ReadVal(obj) + err := adapter.iter.Error + if err == io.EOF { + return nil + } + return adapter.iter.Error +} + +// More is there more? +func (adapter *Decoder) More() bool { + iter := adapter.iter + if iter.Error != nil { + return false + } + if iter.head != iter.tail { + return true + } + return iter.loadMore() +} + +// Buffered remaining buffer +func (adapter *Decoder) Buffered() io.Reader { + remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail] + return bytes.NewReader(remaining) +} + +// UseNumber causes the Decoder to unmarshal a number into an interface{} as a +// Number instead of as a float64. +func (adapter *Decoder) UseNumber() { + cfg := adapter.iter.cfg.configBeforeFrozen + cfg.UseNumber = true + adapter.iter.cfg = cfg.frozeWithCacheReuse() +} + +// DisallowUnknownFields causes the Decoder to return an error when the destination +// is a struct and the input contains object keys which do not match any +// non-ignored, exported fields in the destination. +func (adapter *Decoder) DisallowUnknownFields() { + cfg := adapter.iter.cfg.configBeforeFrozen + cfg.DisallowUnknownFields = true + adapter.iter.cfg = cfg.frozeWithCacheReuse() +} + +// NewEncoder same as json.NewEncoder +func NewEncoder(writer io.Writer) *Encoder { + return ConfigDefault.NewEncoder(writer) +} + +// Encoder same as json.Encoder +type Encoder struct { + stream *Stream +} + +// Encode encode interface{} as JSON to io.Writer +func (adapter *Encoder) Encode(val interface{}) error { + adapter.stream.WriteVal(val) + adapter.stream.WriteRaw("\n") + adapter.stream.Flush() + return adapter.stream.Error +} + +// SetIndent set the indention. Prefix is not supported +func (adapter *Encoder) SetIndent(prefix, indent string) { + config := adapter.stream.cfg.configBeforeFrozen + config.IndentionStep = len(indent) + adapter.stream.cfg = config.frozeWithCacheReuse() +} + +// SetEscapeHTML escape html by default, set to false to disable +func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) { + config := adapter.stream.cfg.configBeforeFrozen + config.EscapeHTML = escapeHTML + adapter.stream.cfg = config.frozeWithCacheReuse() +} + +// Valid reports whether data is a valid JSON encoding. +func Valid(data []byte) bool { + return ConfigDefault.Valid(data) +} diff --git a/vendor/github.com/json-iterator/go/any.go b/vendor/github.com/json-iterator/go/any.go new file mode 100644 index 000000000..daecfed61 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any.go @@ -0,0 +1,321 @@ +package jsoniter + +import ( + "errors" + "fmt" + "github.com/modern-go/reflect2" + "io" + "reflect" + "strconv" + "unsafe" +) + +// Any generic object representation. +// The lazy json implementation holds []byte and parse lazily. +type Any interface { + LastError() error + ValueType() ValueType + MustBeValid() Any + ToBool() bool + ToInt() int + ToInt32() int32 + ToInt64() int64 + ToUint() uint + ToUint32() uint32 + ToUint64() uint64 + ToFloat32() float32 + ToFloat64() float64 + ToString() string + ToVal(val interface{}) + Get(path ...interface{}) Any + Size() int + Keys() []string + GetInterface() interface{} + WriteTo(stream *Stream) +} + +type baseAny struct{} + +func (any *baseAny) Get(path ...interface{}) Any { + return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} +} + +func (any *baseAny) Size() int { + return 0 +} + +func (any *baseAny) Keys() []string { + return []string{} +} + +func (any *baseAny) ToVal(obj interface{}) { + panic("not implemented") +} + +// WrapInt32 turn int32 into Any interface +func WrapInt32(val int32) Any { + return &int32Any{baseAny{}, val} +} + +// WrapInt64 turn int64 into Any interface +func WrapInt64(val int64) Any { + return &int64Any{baseAny{}, val} +} + +// WrapUint32 turn uint32 into Any interface +func WrapUint32(val uint32) Any { + return &uint32Any{baseAny{}, val} +} + +// WrapUint64 turn uint64 into Any interface +func WrapUint64(val uint64) Any { + return &uint64Any{baseAny{}, val} +} + +// WrapFloat64 turn float64 into Any interface +func WrapFloat64(val float64) Any { + return &floatAny{baseAny{}, val} +} + +// WrapString turn string into Any interface +func WrapString(val string) Any { + return &stringAny{baseAny{}, val} +} + +// Wrap turn a go object into Any interface +func Wrap(val interface{}) Any { + if val == nil { + return &nilAny{} + } + asAny, isAny := val.(Any) + if isAny { + return asAny + } + typ := reflect2.TypeOf(val) + switch typ.Kind() { + case reflect.Slice: + return wrapArray(val) + case reflect.Struct: + return wrapStruct(val) + case reflect.Map: + return wrapMap(val) + case reflect.String: + return WrapString(val.(string)) + case reflect.Int: + if strconv.IntSize == 32 { + return WrapInt32(int32(val.(int))) + } + return WrapInt64(int64(val.(int))) + case reflect.Int8: + return WrapInt32(int32(val.(int8))) + case reflect.Int16: + return WrapInt32(int32(val.(int16))) + case reflect.Int32: + return WrapInt32(val.(int32)) + case reflect.Int64: + return WrapInt64(val.(int64)) + case reflect.Uint: + if strconv.IntSize == 32 { + return WrapUint32(uint32(val.(uint))) + } + return WrapUint64(uint64(val.(uint))) + case reflect.Uintptr: + if ptrSize == 32 { + return WrapUint32(uint32(val.(uintptr))) + } + return WrapUint64(uint64(val.(uintptr))) + case reflect.Uint8: + return WrapUint32(uint32(val.(uint8))) + case reflect.Uint16: + return WrapUint32(uint32(val.(uint16))) + case reflect.Uint32: + return WrapUint32(uint32(val.(uint32))) + case reflect.Uint64: + return WrapUint64(val.(uint64)) + case reflect.Float32: + return WrapFloat64(float64(val.(float32))) + case reflect.Float64: + return WrapFloat64(val.(float64)) + case reflect.Bool: + if val.(bool) == true { + return &trueAny{} + } + return &falseAny{} + } + return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", typ)} +} + +// ReadAny read next JSON element as an Any object. It is a better json.RawMessage. +func (iter *Iterator) ReadAny() Any { + return iter.readAny() +} + +func (iter *Iterator) readAny() Any { + c := iter.nextToken() + switch c { + case '"': + iter.unreadByte() + return &stringAny{baseAny{}, iter.ReadString()} + case 'n': + iter.skipThreeBytes('u', 'l', 'l') // null + return &nilAny{} + case 't': + iter.skipThreeBytes('r', 'u', 'e') // true + return &trueAny{} + case 'f': + iter.skipFourBytes('a', 'l', 's', 'e') // false + return &falseAny{} + case '{': + return iter.readObjectAny() + case '[': + return iter.readArrayAny() + case '-': + return iter.readNumberAny(false) + case 0: + return &invalidAny{baseAny{}, errors.New("input is empty")} + default: + return iter.readNumberAny(true) + } +} + +func (iter *Iterator) readNumberAny(positive bool) Any { + iter.startCapture(iter.head - 1) + iter.skipNumber() + lazyBuf := iter.stopCapture() + return &numberLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} +} + +func (iter *Iterator) readObjectAny() Any { + iter.startCapture(iter.head - 1) + iter.skipObject() + lazyBuf := iter.stopCapture() + return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} +} + +func (iter *Iterator) readArrayAny() Any { + iter.startCapture(iter.head - 1) + iter.skipArray() + lazyBuf := iter.stopCapture() + return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} +} + +func locateObjectField(iter *Iterator, target string) []byte { + var found []byte + iter.ReadObjectCB(func(iter *Iterator, field string) bool { + if field == target { + found = iter.SkipAndReturnBytes() + return false + } + iter.Skip() + return true + }) + return found +} + +func locateArrayElement(iter *Iterator, target int) []byte { + var found []byte + n := 0 + iter.ReadArrayCB(func(iter *Iterator) bool { + if n == target { + found = iter.SkipAndReturnBytes() + return false + } + iter.Skip() + n++ + return true + }) + return found +} + +func locatePath(iter *Iterator, path []interface{}) Any { + for i, pathKeyObj := range path { + switch pathKey := pathKeyObj.(type) { + case string: + valueBytes := locateObjectField(iter, pathKey) + if valueBytes == nil { + return newInvalidAny(path[i:]) + } + iter.ResetBytes(valueBytes) + case int: + valueBytes := locateArrayElement(iter, pathKey) + if valueBytes == nil { + return newInvalidAny(path[i:]) + } + iter.ResetBytes(valueBytes) + case int32: + if '*' == pathKey { + return iter.readAny().Get(path[i:]...) + } + return newInvalidAny(path[i:]) + default: + return newInvalidAny(path[i:]) + } + } + if iter.Error != nil && iter.Error != io.EOF { + return &invalidAny{baseAny{}, iter.Error} + } + return iter.readAny() +} + +var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem() + +func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ == anyType { + return &directAnyCodec{} + } + if typ.Implements(anyType) { + return &anyCodec{ + valType: typ, + } + } + return nil +} + +func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ == anyType { + return &directAnyCodec{} + } + if typ.Implements(anyType) { + return &anyCodec{ + valType: typ, + } + } + return nil +} + +type anyCodec struct { + valType reflect2.Type +} + +func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + panic("not implemented") +} + +func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := codec.valType.UnsafeIndirect(ptr) + any := obj.(Any) + any.WriteTo(stream) +} + +func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { + obj := codec.valType.UnsafeIndirect(ptr) + any := obj.(Any) + return any.Size() == 0 +} + +type directAnyCodec struct { +} + +func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *(*Any)(ptr) = iter.readAny() +} + +func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + any := *(*Any)(ptr) + any.WriteTo(stream) +} + +func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool { + any := *(*Any)(ptr) + return any.Size() == 0 +} diff --git a/vendor/github.com/json-iterator/go/any_array.go b/vendor/github.com/json-iterator/go/any_array.go new file mode 100644 index 000000000..0449e9aa4 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_array.go @@ -0,0 +1,278 @@ +package jsoniter + +import ( + "reflect" + "unsafe" +) + +type arrayLazyAny struct { + baseAny + cfg *frozenConfig + buf []byte + err error +} + +func (any *arrayLazyAny) ValueType() ValueType { + return ArrayValue +} + +func (any *arrayLazyAny) MustBeValid() Any { + return any +} + +func (any *arrayLazyAny) LastError() error { + return any.err +} + +func (any *arrayLazyAny) ToBool() bool { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + return iter.ReadArray() +} + +func (any *arrayLazyAny) ToInt() int { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToInt32() int32 { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToInt64() int64 { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToUint() uint { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToUint32() uint32 { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToUint64() uint64 { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToFloat32() float32 { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToFloat64() float64 { + if any.ToBool() { + return 1 + } + return 0 +} + +func (any *arrayLazyAny) ToString() string { + return *(*string)(unsafe.Pointer(&any.buf)) +} + +func (any *arrayLazyAny) ToVal(val interface{}) { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadVal(val) +} + +func (any *arrayLazyAny) Get(path ...interface{}) Any { + if len(path) == 0 { + return any + } + switch firstPath := path[0].(type) { + case int: + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + valueBytes := locateArrayElement(iter, firstPath) + if valueBytes == nil { + return newInvalidAny(path) + } + iter.ResetBytes(valueBytes) + return locatePath(iter, path[1:]) + case int32: + if '*' == firstPath { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + arr := make([]Any, 0) + iter.ReadArrayCB(func(iter *Iterator) bool { + found := iter.readAny().Get(path[1:]...) + if found.ValueType() != InvalidValue { + arr = append(arr, found) + } + return true + }) + return wrapArray(arr) + } + return newInvalidAny(path) + default: + return newInvalidAny(path) + } +} + +func (any *arrayLazyAny) Size() int { + size := 0 + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadArrayCB(func(iter *Iterator) bool { + size++ + iter.Skip() + return true + }) + return size +} + +func (any *arrayLazyAny) WriteTo(stream *Stream) { + stream.Write(any.buf) +} + +func (any *arrayLazyAny) GetInterface() interface{} { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + return iter.Read() +} + +type arrayAny struct { + baseAny + val reflect.Value +} + +func wrapArray(val interface{}) *arrayAny { + return &arrayAny{baseAny{}, reflect.ValueOf(val)} +} + +func (any *arrayAny) ValueType() ValueType { + return ArrayValue +} + +func (any *arrayAny) MustBeValid() Any { + return any +} + +func (any *arrayAny) LastError() error { + return nil +} + +func (any *arrayAny) ToBool() bool { + return any.val.Len() != 0 +} + +func (any *arrayAny) ToInt() int { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToInt32() int32 { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToInt64() int64 { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToUint() uint { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToUint32() uint32 { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToUint64() uint64 { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToFloat32() float32 { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToFloat64() float64 { + if any.val.Len() == 0 { + return 0 + } + return 1 +} + +func (any *arrayAny) ToString() string { + str, _ := MarshalToString(any.val.Interface()) + return str +} + +func (any *arrayAny) Get(path ...interface{}) Any { + if len(path) == 0 { + return any + } + switch firstPath := path[0].(type) { + case int: + if firstPath < 0 || firstPath >= any.val.Len() { + return newInvalidAny(path) + } + return Wrap(any.val.Index(firstPath).Interface()) + case int32: + if '*' == firstPath { + mappedAll := make([]Any, 0) + for i := 0; i < any.val.Len(); i++ { + mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...) + if mapped.ValueType() != InvalidValue { + mappedAll = append(mappedAll, mapped) + } + } + return wrapArray(mappedAll) + } + return newInvalidAny(path) + default: + return newInvalidAny(path) + } +} + +func (any *arrayAny) Size() int { + return any.val.Len() +} + +func (any *arrayAny) WriteTo(stream *Stream) { + stream.WriteVal(any.val) +} + +func (any *arrayAny) GetInterface() interface{} { + return any.val.Interface() +} diff --git a/vendor/github.com/json-iterator/go/any_bool.go b/vendor/github.com/json-iterator/go/any_bool.go new file mode 100644 index 000000000..9452324af --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_bool.go @@ -0,0 +1,137 @@ +package jsoniter + +type trueAny struct { + baseAny +} + +func (any *trueAny) LastError() error { + return nil +} + +func (any *trueAny) ToBool() bool { + return true +} + +func (any *trueAny) ToInt() int { + return 1 +} + +func (any *trueAny) ToInt32() int32 { + return 1 +} + +func (any *trueAny) ToInt64() int64 { + return 1 +} + +func (any *trueAny) ToUint() uint { + return 1 +} + +func (any *trueAny) ToUint32() uint32 { + return 1 +} + +func (any *trueAny) ToUint64() uint64 { + return 1 +} + +func (any *trueAny) ToFloat32() float32 { + return 1 +} + +func (any *trueAny) ToFloat64() float64 { + return 1 +} + +func (any *trueAny) ToString() string { + return "true" +} + +func (any *trueAny) WriteTo(stream *Stream) { + stream.WriteTrue() +} + +func (any *trueAny) Parse() *Iterator { + return nil +} + +func (any *trueAny) GetInterface() interface{} { + return true +} + +func (any *trueAny) ValueType() ValueType { + return BoolValue +} + +func (any *trueAny) MustBeValid() Any { + return any +} + +type falseAny struct { + baseAny +} + +func (any *falseAny) LastError() error { + return nil +} + +func (any *falseAny) ToBool() bool { + return false +} + +func (any *falseAny) ToInt() int { + return 0 +} + +func (any *falseAny) ToInt32() int32 { + return 0 +} + +func (any *falseAny) ToInt64() int64 { + return 0 +} + +func (any *falseAny) ToUint() uint { + return 0 +} + +func (any *falseAny) ToUint32() uint32 { + return 0 +} + +func (any *falseAny) ToUint64() uint64 { + return 0 +} + +func (any *falseAny) ToFloat32() float32 { + return 0 +} + +func (any *falseAny) ToFloat64() float64 { + return 0 +} + +func (any *falseAny) ToString() string { + return "false" +} + +func (any *falseAny) WriteTo(stream *Stream) { + stream.WriteFalse() +} + +func (any *falseAny) Parse() *Iterator { + return nil +} + +func (any *falseAny) GetInterface() interface{} { + return false +} + +func (any *falseAny) ValueType() ValueType { + return BoolValue +} + +func (any *falseAny) MustBeValid() Any { + return any +} diff --git a/vendor/github.com/json-iterator/go/any_float.go b/vendor/github.com/json-iterator/go/any_float.go new file mode 100644 index 000000000..35fdb0949 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_float.go @@ -0,0 +1,83 @@ +package jsoniter + +import ( + "strconv" +) + +type floatAny struct { + baseAny + val float64 +} + +func (any *floatAny) Parse() *Iterator { + return nil +} + +func (any *floatAny) ValueType() ValueType { + return NumberValue +} + +func (any *floatAny) MustBeValid() Any { + return any +} + +func (any *floatAny) LastError() error { + return nil +} + +func (any *floatAny) ToBool() bool { + return any.ToFloat64() != 0 +} + +func (any *floatAny) ToInt() int { + return int(any.val) +} + +func (any *floatAny) ToInt32() int32 { + return int32(any.val) +} + +func (any *floatAny) ToInt64() int64 { + return int64(any.val) +} + +func (any *floatAny) ToUint() uint { + if any.val > 0 { + return uint(any.val) + } + return 0 +} + +func (any *floatAny) ToUint32() uint32 { + if any.val > 0 { + return uint32(any.val) + } + return 0 +} + +func (any *floatAny) ToUint64() uint64 { + if any.val > 0 { + return uint64(any.val) + } + return 0 +} + +func (any *floatAny) ToFloat32() float32 { + return float32(any.val) +} + +func (any *floatAny) ToFloat64() float64 { + return any.val +} + +func (any *floatAny) ToString() string { + return strconv.FormatFloat(any.val, 'E', -1, 64) +} + +func (any *floatAny) WriteTo(stream *Stream) { + stream.WriteFloat64(any.val) +} + +func (any *floatAny) GetInterface() interface{} { + return any.val +} diff --git a/vendor/github.com/json-iterator/go/any_int32.go b/vendor/github.com/json-iterator/go/any_int32.go new file mode 100644 index 000000000..1b56f3991 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_int32.go @@ -0,0 +1,74 @@ +package jsoniter + +import ( + "strconv" +) + +type int32Any struct { + baseAny + val int32 +} + +func (any *int32Any) LastError() error { + return nil +} + +func (any *int32Any) ValueType() ValueType { + return NumberValue +} + +func (any *int32Any) MustBeValid() Any { + return any +} + +func (any *int32Any) ToBool() bool { + return any.val != 0 +} + +func (any *int32Any) ToInt() int { + return int(any.val) +} + +func (any *int32Any) ToInt32() int32 { + return any.val +} + +func (any *int32Any) ToInt64() int64 { + return int64(any.val) +} + +func (any *int32Any) ToUint() uint { + return uint(any.val) +} + +func (any *int32Any) ToUint32() uint32 { + return uint32(any.val) +} + +func (any *int32Any) ToUint64() uint64 { + return uint64(any.val) +} + +func (any *int32Any) ToFloat32() float32 { + return float32(any.val) +} + +func (any *int32Any) ToFloat64() float64 { + return float64(any.val) +} + +func (any *int32Any) ToString() string { + return strconv.FormatInt(int64(any.val), 10) +} + +func (any *int32Any) WriteTo(stream *Stream) { + stream.WriteInt32(any.val) +} + +func (any *int32Any) Parse() *Iterator { + return nil +} + +func (any *int32Any) GetInterface() interface{} { + return any.val +} diff --git a/vendor/github.com/json-iterator/go/any_int64.go b/vendor/github.com/json-iterator/go/any_int64.go new file mode 100644 index 000000000..c440d72b6 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_int64.go @@ -0,0 +1,74 @@ +package jsoniter + +import ( + "strconv" +) + +type int64Any struct { + baseAny + val int64 +} + +func (any *int64Any) LastError() error { + return nil +} + +func (any *int64Any) ValueType() ValueType { + return NumberValue +} + +func (any *int64Any) MustBeValid() Any { + return any +} + +func (any *int64Any) ToBool() bool { + return any.val != 0 +} + +func (any *int64Any) ToInt() int { + return int(any.val) +} + +func (any *int64Any) ToInt32() int32 { + return int32(any.val) +} + +func (any *int64Any) ToInt64() int64 { + return any.val +} + +func (any *int64Any) ToUint() uint { + return uint(any.val) +} + +func (any *int64Any) ToUint32() uint32 { + return uint32(any.val) +} + +func (any *int64Any) ToUint64() uint64 { + return uint64(any.val) +} + +func (any *int64Any) ToFloat32() float32 { + return float32(any.val) +} + +func (any *int64Any) ToFloat64() float64 { + return float64(any.val) +} + +func (any *int64Any) ToString() string { + return strconv.FormatInt(any.val, 10) +} + +func (any *int64Any) WriteTo(stream *Stream) { + stream.WriteInt64(any.val) +} + +func (any *int64Any) Parse() *Iterator { + return nil +} + +func (any *int64Any) GetInterface() interface{} { + return any.val +} diff --git a/vendor/github.com/json-iterator/go/any_invalid.go b/vendor/github.com/json-iterator/go/any_invalid.go new file mode 100644 index 000000000..1d859eac3 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_invalid.go @@ -0,0 +1,82 @@ +package jsoniter + +import "fmt" + +type invalidAny struct { + baseAny + err error +} + +func newInvalidAny(path []interface{}) *invalidAny { + return &invalidAny{baseAny{}, fmt.Errorf("%v not found", path)} +} + +func (any *invalidAny) LastError() error { + return any.err +} + +func (any *invalidAny) ValueType() ValueType { + return InvalidValue +} + +func (any *invalidAny) MustBeValid() Any { + panic(any.err) +} + +func (any *invalidAny) ToBool() bool { + return false +} + +func (any *invalidAny) ToInt() int { + return 0 +} + +func (any *invalidAny) ToInt32() int32 { + return 0 +} + +func (any *invalidAny) ToInt64() int64 { + return 0 +} + +func (any *invalidAny) ToUint() uint { + return 0 +} + +func (any *invalidAny) ToUint32() uint32 { + return 0 +} + +func (any *invalidAny) ToUint64() uint64 { + return 0 +} + +func (any *invalidAny) ToFloat32() float32 { + return 0 +} + +func (any *invalidAny) ToFloat64() float64 { + return 0 +} + +func (any *invalidAny) ToString() string { + return "" +} + +func (any *invalidAny) WriteTo(stream *Stream) { +} + +func (any *invalidAny) Get(path ...interface{}) Any { + if any.err == nil { + return &invalidAny{baseAny{}, fmt.Errorf("get %v from invalid", path)} + } + return &invalidAny{baseAny{}, fmt.Errorf("%v, get %v from invalid", any.err, path)} +} + +func (any *invalidAny) Parse() *Iterator { + return nil +} + +func (any *invalidAny) GetInterface() interface{} { + return nil +} diff --git a/vendor/github.com/json-iterator/go/any_nil.go b/vendor/github.com/json-iterator/go/any_nil.go new file mode 100644 index 000000000..d04cb54c1 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_nil.go @@ -0,0 +1,69 @@ +package jsoniter + +type nilAny struct { + baseAny +} + +func (any *nilAny) LastError() error { + return nil +} + +func (any *nilAny) ValueType() ValueType { + return NilValue +} + +func (any *nilAny) MustBeValid() Any { + return any +} + +func (any *nilAny) ToBool() bool { + return false +} + +func (any *nilAny) ToInt() int { + return 0 +} + +func (any *nilAny) ToInt32() int32 { + return 0 +} + +func (any *nilAny) ToInt64() int64 { + return 0 +} + +func (any *nilAny) ToUint() uint { + return 0 +} + +func (any *nilAny) ToUint32() uint32 { + return 0 +} + +func (any *nilAny) ToUint64() uint64 { + return 0 +} + +func (any *nilAny) ToFloat32() float32 { + return 0 +} + +func (any *nilAny) ToFloat64() float64 { + return 0 +} + +func (any *nilAny) ToString() string { + return "" +} + +func (any *nilAny) WriteTo(stream *Stream) { + stream.WriteNil() +} + +func (any *nilAny) Parse() *Iterator { + return nil +} + +func (any *nilAny) GetInterface() interface{} { + return nil +} diff --git a/vendor/github.com/json-iterator/go/any_number.go b/vendor/github.com/json-iterator/go/any_number.go new file mode 100644 index 000000000..9d1e901a6 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_number.go @@ -0,0 +1,123 @@ +package jsoniter + +import ( + "io" + "unsafe" +) + +type numberLazyAny struct { + baseAny + cfg *frozenConfig + buf []byte + err error +} + +func (any *numberLazyAny) ValueType() ValueType { + return NumberValue +} + +func (any *numberLazyAny) MustBeValid() Any { + return any +} + +func (any *numberLazyAny) LastError() error { + return any.err +} + +func (any *numberLazyAny) ToBool() bool { + return any.ToFloat64() != 0 +} + +func (any *numberLazyAny) ToInt() int { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadInt() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToInt32() int32 { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadInt32() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToInt64() int64 { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadInt64() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToUint() uint { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadUint() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToUint32() uint32 { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadUint32() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToUint64() uint64 { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadUint64() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToFloat32() float32 { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadFloat32() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToFloat64() float64 { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + val := iter.ReadFloat64() + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } + return val +} + +func (any *numberLazyAny) ToString() string { + return *(*string)(unsafe.Pointer(&any.buf)) +} + +func (any *numberLazyAny) WriteTo(stream *Stream) { + stream.Write(any.buf) +} + +func (any *numberLazyAny) GetInterface() interface{} { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + return iter.Read() +} diff --git a/vendor/github.com/json-iterator/go/any_object.go b/vendor/github.com/json-iterator/go/any_object.go new file mode 100644 index 000000000..c44ef5c98 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_object.go @@ -0,0 +1,374 @@ +package jsoniter + +import ( + "reflect" + "unsafe" +) + +type objectLazyAny struct { + baseAny + cfg *frozenConfig + buf []byte + err error +} + +func (any *objectLazyAny) ValueType() ValueType { + return ObjectValue +} + +func (any *objectLazyAny) MustBeValid() Any { + return any +} + +func (any *objectLazyAny) LastError() error { + return any.err +} + +func (any *objectLazyAny) ToBool() bool { + return true +} + +func (any *objectLazyAny) ToInt() int { + return 0 +} + +func (any *objectLazyAny) ToInt32() int32 { + return 0 +} + +func (any *objectLazyAny) ToInt64() int64 { + return 0 +} + +func (any *objectLazyAny) ToUint() uint { + return 0 +} + +func (any *objectLazyAny) ToUint32() uint32 { + return 0 +} + +func (any *objectLazyAny) ToUint64() uint64 { + return 0 +} + +func (any *objectLazyAny) ToFloat32() float32 { + return 0 +} + +func (any *objectLazyAny) ToFloat64() float64 { + return 0 +} + +func (any *objectLazyAny) ToString() string { + return *(*string)(unsafe.Pointer(&any.buf)) +} + +func (any *objectLazyAny) ToVal(obj interface{}) { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadVal(obj) +} + +func (any *objectLazyAny) Get(path ...interface{}) Any { + if len(path) == 0 { + return any + } + switch firstPath := path[0].(type) { + case string: + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + valueBytes := locateObjectField(iter, firstPath) + if valueBytes == nil { + return newInvalidAny(path) + } + iter.ResetBytes(valueBytes) + return locatePath(iter, path[1:]) + case int32: + if '*' == firstPath { + mappedAll := map[string]Any{} + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadMapCB(func(iter *Iterator, field string) bool { + mapped := locatePath(iter, path[1:]) + if mapped.ValueType() != InvalidValue { + mappedAll[field] = mapped + } + return true + }) + return wrapMap(mappedAll) + } + return newInvalidAny(path) + default: + return newInvalidAny(path) + } +} + +func (any *objectLazyAny) Keys() []string { + keys := []string{} + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadMapCB(func(iter *Iterator, field string) bool { + iter.Skip() + keys = append(keys, field) + return true + }) + return keys +} + +func (any *objectLazyAny) Size() int { + size := 0 + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadObjectCB(func(iter *Iterator, field string) bool { + iter.Skip() + size++ + return true + }) + return size +} + +func (any *objectLazyAny) WriteTo(stream *Stream) { + stream.Write(any.buf) +} + +func (any *objectLazyAny) GetInterface() interface{} { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + return iter.Read() +} + +type objectAny struct { + baseAny + err error + val reflect.Value +} + +func wrapStruct(val interface{}) *objectAny { + return &objectAny{baseAny{}, nil, reflect.ValueOf(val)} +} + +func (any *objectAny) ValueType() ValueType { + return ObjectValue +} + +func (any *objectAny) MustBeValid() Any { + return any +} + +func (any *objectAny) Parse() *Iterator { + return nil +} + +func (any *objectAny) LastError() error { + return any.err +} + +func (any *objectAny) ToBool() bool { + return any.val.NumField() != 0 +} + +func (any *objectAny) ToInt() int { + return 0 +} + +func (any *objectAny) ToInt32() int32 { + return 0 +} + +func (any *objectAny) ToInt64() int64 { + return 0 +} + +func (any *objectAny) ToUint() uint { + return 0 +} + +func (any *objectAny) ToUint32() uint32 { + return 0 +} + +func (any *objectAny) ToUint64() uint64 { + return 0 +} + +func (any *objectAny) ToFloat32() float32 { + return 0 +} + +func (any *objectAny) ToFloat64() float64 { + return 0 +} + +func (any *objectAny) ToString() string { + str, err := MarshalToString(any.val.Interface()) + any.err = err + return str +} + +func (any *objectAny) Get(path ...interface{}) Any { + if len(path) == 0 { + return any + } + switch firstPath := path[0].(type) { + case string: + field := any.val.FieldByName(firstPath) + if !field.IsValid() { + return newInvalidAny(path) + } + return Wrap(field.Interface()) + case int32: + if '*' == firstPath { + mappedAll := map[string]Any{} + for i := 0; i < any.val.NumField(); i++ { + field := any.val.Field(i) + if field.CanInterface() { + mapped := Wrap(field.Interface()).Get(path[1:]...) + if mapped.ValueType() != InvalidValue { + mappedAll[any.val.Type().Field(i).Name] = mapped + } + } + } + return wrapMap(mappedAll) + } + return newInvalidAny(path) + default: + return newInvalidAny(path) + } +} + +func (any *objectAny) Keys() []string { + keys := make([]string, 0, any.val.NumField()) + for i := 0; i < any.val.NumField(); i++ { + keys = append(keys, any.val.Type().Field(i).Name) + } + return keys +} + +func (any *objectAny) Size() int { + return any.val.NumField() +} + +func (any *objectAny) WriteTo(stream *Stream) { + stream.WriteVal(any.val) +} + +func (any *objectAny) GetInterface() interface{} { + return any.val.Interface() +} + +type mapAny struct { + baseAny + err error + val reflect.Value +} + +func wrapMap(val interface{}) *mapAny { + return &mapAny{baseAny{}, nil, reflect.ValueOf(val)} +} + +func (any *mapAny) ValueType() ValueType { + return ObjectValue +} + +func (any *mapAny) MustBeValid() Any { + return any +} + +func (any *mapAny) Parse() *Iterator { + return nil +} + +func (any *mapAny) LastError() error { + return any.err +} + +func (any *mapAny) ToBool() bool { + return true +} + +func (any *mapAny) ToInt() int { + return 0 +} + +func (any *mapAny) ToInt32() int32 { + return 0 +} + +func (any *mapAny) ToInt64() int64 { + return 0 +} + +func (any *mapAny) ToUint() uint { + return 0 +} + +func (any *mapAny) ToUint32() uint32 { + return 0 +} + +func (any *mapAny) ToUint64() uint64 { + return 0 +} + +func (any *mapAny) ToFloat32() float32 { + return 0 +} + +func (any *mapAny) ToFloat64() float64 { + return 0 +} + +func (any *mapAny) ToString() string { + str, err := MarshalToString(any.val.Interface()) + any.err = err + return str +} + +func (any *mapAny) Get(path ...interface{}) Any { + if len(path) == 0 { + return any + } + switch firstPath := path[0].(type) { + case int32: + if '*' == firstPath { + mappedAll := map[string]Any{} + for _, key := range any.val.MapKeys() { + keyAsStr := key.String() + element := Wrap(any.val.MapIndex(key).Interface()) + mapped := element.Get(path[1:]...) + if mapped.ValueType() != InvalidValue { + mappedAll[keyAsStr] = mapped + } + } + return wrapMap(mappedAll) + } + return newInvalidAny(path) + default: + value := any.val.MapIndex(reflect.ValueOf(firstPath)) + if !value.IsValid() { + return newInvalidAny(path) + } + return Wrap(value.Interface()) + } +} + +func (any *mapAny) Keys() []string { + keys := make([]string, 0, any.val.Len()) + for _, key := range any.val.MapKeys() { + keys = append(keys, key.String()) + } + return keys +} + +func (any *mapAny) Size() int { + return any.val.Len() +} + +func (any *mapAny) WriteTo(stream *Stream) { + stream.WriteVal(any.val) +} + +func (any *mapAny) GetInterface() interface{} { + return any.val.Interface() +} diff --git a/vendor/github.com/json-iterator/go/any_str.go b/vendor/github.com/json-iterator/go/any_str.go new file mode 100644 index 000000000..a4b93c78c --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_str.go @@ -0,0 +1,166 @@ +package jsoniter + +import ( + "fmt" + "strconv" +) + +type stringAny struct { + baseAny + val string +} + +func (any *stringAny) Get(path ...interface{}) Any { + if len(path) == 0 { + return any + } + return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} +} + +func (any *stringAny) Parse() *Iterator { + return nil +} + +func (any *stringAny) ValueType() ValueType { + return StringValue +} + +func (any *stringAny) MustBeValid() Any { + return any +} + +func (any *stringAny) LastError() error { + return nil +} + +func (any *stringAny) ToBool() bool { + str := any.ToString() + if str == "0" { + return false + } + for _, c := range str { + switch c { + case ' ', '\n', '\r', '\t': + default: + return true + } + } + return false +} + +func (any *stringAny) ToInt() int { + return int(any.ToInt64()) + +} + +func (any *stringAny) ToInt32() int32 { + return int32(any.ToInt64()) +} + +func (any *stringAny) ToInt64() int64 { + if any.val == "" { + return 0 + } + + flag := 1 + startPos := 0 + endPos := 0 + if any.val[0] == '+' || any.val[0] == '-' { + startPos = 1 + } + + if any.val[0] == '-' { + flag = -1 + } + + for i := startPos; i < len(any.val); i++ { + if any.val[i] >= '0' && any.val[i] <= '9' { + endPos = i + 1 + } else { + break + } + } + parsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64) + return int64(flag) * parsed +} + +func (any *stringAny) ToUint() uint { + return uint(any.ToUint64()) +} + +func (any *stringAny) ToUint32() uint32 { + return uint32(any.ToUint64()) +} + +func (any *stringAny) ToUint64() uint64 { + if any.val == "" { + return 0 + } + + startPos := 0 + endPos := 0 + + if any.val[0] == '-' { + return 0 + } + if any.val[0] == '+' { + startPos = 1 + } + + for i := startPos; i < len(any.val); i++ { + if any.val[i] >= '0' && any.val[i] <= '9' { + endPos = i + 1 + } else { + break + } + } + parsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64) + return parsed +} + +func (any *stringAny) ToFloat32() float32 { + return float32(any.ToFloat64()) +} + +func (any *stringAny) ToFloat64() float64 { + if len(any.val) == 0 { + return 0 + } + + // first char invalid + if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') { + return 0 + } + + // extract valid num expression from string + // eg 123true => 123, -12.12xxa => -12.12 + endPos := 1 + for i := 1; i < len(any.val); i++ { + if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' { + endPos = i + 1 + continue + } + + // end position is the first char which is not digit + if any.val[i] >= '0' && any.val[i] <= '9' { + endPos = i + 1 + } else { + endPos = i + break + } + } + parsed, _ := strconv.ParseFloat(any.val[:endPos], 64) + return parsed +} + +func (any *stringAny) ToString() string { + return any.val +} + +func (any *stringAny) WriteTo(stream *Stream) { + stream.WriteString(any.val) +} + +func (any *stringAny) GetInterface() interface{} { + return any.val +} diff --git a/vendor/github.com/json-iterator/go/any_uint32.go b/vendor/github.com/json-iterator/go/any_uint32.go new file mode 100644 index 000000000..656bbd33d --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_uint32.go @@ -0,0 +1,74 @@ +package jsoniter + +import ( + "strconv" +) + +type uint32Any struct { + baseAny + val uint32 +} + +func (any *uint32Any) LastError() error { + return nil +} + +func (any *uint32Any) ValueType() ValueType { + return NumberValue +} + +func (any *uint32Any) MustBeValid() Any { + return any +} + +func (any *uint32Any) ToBool() bool { + return any.val != 0 +} + +func (any *uint32Any) ToInt() int { + return int(any.val) +} + +func (any *uint32Any) ToInt32() int32 { + return int32(any.val) +} + +func (any *uint32Any) ToInt64() int64 { + return int64(any.val) +} + +func (any *uint32Any) ToUint() uint { + return uint(any.val) +} + +func (any *uint32Any) ToUint32() uint32 { + return any.val +} + +func (any *uint32Any) ToUint64() uint64 { + return uint64(any.val) +} + +func (any *uint32Any) ToFloat32() float32 { + return float32(any.val) +} + +func (any *uint32Any) ToFloat64() float64 { + return float64(any.val) +} + +func (any *uint32Any) ToString() string { + return strconv.FormatInt(int64(any.val), 10) +} + +func (any *uint32Any) WriteTo(stream *Stream) { + stream.WriteUint32(any.val) +} + +func (any *uint32Any) Parse() *Iterator { + return nil +} + +func (any *uint32Any) GetInterface() interface{} { + return any.val +} diff --git a/vendor/github.com/json-iterator/go/any_uint64.go b/vendor/github.com/json-iterator/go/any_uint64.go new file mode 100644 index 000000000..7df2fce33 --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_uint64.go @@ -0,0 +1,74 @@ +package jsoniter + +import ( + "strconv" +) + +type uint64Any struct { + baseAny + val uint64 +} + +func (any *uint64Any) LastError() error { + return nil +} + +func (any *uint64Any) ValueType() ValueType { + return NumberValue +} + +func (any *uint64Any) MustBeValid() Any { + return any +} + +func (any *uint64Any) ToBool() bool { + return any.val != 0 +} + +func (any *uint64Any) ToInt() int { + return int(any.val) +} + +func (any *uint64Any) ToInt32() int32 { + return int32(any.val) +} + +func (any *uint64Any) ToInt64() int64 { + return int64(any.val) +} + +func (any *uint64Any) ToUint() uint { + return uint(any.val) +} + +func (any *uint64Any) ToUint32() uint32 { + return uint32(any.val) +} + +func (any *uint64Any) ToUint64() uint64 { + return any.val +} + +func (any *uint64Any) ToFloat32() float32 { + return float32(any.val) +} + +func (any *uint64Any) ToFloat64() float64 { + return float64(any.val) +} + +func (any *uint64Any) ToString() string { + return strconv.FormatUint(any.val, 10) +} + +func (any *uint64Any) WriteTo(stream *Stream) { + stream.WriteUint64(any.val) +} + +func (any *uint64Any) Parse() *Iterator { + return nil +} + +func (any *uint64Any) GetInterface() interface{} { + return any.val +} diff --git a/vendor/github.com/json-iterator/go/config.go b/vendor/github.com/json-iterator/go/config.go new file mode 100644 index 000000000..835819129 --- /dev/null +++ b/vendor/github.com/json-iterator/go/config.go @@ -0,0 +1,372 @@ +package jsoniter + +import ( + "encoding/json" + "io" + "reflect" + "sync" + "unsafe" + + "github.com/modern-go/concurrent" + "github.com/modern-go/reflect2" +) + +// Config customize how the API should behave. +// The API is created from Config by Froze. +type Config struct { + IndentionStep int + MarshalFloatWith6Digits bool + EscapeHTML bool + SortMapKeys bool + UseNumber bool + DisallowUnknownFields bool + TagKey string + OnlyTaggedField bool + ValidateJsonRawMessage bool + ObjectFieldMustBeSimpleString bool + CaseSensitive bool +} + +// API the public interface of this package. +// Primary Marshal and Unmarshal. +type API interface { + IteratorPool + StreamPool + MarshalToString(v interface{}) (string, error) + Marshal(v interface{}) ([]byte, error) + MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) + UnmarshalFromString(str string, v interface{}) error + Unmarshal(data []byte, v interface{}) error + Get(data []byte, path ...interface{}) Any + NewEncoder(writer io.Writer) *Encoder + NewDecoder(reader io.Reader) *Decoder + Valid(data []byte) bool + RegisterExtension(extension Extension) + DecoderOf(typ reflect2.Type) ValDecoder + EncoderOf(typ reflect2.Type) ValEncoder +} + +// ConfigDefault the default API +var ConfigDefault = Config{ + EscapeHTML: true, +}.Froze() + +// ConfigCompatibleWithStandardLibrary tries to be 100% compatible with standard library behavior +var ConfigCompatibleWithStandardLibrary = Config{ + EscapeHTML: true, + SortMapKeys: true, + ValidateJsonRawMessage: true, +}.Froze() + +// ConfigFastest marshals float with only 6 digits precision +var ConfigFastest = Config{ + EscapeHTML: false, + MarshalFloatWith6Digits: true, // will lose precession + ObjectFieldMustBeSimpleString: true, // do not unescape object field +}.Froze() + +type frozenConfig struct { + configBeforeFrozen Config + sortMapKeys bool + indentionStep int + objectFieldMustBeSimpleString bool + onlyTaggedField bool + disallowUnknownFields bool + decoderCache *concurrent.Map + encoderCache *concurrent.Map + extensions []Extension + streamPool *sync.Pool + iteratorPool *sync.Pool + caseSensitive bool +} + +func (cfg *frozenConfig) initCache() { + cfg.decoderCache = concurrent.NewMap() + cfg.encoderCache = concurrent.NewMap() +} + +func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) { + cfg.decoderCache.Store(cacheKey, decoder) +} + +func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) { + cfg.encoderCache.Store(cacheKey, encoder) +} + +func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder { + decoder, found := cfg.decoderCache.Load(cacheKey) + if found { + return decoder.(ValDecoder) + } + return nil +} + +func (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder { + encoder, found := cfg.encoderCache.Load(cacheKey) + if found { + return encoder.(ValEncoder) + } + return nil +} + +var cfgCache = concurrent.NewMap() + +func getFrozenConfigFromCache(cfg Config) *frozenConfig { + obj, found := cfgCache.Load(cfg) + if found { + return obj.(*frozenConfig) + } + return nil +} + +func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) { + cfgCache.Store(cfg, frozenConfig) +} + +// Froze forge API from config +func (cfg Config) Froze() API { + api := &frozenConfig{ + sortMapKeys: cfg.SortMapKeys, + indentionStep: cfg.IndentionStep, + objectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString, + onlyTaggedField: cfg.OnlyTaggedField, + disallowUnknownFields: cfg.DisallowUnknownFields, + caseSensitive: cfg.CaseSensitive, + } + api.streamPool = &sync.Pool{ + New: func() interface{} { + return NewStream(api, nil, 512) + }, + } + api.iteratorPool = &sync.Pool{ + New: func() interface{} { + return NewIterator(api) + }, + } + api.initCache() + encoderExtension := EncoderExtension{} + decoderExtension := DecoderExtension{} + if cfg.MarshalFloatWith6Digits { + api.marshalFloatWith6Digits(encoderExtension) + } + if cfg.EscapeHTML { + api.escapeHTML(encoderExtension) + } + if cfg.UseNumber { + api.useNumber(decoderExtension) + } + if cfg.ValidateJsonRawMessage { + api.validateJsonRawMessage(encoderExtension) + } + if len(encoderExtension) > 0 { + api.extensions = append(api.extensions, encoderExtension) + } + if len(decoderExtension) > 0 { + api.extensions = append(api.extensions, decoderExtension) + } + api.configBeforeFrozen = cfg + return api +} + +func (cfg Config) frozeWithCacheReuse() *frozenConfig { + api := getFrozenConfigFromCache(cfg) + if api != nil { + return api + } + api = cfg.Froze().(*frozenConfig) + addFrozenConfigToCache(cfg, api) + return api +} + +func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) { + encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) { + rawMessage := *(*json.RawMessage)(ptr) + iter := cfg.BorrowIterator([]byte(rawMessage)) + iter.Read() + if iter.Error != nil { + stream.WriteRaw("null") + } else { + cfg.ReturnIterator(iter) + stream.WriteRaw(string(rawMessage)) + } + }, func(ptr unsafe.Pointer) bool { + return false + }} + extension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder + extension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder +} + +func (cfg *frozenConfig) useNumber(extension DecoderExtension) { + extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { + exitingValue := *((*interface{})(ptr)) + if exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr { + iter.ReadVal(exitingValue) + return + } + if iter.WhatIsNext() == NumberValue { + *((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) + } else { + *((*interface{})(ptr)) = iter.Read() + } + }} +} +func (cfg *frozenConfig) getTagKey() string { + tagKey := cfg.configBeforeFrozen.TagKey + if tagKey == "" { + return "json" + } + return tagKey +} + +func (cfg *frozenConfig) RegisterExtension(extension Extension) { + cfg.extensions = append(cfg.extensions, extension) +} + +type lossyFloat32Encoder struct { +} + +func (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat32Lossy(*((*float32)(ptr))) +} + +func (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float32)(ptr)) == 0 +} + +type lossyFloat64Encoder struct { +} + +func (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat64Lossy(*((*float64)(ptr))) +} + +func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float64)(ptr)) == 0 +} + +// EnableLossyFloatMarshalling keeps 10**(-6) precision +// for float variables for better performance. +func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) { + // for better performance + extension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{} + extension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{} +} + +type htmlEscapedStringEncoder struct { +} + +func (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + str := *((*string)(ptr)) + stream.WriteStringWithHTMLEscaped(str) +} + +func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*string)(ptr)) == "" +} + +func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) { + encoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{} +} + +func (cfg *frozenConfig) cleanDecoders() { + typeDecoders = map[string]ValDecoder{} + fieldDecoders = map[string]ValDecoder{} + *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) +} + +func (cfg *frozenConfig) cleanEncoders() { + typeEncoders = map[string]ValEncoder{} + fieldEncoders = map[string]ValEncoder{} + *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) +} + +func (cfg *frozenConfig) MarshalToString(v interface{}) (string, error) { + stream := cfg.BorrowStream(nil) + defer cfg.ReturnStream(stream) + stream.WriteVal(v) + if stream.Error != nil { + return "", stream.Error + } + return string(stream.Buffer()), nil +} + +func (cfg *frozenConfig) Marshal(v interface{}) ([]byte, error) { + stream := cfg.BorrowStream(nil) + defer cfg.ReturnStream(stream) + stream.WriteVal(v) + if stream.Error != nil { + return nil, stream.Error + } + result := stream.Buffer() + copied := make([]byte, len(result)) + copy(copied, result) + return copied, nil +} + +func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { + if prefix != "" { + panic("prefix is not supported") + } + for _, r := range indent { + if r != ' ' { + panic("indent can only be space") + } + } + newCfg := cfg.configBeforeFrozen + newCfg.IndentionStep = len(indent) + return newCfg.frozeWithCacheReuse().Marshal(v) +} + +func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error { + data := []byte(str) + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + iter.ReadVal(v) + c := iter.nextToken() + if c == 0 { + if iter.Error == io.EOF { + return nil + } + return iter.Error + } + iter.ReportError("Unmarshal", "there are bytes left after unmarshal") + return iter.Error +} + +func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any { + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + return locatePath(iter, path) +} + +func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error { + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + iter.ReadVal(v) + c := iter.nextToken() + if c == 0 { + if iter.Error == io.EOF { + return nil + } + return iter.Error + } + iter.ReportError("Unmarshal", "there are bytes left after unmarshal") + return iter.Error +} + +func (cfg *frozenConfig) NewEncoder(writer io.Writer) *Encoder { + stream := NewStream(cfg, writer, 512) + return &Encoder{stream} +} + +func (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder { + iter := Parse(cfg, reader, 512) + return &Decoder{iter} +} + +func (cfg *frozenConfig) Valid(data []byte) bool { + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + iter.Skip() + return iter.Error == nil +} diff --git a/vendor/github.com/json-iterator/go/iter.go b/vendor/github.com/json-iterator/go/iter.go new file mode 100644 index 000000000..95ae54fbf --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter.go @@ -0,0 +1,322 @@ +package jsoniter + +import ( + "encoding/json" + "fmt" + "io" +) + +// ValueType the type for JSON element +type ValueType int + +const ( + // InvalidValue invalid JSON element + InvalidValue ValueType = iota + // StringValue JSON element "string" + StringValue + // NumberValue JSON element 100 or 0.10 + NumberValue + // NilValue JSON element null + NilValue + // BoolValue JSON element true or false + BoolValue + // ArrayValue JSON element [] + ArrayValue + // ObjectValue JSON element {} + ObjectValue +) + +var hexDigits []byte +var valueTypes []ValueType + +func init() { + hexDigits = make([]byte, 256) + for i := 0; i < len(hexDigits); i++ { + hexDigits[i] = 255 + } + for i := '0'; i <= '9'; i++ { + hexDigits[i] = byte(i - '0') + } + for i := 'a'; i <= 'f'; i++ { + hexDigits[i] = byte((i - 'a') + 10) + } + for i := 'A'; i <= 'F'; i++ { + hexDigits[i] = byte((i - 'A') + 10) + } + valueTypes = make([]ValueType, 256) + for i := 0; i < len(valueTypes); i++ { + valueTypes[i] = InvalidValue + } + valueTypes['"'] = StringValue + valueTypes['-'] = NumberValue + valueTypes['0'] = NumberValue + valueTypes['1'] = NumberValue + valueTypes['2'] = NumberValue + valueTypes['3'] = NumberValue + valueTypes['4'] = NumberValue + valueTypes['5'] = NumberValue + valueTypes['6'] = NumberValue + valueTypes['7'] = NumberValue + valueTypes['8'] = NumberValue + valueTypes['9'] = NumberValue + valueTypes['t'] = BoolValue + valueTypes['f'] = BoolValue + valueTypes['n'] = NilValue + valueTypes['['] = ArrayValue + valueTypes['{'] = ObjectValue +} + +// Iterator is a io.Reader like object, with JSON specific read functions. +// Error is not returned as return value, but stored as Error member on this iterator instance. +type Iterator struct { + cfg *frozenConfig + reader io.Reader + buf []byte + head int + tail int + captureStartedAt int + captured []byte + Error error + Attachment interface{} // open for customized decoder +} + +// NewIterator creates an empty Iterator instance +func NewIterator(cfg API) *Iterator { + return &Iterator{ + cfg: cfg.(*frozenConfig), + reader: nil, + buf: nil, + head: 0, + tail: 0, + } +} + +// Parse creates an Iterator instance from io.Reader +func Parse(cfg API, reader io.Reader, bufSize int) *Iterator { + return &Iterator{ + cfg: cfg.(*frozenConfig), + reader: reader, + buf: make([]byte, bufSize), + head: 0, + tail: 0, + } +} + +// ParseBytes creates an Iterator instance from byte array +func ParseBytes(cfg API, input []byte) *Iterator { + return &Iterator{ + cfg: cfg.(*frozenConfig), + reader: nil, + buf: input, + head: 0, + tail: len(input), + } +} + +// ParseString creates an Iterator instance from string +func ParseString(cfg API, input string) *Iterator { + return ParseBytes(cfg, []byte(input)) +} + +// Pool returns a pool can provide more iterator with same configuration +func (iter *Iterator) Pool() IteratorPool { + return iter.cfg +} + +// Reset reuse iterator instance by specifying another reader +func (iter *Iterator) Reset(reader io.Reader) *Iterator { + iter.reader = reader + iter.head = 0 + iter.tail = 0 + return iter +} + +// ResetBytes reuse iterator instance by specifying another byte array as input +func (iter *Iterator) ResetBytes(input []byte) *Iterator { + iter.reader = nil + iter.buf = input + iter.head = 0 + iter.tail = len(input) + return iter +} + +// WhatIsNext gets ValueType of relatively next json element +func (iter *Iterator) WhatIsNext() ValueType { + valueType := valueTypes[iter.nextToken()] + iter.unreadByte() + return valueType +} + +func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool { + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + switch c { + case ' ', '\n', '\t', '\r': + continue + } + iter.head = i + return false + } + return true +} + +func (iter *Iterator) isObjectEnd() bool { + c := iter.nextToken() + if c == ',' { + return false + } + if c == '}' { + return true + } + iter.ReportError("isObjectEnd", "object ended prematurely, unexpected char "+string([]byte{c})) + return true +} + +func (iter *Iterator) nextToken() byte { + // a variation of skip whitespaces, returning the next non-whitespace token + for { + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + switch c { + case ' ', '\n', '\t', '\r': + continue + } + iter.head = i + 1 + return c + } + if !iter.loadMore() { + return 0 + } + } +} + +// ReportError record a error in iterator instance with current position. +func (iter *Iterator) ReportError(operation string, msg string) { + if iter.Error != nil { + if iter.Error != io.EOF { + return + } + } + peekStart := iter.head - 10 + if peekStart < 0 { + peekStart = 0 + } + peekEnd := iter.head + 10 + if peekEnd > iter.tail { + peekEnd = iter.tail + } + parsing := string(iter.buf[peekStart:peekEnd]) + contextStart := iter.head - 50 + if contextStart < 0 { + contextStart = 0 + } + contextEnd := iter.head + 50 + if contextEnd > iter.tail { + contextEnd = iter.tail + } + context := string(iter.buf[contextStart:contextEnd]) + iter.Error = fmt.Errorf("%s: %s, error found in #%v byte of ...|%s|..., bigger context ...|%s|...", + operation, msg, iter.head-peekStart, parsing, context) +} + +// CurrentBuffer gets current buffer as string for debugging purpose +func (iter *Iterator) CurrentBuffer() string { + peekStart := iter.head - 10 + if peekStart < 0 { + peekStart = 0 + } + return fmt.Sprintf("parsing #%v byte, around ...|%s|..., whole buffer ...|%s|...", iter.head, + string(iter.buf[peekStart:iter.head]), string(iter.buf[0:iter.tail])) +} + +func (iter *Iterator) readByte() (ret byte) { + if iter.head == iter.tail { + if iter.loadMore() { + ret = iter.buf[iter.head] + iter.head++ + return ret + } + return 0 + } + ret = iter.buf[iter.head] + iter.head++ + return ret +} + +func (iter *Iterator) loadMore() bool { + if iter.reader == nil { + if iter.Error == nil { + iter.head = iter.tail + iter.Error = io.EOF + } + return false + } + if iter.captured != nil { + iter.captured = append(iter.captured, + iter.buf[iter.captureStartedAt:iter.tail]...) + iter.captureStartedAt = 0 + } + for { + n, err := iter.reader.Read(iter.buf) + if n == 0 { + if err != nil { + if iter.Error == nil { + iter.Error = err + } + return false + } + } else { + iter.head = 0 + iter.tail = n + return true + } + } +} + +func (iter *Iterator) unreadByte() { + if iter.Error != nil { + return + } + iter.head-- + return +} + +// Read read the next JSON element as generic interface{}. +func (iter *Iterator) Read() interface{} { + valueType := iter.WhatIsNext() + switch valueType { + case StringValue: + return iter.ReadString() + case NumberValue: + if iter.cfg.configBeforeFrozen.UseNumber { + return json.Number(iter.readNumberAsString()) + } + return iter.ReadFloat64() + case NilValue: + iter.skipFourBytes('n', 'u', 'l', 'l') + return nil + case BoolValue: + return iter.ReadBool() + case ArrayValue: + arr := []interface{}{} + iter.ReadArrayCB(func(iter *Iterator) bool { + var elem interface{} + iter.ReadVal(&elem) + arr = append(arr, elem) + return true + }) + return arr + case ObjectValue: + obj := map[string]interface{}{} + iter.ReadMapCB(func(Iter *Iterator, field string) bool { + var elem interface{} + iter.ReadVal(&elem) + obj[field] = elem + return true + }) + return obj + default: + iter.ReportError("Read", fmt.Sprintf("unexpected value type: %v", valueType)) + return nil + } +} diff --git a/vendor/github.com/json-iterator/go/iter_array.go b/vendor/github.com/json-iterator/go/iter_array.go new file mode 100644 index 000000000..6188cb457 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_array.go @@ -0,0 +1,58 @@ +package jsoniter + +// ReadArray read array element, tells if the array has more element to read. +func (iter *Iterator) ReadArray() (ret bool) { + c := iter.nextToken() + switch c { + case 'n': + iter.skipThreeBytes('u', 'l', 'l') + return false // null + case '[': + c = iter.nextToken() + if c != ']' { + iter.unreadByte() + return true + } + return false + case ']': + return false + case ',': + return true + default: + iter.ReportError("ReadArray", "expect [ or , or ] or n, but found "+string([]byte{c})) + return + } +} + +// ReadArrayCB read array with callback +func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) { + c := iter.nextToken() + if c == '[' { + c = iter.nextToken() + if c != ']' { + iter.unreadByte() + if !callback(iter) { + return false + } + c = iter.nextToken() + for c == ',' { + if !callback(iter) { + return false + } + c = iter.nextToken() + } + if c != ']' { + iter.ReportError("ReadArrayCB", "expect ] in the end, but found "+string([]byte{c})) + return false + } + return true + } + return true + } + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return true // null + } + iter.ReportError("ReadArrayCB", "expect [ or n, but found "+string([]byte{c})) + return false +} diff --git a/vendor/github.com/json-iterator/go/iter_float.go b/vendor/github.com/json-iterator/go/iter_float.go new file mode 100644 index 000000000..4f883c095 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_float.go @@ -0,0 +1,347 @@ +package jsoniter + +import ( + "encoding/json" + "io" + "math/big" + "strconv" + "strings" + "unsafe" +) + +var floatDigits []int8 + +const invalidCharForNumber = int8(-1) +const endOfNumber = int8(-2) +const dotInNumber = int8(-3) + +func init() { + floatDigits = make([]int8, 256) + for i := 0; i < len(floatDigits); i++ { + floatDigits[i] = invalidCharForNumber + } + for i := int8('0'); i <= int8('9'); i++ { + floatDigits[i] = i - int8('0') + } + floatDigits[','] = endOfNumber + floatDigits[']'] = endOfNumber + floatDigits['}'] = endOfNumber + floatDigits[' '] = endOfNumber + floatDigits['\t'] = endOfNumber + floatDigits['\n'] = endOfNumber + floatDigits['.'] = dotInNumber +} + +// ReadBigFloat read big.Float +func (iter *Iterator) ReadBigFloat() (ret *big.Float) { + str := iter.readNumberAsString() + if iter.Error != nil && iter.Error != io.EOF { + return nil + } + prec := 64 + if len(str) > prec { + prec = len(str) + } + val, _, err := big.ParseFloat(str, 10, uint(prec), big.ToZero) + if err != nil { + iter.Error = err + return nil + } + return val +} + +// ReadBigInt read big.Int +func (iter *Iterator) ReadBigInt() (ret *big.Int) { + str := iter.readNumberAsString() + if iter.Error != nil && iter.Error != io.EOF { + return nil + } + ret = big.NewInt(0) + var success bool + ret, success = ret.SetString(str, 10) + if !success { + iter.ReportError("ReadBigInt", "invalid big int") + return nil + } + return ret +} + +//ReadFloat32 read float32 +func (iter *Iterator) ReadFloat32() (ret float32) { + c := iter.nextToken() + if c == '-' { + return -iter.readPositiveFloat32() + } + iter.unreadByte() + return iter.readPositiveFloat32() +} + +func (iter *Iterator) readPositiveFloat32() (ret float32) { + value := uint64(0) + c := byte(' ') + i := iter.head + // first char + if i == iter.tail { + return iter.readFloat32SlowPath() + } + c = iter.buf[i] + i++ + ind := floatDigits[c] + switch ind { + case invalidCharForNumber: + return iter.readFloat32SlowPath() + case endOfNumber: + iter.ReportError("readFloat32", "empty number") + return + case dotInNumber: + iter.ReportError("readFloat32", "leading dot is invalid") + return + case 0: + if i == iter.tail { + return iter.readFloat32SlowPath() + } + c = iter.buf[i] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + iter.ReportError("readFloat32", "leading zero is invalid") + return + } + } + value = uint64(ind) + // chars before dot +non_decimal_loop: + for ; i < iter.tail; i++ { + c = iter.buf[i] + ind := floatDigits[c] + switch ind { + case invalidCharForNumber: + return iter.readFloat32SlowPath() + case endOfNumber: + iter.head = i + return float32(value) + case dotInNumber: + break non_decimal_loop + } + if value > uint64SafeToMultiple10 { + return iter.readFloat32SlowPath() + } + value = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind; + } + // chars after dot + if c == '.' { + i++ + decimalPlaces := 0 + if i == iter.tail { + return iter.readFloat32SlowPath() + } + for ; i < iter.tail; i++ { + c = iter.buf[i] + ind := floatDigits[c] + switch ind { + case endOfNumber: + if decimalPlaces > 0 && decimalPlaces < len(pow10) { + iter.head = i + return float32(float64(value) / float64(pow10[decimalPlaces])) + } + // too many decimal places + return iter.readFloat32SlowPath() + case invalidCharForNumber: + fallthrough + case dotInNumber: + return iter.readFloat32SlowPath() + } + decimalPlaces++ + if value > uint64SafeToMultiple10 { + return iter.readFloat32SlowPath() + } + value = (value << 3) + (value << 1) + uint64(ind) + } + } + return iter.readFloat32SlowPath() +} + +func (iter *Iterator) readNumberAsString() (ret string) { + strBuf := [16]byte{} + str := strBuf[0:0] +load_loop: + for { + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + switch c { + case '+', '-', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + str = append(str, c) + continue + default: + iter.head = i + break load_loop + } + } + if !iter.loadMore() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + return + } + if len(str) == 0 { + iter.ReportError("readNumberAsString", "invalid number") + } + return *(*string)(unsafe.Pointer(&str)) +} + +func (iter *Iterator) readFloat32SlowPath() (ret float32) { + str := iter.readNumberAsString() + if iter.Error != nil && iter.Error != io.EOF { + return + } + errMsg := validateFloat(str) + if errMsg != "" { + iter.ReportError("readFloat32SlowPath", errMsg) + return + } + val, err := strconv.ParseFloat(str, 32) + if err != nil { + iter.Error = err + return + } + return float32(val) +} + +// ReadFloat64 read float64 +func (iter *Iterator) ReadFloat64() (ret float64) { + c := iter.nextToken() + if c == '-' { + return -iter.readPositiveFloat64() + } + iter.unreadByte() + return iter.readPositiveFloat64() +} + +func (iter *Iterator) readPositiveFloat64() (ret float64) { + value := uint64(0) + c := byte(' ') + i := iter.head + // first char + if i == iter.tail { + return iter.readFloat64SlowPath() + } + c = iter.buf[i] + i++ + ind := floatDigits[c] + switch ind { + case invalidCharForNumber: + return iter.readFloat64SlowPath() + case endOfNumber: + iter.ReportError("readFloat64", "empty number") + return + case dotInNumber: + iter.ReportError("readFloat64", "leading dot is invalid") + return + case 0: + if i == iter.tail { + return iter.readFloat64SlowPath() + } + c = iter.buf[i] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + iter.ReportError("readFloat64", "leading zero is invalid") + return + } + } + value = uint64(ind) + // chars before dot +non_decimal_loop: + for ; i < iter.tail; i++ { + c = iter.buf[i] + ind := floatDigits[c] + switch ind { + case invalidCharForNumber: + return iter.readFloat64SlowPath() + case endOfNumber: + iter.head = i + return float64(value) + case dotInNumber: + break non_decimal_loop + } + if value > uint64SafeToMultiple10 { + return iter.readFloat64SlowPath() + } + value = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind; + } + // chars after dot + if c == '.' { + i++ + decimalPlaces := 0 + if i == iter.tail { + return iter.readFloat64SlowPath() + } + for ; i < iter.tail; i++ { + c = iter.buf[i] + ind := floatDigits[c] + switch ind { + case endOfNumber: + if decimalPlaces > 0 && decimalPlaces < len(pow10) { + iter.head = i + return float64(value) / float64(pow10[decimalPlaces]) + } + // too many decimal places + return iter.readFloat64SlowPath() + case invalidCharForNumber: + fallthrough + case dotInNumber: + return iter.readFloat64SlowPath() + } + decimalPlaces++ + if value > uint64SafeToMultiple10 { + return iter.readFloat64SlowPath() + } + value = (value << 3) + (value << 1) + uint64(ind) + } + } + return iter.readFloat64SlowPath() +} + +func (iter *Iterator) readFloat64SlowPath() (ret float64) { + str := iter.readNumberAsString() + if iter.Error != nil && iter.Error != io.EOF { + return + } + errMsg := validateFloat(str) + if errMsg != "" { + iter.ReportError("readFloat64SlowPath", errMsg) + return + } + val, err := strconv.ParseFloat(str, 64) + if err != nil { + iter.Error = err + return + } + return val +} + +func validateFloat(str string) string { + // strconv.ParseFloat is not validating `1.` or `1.e1` + if len(str) == 0 { + return "empty number" + } + if str[0] == '-' { + return "-- is not valid" + } + dotPos := strings.IndexByte(str, '.') + if dotPos != -1 { + if dotPos == len(str)-1 { + return "dot can not be last character" + } + switch str[dotPos+1] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + default: + return "missing digit after dot" + } + } + return "" +} + +// ReadNumber read json.Number +func (iter *Iterator) ReadNumber() (ret json.Number) { + return json.Number(iter.readNumberAsString()) +} diff --git a/vendor/github.com/json-iterator/go/iter_int.go b/vendor/github.com/json-iterator/go/iter_int.go new file mode 100644 index 000000000..214232035 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_int.go @@ -0,0 +1,345 @@ +package jsoniter + +import ( + "math" + "strconv" +) + +var intDigits []int8 + +const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1 +const uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1 + +func init() { + intDigits = make([]int8, 256) + for i := 0; i < len(intDigits); i++ { + intDigits[i] = invalidCharForNumber + } + for i := int8('0'); i <= int8('9'); i++ { + intDigits[i] = i - int8('0') + } +} + +// ReadUint read uint +func (iter *Iterator) ReadUint() uint { + if strconv.IntSize == 32 { + return uint(iter.ReadUint32()) + } + return uint(iter.ReadUint64()) +} + +// ReadInt read int +func (iter *Iterator) ReadInt() int { + if strconv.IntSize == 32 { + return int(iter.ReadInt32()) + } + return int(iter.ReadInt64()) +} + +// ReadInt8 read int8 +func (iter *Iterator) ReadInt8() (ret int8) { + c := iter.nextToken() + if c == '-' { + val := iter.readUint32(iter.readByte()) + if val > math.MaxInt8+1 { + iter.ReportError("ReadInt8", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return -int8(val) + } + val := iter.readUint32(c) + if val > math.MaxInt8 { + iter.ReportError("ReadInt8", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return int8(val) +} + +// ReadUint8 read uint8 +func (iter *Iterator) ReadUint8() (ret uint8) { + val := iter.readUint32(iter.nextToken()) + if val > math.MaxUint8 { + iter.ReportError("ReadUint8", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return uint8(val) +} + +// ReadInt16 read int16 +func (iter *Iterator) ReadInt16() (ret int16) { + c := iter.nextToken() + if c == '-' { + val := iter.readUint32(iter.readByte()) + if val > math.MaxInt16+1 { + iter.ReportError("ReadInt16", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return -int16(val) + } + val := iter.readUint32(c) + if val > math.MaxInt16 { + iter.ReportError("ReadInt16", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return int16(val) +} + +// ReadUint16 read uint16 +func (iter *Iterator) ReadUint16() (ret uint16) { + val := iter.readUint32(iter.nextToken()) + if val > math.MaxUint16 { + iter.ReportError("ReadUint16", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return uint16(val) +} + +// ReadInt32 read int32 +func (iter *Iterator) ReadInt32() (ret int32) { + c := iter.nextToken() + if c == '-' { + val := iter.readUint32(iter.readByte()) + if val > math.MaxInt32+1 { + iter.ReportError("ReadInt32", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return -int32(val) + } + val := iter.readUint32(c) + if val > math.MaxInt32 { + iter.ReportError("ReadInt32", "overflow: "+strconv.FormatInt(int64(val), 10)) + return + } + return int32(val) +} + +// ReadUint32 read uint32 +func (iter *Iterator) ReadUint32() (ret uint32) { + return iter.readUint32(iter.nextToken()) +} + +func (iter *Iterator) readUint32(c byte) (ret uint32) { + ind := intDigits[c] + if ind == 0 { + iter.assertInteger() + return 0 // single zero + } + if ind == invalidCharForNumber { + iter.ReportError("readUint32", "unexpected character: "+string([]byte{byte(ind)})) + return + } + value := uint32(ind) + if iter.tail-iter.head > 10 { + i := iter.head + ind2 := intDigits[iter.buf[i]] + if ind2 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value + } + i++ + ind3 := intDigits[iter.buf[i]] + if ind3 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*10 + uint32(ind2) + } + //iter.head = i + 1 + //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) + i++ + ind4 := intDigits[iter.buf[i]] + if ind4 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*100 + uint32(ind2)*10 + uint32(ind3) + } + i++ + ind5 := intDigits[iter.buf[i]] + if ind5 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4) + } + i++ + ind6 := intDigits[iter.buf[i]] + if ind6 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5) + } + i++ + ind7 := intDigits[iter.buf[i]] + if ind7 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6) + } + i++ + ind8 := intDigits[iter.buf[i]] + if ind8 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7) + } + i++ + ind9 := intDigits[iter.buf[i]] + value = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8) + iter.head = i + if ind9 == invalidCharForNumber { + iter.assertInteger() + return value + } + } + for { + for i := iter.head; i < iter.tail; i++ { + ind = intDigits[iter.buf[i]] + if ind == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value + } + if value > uint32SafeToMultiply10 { + value2 := (value << 3) + (value << 1) + uint32(ind) + if value2 < value { + iter.ReportError("readUint32", "overflow") + return + } + value = value2 + continue + } + value = (value << 3) + (value << 1) + uint32(ind) + } + if !iter.loadMore() { + iter.assertInteger() + return value + } + } +} + +// ReadInt64 read int64 +func (iter *Iterator) ReadInt64() (ret int64) { + c := iter.nextToken() + if c == '-' { + val := iter.readUint64(iter.readByte()) + if val > math.MaxInt64+1 { + iter.ReportError("ReadInt64", "overflow: "+strconv.FormatUint(uint64(val), 10)) + return + } + return -int64(val) + } + val := iter.readUint64(c) + if val > math.MaxInt64 { + iter.ReportError("ReadInt64", "overflow: "+strconv.FormatUint(uint64(val), 10)) + return + } + return int64(val) +} + +// ReadUint64 read uint64 +func (iter *Iterator) ReadUint64() uint64 { + return iter.readUint64(iter.nextToken()) +} + +func (iter *Iterator) readUint64(c byte) (ret uint64) { + ind := intDigits[c] + if ind == 0 { + iter.assertInteger() + return 0 // single zero + } + if ind == invalidCharForNumber { + iter.ReportError("readUint64", "unexpected character: "+string([]byte{byte(ind)})) + return + } + value := uint64(ind) + if iter.tail-iter.head > 10 { + i := iter.head + ind2 := intDigits[iter.buf[i]] + if ind2 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value + } + i++ + ind3 := intDigits[iter.buf[i]] + if ind3 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*10 + uint64(ind2) + } + //iter.head = i + 1 + //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) + i++ + ind4 := intDigits[iter.buf[i]] + if ind4 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*100 + uint64(ind2)*10 + uint64(ind3) + } + i++ + ind5 := intDigits[iter.buf[i]] + if ind5 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*1000 + uint64(ind2)*100 + uint64(ind3)*10 + uint64(ind4) + } + i++ + ind6 := intDigits[iter.buf[i]] + if ind6 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*10000 + uint64(ind2)*1000 + uint64(ind3)*100 + uint64(ind4)*10 + uint64(ind5) + } + i++ + ind7 := intDigits[iter.buf[i]] + if ind7 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*100000 + uint64(ind2)*10000 + uint64(ind3)*1000 + uint64(ind4)*100 + uint64(ind5)*10 + uint64(ind6) + } + i++ + ind8 := intDigits[iter.buf[i]] + if ind8 == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value*1000000 + uint64(ind2)*100000 + uint64(ind3)*10000 + uint64(ind4)*1000 + uint64(ind5)*100 + uint64(ind6)*10 + uint64(ind7) + } + i++ + ind9 := intDigits[iter.buf[i]] + value = value*10000000 + uint64(ind2)*1000000 + uint64(ind3)*100000 + uint64(ind4)*10000 + uint64(ind5)*1000 + uint64(ind6)*100 + uint64(ind7)*10 + uint64(ind8) + iter.head = i + if ind9 == invalidCharForNumber { + iter.assertInteger() + return value + } + } + for { + for i := iter.head; i < iter.tail; i++ { + ind = intDigits[iter.buf[i]] + if ind == invalidCharForNumber { + iter.head = i + iter.assertInteger() + return value + } + if value > uint64SafeToMultiple10 { + value2 := (value << 3) + (value << 1) + uint64(ind) + if value2 < value { + iter.ReportError("readUint64", "overflow") + return + } + value = value2 + continue + } + value = (value << 3) + (value << 1) + uint64(ind) + } + if !iter.loadMore() { + iter.assertInteger() + return value + } + } +} + +func (iter *Iterator) assertInteger() { + if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' { + iter.ReportError("assertInteger", "can not decode float as int") + } +} diff --git a/vendor/github.com/json-iterator/go/iter_object.go b/vendor/github.com/json-iterator/go/iter_object.go new file mode 100644 index 000000000..6e7c370ab --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_object.go @@ -0,0 +1,252 @@ +package jsoniter + +import ( + "fmt" + "unicode" +) + +// ReadObject read one field from object. +// If object ended, returns empty string. +// Otherwise, returns the field name. +func (iter *Iterator) ReadObject() (ret string) { + c := iter.nextToken() + switch c { + case 'n': + iter.skipThreeBytes('u', 'l', 'l') + return "" // null + case '{': + c = iter.nextToken() + if c == '"' { + iter.unreadByte() + field := iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + return field + } + if c == '}' { + return "" // end of object + } + iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c})) + return + case ',': + field := iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + return field + case '}': + return "" // end of object + default: + iter.ReportError("ReadObject", fmt.Sprintf(`expect { or , or } or n, but found %s`, string([]byte{c}))) + return + } +} + +// CaseInsensitive +func (iter *Iterator) readFieldHash() int64 { + hash := int64(0x811c9dc5) + c := iter.nextToken() + if c != '"' { + iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) + return 0 + } + for { + for i := iter.head; i < iter.tail; i++ { + // require ascii string and no escape + b := iter.buf[i] + if b == '\\' { + iter.head = i + for _, b := range iter.readStringSlowPath() { + if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { + b += 'a' - 'A' + } + hash ^= int64(b) + hash *= 0x1000193 + } + c = iter.nextToken() + if c != ':' { + iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) + return 0 + } + return hash + } + if b == '"' { + iter.head = i + 1 + c = iter.nextToken() + if c != ':' { + iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) + return 0 + } + return hash + } + if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { + b += 'a' - 'A' + } + hash ^= int64(b) + hash *= 0x1000193 + } + if !iter.loadMore() { + iter.ReportError("readFieldHash", `incomplete field name`) + return 0 + } + } +} + +func calcHash(str string, caseSensitive bool) int64 { + hash := int64(0x811c9dc5) + for _, b := range str { + if caseSensitive { + hash ^= int64(b) + } else { + hash ^= int64(unicode.ToLower(b)) + } + hash *= 0x1000193 + } + return int64(hash) +} + +// ReadObjectCB read object with callback, the key is ascii only and field name not copied +func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { + c := iter.nextToken() + var field string + if c == '{' { + c = iter.nextToken() + if c == '"' { + iter.unreadByte() + field = iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + if !callback(iter, field) { + return false + } + c = iter.nextToken() + for c == ',' { + field = iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + if !callback(iter, field) { + return false + } + c = iter.nextToken() + } + if c != '}' { + iter.ReportError("ReadObjectCB", `object not ended with }`) + return false + } + return true + } + if c == '}' { + return true + } + iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c})) + return false + } + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return true // null + } + iter.ReportError("ReadObjectCB", `expect { or n, but found `+string([]byte{c})) + return false +} + +// ReadMapCB read map with callback, the key can be any string +func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool { + c := iter.nextToken() + if c == '{' { + c = iter.nextToken() + if c == '"' { + iter.unreadByte() + field := iter.ReadString() + if iter.nextToken() != ':' { + iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + return false + } + if !callback(iter, field) { + return false + } + c = iter.nextToken() + for c == ',' { + field = iter.ReadString() + if iter.nextToken() != ':' { + iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + return false + } + if !callback(iter, field) { + return false + } + c = iter.nextToken() + } + if c != '}' { + iter.ReportError("ReadMapCB", `object not ended with }`) + return false + } + return true + } + if c == '}' { + return true + } + iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) + return false + } + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return true // null + } + iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) + return false +} + +func (iter *Iterator) readObjectStart() bool { + c := iter.nextToken() + if c == '{' { + c = iter.nextToken() + if c == '}' { + return false + } + iter.unreadByte() + return true + } else if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return false + } + iter.ReportError("readObjectStart", "expect { or n, but found "+string([]byte{c})) + return false +} + +func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) { + str := iter.ReadStringAsSlice() + if iter.skipWhitespacesWithoutLoadMore() { + if ret == nil { + ret = make([]byte, len(str)) + copy(ret, str) + } + if !iter.loadMore() { + return + } + } + if iter.buf[iter.head] != ':' { + iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found "+string([]byte{iter.buf[iter.head]})) + return + } + iter.head++ + if iter.skipWhitespacesWithoutLoadMore() { + if ret == nil { + ret = make([]byte, len(str)) + copy(ret, str) + } + if !iter.loadMore() { + return + } + } + if ret == nil { + return str + } + return ret +} diff --git a/vendor/github.com/json-iterator/go/iter_skip.go b/vendor/github.com/json-iterator/go/iter_skip.go new file mode 100644 index 000000000..f58beb913 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_skip.go @@ -0,0 +1,129 @@ +package jsoniter + +import "fmt" + +// ReadNil reads a json object as nil and +// returns whether it's a nil or not +func (iter *Iterator) ReadNil() (ret bool) { + c := iter.nextToken() + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') // null + return true + } + iter.unreadByte() + return false +} + +// ReadBool reads a json object as BoolValue +func (iter *Iterator) ReadBool() (ret bool) { + c := iter.nextToken() + if c == 't' { + iter.skipThreeBytes('r', 'u', 'e') + return true + } + if c == 'f' { + iter.skipFourBytes('a', 'l', 's', 'e') + return false + } + iter.ReportError("ReadBool", "expect t or f, but found "+string([]byte{c})) + return +} + +// SkipAndReturnBytes skip next JSON element, and return its content as []byte. +// The []byte can be kept, it is a copy of data. +func (iter *Iterator) SkipAndReturnBytes() []byte { + iter.startCapture(iter.head) + iter.Skip() + return iter.stopCapture() +} + +type captureBuffer struct { + startedAt int + captured []byte +} + +func (iter *Iterator) startCapture(captureStartedAt int) { + if iter.captured != nil { + panic("already in capture mode") + } + iter.captureStartedAt = captureStartedAt + iter.captured = make([]byte, 0, 32) +} + +func (iter *Iterator) stopCapture() []byte { + if iter.captured == nil { + panic("not in capture mode") + } + captured := iter.captured + remaining := iter.buf[iter.captureStartedAt:iter.head] + iter.captureStartedAt = -1 + iter.captured = nil + if len(captured) == 0 { + copied := make([]byte, len(remaining)) + copy(copied, remaining) + return copied + } + captured = append(captured, remaining...) + return captured +} + +// Skip skips a json object and positions to relatively the next json object +func (iter *Iterator) Skip() { + c := iter.nextToken() + switch c { + case '"': + iter.skipString() + case 'n': + iter.skipThreeBytes('u', 'l', 'l') // null + case 't': + iter.skipThreeBytes('r', 'u', 'e') // true + case 'f': + iter.skipFourBytes('a', 'l', 's', 'e') // false + case '0': + iter.unreadByte() + iter.ReadFloat32() + case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9': + iter.skipNumber() + case '[': + iter.skipArray() + case '{': + iter.skipObject() + default: + iter.ReportError("Skip", fmt.Sprintf("do not know how to skip: %v", c)) + return + } +} + +func (iter *Iterator) skipFourBytes(b1, b2, b3, b4 byte) { + if iter.readByte() != b1 { + iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) + return + } + if iter.readByte() != b2 { + iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) + return + } + if iter.readByte() != b3 { + iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) + return + } + if iter.readByte() != b4 { + iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) + return + } +} + +func (iter *Iterator) skipThreeBytes(b1, b2, b3 byte) { + if iter.readByte() != b1 { + iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) + return + } + if iter.readByte() != b2 { + iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) + return + } + if iter.readByte() != b3 { + iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) + return + } +} diff --git a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go b/vendor/github.com/json-iterator/go/iter_skip_sloppy.go new file mode 100644 index 000000000..8fcdc3b69 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_skip_sloppy.go @@ -0,0 +1,144 @@ +//+build jsoniter_sloppy + +package jsoniter + +// sloppy but faster implementation, do not validate the input json + +func (iter *Iterator) skipNumber() { + for { + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + switch c { + case ' ', '\n', '\r', '\t', ',', '}', ']': + iter.head = i + return + } + } + if !iter.loadMore() { + return + } + } +} + +func (iter *Iterator) skipArray() { + level := 1 + for { + for i := iter.head; i < iter.tail; i++ { + switch iter.buf[i] { + case '"': // If inside string, skip it + iter.head = i + 1 + iter.skipString() + i = iter.head - 1 // it will be i++ soon + case '[': // If open symbol, increase level + level++ + case ']': // If close symbol, increase level + level-- + + // If we have returned to the original level, we're done + if level == 0 { + iter.head = i + 1 + return + } + } + } + if !iter.loadMore() { + iter.ReportError("skipObject", "incomplete array") + return + } + } +} + +func (iter *Iterator) skipObject() { + level := 1 + for { + for i := iter.head; i < iter.tail; i++ { + switch iter.buf[i] { + case '"': // If inside string, skip it + iter.head = i + 1 + iter.skipString() + i = iter.head - 1 // it will be i++ soon + case '{': // If open symbol, increase level + level++ + case '}': // If close symbol, increase level + level-- + + // If we have returned to the original level, we're done + if level == 0 { + iter.head = i + 1 + return + } + } + } + if !iter.loadMore() { + iter.ReportError("skipObject", "incomplete object") + return + } + } +} + +func (iter *Iterator) skipString() { + for { + end, escaped := iter.findStringEnd() + if end == -1 { + if !iter.loadMore() { + iter.ReportError("skipString", "incomplete string") + return + } + if escaped { + iter.head = 1 // skip the first char as last char read is \ + } + } else { + iter.head = end + return + } + } +} + +// adapted from: https://github.com/buger/jsonparser/blob/master/parser.go +// Tries to find the end of string +// Support if string contains escaped quote symbols. +func (iter *Iterator) findStringEnd() (int, bool) { + escaped := false + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + if c == '"' { + if !escaped { + return i + 1, false + } + j := i - 1 + for { + if j < iter.head || iter.buf[j] != '\\' { + // even number of backslashes + // either end of buffer, or " found + return i + 1, true + } + j-- + if j < iter.head || iter.buf[j] != '\\' { + // odd number of backslashes + // it is \" or \\\" + break + } + j-- + } + } else if c == '\\' { + escaped = true + } + } + j := iter.tail - 1 + for { + if j < iter.head || iter.buf[j] != '\\' { + // even number of backslashes + // either end of buffer, or " found + return -1, false // do not end with \ + } + j-- + if j < iter.head || iter.buf[j] != '\\' { + // odd number of backslashes + // it is \" or \\\" + break + } + j-- + + } + return -1, true // end with \ +} diff --git a/vendor/github.com/json-iterator/go/iter_skip_strict.go b/vendor/github.com/json-iterator/go/iter_skip_strict.go new file mode 100644 index 000000000..f67bc2e83 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_skip_strict.go @@ -0,0 +1,89 @@ +//+build !jsoniter_sloppy + +package jsoniter + +import "fmt" + +func (iter *Iterator) skipNumber() { + if !iter.trySkipNumber() { + iter.unreadByte() + iter.ReadFloat32() + } +} + +func (iter *Iterator) trySkipNumber() bool { + dotFound := false + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + case '.': + if dotFound { + iter.ReportError("validateNumber", `more than one dot found in number`) + return true // already failed + } + if i+1 == iter.tail { + return false + } + c = iter.buf[i+1] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + default: + iter.ReportError("validateNumber", `missing digit after dot`) + return true // already failed + } + dotFound = true + default: + switch c { + case ',', ']', '}', ' ', '\t', '\n', '\r': + if iter.head == i { + return false // if - without following digits + } + iter.head = i + return true // must be valid + } + return false // may be invalid + } + } + return false +} + +func (iter *Iterator) skipString() { + if !iter.trySkipString() { + iter.unreadByte() + iter.ReadString() + } +} + +func (iter *Iterator) trySkipString() bool { + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + if c == '"' { + iter.head = i + 1 + return true // valid + } else if c == '\\' { + return false + } else if c < ' ' { + iter.ReportError("trySkipString", + fmt.Sprintf(`invalid control character found: %d`, c)) + return true // already failed + } + } + return false +} + +func (iter *Iterator) skipObject() { + iter.unreadByte() + iter.ReadObjectCB(func(iter *Iterator, field string) bool { + iter.Skip() + return true + }) +} + +func (iter *Iterator) skipArray() { + iter.unreadByte() + iter.ReadArrayCB(func(iter *Iterator) bool { + iter.Skip() + return true + }) +} diff --git a/vendor/github.com/json-iterator/go/iter_str.go b/vendor/github.com/json-iterator/go/iter_str.go new file mode 100644 index 000000000..adc487ea8 --- /dev/null +++ b/vendor/github.com/json-iterator/go/iter_str.go @@ -0,0 +1,215 @@ +package jsoniter + +import ( + "fmt" + "unicode/utf16" +) + +// ReadString read string from iterator +func (iter *Iterator) ReadString() (ret string) { + c := iter.nextToken() + if c == '"' { + for i := iter.head; i < iter.tail; i++ { + c := iter.buf[i] + if c == '"' { + ret = string(iter.buf[iter.head:i]) + iter.head = i + 1 + return ret + } else if c == '\\' { + break + } else if c < ' ' { + iter.ReportError("ReadString", + fmt.Sprintf(`invalid control character found: %d`, c)) + return + } + } + return iter.readStringSlowPath() + } else if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return "" + } + iter.ReportError("ReadString", `expects " or n, but found `+string([]byte{c})) + return +} + +func (iter *Iterator) readStringSlowPath() (ret string) { + var str []byte + var c byte + for iter.Error == nil { + c = iter.readByte() + if c == '"' { + return string(str) + } + if c == '\\' { + c = iter.readByte() + str = iter.readEscapedChar(c, str) + } else { + str = append(str, c) + } + } + iter.ReportError("readStringSlowPath", "unexpected end of input") + return +} + +func (iter *Iterator) readEscapedChar(c byte, str []byte) []byte { + switch c { + case 'u': + r := iter.readU4() + if utf16.IsSurrogate(r) { + c = iter.readByte() + if iter.Error != nil { + return nil + } + if c != '\\' { + iter.unreadByte() + str = appendRune(str, r) + return str + } + c = iter.readByte() + if iter.Error != nil { + return nil + } + if c != 'u' { + str = appendRune(str, r) + return iter.readEscapedChar(c, str) + } + r2 := iter.readU4() + if iter.Error != nil { + return nil + } + combined := utf16.DecodeRune(r, r2) + if combined == '\uFFFD' { + str = appendRune(str, r) + str = appendRune(str, r2) + } else { + str = appendRune(str, combined) + } + } else { + str = appendRune(str, r) + } + case '"': + str = append(str, '"') + case '\\': + str = append(str, '\\') + case '/': + str = append(str, '/') + case 'b': + str = append(str, '\b') + case 'f': + str = append(str, '\f') + case 'n': + str = append(str, '\n') + case 'r': + str = append(str, '\r') + case 't': + str = append(str, '\t') + default: + iter.ReportError("readEscapedChar", + `invalid escape char after \`) + return nil + } + return str +} + +// ReadStringAsSlice read string from iterator without copying into string form. +// The []byte can not be kept, as it will change after next iterator call. +func (iter *Iterator) ReadStringAsSlice() (ret []byte) { + c := iter.nextToken() + if c == '"' { + for i := iter.head; i < iter.tail; i++ { + // require ascii string and no escape + // for: field name, base64, number + if iter.buf[i] == '"' { + // fast path: reuse the underlying buffer + ret = iter.buf[iter.head:i] + iter.head = i + 1 + return ret + } + } + readLen := iter.tail - iter.head + copied := make([]byte, readLen, readLen*2) + copy(copied, iter.buf[iter.head:iter.tail]) + iter.head = iter.tail + for iter.Error == nil { + c := iter.readByte() + if c == '"' { + return copied + } + copied = append(copied, c) + } + return copied + } + iter.ReportError("ReadStringAsSlice", `expects " or n, but found `+string([]byte{c})) + return +} + +func (iter *Iterator) readU4() (ret rune) { + for i := 0; i < 4; i++ { + c := iter.readByte() + if iter.Error != nil { + return + } + if c >= '0' && c <= '9' { + ret = ret*16 + rune(c-'0') + } else if c >= 'a' && c <= 'f' { + ret = ret*16 + rune(c-'a'+10) + } else if c >= 'A' && c <= 'F' { + ret = ret*16 + rune(c-'A'+10) + } else { + iter.ReportError("readU4", "expects 0~9 or a~f, but found "+string([]byte{c})) + return + } + } + return ret +} + +const ( + t1 = 0x00 // 0000 0000 + tx = 0x80 // 1000 0000 + t2 = 0xC0 // 1100 0000 + t3 = 0xE0 // 1110 0000 + t4 = 0xF0 // 1111 0000 + t5 = 0xF8 // 1111 1000 + + maskx = 0x3F // 0011 1111 + mask2 = 0x1F // 0001 1111 + mask3 = 0x0F // 0000 1111 + mask4 = 0x07 // 0000 0111 + + rune1Max = 1<<7 - 1 + rune2Max = 1<<11 - 1 + rune3Max = 1<<16 - 1 + + surrogateMin = 0xD800 + surrogateMax = 0xDFFF + + maxRune = '\U0010FFFF' // Maximum valid Unicode code point. + runeError = '\uFFFD' // the "error" Rune or "Unicode replacement character" +) + +func appendRune(p []byte, r rune) []byte { + // Negative values are erroneous. Making it unsigned addresses the problem. + switch i := uint32(r); { + case i <= rune1Max: + p = append(p, byte(r)) + return p + case i <= rune2Max: + p = append(p, t2|byte(r>>6)) + p = append(p, tx|byte(r)&maskx) + return p + case i > maxRune, surrogateMin <= i && i <= surrogateMax: + r = runeError + fallthrough + case i <= rune3Max: + p = append(p, t3|byte(r>>12)) + p = append(p, tx|byte(r>>6)&maskx) + p = append(p, tx|byte(r)&maskx) + return p + default: + p = append(p, t4|byte(r>>18)) + p = append(p, tx|byte(r>>12)&maskx) + p = append(p, tx|byte(r>>6)&maskx) + p = append(p, tx|byte(r)&maskx) + return p + } +} diff --git a/vendor/github.com/json-iterator/go/jsoniter.go b/vendor/github.com/json-iterator/go/jsoniter.go new file mode 100644 index 000000000..c2934f916 --- /dev/null +++ b/vendor/github.com/json-iterator/go/jsoniter.go @@ -0,0 +1,18 @@ +// Package jsoniter implements encoding and decoding of JSON as defined in +// RFC 4627 and provides interfaces with identical syntax of standard lib encoding/json. +// Converting from encoding/json to jsoniter is no more than replacing the package with jsoniter +// and variable type declarations (if any). +// jsoniter interfaces gives 100% compatibility with code using standard lib. +// +// "JSON and Go" +// (https://golang.org/doc/articles/json_and_go.html) +// gives a description of how Marshal/Unmarshal operate +// between arbitrary or predefined json objects and bytes, +// and it applies to jsoniter.Marshal/Unmarshal as well. +// +// Besides, jsoniter.Iterator provides a different set of interfaces +// iterating given bytes/string/reader +// and yielding parsed elements one by one. +// This set of interfaces reads input as required and gives +// better performance. +package jsoniter diff --git a/vendor/github.com/json-iterator/go/pool.go b/vendor/github.com/json-iterator/go/pool.go new file mode 100644 index 000000000..e2389b56c --- /dev/null +++ b/vendor/github.com/json-iterator/go/pool.go @@ -0,0 +1,42 @@ +package jsoniter + +import ( + "io" +) + +// IteratorPool a thread safe pool of iterators with same configuration +type IteratorPool interface { + BorrowIterator(data []byte) *Iterator + ReturnIterator(iter *Iterator) +} + +// StreamPool a thread safe pool of streams with same configuration +type StreamPool interface { + BorrowStream(writer io.Writer) *Stream + ReturnStream(stream *Stream) +} + +func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream { + stream := cfg.streamPool.Get().(*Stream) + stream.Reset(writer) + return stream +} + +func (cfg *frozenConfig) ReturnStream(stream *Stream) { + stream.out = nil + stream.Error = nil + stream.Attachment = nil + cfg.streamPool.Put(stream) +} + +func (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator { + iter := cfg.iteratorPool.Get().(*Iterator) + iter.ResetBytes(data) + return iter +} + +func (cfg *frozenConfig) ReturnIterator(iter *Iterator) { + iter.Error = nil + iter.Attachment = nil + cfg.iteratorPool.Put(iter) +} diff --git a/vendor/github.com/json-iterator/go/reflect.go b/vendor/github.com/json-iterator/go/reflect.go new file mode 100644 index 000000000..be7a0e218 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect.go @@ -0,0 +1,330 @@ +package jsoniter + +import ( + "fmt" + "reflect" + "unsafe" + + "github.com/modern-go/reflect2" +) + +// ValDecoder is an internal type registered to cache as needed. +// Don't confuse jsoniter.ValDecoder with json.Decoder. +// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). +// +// Reflection on type to create decoders, which is then cached +// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions +// 1. create instance of new value, for example *int will need a int to be allocated +// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New +// 3. assignment to map, both key and value will be reflect.Value +// For a simple struct binding, it will be reflect.Value free and allocation free +type ValDecoder interface { + Decode(ptr unsafe.Pointer, iter *Iterator) +} + +// ValEncoder is an internal type registered to cache as needed. +// Don't confuse jsoniter.ValEncoder with json.Encoder. +// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). +type ValEncoder interface { + IsEmpty(ptr unsafe.Pointer) bool + Encode(ptr unsafe.Pointer, stream *Stream) +} + +type checkIsEmpty interface { + IsEmpty(ptr unsafe.Pointer) bool +} + +type ctx struct { + *frozenConfig + prefix string + encoders map[reflect2.Type]ValEncoder + decoders map[reflect2.Type]ValDecoder +} + +func (b *ctx) caseSensitive() bool { + if b.frozenConfig == nil { + // default is case-insensitive + return false + } + return b.frozenConfig.caseSensitive +} + +func (b *ctx) append(prefix string) *ctx { + return &ctx{ + frozenConfig: b.frozenConfig, + prefix: b.prefix + " " + prefix, + encoders: b.encoders, + decoders: b.decoders, + } +} + +// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal +func (iter *Iterator) ReadVal(obj interface{}) { + cacheKey := reflect2.RTypeOf(obj) + decoder := iter.cfg.getDecoderFromCache(cacheKey) + if decoder == nil { + typ := reflect2.TypeOf(obj) + if typ.Kind() != reflect.Ptr { + iter.ReportError("ReadVal", "can only unmarshal into pointer") + return + } + decoder = iter.cfg.DecoderOf(typ) + } + ptr := reflect2.PtrOf(obj) + if ptr == nil { + iter.ReportError("ReadVal", "can not read into nil pointer") + return + } + decoder.Decode(ptr, iter) +} + +// WriteVal copy the go interface into underlying JSON, same as json.Marshal +func (stream *Stream) WriteVal(val interface{}) { + if nil == val { + stream.WriteNil() + return + } + cacheKey := reflect2.RTypeOf(val) + encoder := stream.cfg.getEncoderFromCache(cacheKey) + if encoder == nil { + typ := reflect2.TypeOf(val) + encoder = stream.cfg.EncoderOf(typ) + } + encoder.Encode(reflect2.PtrOf(val), stream) +} + +func (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder { + cacheKey := typ.RType() + decoder := cfg.getDecoderFromCache(cacheKey) + if decoder != nil { + return decoder + } + ctx := &ctx{ + frozenConfig: cfg, + prefix: "", + decoders: map[reflect2.Type]ValDecoder{}, + encoders: map[reflect2.Type]ValEncoder{}, + } + ptrType := typ.(*reflect2.UnsafePtrType) + decoder = decoderOfType(ctx, ptrType.Elem()) + cfg.addDecoderToCache(cacheKey, decoder) + return decoder +} + +func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := getTypeDecoderFromExtension(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfType(ctx, typ) + for _, extension := range extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + for _, extension := range ctx.extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + return decoder +} + +func createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := ctx.decoders[typ] + if decoder != nil { + return decoder + } + placeholder := &placeholderDecoder{} + ctx.decoders[typ] = placeholder + decoder = _createDecoderOfType(ctx, typ) + placeholder.decoder = decoder + return decoder +} + +func _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := createDecoderOfJsonRawMessage(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfJsonNumber(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfMarshaler(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfAny(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfNative(ctx, typ) + if decoder != nil { + return decoder + } + switch typ.Kind() { + case reflect.Interface: + ifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType) + if isIFace { + return &ifaceDecoder{valType: ifaceType} + } + return &efaceDecoder{} + case reflect.Struct: + return decoderOfStruct(ctx, typ) + case reflect.Array: + return decoderOfArray(ctx, typ) + case reflect.Slice: + return decoderOfSlice(ctx, typ) + case reflect.Map: + return decoderOfMap(ctx, typ) + case reflect.Ptr: + return decoderOfOptional(ctx, typ) + default: + return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} + } +} + +func (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder { + cacheKey := typ.RType() + encoder := cfg.getEncoderFromCache(cacheKey) + if encoder != nil { + return encoder + } + ctx := &ctx{ + frozenConfig: cfg, + prefix: "", + decoders: map[reflect2.Type]ValDecoder{}, + encoders: map[reflect2.Type]ValEncoder{}, + } + encoder = encoderOfType(ctx, typ) + if typ.LikePtr() { + encoder = &onePtrEncoder{encoder} + } + cfg.addEncoderToCache(cacheKey, encoder) + return encoder +} + +type onePtrEncoder struct { + encoder ValEncoder +} + +func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) +} + +func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) +} + +func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := getTypeEncoderFromExtension(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfType(ctx, typ) + for _, extension := range extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + for _, extension := range ctx.extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + return encoder +} + +func createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := ctx.encoders[typ] + if encoder != nil { + return encoder + } + placeholder := &placeholderEncoder{} + ctx.encoders[typ] = placeholder + encoder = _createEncoderOfType(ctx, typ) + placeholder.encoder = encoder + return encoder +} +func _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := createEncoderOfJsonRawMessage(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfJsonNumber(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfMarshaler(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfAny(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfNative(ctx, typ) + if encoder != nil { + return encoder + } + kind := typ.Kind() + switch kind { + case reflect.Interface: + return &dynamicEncoder{typ} + case reflect.Struct: + return encoderOfStruct(ctx, typ) + case reflect.Array: + return encoderOfArray(ctx, typ) + case reflect.Slice: + return encoderOfSlice(ctx, typ) + case reflect.Map: + return encoderOfMap(ctx, typ) + case reflect.Ptr: + return encoderOfOptional(ctx, typ) + default: + return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} + } +} + +type lazyErrorDecoder struct { + err error +} + +func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.WhatIsNext() != NilValue { + if iter.Error == nil { + iter.Error = decoder.err + } + } else { + iter.Skip() + } +} + +type lazyErrorEncoder struct { + err error +} + +func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if ptr == nil { + stream.WriteNil() + } else if stream.Error == nil { + stream.Error = encoder.err + } +} + +func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type placeholderDecoder struct { + decoder ValDecoder +} + +func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.decoder.Decode(ptr, iter) +} + +type placeholderEncoder struct { + encoder ValEncoder +} + +func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.encoder.Encode(ptr, stream) +} + +func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.encoder.IsEmpty(ptr) +} diff --git a/vendor/github.com/json-iterator/go/reflect_array.go b/vendor/github.com/json-iterator/go/reflect_array.go new file mode 100644 index 000000000..13a0b7b08 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_array.go @@ -0,0 +1,104 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "unsafe" +) + +func decoderOfArray(ctx *ctx, typ reflect2.Type) ValDecoder { + arrayType := typ.(*reflect2.UnsafeArrayType) + decoder := decoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) + return &arrayDecoder{arrayType, decoder} +} + +func encoderOfArray(ctx *ctx, typ reflect2.Type) ValEncoder { + arrayType := typ.(*reflect2.UnsafeArrayType) + if arrayType.Len() == 0 { + return emptyArrayEncoder{} + } + encoder := encoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) + return &arrayEncoder{arrayType, encoder} +} + +type emptyArrayEncoder struct{} + +func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteEmptyArray() +} + +func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return true +} + +type arrayEncoder struct { + arrayType *reflect2.UnsafeArrayType + elemEncoder ValEncoder +} + +func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteArrayStart() + elemPtr := unsafe.Pointer(ptr) + encoder.elemEncoder.Encode(elemPtr, stream) + for i := 1; i < encoder.arrayType.Len(); i++ { + stream.WriteMore() + elemPtr = encoder.arrayType.UnsafeGetIndex(ptr, i) + encoder.elemEncoder.Encode(elemPtr, stream) + } + stream.WriteArrayEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) + } +} + +func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type arrayDecoder struct { + arrayType *reflect2.UnsafeArrayType + elemDecoder ValDecoder +} + +func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.doDecode(ptr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) + } +} + +func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + arrayType := decoder.arrayType + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return + } + if c != '[' { + iter.ReportError("decode array", "expect [ or n, but found "+string([]byte{c})) + return + } + c = iter.nextToken() + if c == ']' { + return + } + iter.unreadByte() + elemPtr := arrayType.UnsafeGetIndex(ptr, 0) + decoder.elemDecoder.Decode(elemPtr, iter) + length := 1 + for c = iter.nextToken(); c == ','; c = iter.nextToken() { + if length >= arrayType.Len() { + iter.Skip() + continue + } + idx := length + length += 1 + elemPtr = arrayType.UnsafeGetIndex(ptr, idx) + decoder.elemDecoder.Decode(elemPtr, iter) + } + if c != ']' { + iter.ReportError("decode array", "expect ], but found "+string([]byte{c})) + return + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_dynamic.go b/vendor/github.com/json-iterator/go/reflect_dynamic.go new file mode 100644 index 000000000..8b6bc8b43 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_dynamic.go @@ -0,0 +1,70 @@ +package jsoniter + +import ( + "github.com/modern-go/reflect2" + "reflect" + "unsafe" +) + +type dynamicEncoder struct { + valType reflect2.Type +} + +func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + stream.WriteVal(obj) +} + +func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.valType.UnsafeIndirect(ptr) == nil +} + +type efaceDecoder struct { +} + +func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + pObj := (*interface{})(ptr) + obj := *pObj + if obj == nil { + *pObj = iter.Read() + return + } + typ := reflect2.TypeOf(obj) + if typ.Kind() != reflect.Ptr { + *pObj = iter.Read() + return + } + ptrType := typ.(*reflect2.UnsafePtrType) + ptrElemType := ptrType.Elem() + if iter.WhatIsNext() == NilValue { + if ptrElemType.Kind() != reflect.Ptr { + iter.skipFourBytes('n', 'u', 'l', 'l') + *pObj = nil + return + } + } + if reflect2.IsNil(obj) { + obj := ptrElemType.New() + iter.ReadVal(obj) + *pObj = obj + return + } + iter.ReadVal(obj) +} + +type ifaceDecoder struct { + valType *reflect2.UnsafeIFaceType +} + +func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew()) + return + } + obj := decoder.valType.UnsafeIndirect(ptr) + if reflect2.IsNil(obj) { + iter.ReportError("decode non empty interface", "can not unmarshal into nil") + return + } + iter.ReadVal(obj) +} diff --git a/vendor/github.com/json-iterator/go/reflect_extension.go b/vendor/github.com/json-iterator/go/reflect_extension.go new file mode 100644 index 000000000..917bbe84e --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_extension.go @@ -0,0 +1,471 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "reflect" + "sort" + "strings" + "unicode" + "unsafe" +) + +var typeDecoders = map[string]ValDecoder{} +var fieldDecoders = map[string]ValDecoder{} +var typeEncoders = map[string]ValEncoder{} +var fieldEncoders = map[string]ValEncoder{} +var extensions = []Extension{} + +// StructDescriptor describe how should we encode/decode the struct +type StructDescriptor struct { + Type reflect2.Type + Fields []*Binding +} + +// GetField get one field from the descriptor by its name. +// Can not use map here to keep field orders. +func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { + for _, binding := range structDescriptor.Fields { + if binding.Field.Name() == fieldName { + return binding + } + } + return nil +} + +// Binding describe how should we encode/decode the struct field +type Binding struct { + levels []int + Field reflect2.StructField + FromNames []string + ToNames []string + Encoder ValEncoder + Decoder ValDecoder +} + +// Extension the one for all SPI. Customize encoding/decoding by specifying alternate encoder/decoder. +// Can also rename fields by UpdateStructDescriptor. +type Extension interface { + UpdateStructDescriptor(structDescriptor *StructDescriptor) + CreateMapKeyDecoder(typ reflect2.Type) ValDecoder + CreateMapKeyEncoder(typ reflect2.Type) ValEncoder + CreateDecoder(typ reflect2.Type) ValDecoder + CreateEncoder(typ reflect2.Type) ValEncoder + DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder + DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder +} + +// DummyExtension embed this type get dummy implementation for all methods of Extension +type DummyExtension struct { +} + +// UpdateStructDescriptor No-op +func (extension *DummyExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { +} + +// CreateMapKeyDecoder No-op +func (extension *DummyExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateMapKeyEncoder No-op +func (extension *DummyExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// CreateDecoder No-op +func (extension *DummyExtension) CreateDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateEncoder No-op +func (extension *DummyExtension) CreateEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// DecorateDecoder No-op +func (extension *DummyExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { + return decoder +} + +// DecorateEncoder No-op +func (extension *DummyExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { + return encoder +} + +type EncoderExtension map[reflect2.Type]ValEncoder + +// UpdateStructDescriptor No-op +func (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { +} + +// CreateDecoder No-op +func (extension EncoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateEncoder get encoder from map +func (extension EncoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { + return extension[typ] +} + +// CreateMapKeyDecoder No-op +func (extension EncoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateMapKeyEncoder No-op +func (extension EncoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// DecorateDecoder No-op +func (extension EncoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { + return decoder +} + +// DecorateEncoder No-op +func (extension EncoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { + return encoder +} + +type DecoderExtension map[reflect2.Type]ValDecoder + +// UpdateStructDescriptor No-op +func (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { +} + +// CreateMapKeyDecoder No-op +func (extension DecoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateMapKeyEncoder No-op +func (extension DecoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// CreateDecoder get decoder from map +func (extension DecoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { + return extension[typ] +} + +// CreateEncoder No-op +func (extension DecoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// DecorateDecoder No-op +func (extension DecoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { + return decoder +} + +// DecorateEncoder No-op +func (extension DecoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { + return encoder +} + +type funcDecoder struct { + fun DecoderFunc +} + +func (decoder *funcDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.fun(ptr, iter) +} + +type funcEncoder struct { + fun EncoderFunc + isEmptyFunc func(ptr unsafe.Pointer) bool +} + +func (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.fun(ptr, stream) +} + +func (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool { + if encoder.isEmptyFunc == nil { + return false + } + return encoder.isEmptyFunc(ptr) +} + +// DecoderFunc the function form of TypeDecoder +type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator) + +// EncoderFunc the function form of TypeEncoder +type EncoderFunc func(ptr unsafe.Pointer, stream *Stream) + +// RegisterTypeDecoderFunc register TypeDecoder for a type with function +func RegisterTypeDecoderFunc(typ string, fun DecoderFunc) { + typeDecoders[typ] = &funcDecoder{fun} +} + +// RegisterTypeDecoder register TypeDecoder for a typ +func RegisterTypeDecoder(typ string, decoder ValDecoder) { + typeDecoders[typ] = decoder +} + +// RegisterFieldDecoderFunc register TypeDecoder for a struct field with function +func RegisterFieldDecoderFunc(typ string, field string, fun DecoderFunc) { + RegisterFieldDecoder(typ, field, &funcDecoder{fun}) +} + +// RegisterFieldDecoder register TypeDecoder for a struct field +func RegisterFieldDecoder(typ string, field string, decoder ValDecoder) { + fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = decoder +} + +// RegisterTypeEncoderFunc register TypeEncoder for a type with encode/isEmpty function +func RegisterTypeEncoderFunc(typ string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) { + typeEncoders[typ] = &funcEncoder{fun, isEmptyFunc} +} + +// RegisterTypeEncoder register TypeEncoder for a type +func RegisterTypeEncoder(typ string, encoder ValEncoder) { + typeEncoders[typ] = encoder +} + +// RegisterFieldEncoderFunc register TypeEncoder for a struct field with encode/isEmpty function +func RegisterFieldEncoderFunc(typ string, field string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) { + RegisterFieldEncoder(typ, field, &funcEncoder{fun, isEmptyFunc}) +} + +// RegisterFieldEncoder register TypeEncoder for a struct field +func RegisterFieldEncoder(typ string, field string, encoder ValEncoder) { + fieldEncoders[fmt.Sprintf("%s/%s", typ, field)] = encoder +} + +// RegisterExtension register extension +func RegisterExtension(extension Extension) { + extensions = append(extensions, extension) +} + +func getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := _getTypeDecoderFromExtension(ctx, typ) + if decoder != nil { + for _, extension := range extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + for _, extension := range ctx.extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + } + return decoder +} +func _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { + for _, extension := range extensions { + decoder := extension.CreateDecoder(typ) + if decoder != nil { + return decoder + } + } + for _, extension := range ctx.extensions { + decoder := extension.CreateDecoder(typ) + if decoder != nil { + return decoder + } + } + typeName := typ.String() + decoder := typeDecoders[typeName] + if decoder != nil { + return decoder + } + if typ.Kind() == reflect.Ptr { + ptrType := typ.(*reflect2.UnsafePtrType) + decoder := typeDecoders[ptrType.Elem().String()] + if decoder != nil { + return &OptionalDecoder{ptrType.Elem(), decoder} + } + } + return nil +} + +func getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := _getTypeEncoderFromExtension(ctx, typ) + if encoder != nil { + for _, extension := range extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + for _, extension := range ctx.extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + } + return encoder +} + +func _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { + for _, extension := range extensions { + encoder := extension.CreateEncoder(typ) + if encoder != nil { + return encoder + } + } + for _, extension := range ctx.extensions { + encoder := extension.CreateEncoder(typ) + if encoder != nil { + return encoder + } + } + typeName := typ.String() + encoder := typeEncoders[typeName] + if encoder != nil { + return encoder + } + if typ.Kind() == reflect.Ptr { + typePtr := typ.(*reflect2.UnsafePtrType) + encoder := typeEncoders[typePtr.Elem().String()] + if encoder != nil { + return &OptionalEncoder{encoder} + } + } + return nil +} + +func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { + structType := typ.(*reflect2.UnsafeStructType) + embeddedBindings := []*Binding{} + bindings := []*Binding{} + for i := 0; i < structType.NumField(); i++ { + field := structType.Field(i) + tag, hastag := field.Tag().Lookup(ctx.getTagKey()) + if ctx.onlyTaggedField && !hastag { + continue + } + tagParts := strings.Split(tag, ",") + if tag == "-" { + continue + } + if field.Anonymous() && (tag == "" || tagParts[0] == "") { + if field.Type().Kind() == reflect.Struct { + structDescriptor := describeStruct(ctx, field.Type()) + for _, binding := range structDescriptor.Fields { + binding.levels = append([]int{i}, binding.levels...) + omitempty := binding.Encoder.(*structFieldEncoder).omitempty + binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} + binding.Decoder = &structFieldDecoder{field, binding.Decoder} + embeddedBindings = append(embeddedBindings, binding) + } + continue + } else if field.Type().Kind() == reflect.Ptr { + ptrType := field.Type().(*reflect2.UnsafePtrType) + if ptrType.Elem().Kind() == reflect.Struct { + structDescriptor := describeStruct(ctx, ptrType.Elem()) + for _, binding := range structDescriptor.Fields { + binding.levels = append([]int{i}, binding.levels...) + omitempty := binding.Encoder.(*structFieldEncoder).omitempty + binding.Encoder = &dereferenceEncoder{binding.Encoder} + binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} + binding.Decoder = &dereferenceDecoder{ptrType.Elem(), binding.Decoder} + binding.Decoder = &structFieldDecoder{field, binding.Decoder} + embeddedBindings = append(embeddedBindings, binding) + } + continue + } + } + } + fieldNames := calcFieldNames(field.Name(), tagParts[0], tag) + fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name()) + decoder := fieldDecoders[fieldCacheKey] + if decoder == nil { + decoder = decoderOfType(ctx.append(field.Name()), field.Type()) + } + encoder := fieldEncoders[fieldCacheKey] + if encoder == nil { + encoder = encoderOfType(ctx.append(field.Name()), field.Type()) + } + binding := &Binding{ + Field: field, + FromNames: fieldNames, + ToNames: fieldNames, + Decoder: decoder, + Encoder: encoder, + } + binding.levels = []int{i} + bindings = append(bindings, binding) + } + return createStructDescriptor(ctx, typ, bindings, embeddedBindings) +} +func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { + structDescriptor := &StructDescriptor{ + Type: typ, + Fields: bindings, + } + for _, extension := range extensions { + extension.UpdateStructDescriptor(structDescriptor) + } + for _, extension := range ctx.extensions { + extension.UpdateStructDescriptor(structDescriptor) + } + processTags(structDescriptor, ctx.frozenConfig) + // merge normal & embedded bindings & sort with original order + allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) + sort.Sort(allBindings) + structDescriptor.Fields = allBindings + return structDescriptor +} + +type sortableBindings []*Binding + +func (bindings sortableBindings) Len() int { + return len(bindings) +} + +func (bindings sortableBindings) Less(i, j int) bool { + left := bindings[i].levels + right := bindings[j].levels + k := 0 + for { + if left[k] < right[k] { + return true + } else if left[k] > right[k] { + return false + } + k++ + } +} + +func (bindings sortableBindings) Swap(i, j int) { + bindings[i], bindings[j] = bindings[j], bindings[i] +} + +func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { + for _, binding := range structDescriptor.Fields { + shouldOmitEmpty := false + tagParts := strings.Split(binding.Field.Tag().Get(cfg.getTagKey()), ",") + for _, tagPart := range tagParts[1:] { + if tagPart == "omitempty" { + shouldOmitEmpty = true + } else if tagPart == "string" { + if binding.Field.Type().Kind() == reflect.String { + binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg} + binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg} + } else { + binding.Decoder = &stringModeNumberDecoder{binding.Decoder} + binding.Encoder = &stringModeNumberEncoder{binding.Encoder} + } + } + } + binding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder} + binding.Encoder = &structFieldEncoder{binding.Field, binding.Encoder, shouldOmitEmpty} + } +} + +func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { + // ignore? + if wholeTag == "-" { + return []string{} + } + // rename? + var fieldNames []string + if tagProvidedFieldName == "" { + fieldNames = []string{originalFieldName} + } else { + fieldNames = []string{tagProvidedFieldName} + } + // private? + isNotExported := unicode.IsLower(rune(originalFieldName[0])) + if isNotExported { + fieldNames = []string{} + } + return fieldNames +} diff --git a/vendor/github.com/json-iterator/go/reflect_json_number.go b/vendor/github.com/json-iterator/go/reflect_json_number.go new file mode 100644 index 000000000..98d45c1ec --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_json_number.go @@ -0,0 +1,112 @@ +package jsoniter + +import ( + "encoding/json" + "github.com/modern-go/reflect2" + "strconv" + "unsafe" +) + +type Number string + +// String returns the literal text of the number. +func (n Number) String() string { return string(n) } + +// Float64 returns the number as a float64. +func (n Number) Float64() (float64, error) { + return strconv.ParseFloat(string(n), 64) +} + +// Int64 returns the number as an int64. +func (n Number) Int64() (int64, error) { + return strconv.ParseInt(string(n), 10, 64) +} + +func CastJsonNumber(val interface{}) (string, bool) { + switch typedVal := val.(type) { + case json.Number: + return string(typedVal), true + case Number: + return string(typedVal), true + } + return "", false +} + +var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem() +var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem() + +func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ.AssignableTo(jsonNumberType) { + return &jsonNumberCodec{} + } + if typ.AssignableTo(jsoniterNumberType) { + return &jsoniterNumberCodec{} + } + return nil +} + +func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ.AssignableTo(jsonNumberType) { + return &jsonNumberCodec{} + } + if typ.AssignableTo(jsoniterNumberType) { + return &jsoniterNumberCodec{} + } + return nil +} + +type jsonNumberCodec struct { +} + +func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + switch iter.WhatIsNext() { + case StringValue: + *((*json.Number)(ptr)) = json.Number(iter.ReadString()) + case NilValue: + iter.skipFourBytes('n', 'u', 'l', 'l') + *((*json.Number)(ptr)) = "" + default: + *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) + } +} + +func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + number := *((*json.Number)(ptr)) + if len(number) == 0 { + stream.writeByte('0') + } else { + stream.WriteRaw(string(number)) + } +} + +func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*json.Number)(ptr))) == 0 +} + +type jsoniterNumberCodec struct { +} + +func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + switch iter.WhatIsNext() { + case StringValue: + *((*Number)(ptr)) = Number(iter.ReadString()) + case NilValue: + iter.skipFourBytes('n', 'u', 'l', 'l') + *((*Number)(ptr)) = "" + default: + *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) + } +} + +func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + number := *((*Number)(ptr)) + if len(number) == 0 { + stream.writeByte('0') + } else { + stream.WriteRaw(string(number)) + } +} + +func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*Number)(ptr))) == 0 +} diff --git a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go new file mode 100644 index 000000000..f2619936c --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go @@ -0,0 +1,60 @@ +package jsoniter + +import ( + "encoding/json" + "github.com/modern-go/reflect2" + "unsafe" +) + +var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem() +var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem() + +func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ == jsonRawMessageType { + return &jsonRawMessageCodec{} + } + if typ == jsoniterRawMessageType { + return &jsoniterRawMessageCodec{} + } + return nil +} + +func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ == jsonRawMessageType { + return &jsonRawMessageCodec{} + } + if typ == jsoniterRawMessageType { + return &jsoniterRawMessageCodec{} + } + return nil +} + +type jsonRawMessageCodec struct { +} + +func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) +} + +func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) +} + +func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*json.RawMessage)(ptr))) == 0 +} + +type jsoniterRawMessageCodec struct { +} + +func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) +} + +func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*RawMessage)(ptr)))) +} + +func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*RawMessage)(ptr))) == 0 +} diff --git a/vendor/github.com/json-iterator/go/reflect_map.go b/vendor/github.com/json-iterator/go/reflect_map.go new file mode 100644 index 000000000..8812f0850 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_map.go @@ -0,0 +1,318 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "reflect" + "sort" + "unsafe" +) + +func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder { + mapType := typ.(*reflect2.UnsafeMapType) + keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()) + elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem()) + return &mapDecoder{ + mapType: mapType, + keyType: mapType.Key(), + elemType: mapType.Elem(), + keyDecoder: keyDecoder, + elemDecoder: elemDecoder, + } +} + +func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder { + mapType := typ.(*reflect2.UnsafeMapType) + if ctx.sortMapKeys { + return &sortKeysMapEncoder{ + mapType: mapType, + keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), + elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), + } + } + return &mapEncoder{ + mapType: mapType, + keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), + elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), + } +} + +func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder { + for _, extension := range ctx.extensions { + decoder := extension.CreateMapKeyDecoder(typ) + if decoder != nil { + return decoder + } + } + switch typ.Kind() { + case reflect.String: + return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) + case reflect.Bool, + reflect.Uint8, reflect.Int8, + reflect.Uint16, reflect.Int16, + reflect.Uint32, reflect.Int32, + reflect.Uint64, reflect.Int64, + reflect.Uint, reflect.Int, + reflect.Float32, reflect.Float64, + reflect.Uintptr: + typ = reflect2.DefaultTypeOfKind(typ.Kind()) + return &numericMapKeyDecoder{decoderOfType(ctx, typ)} + default: + ptrType := reflect2.PtrTo(typ) + if ptrType.Implements(textMarshalerType) { + return &referenceDecoder{ + &textUnmarshalerDecoder{ + valType: ptrType, + }, + } + } + if typ.Implements(textMarshalerType) { + return &textUnmarshalerDecoder{ + valType: typ, + } + } + return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)} + } +} + +func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder { + for _, extension := range ctx.extensions { + encoder := extension.CreateMapKeyEncoder(typ) + if encoder != nil { + return encoder + } + } + switch typ.Kind() { + case reflect.String: + return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) + case reflect.Bool, + reflect.Uint8, reflect.Int8, + reflect.Uint16, reflect.Int16, + reflect.Uint32, reflect.Int32, + reflect.Uint64, reflect.Int64, + reflect.Uint, reflect.Int, + reflect.Float32, reflect.Float64, + reflect.Uintptr: + typ = reflect2.DefaultTypeOfKind(typ.Kind()) + return &numericMapKeyEncoder{encoderOfType(ctx, typ)} + default: + if typ == textMarshalerType { + return &directTextMarshalerEncoder{ + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + } + } + if typ.Implements(textMarshalerType) { + return &textMarshalerEncoder{ + valType: typ, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + } + } + if typ.Kind() == reflect.Interface { + return &dynamicMapKeyEncoder{ctx, typ} + } + return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)} + } +} + +type mapDecoder struct { + mapType *reflect2.UnsafeMapType + keyType reflect2.Type + elemType reflect2.Type + keyDecoder ValDecoder + elemDecoder ValDecoder +} + +func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + mapType := decoder.mapType + c := iter.nextToken() + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + *(*unsafe.Pointer)(ptr) = nil + mapType.UnsafeSet(ptr, mapType.UnsafeNew()) + return + } + if mapType.UnsafeIsNil(ptr) { + mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0)) + } + if c != '{' { + iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) + return + } + c = iter.nextToken() + if c == '}' { + return + } + if c != '"' { + iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) + return + } + iter.unreadByte() + key := decoder.keyType.UnsafeNew() + decoder.keyDecoder.Decode(key, iter) + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + return + } + elem := decoder.elemType.UnsafeNew() + decoder.elemDecoder.Decode(elem, iter) + decoder.mapType.UnsafeSetIndex(ptr, key, elem) + for c = iter.nextToken(); c == ','; c = iter.nextToken() { + key := decoder.keyType.UnsafeNew() + decoder.keyDecoder.Decode(key, iter) + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + return + } + elem := decoder.elemType.UnsafeNew() + decoder.elemDecoder.Decode(elem, iter) + decoder.mapType.UnsafeSetIndex(ptr, key, elem) + } + if c != '}' { + iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c})) + } +} + +type numericMapKeyDecoder struct { + decoder ValDecoder +} + +func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + if c != '"' { + iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) + return + } + decoder.decoder.Decode(ptr, iter) + c = iter.nextToken() + if c != '"' { + iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) + return + } +} + +type numericMapKeyEncoder struct { + encoder ValEncoder +} + +func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.writeByte('"') + encoder.encoder.Encode(ptr, stream) + stream.writeByte('"') +} + +func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type dynamicMapKeyEncoder struct { + ctx *ctx + valType reflect2.Type +} + +func (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream) +} + +func (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { + obj := encoder.valType.UnsafeIndirect(ptr) + return encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj)) +} + +type mapEncoder struct { + mapType *reflect2.UnsafeMapType + keyEncoder ValEncoder + elemEncoder ValEncoder +} + +func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteObjectStart() + iter := encoder.mapType.UnsafeIterate(ptr) + for i := 0; iter.HasNext(); i++ { + if i != 0 { + stream.WriteMore() + } + key, elem := iter.UnsafeNext() + encoder.keyEncoder.Encode(key, stream) + if stream.indention > 0 { + stream.writeTwoBytes(byte(':'), byte(' ')) + } else { + stream.writeByte(':') + } + encoder.elemEncoder.Encode(elem, stream) + } + stream.WriteObjectEnd() +} + +func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { + iter := encoder.mapType.UnsafeIterate(ptr) + return !iter.HasNext() +} + +type sortKeysMapEncoder struct { + mapType *reflect2.UnsafeMapType + keyEncoder ValEncoder + elemEncoder ValEncoder +} + +func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *(*unsafe.Pointer)(ptr) == nil { + stream.WriteNil() + return + } + stream.WriteObjectStart() + mapIter := encoder.mapType.UnsafeIterate(ptr) + subStream := stream.cfg.BorrowStream(nil) + subIter := stream.cfg.BorrowIterator(nil) + keyValues := encodedKeyValues{} + for mapIter.HasNext() { + subStream.buf = make([]byte, 0, 64) + key, elem := mapIter.UnsafeNext() + encoder.keyEncoder.Encode(key, subStream) + if subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil { + stream.Error = subStream.Error + } + encodedKey := subStream.Buffer() + subIter.ResetBytes(encodedKey) + decodedKey := subIter.ReadString() + if stream.indention > 0 { + subStream.writeTwoBytes(byte(':'), byte(' ')) + } else { + subStream.writeByte(':') + } + encoder.elemEncoder.Encode(elem, subStream) + keyValues = append(keyValues, encodedKV{ + key: decodedKey, + keyValue: subStream.Buffer(), + }) + } + sort.Sort(keyValues) + for i, keyValue := range keyValues { + if i != 0 { + stream.WriteMore() + } + stream.Write(keyValue.keyValue) + } + stream.WriteObjectEnd() + stream.cfg.ReturnStream(subStream) + stream.cfg.ReturnIterator(subIter) +} + +func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { + iter := encoder.mapType.UnsafeIterate(ptr) + return !iter.HasNext() +} + +type encodedKeyValues []encodedKV + +type encodedKV struct { + key string + keyValue []byte +} + +func (sv encodedKeyValues) Len() int { return len(sv) } +func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } +func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key } diff --git a/vendor/github.com/json-iterator/go/reflect_marshaler.go b/vendor/github.com/json-iterator/go/reflect_marshaler.go new file mode 100644 index 000000000..58ac959ad --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_marshaler.go @@ -0,0 +1,218 @@ +package jsoniter + +import ( + "encoding" + "encoding/json" + "github.com/modern-go/reflect2" + "unsafe" +) + +var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem() +var unmarshalerType = reflect2.TypeOfPtr((*json.Unmarshaler)(nil)).Elem() +var textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem() +var textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem() + +func createDecoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValDecoder { + ptrType := reflect2.PtrTo(typ) + if ptrType.Implements(unmarshalerType) { + return &referenceDecoder{ + &unmarshalerDecoder{ptrType}, + } + } + if ptrType.Implements(textUnmarshalerType) { + return &referenceDecoder{ + &textUnmarshalerDecoder{ptrType}, + } + } + return nil +} + +func createEncoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ == marshalerType { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &directMarshalerEncoder{ + checkIsEmpty: checkIsEmpty, + } + return encoder + } + if typ.Implements(marshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &marshalerEncoder{ + valType: typ, + checkIsEmpty: checkIsEmpty, + } + return encoder + } + ptrType := reflect2.PtrTo(typ) + if ctx.prefix != "" && ptrType.Implements(marshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, ptrType) + var encoder ValEncoder = &marshalerEncoder{ + valType: ptrType, + checkIsEmpty: checkIsEmpty, + } + return &referenceEncoder{encoder} + } + if typ == textMarshalerType { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &directTextMarshalerEncoder{ + checkIsEmpty: checkIsEmpty, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + } + return encoder + } + if typ.Implements(textMarshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &textMarshalerEncoder{ + valType: typ, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + checkIsEmpty: checkIsEmpty, + } + return encoder + } + // if prefix is empty, the type is the root type + if ctx.prefix != "" && ptrType.Implements(textMarshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, ptrType) + var encoder ValEncoder = &textMarshalerEncoder{ + valType: ptrType, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + checkIsEmpty: checkIsEmpty, + } + return &referenceEncoder{encoder} + } + return nil +} + +type marshalerEncoder struct { + checkIsEmpty checkIsEmpty + valType reflect2.Type +} + +func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + if encoder.valType.IsNullable() && reflect2.IsNil(obj) { + stream.WriteNil() + return + } + marshaler := obj.(json.Marshaler) + bytes, err := marshaler.MarshalJSON() + if err != nil { + stream.Error = err + } else { + stream.Write(bytes) + } +} + +func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type directMarshalerEncoder struct { + checkIsEmpty checkIsEmpty +} + +func (encoder *directMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + marshaler := *(*json.Marshaler)(ptr) + if marshaler == nil { + stream.WriteNil() + return + } + bytes, err := marshaler.MarshalJSON() + if err != nil { + stream.Error = err + } else { + stream.Write(bytes) + } +} + +func (encoder *directMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type textMarshalerEncoder struct { + valType reflect2.Type + stringEncoder ValEncoder + checkIsEmpty checkIsEmpty +} + +func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + if encoder.valType.IsNullable() && reflect2.IsNil(obj) { + stream.WriteNil() + return + } + marshaler := (obj).(encoding.TextMarshaler) + bytes, err := marshaler.MarshalText() + if err != nil { + stream.Error = err + } else { + str := string(bytes) + encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) + } +} + +func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type directTextMarshalerEncoder struct { + stringEncoder ValEncoder + checkIsEmpty checkIsEmpty +} + +func (encoder *directTextMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + marshaler := *(*encoding.TextMarshaler)(ptr) + if marshaler == nil { + stream.WriteNil() + return + } + bytes, err := marshaler.MarshalText() + if err != nil { + stream.Error = err + } else { + str := string(bytes) + encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) + } +} + +func (encoder *directTextMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type unmarshalerDecoder struct { + valType reflect2.Type +} + +func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + valType := decoder.valType + obj := valType.UnsafeIndirect(ptr) + unmarshaler := obj.(json.Unmarshaler) + iter.nextToken() + iter.unreadByte() // skip spaces + bytes := iter.SkipAndReturnBytes() + err := unmarshaler.UnmarshalJSON(bytes) + if err != nil { + iter.ReportError("unmarshalerDecoder", err.Error()) + } +} + +type textUnmarshalerDecoder struct { + valType reflect2.Type +} + +func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + valType := decoder.valType + obj := valType.UnsafeIndirect(ptr) + if reflect2.IsNil(obj) { + ptrType := valType.(*reflect2.UnsafePtrType) + elemType := ptrType.Elem() + elem := elemType.UnsafeNew() + ptrType.UnsafeSet(ptr, unsafe.Pointer(&elem)) + obj = valType.UnsafeIndirect(ptr) + } + unmarshaler := (obj).(encoding.TextUnmarshaler) + str := iter.ReadString() + err := unmarshaler.UnmarshalText([]byte(str)) + if err != nil { + iter.ReportError("textUnmarshalerDecoder", err.Error()) + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go new file mode 100644 index 000000000..9042eb0cb --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_native.go @@ -0,0 +1,451 @@ +package jsoniter + +import ( + "encoding/base64" + "reflect" + "strconv" + "unsafe" + + "github.com/modern-go/reflect2" +) + +const ptrSize = 32 << uintptr(^uintptr(0)>>63) + +func createEncoderOfNative(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { + sliceDecoder := decoderOfSlice(ctx, typ) + return &base64Codec{sliceDecoder: sliceDecoder} + } + typeName := typ.String() + kind := typ.Kind() + switch kind { + case reflect.String: + if typeName != "string" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) + } + return &stringCodec{} + case reflect.Int: + if typeName != "int" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &int32Codec{} + } + return &int64Codec{} + case reflect.Int8: + if typeName != "int8" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) + } + return &int8Codec{} + case reflect.Int16: + if typeName != "int16" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) + } + return &int16Codec{} + case reflect.Int32: + if typeName != "int32" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) + } + return &int32Codec{} + case reflect.Int64: + if typeName != "int64" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) + } + return &int64Codec{} + case reflect.Uint: + if typeName != "uint" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint8: + if typeName != "uint8" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) + } + return &uint8Codec{} + case reflect.Uint16: + if typeName != "uint16" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) + } + return &uint16Codec{} + case reflect.Uint32: + if typeName != "uint32" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) + } + return &uint32Codec{} + case reflect.Uintptr: + if typeName != "uintptr" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) + } + if ptrSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint64: + if typeName != "uint64" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) + } + return &uint64Codec{} + case reflect.Float32: + if typeName != "float32" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) + } + return &float32Codec{} + case reflect.Float64: + if typeName != "float64" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) + } + return &float64Codec{} + case reflect.Bool: + if typeName != "bool" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) + } + return &boolCodec{} + } + return nil +} + +func createDecoderOfNative(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { + sliceDecoder := decoderOfSlice(ctx, typ) + return &base64Codec{sliceDecoder: sliceDecoder} + } + typeName := typ.String() + switch typ.Kind() { + case reflect.String: + if typeName != "string" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) + } + return &stringCodec{} + case reflect.Int: + if typeName != "int" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &int32Codec{} + } + return &int64Codec{} + case reflect.Int8: + if typeName != "int8" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) + } + return &int8Codec{} + case reflect.Int16: + if typeName != "int16" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) + } + return &int16Codec{} + case reflect.Int32: + if typeName != "int32" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) + } + return &int32Codec{} + case reflect.Int64: + if typeName != "int64" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) + } + return &int64Codec{} + case reflect.Uint: + if typeName != "uint" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint8: + if typeName != "uint8" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) + } + return &uint8Codec{} + case reflect.Uint16: + if typeName != "uint16" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) + } + return &uint16Codec{} + case reflect.Uint32: + if typeName != "uint32" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) + } + return &uint32Codec{} + case reflect.Uintptr: + if typeName != "uintptr" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) + } + if ptrSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint64: + if typeName != "uint64" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) + } + return &uint64Codec{} + case reflect.Float32: + if typeName != "float32" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) + } + return &float32Codec{} + case reflect.Float64: + if typeName != "float64" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) + } + return &float64Codec{} + case reflect.Bool: + if typeName != "bool" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) + } + return &boolCodec{} + } + return nil +} + +type stringCodec struct { +} + +func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*string)(ptr)) = iter.ReadString() +} + +func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + str := *((*string)(ptr)) + stream.WriteString(str) +} + +func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*string)(ptr)) == "" +} + +type int8Codec struct { +} + +func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int8)(ptr)) = iter.ReadInt8() + } +} + +func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt8(*((*int8)(ptr))) +} + +func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int8)(ptr)) == 0 +} + +type int16Codec struct { +} + +func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int16)(ptr)) = iter.ReadInt16() + } +} + +func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt16(*((*int16)(ptr))) +} + +func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int16)(ptr)) == 0 +} + +type int32Codec struct { +} + +func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int32)(ptr)) = iter.ReadInt32() + } +} + +func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt32(*((*int32)(ptr))) +} + +func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int32)(ptr)) == 0 +} + +type int64Codec struct { +} + +func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int64)(ptr)) = iter.ReadInt64() + } +} + +func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt64(*((*int64)(ptr))) +} + +func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int64)(ptr)) == 0 +} + +type uint8Codec struct { +} + +func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint8)(ptr)) = iter.ReadUint8() + } +} + +func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint8(*((*uint8)(ptr))) +} + +func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint8)(ptr)) == 0 +} + +type uint16Codec struct { +} + +func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint16)(ptr)) = iter.ReadUint16() + } +} + +func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint16(*((*uint16)(ptr))) +} + +func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint16)(ptr)) == 0 +} + +type uint32Codec struct { +} + +func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint32)(ptr)) = iter.ReadUint32() + } +} + +func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint32(*((*uint32)(ptr))) +} + +func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint32)(ptr)) == 0 +} + +type uint64Codec struct { +} + +func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint64)(ptr)) = iter.ReadUint64() + } +} + +func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint64(*((*uint64)(ptr))) +} + +func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint64)(ptr)) == 0 +} + +type float32Codec struct { +} + +func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*float32)(ptr)) = iter.ReadFloat32() + } +} + +func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat32(*((*float32)(ptr))) +} + +func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float32)(ptr)) == 0 +} + +type float64Codec struct { +} + +func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*float64)(ptr)) = iter.ReadFloat64() + } +} + +func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat64(*((*float64)(ptr))) +} + +func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float64)(ptr)) == 0 +} + +type boolCodec struct { +} + +func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*bool)(ptr)) = iter.ReadBool() + } +} + +func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteBool(*((*bool)(ptr))) +} + +func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { + return !(*((*bool)(ptr))) +} + +type base64Codec struct { + sliceType *reflect2.UnsafeSliceType + sliceDecoder ValDecoder +} + +func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + codec.sliceType.UnsafeSetNil(ptr) + return + } + switch iter.WhatIsNext() { + case StringValue: + src := iter.ReadString() + dst, err := base64.StdEncoding.DecodeString(src) + if err != nil { + iter.ReportError("decode base64", err.Error()) + } else { + codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst)) + } + case ArrayValue: + codec.sliceDecoder.Decode(ptr, iter) + default: + iter.ReportError("base64Codec", "invalid input") + } +} + +func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + src := *((*[]byte)(ptr)) + if len(src) == 0 { + stream.WriteNil() + return + } + encoding := base64.StdEncoding + stream.writeByte('"') + size := encoding.EncodedLen(len(src)) + buf := make([]byte, size) + encoding.Encode(buf, src) + stream.buf = append(stream.buf, buf...) + stream.writeByte('"') +} + +func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*[]byte)(ptr))) == 0 +} diff --git a/vendor/github.com/json-iterator/go/reflect_optional.go b/vendor/github.com/json-iterator/go/reflect_optional.go new file mode 100644 index 000000000..43ec71d6d --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_optional.go @@ -0,0 +1,133 @@ +package jsoniter + +import ( + "github.com/modern-go/reflect2" + "reflect" + "unsafe" +) + +func decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder { + ptrType := typ.(*reflect2.UnsafePtrType) + elemType := ptrType.Elem() + decoder := decoderOfType(ctx, elemType) + if ctx.prefix == "" && elemType.Kind() == reflect.Ptr { + return &dereferenceDecoder{elemType, decoder} + } + return &OptionalDecoder{elemType, decoder} +} + +func encoderOfOptional(ctx *ctx, typ reflect2.Type) ValEncoder { + ptrType := typ.(*reflect2.UnsafePtrType) + elemType := ptrType.Elem() + elemEncoder := encoderOfType(ctx, elemType) + encoder := &OptionalEncoder{elemEncoder} + return encoder +} + +type OptionalDecoder struct { + ValueType reflect2.Type + ValueDecoder ValDecoder +} + +func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + *((*unsafe.Pointer)(ptr)) = nil + } else { + if *((*unsafe.Pointer)(ptr)) == nil { + //pointer to null, we have to allocate memory to hold the value + newPtr := decoder.ValueType.UnsafeNew() + decoder.ValueDecoder.Decode(newPtr, iter) + *((*unsafe.Pointer)(ptr)) = newPtr + } else { + //reuse existing instance + decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) + } + } +} + +type dereferenceDecoder struct { + // only to deference a pointer + valueType reflect2.Type + valueDecoder ValDecoder +} + +func (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if *((*unsafe.Pointer)(ptr)) == nil { + //pointer to null, we have to allocate memory to hold the value + newPtr := decoder.valueType.UnsafeNew() + decoder.valueDecoder.Decode(newPtr, iter) + *((*unsafe.Pointer)(ptr)) = newPtr + } else { + //reuse existing instance + decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) + } +} + +type OptionalEncoder struct { + ValueEncoder ValEncoder +} + +func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *((*unsafe.Pointer)(ptr)) == nil { + stream.WriteNil() + } else { + encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) + } +} + +func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*unsafe.Pointer)(ptr)) == nil +} + +type dereferenceEncoder struct { + ValueEncoder ValEncoder +} + +func (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *((*unsafe.Pointer)(ptr)) == nil { + stream.WriteNil() + } else { + encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) + } +} + +func (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + dePtr := *((*unsafe.Pointer)(ptr)) + if dePtr == nil { + return true + } + return encoder.ValueEncoder.IsEmpty(dePtr) +} + +func (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { + deReferenced := *((*unsafe.Pointer)(ptr)) + if deReferenced == nil { + return true + } + isEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil) + if !converted { + return false + } + fieldPtr := unsafe.Pointer(deReferenced) + return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) +} + +type referenceEncoder struct { + encoder ValEncoder +} + +func (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) +} + +func (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) +} + +type referenceDecoder struct { + decoder ValDecoder +} + +func (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.decoder.Decode(unsafe.Pointer(&ptr), iter) +} diff --git a/vendor/github.com/json-iterator/go/reflect_slice.go b/vendor/github.com/json-iterator/go/reflect_slice.go new file mode 100644 index 000000000..9441d79df --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_slice.go @@ -0,0 +1,99 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "unsafe" +) + +func decoderOfSlice(ctx *ctx, typ reflect2.Type) ValDecoder { + sliceType := typ.(*reflect2.UnsafeSliceType) + decoder := decoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) + return &sliceDecoder{sliceType, decoder} +} + +func encoderOfSlice(ctx *ctx, typ reflect2.Type) ValEncoder { + sliceType := typ.(*reflect2.UnsafeSliceType) + encoder := encoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) + return &sliceEncoder{sliceType, encoder} +} + +type sliceEncoder struct { + sliceType *reflect2.UnsafeSliceType + elemEncoder ValEncoder +} + +func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if encoder.sliceType.UnsafeIsNil(ptr) { + stream.WriteNil() + return + } + length := encoder.sliceType.UnsafeLengthOf(ptr) + if length == 0 { + stream.WriteEmptyArray() + return + } + stream.WriteArrayStart() + encoder.elemEncoder.Encode(encoder.sliceType.UnsafeGetIndex(ptr, 0), stream) + for i := 1; i < length; i++ { + stream.WriteMore() + elemPtr := encoder.sliceType.UnsafeGetIndex(ptr, i) + encoder.elemEncoder.Encode(elemPtr, stream) + } + stream.WriteArrayEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) + } +} + +func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.sliceType.UnsafeLengthOf(ptr) == 0 +} + +type sliceDecoder struct { + sliceType *reflect2.UnsafeSliceType + elemDecoder ValDecoder +} + +func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.doDecode(ptr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) + } +} + +func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + sliceType := decoder.sliceType + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + sliceType.UnsafeSetNil(ptr) + return + } + if c != '[' { + iter.ReportError("decode slice", "expect [ or n, but found "+string([]byte{c})) + return + } + c = iter.nextToken() + if c == ']' { + sliceType.UnsafeSet(ptr, sliceType.UnsafeMakeSlice(0, 0)) + return + } + iter.unreadByte() + sliceType.UnsafeGrow(ptr, 1) + elemPtr := sliceType.UnsafeGetIndex(ptr, 0) + decoder.elemDecoder.Decode(elemPtr, iter) + length := 1 + for c = iter.nextToken(); c == ','; c = iter.nextToken() { + idx := length + length += 1 + sliceType.UnsafeGrow(ptr, length) + elemPtr = sliceType.UnsafeGetIndex(ptr, idx) + decoder.elemDecoder.Decode(elemPtr, iter) + } + if c != ']' { + iter.ReportError("decode slice", "expect ], but found "+string([]byte{c})) + return + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go new file mode 100644 index 000000000..355d2d116 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go @@ -0,0 +1,1048 @@ +package jsoniter + +import ( + "fmt" + "io" + "strings" + "unsafe" + + "github.com/modern-go/reflect2" +) + +func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { + bindings := map[string]*Binding{} + structDescriptor := describeStruct(ctx, typ) + for _, binding := range structDescriptor.Fields { + for _, fromName := range binding.FromNames { + old := bindings[fromName] + if old == nil { + bindings[fromName] = binding + continue + } + ignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding) + if ignoreOld { + delete(bindings, fromName) + } + if !ignoreNew { + bindings[fromName] = binding + } + } + } + fields := map[string]*structFieldDecoder{} + for k, binding := range bindings { + fields[k] = binding.Decoder.(*structFieldDecoder) + } + + if !ctx.caseSensitive() { + for k, binding := range bindings { + if _, found := fields[strings.ToLower(k)]; !found { + fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) + } + } + } + + return createStructDecoder(ctx, typ, fields) +} + +func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder { + if ctx.disallowUnknownFields { + return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true} + } + knownHash := map[int64]struct{}{ + 0: {}, + } + + switch len(fields) { + case 0: + return &skipObjectDecoder{typ} + case 1: + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder} + } + case 2: + var fieldHash1 int64 + var fieldHash2 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldHash1 == 0 { + fieldHash1 = fieldHash + fieldDecoder1 = fieldDecoder + } else { + fieldHash2 = fieldHash + fieldDecoder2 = fieldDecoder + } + } + return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2} + case 3: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } + } + return &threeFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3} + case 4: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } + } + return &fourFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4} + case 5: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + var fieldDecoder5 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else if fieldName4 == 0 { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } else { + fieldName5 = fieldHash + fieldDecoder5 = fieldDecoder + } + } + return &fiveFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5} + case 6: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + var fieldDecoder5 *structFieldDecoder + var fieldDecoder6 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else if fieldName4 == 0 { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } else if fieldName5 == 0 { + fieldName5 = fieldHash + fieldDecoder5 = fieldDecoder + } else { + fieldName6 = fieldHash + fieldDecoder6 = fieldDecoder + } + } + return &sixFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6} + case 7: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + var fieldDecoder5 *structFieldDecoder + var fieldDecoder6 *structFieldDecoder + var fieldDecoder7 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else if fieldName4 == 0 { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } else if fieldName5 == 0 { + fieldName5 = fieldHash + fieldDecoder5 = fieldDecoder + } else if fieldName6 == 0 { + fieldName6 = fieldHash + fieldDecoder6 = fieldDecoder + } else { + fieldName7 = fieldHash + fieldDecoder7 = fieldDecoder + } + } + return &sevenFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7} + case 8: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldName8 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + var fieldDecoder5 *structFieldDecoder + var fieldDecoder6 *structFieldDecoder + var fieldDecoder7 *structFieldDecoder + var fieldDecoder8 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else if fieldName4 == 0 { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } else if fieldName5 == 0 { + fieldName5 = fieldHash + fieldDecoder5 = fieldDecoder + } else if fieldName6 == 0 { + fieldName6 = fieldHash + fieldDecoder6 = fieldDecoder + } else if fieldName7 == 0 { + fieldName7 = fieldHash + fieldDecoder7 = fieldDecoder + } else { + fieldName8 = fieldHash + fieldDecoder8 = fieldDecoder + } + } + return &eightFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, + fieldName8, fieldDecoder8} + case 9: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldName8 int64 + var fieldName9 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + var fieldDecoder5 *structFieldDecoder + var fieldDecoder6 *structFieldDecoder + var fieldDecoder7 *structFieldDecoder + var fieldDecoder8 *structFieldDecoder + var fieldDecoder9 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else if fieldName4 == 0 { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } else if fieldName5 == 0 { + fieldName5 = fieldHash + fieldDecoder5 = fieldDecoder + } else if fieldName6 == 0 { + fieldName6 = fieldHash + fieldDecoder6 = fieldDecoder + } else if fieldName7 == 0 { + fieldName7 = fieldHash + fieldDecoder7 = fieldDecoder + } else if fieldName8 == 0 { + fieldName8 = fieldHash + fieldDecoder8 = fieldDecoder + } else { + fieldName9 = fieldHash + fieldDecoder9 = fieldDecoder + } + } + return &nineFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, + fieldName8, fieldDecoder8, + fieldName9, fieldDecoder9} + case 10: + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldName8 int64 + var fieldName9 int64 + var fieldName10 int64 + var fieldDecoder1 *structFieldDecoder + var fieldDecoder2 *structFieldDecoder + var fieldDecoder3 *structFieldDecoder + var fieldDecoder4 *structFieldDecoder + var fieldDecoder5 *structFieldDecoder + var fieldDecoder6 *structFieldDecoder + var fieldDecoder7 *structFieldDecoder + var fieldDecoder8 *structFieldDecoder + var fieldDecoder9 *structFieldDecoder + var fieldDecoder10 *structFieldDecoder + for fieldName, fieldDecoder := range fields { + fieldHash := calcHash(fieldName, ctx.caseSensitive()) + _, known := knownHash[fieldHash] + if known { + return &generalStructDecoder{typ, fields, false} + } + knownHash[fieldHash] = struct{}{} + if fieldName1 == 0 { + fieldName1 = fieldHash + fieldDecoder1 = fieldDecoder + } else if fieldName2 == 0 { + fieldName2 = fieldHash + fieldDecoder2 = fieldDecoder + } else if fieldName3 == 0 { + fieldName3 = fieldHash + fieldDecoder3 = fieldDecoder + } else if fieldName4 == 0 { + fieldName4 = fieldHash + fieldDecoder4 = fieldDecoder + } else if fieldName5 == 0 { + fieldName5 = fieldHash + fieldDecoder5 = fieldDecoder + } else if fieldName6 == 0 { + fieldName6 = fieldHash + fieldDecoder6 = fieldDecoder + } else if fieldName7 == 0 { + fieldName7 = fieldHash + fieldDecoder7 = fieldDecoder + } else if fieldName8 == 0 { + fieldName8 = fieldHash + fieldDecoder8 = fieldDecoder + } else if fieldName9 == 0 { + fieldName9 = fieldHash + fieldDecoder9 = fieldDecoder + } else { + fieldName10 = fieldHash + fieldDecoder10 = fieldDecoder + } + } + return &tenFieldsStructDecoder{typ, + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, + fieldName8, fieldDecoder8, + fieldName9, fieldDecoder9, + fieldName10, fieldDecoder10} + } + return &generalStructDecoder{typ, fields, false} +} + +type generalStructDecoder struct { + typ reflect2.Type + fields map[string]*structFieldDecoder + disallowUnknownFields bool +} + +func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + var c byte + for c = ','; c == ','; c = iter.nextToken() { + decoder.decodeOneField(ptr, iter) + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } + if c != '}' { + iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) + } +} + +func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) { + var field string + var fieldDecoder *structFieldDecoder + if iter.cfg.objectFieldMustBeSimpleString { + fieldBytes := iter.ReadStringAsSlice() + field = *(*string)(unsafe.Pointer(&fieldBytes)) + fieldDecoder = decoder.fields[field] + if fieldDecoder == nil && !iter.cfg.caseSensitive { + fieldDecoder = decoder.fields[strings.ToLower(field)] + } + } else { + field = iter.ReadString() + fieldDecoder = decoder.fields[field] + if fieldDecoder == nil && !iter.cfg.caseSensitive { + fieldDecoder = decoder.fields[strings.ToLower(field)] + } + } + if fieldDecoder == nil { + msg := "found unknown field: " + field + if decoder.disallowUnknownFields { + iter.ReportError("ReadObject", msg) + } + c := iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + iter.Skip() + return + } + c := iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + fieldDecoder.Decode(ptr, iter) +} + +type skipObjectDecoder struct { + typ reflect2.Type +} + +func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + valueType := iter.WhatIsNext() + if valueType != ObjectValue && valueType != NilValue { + iter.ReportError("skipObjectDecoder", "expect object or null") + return + } + iter.Skip() +} + +type oneFieldStructDecoder struct { + typ reflect2.Type + fieldHash int64 + fieldDecoder *structFieldDecoder +} + +func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + if iter.readFieldHash() == decoder.fieldHash { + decoder.fieldDecoder.Decode(ptr, iter) + } else { + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type twoFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder +} + +func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type threeFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder +} + +func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type fourFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder +} + +func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type fiveFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder + fieldHash5 int64 + fieldDecoder5 *structFieldDecoder +} + +func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + case decoder.fieldHash5: + decoder.fieldDecoder5.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type sixFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder + fieldHash5 int64 + fieldDecoder5 *structFieldDecoder + fieldHash6 int64 + fieldDecoder6 *structFieldDecoder +} + +func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + case decoder.fieldHash5: + decoder.fieldDecoder5.Decode(ptr, iter) + case decoder.fieldHash6: + decoder.fieldDecoder6.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type sevenFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder + fieldHash5 int64 + fieldDecoder5 *structFieldDecoder + fieldHash6 int64 + fieldDecoder6 *structFieldDecoder + fieldHash7 int64 + fieldDecoder7 *structFieldDecoder +} + +func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + case decoder.fieldHash5: + decoder.fieldDecoder5.Decode(ptr, iter) + case decoder.fieldHash6: + decoder.fieldDecoder6.Decode(ptr, iter) + case decoder.fieldHash7: + decoder.fieldDecoder7.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type eightFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder + fieldHash5 int64 + fieldDecoder5 *structFieldDecoder + fieldHash6 int64 + fieldDecoder6 *structFieldDecoder + fieldHash7 int64 + fieldDecoder7 *structFieldDecoder + fieldHash8 int64 + fieldDecoder8 *structFieldDecoder +} + +func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + case decoder.fieldHash5: + decoder.fieldDecoder5.Decode(ptr, iter) + case decoder.fieldHash6: + decoder.fieldDecoder6.Decode(ptr, iter) + case decoder.fieldHash7: + decoder.fieldDecoder7.Decode(ptr, iter) + case decoder.fieldHash8: + decoder.fieldDecoder8.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type nineFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder + fieldHash5 int64 + fieldDecoder5 *structFieldDecoder + fieldHash6 int64 + fieldDecoder6 *structFieldDecoder + fieldHash7 int64 + fieldDecoder7 *structFieldDecoder + fieldHash8 int64 + fieldDecoder8 *structFieldDecoder + fieldHash9 int64 + fieldDecoder9 *structFieldDecoder +} + +func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + case decoder.fieldHash5: + decoder.fieldDecoder5.Decode(ptr, iter) + case decoder.fieldHash6: + decoder.fieldDecoder6.Decode(ptr, iter) + case decoder.fieldHash7: + decoder.fieldDecoder7.Decode(ptr, iter) + case decoder.fieldHash8: + decoder.fieldDecoder8.Decode(ptr, iter) + case decoder.fieldHash9: + decoder.fieldDecoder9.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type tenFieldsStructDecoder struct { + typ reflect2.Type + fieldHash1 int64 + fieldDecoder1 *structFieldDecoder + fieldHash2 int64 + fieldDecoder2 *structFieldDecoder + fieldHash3 int64 + fieldDecoder3 *structFieldDecoder + fieldHash4 int64 + fieldDecoder4 *structFieldDecoder + fieldHash5 int64 + fieldDecoder5 *structFieldDecoder + fieldHash6 int64 + fieldDecoder6 *structFieldDecoder + fieldHash7 int64 + fieldDecoder7 *structFieldDecoder + fieldHash8 int64 + fieldDecoder8 *structFieldDecoder + fieldHash9 int64 + fieldDecoder9 *structFieldDecoder + fieldHash10 int64 + fieldDecoder10 *structFieldDecoder +} + +func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.readObjectStart() { + return + } + for { + switch iter.readFieldHash() { + case decoder.fieldHash1: + decoder.fieldDecoder1.Decode(ptr, iter) + case decoder.fieldHash2: + decoder.fieldDecoder2.Decode(ptr, iter) + case decoder.fieldHash3: + decoder.fieldDecoder3.Decode(ptr, iter) + case decoder.fieldHash4: + decoder.fieldDecoder4.Decode(ptr, iter) + case decoder.fieldHash5: + decoder.fieldDecoder5.Decode(ptr, iter) + case decoder.fieldHash6: + decoder.fieldDecoder6.Decode(ptr, iter) + case decoder.fieldHash7: + decoder.fieldDecoder7.Decode(ptr, iter) + case decoder.fieldHash8: + decoder.fieldDecoder8.Decode(ptr, iter) + case decoder.fieldHash9: + decoder.fieldDecoder9.Decode(ptr, iter) + case decoder.fieldHash10: + decoder.fieldDecoder10.Decode(ptr, iter) + default: + iter.Skip() + } + if iter.isObjectEnd() { + break + } + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } +} + +type structFieldDecoder struct { + field reflect2.StructField + fieldDecoder ValDecoder +} + +func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + fieldPtr := decoder.field.UnsafeGet(ptr) + decoder.fieldDecoder.Decode(fieldPtr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%s: %s", decoder.field.Name(), iter.Error.Error()) + } +} + +type stringModeStringDecoder struct { + elemDecoder ValDecoder + cfg *frozenConfig +} + +func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.elemDecoder.Decode(ptr, iter) + str := *((*string)(ptr)) + tempIter := decoder.cfg.BorrowIterator([]byte(str)) + defer decoder.cfg.ReturnIterator(tempIter) + *((*string)(ptr)) = tempIter.ReadString() +} + +type stringModeNumberDecoder struct { + elemDecoder ValDecoder +} + +func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + if c != '"' { + iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) + return + } + decoder.elemDecoder.Decode(ptr, iter) + if iter.Error != nil { + return + } + c = iter.readByte() + if c != '"' { + iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) + return + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go b/vendor/github.com/json-iterator/go/reflect_struct_encoder.go new file mode 100644 index 000000000..d0759cf64 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_struct_encoder.go @@ -0,0 +1,210 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "reflect" + "unsafe" +) + +func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { + type bindingTo struct { + binding *Binding + toName string + ignored bool + } + orderedBindings := []*bindingTo{} + structDescriptor := describeStruct(ctx, typ) + for _, binding := range structDescriptor.Fields { + for _, toName := range binding.ToNames { + new := &bindingTo{ + binding: binding, + toName: toName, + } + for _, old := range orderedBindings { + if old.toName != toName { + continue + } + old.ignored, new.ignored = resolveConflictBinding(ctx.frozenConfig, old.binding, new.binding) + } + orderedBindings = append(orderedBindings, new) + } + } + if len(orderedBindings) == 0 { + return &emptyStructEncoder{} + } + finalOrderedFields := []structFieldTo{} + for _, bindingTo := range orderedBindings { + if !bindingTo.ignored { + finalOrderedFields = append(finalOrderedFields, structFieldTo{ + encoder: bindingTo.binding.Encoder.(*structFieldEncoder), + toName: bindingTo.toName, + }) + } + } + return &structEncoder{typ, finalOrderedFields} +} + +func createCheckIsEmpty(ctx *ctx, typ reflect2.Type) checkIsEmpty { + encoder := createEncoderOfNative(ctx, typ) + if encoder != nil { + return encoder + } + kind := typ.Kind() + switch kind { + case reflect.Interface: + return &dynamicEncoder{typ} + case reflect.Struct: + return &structEncoder{typ: typ} + case reflect.Array: + return &arrayEncoder{} + case reflect.Slice: + return &sliceEncoder{} + case reflect.Map: + return encoderOfMap(ctx, typ) + case reflect.Ptr: + return &OptionalEncoder{} + default: + return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)} + } +} + +func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) { + newTagged := new.Field.Tag().Get(cfg.getTagKey()) != "" + oldTagged := old.Field.Tag().Get(cfg.getTagKey()) != "" + if newTagged { + if oldTagged { + if len(old.levels) > len(new.levels) { + return true, false + } else if len(new.levels) > len(old.levels) { + return false, true + } else { + return true, true + } + } else { + return true, false + } + } else { + if oldTagged { + return true, false + } + if len(old.levels) > len(new.levels) { + return true, false + } else if len(new.levels) > len(old.levels) { + return false, true + } else { + return true, true + } + } +} + +type structFieldEncoder struct { + field reflect2.StructField + fieldEncoder ValEncoder + omitempty bool +} + +func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + fieldPtr := encoder.field.UnsafeGet(ptr) + encoder.fieldEncoder.Encode(fieldPtr, stream) + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%s: %s", encoder.field.Name(), stream.Error.Error()) + } +} + +func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool { + fieldPtr := encoder.field.UnsafeGet(ptr) + return encoder.fieldEncoder.IsEmpty(fieldPtr) +} + +func (encoder *structFieldEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { + isEmbeddedPtrNil, converted := encoder.fieldEncoder.(IsEmbeddedPtrNil) + if !converted { + return false + } + fieldPtr := encoder.field.UnsafeGet(ptr) + return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) +} + +type IsEmbeddedPtrNil interface { + IsEmbeddedPtrNil(ptr unsafe.Pointer) bool +} + +type structEncoder struct { + typ reflect2.Type + fields []structFieldTo +} + +type structFieldTo struct { + encoder *structFieldEncoder + toName string +} + +func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteObjectStart() + isNotFirst := false + for _, field := range encoder.fields { + if field.encoder.omitempty && field.encoder.IsEmpty(ptr) { + continue + } + if field.encoder.IsEmbeddedPtrNil(ptr) { + continue + } + if isNotFirst { + stream.WriteMore() + } + stream.WriteObjectField(field.toName) + field.encoder.Encode(ptr, stream) + isNotFirst = true + } + stream.WriteObjectEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v.%s", encoder.typ, stream.Error.Error()) + } +} + +func (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type emptyStructEncoder struct { +} + +func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteEmptyObject() +} + +func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type stringModeNumberEncoder struct { + elemEncoder ValEncoder +} + +func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.writeByte('"') + encoder.elemEncoder.Encode(ptr, stream) + stream.writeByte('"') +} + +func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.elemEncoder.IsEmpty(ptr) +} + +type stringModeStringEncoder struct { + elemEncoder ValEncoder + cfg *frozenConfig +} + +func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + tempStream := encoder.cfg.BorrowStream(nil) + defer encoder.cfg.ReturnStream(tempStream) + encoder.elemEncoder.Encode(ptr, tempStream) + stream.WriteString(string(tempStream.Buffer())) +} + +func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.elemEncoder.IsEmpty(ptr) +} diff --git a/vendor/github.com/json-iterator/go/stream.go b/vendor/github.com/json-iterator/go/stream.go new file mode 100644 index 000000000..17662fded --- /dev/null +++ b/vendor/github.com/json-iterator/go/stream.go @@ -0,0 +1,211 @@ +package jsoniter + +import ( + "io" +) + +// stream is a io.Writer like object, with JSON specific write functions. +// Error is not returned as return value, but stored as Error member on this stream instance. +type Stream struct { + cfg *frozenConfig + out io.Writer + buf []byte + Error error + indention int + Attachment interface{} // open for customized encoder +} + +// NewStream create new stream instance. +// cfg can be jsoniter.ConfigDefault. +// out can be nil if write to internal buffer. +// bufSize is the initial size for the internal buffer in bytes. +func NewStream(cfg API, out io.Writer, bufSize int) *Stream { + return &Stream{ + cfg: cfg.(*frozenConfig), + out: out, + buf: make([]byte, 0, bufSize), + Error: nil, + indention: 0, + } +} + +// Pool returns a pool can provide more stream with same configuration +func (stream *Stream) Pool() StreamPool { + return stream.cfg +} + +// Reset reuse this stream instance by assign a new writer +func (stream *Stream) Reset(out io.Writer) { + stream.out = out + stream.buf = stream.buf[:0] +} + +// Available returns how many bytes are unused in the buffer. +func (stream *Stream) Available() int { + return cap(stream.buf) - len(stream.buf) +} + +// Buffered returns the number of bytes that have been written into the current buffer. +func (stream *Stream) Buffered() int { + return len(stream.buf) +} + +// Buffer if writer is nil, use this method to take the result +func (stream *Stream) Buffer() []byte { + return stream.buf +} + +// SetBuffer allows to append to the internal buffer directly +func (stream *Stream) SetBuffer(buf []byte) { + stream.buf = buf +} + +// Write writes the contents of p into the buffer. +// It returns the number of bytes written. +// If nn < len(p), it also returns an error explaining +// why the write is short. +func (stream *Stream) Write(p []byte) (nn int, err error) { + stream.buf = append(stream.buf, p...) + if stream.out != nil { + nn, err = stream.out.Write(stream.buf) + stream.buf = stream.buf[nn:] + return + } + return len(p), nil +} + +// WriteByte writes a single byte. +func (stream *Stream) writeByte(c byte) { + stream.buf = append(stream.buf, c) +} + +func (stream *Stream) writeTwoBytes(c1 byte, c2 byte) { + stream.buf = append(stream.buf, c1, c2) +} + +func (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) { + stream.buf = append(stream.buf, c1, c2, c3) +} + +func (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) { + stream.buf = append(stream.buf, c1, c2, c3, c4) +} + +func (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) { + stream.buf = append(stream.buf, c1, c2, c3, c4, c5) +} + +// Flush writes any buffered data to the underlying io.Writer. +func (stream *Stream) Flush() error { + if stream.out == nil { + return nil + } + if stream.Error != nil { + return stream.Error + } + n, err := stream.out.Write(stream.buf) + if err != nil { + if stream.Error == nil { + stream.Error = err + } + return err + } + stream.buf = stream.buf[n:] + return nil +} + +// WriteRaw write string out without quotes, just like []byte +func (stream *Stream) WriteRaw(s string) { + stream.buf = append(stream.buf, s...) +} + +// WriteNil write null to stream +func (stream *Stream) WriteNil() { + stream.writeFourBytes('n', 'u', 'l', 'l') +} + +// WriteTrue write true to stream +func (stream *Stream) WriteTrue() { + stream.writeFourBytes('t', 'r', 'u', 'e') +} + +// WriteFalse write false to stream +func (stream *Stream) WriteFalse() { + stream.writeFiveBytes('f', 'a', 'l', 's', 'e') +} + +// WriteBool write true or false into stream +func (stream *Stream) WriteBool(val bool) { + if val { + stream.WriteTrue() + } else { + stream.WriteFalse() + } +} + +// WriteObjectStart write { with possible indention +func (stream *Stream) WriteObjectStart() { + stream.indention += stream.cfg.indentionStep + stream.writeByte('{') + stream.writeIndention(0) +} + +// WriteObjectField write "field": with possible indention +func (stream *Stream) WriteObjectField(field string) { + stream.WriteString(field) + if stream.indention > 0 { + stream.writeTwoBytes(':', ' ') + } else { + stream.writeByte(':') + } +} + +// WriteObjectEnd write } with possible indention +func (stream *Stream) WriteObjectEnd() { + stream.writeIndention(stream.cfg.indentionStep) + stream.indention -= stream.cfg.indentionStep + stream.writeByte('}') +} + +// WriteEmptyObject write {} +func (stream *Stream) WriteEmptyObject() { + stream.writeByte('{') + stream.writeByte('}') +} + +// WriteMore write , with possible indention +func (stream *Stream) WriteMore() { + stream.writeByte(',') + stream.writeIndention(0) + stream.Flush() +} + +// WriteArrayStart write [ with possible indention +func (stream *Stream) WriteArrayStart() { + stream.indention += stream.cfg.indentionStep + stream.writeByte('[') + stream.writeIndention(0) +} + +// WriteEmptyArray write [] +func (stream *Stream) WriteEmptyArray() { + stream.writeTwoBytes('[', ']') +} + +// WriteArrayEnd write ] with possible indention +func (stream *Stream) WriteArrayEnd() { + stream.writeIndention(stream.cfg.indentionStep) + stream.indention -= stream.cfg.indentionStep + stream.writeByte(']') +} + +func (stream *Stream) writeIndention(delta int) { + if stream.indention == 0 { + return + } + stream.writeByte('\n') + toWrite := stream.indention - delta + for i := 0; i < toWrite; i++ { + stream.buf = append(stream.buf, ' ') + } +} diff --git a/vendor/github.com/json-iterator/go/stream_float.go b/vendor/github.com/json-iterator/go/stream_float.go new file mode 100644 index 000000000..f318d2c59 --- /dev/null +++ b/vendor/github.com/json-iterator/go/stream_float.go @@ -0,0 +1,94 @@ +package jsoniter + +import ( + "math" + "strconv" +) + +var pow10 []uint64 + +func init() { + pow10 = []uint64{1, 10, 100, 1000, 10000, 100000, 1000000} +} + +// WriteFloat32 write float32 to stream +func (stream *Stream) WriteFloat32(val float32) { + abs := math.Abs(float64(val)) + fmt := byte('f') + // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. + if abs != 0 { + if float32(abs) < 1e-6 || float32(abs) >= 1e21 { + fmt = 'e' + } + } + stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32) +} + +// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster +func (stream *Stream) WriteFloat32Lossy(val float32) { + if val < 0 { + stream.writeByte('-') + val = -val + } + if val > 0x4ffffff { + stream.WriteFloat32(val) + return + } + precision := 6 + exp := uint64(1000000) // 6 + lval := uint64(float64(val)*float64(exp) + 0.5) + stream.WriteUint64(lval / exp) + fval := lval % exp + if fval == 0 { + return + } + stream.writeByte('.') + for p := precision - 1; p > 0 && fval < pow10[p]; p-- { + stream.writeByte('0') + } + stream.WriteUint64(fval) + for stream.buf[len(stream.buf)-1] == '0' { + stream.buf = stream.buf[:len(stream.buf)-1] + } +} + +// WriteFloat64 write float64 to stream +func (stream *Stream) WriteFloat64(val float64) { + abs := math.Abs(val) + fmt := byte('f') + // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. + if abs != 0 { + if abs < 1e-6 || abs >= 1e21 { + fmt = 'e' + } + } + stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64) +} + +// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster +func (stream *Stream) WriteFloat64Lossy(val float64) { + if val < 0 { + stream.writeByte('-') + val = -val + } + if val > 0x4ffffff { + stream.WriteFloat64(val) + return + } + precision := 6 + exp := uint64(1000000) // 6 + lval := uint64(val*float64(exp) + 0.5) + stream.WriteUint64(lval / exp) + fval := lval % exp + if fval == 0 { + return + } + stream.writeByte('.') + for p := precision - 1; p > 0 && fval < pow10[p]; p-- { + stream.writeByte('0') + } + stream.WriteUint64(fval) + for stream.buf[len(stream.buf)-1] == '0' { + stream.buf = stream.buf[:len(stream.buf)-1] + } +} diff --git a/vendor/github.com/json-iterator/go/stream_int.go b/vendor/github.com/json-iterator/go/stream_int.go new file mode 100644 index 000000000..d1059ee4c --- /dev/null +++ b/vendor/github.com/json-iterator/go/stream_int.go @@ -0,0 +1,190 @@ +package jsoniter + +var digits []uint32 + +func init() { + digits = make([]uint32, 1000) + for i := uint32(0); i < 1000; i++ { + digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' + if i < 10 { + digits[i] += 2 << 24 + } else if i < 100 { + digits[i] += 1 << 24 + } + } +} + +func writeFirstBuf(space []byte, v uint32) []byte { + start := v >> 24 + if start == 0 { + space = append(space, byte(v>>16), byte(v>>8)) + } else if start == 1 { + space = append(space, byte(v>>8)) + } + space = append(space, byte(v)) + return space +} + +func writeBuf(buf []byte, v uint32) []byte { + return append(buf, byte(v>>16), byte(v>>8), byte(v)) +} + +// WriteUint8 write uint8 to stream +func (stream *Stream) WriteUint8(val uint8) { + stream.buf = writeFirstBuf(stream.buf, digits[val]) +} + +// WriteInt8 write int8 to stream +func (stream *Stream) WriteInt8(nval int8) { + var val uint8 + if nval < 0 { + val = uint8(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint8(nval) + } + stream.buf = writeFirstBuf(stream.buf, digits[val]) +} + +// WriteUint16 write uint16 to stream +func (stream *Stream) WriteUint16(val uint16) { + q1 := val / 1000 + if q1 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[val]) + return + } + r1 := val - q1*1000 + stream.buf = writeFirstBuf(stream.buf, digits[q1]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return +} + +// WriteInt16 write int16 to stream +func (stream *Stream) WriteInt16(nval int16) { + var val uint16 + if nval < 0 { + val = uint16(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint16(nval) + } + stream.WriteUint16(val) +} + +// WriteUint32 write uint32 to stream +func (stream *Stream) WriteUint32(val uint32) { + q1 := val / 1000 + if q1 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[val]) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q1]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q2]) + } else { + r3 := q2 - q3*1000 + stream.buf = append(stream.buf, byte(q3+'0')) + stream.buf = writeBuf(stream.buf, digits[r3]) + } + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) +} + +// WriteInt32 write int32 to stream +func (stream *Stream) WriteInt32(nval int32) { + var val uint32 + if nval < 0 { + val = uint32(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint32(nval) + } + stream.WriteUint32(val) +} + +// WriteUint64 write uint64 to stream +func (stream *Stream) WriteUint64(val uint64) { + q1 := val / 1000 + if q1 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[val]) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q1]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q2]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r3 := q2 - q3*1000 + q4 := q3 / 1000 + if q4 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q3]) + stream.buf = writeBuf(stream.buf, digits[r3]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r4 := q3 - q4*1000 + q5 := q4 / 1000 + if q5 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q4]) + stream.buf = writeBuf(stream.buf, digits[r4]) + stream.buf = writeBuf(stream.buf, digits[r3]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r5 := q4 - q5*1000 + q6 := q5 / 1000 + if q6 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q5]) + } else { + stream.buf = writeFirstBuf(stream.buf, digits[q6]) + r6 := q5 - q6*1000 + stream.buf = writeBuf(stream.buf, digits[r6]) + } + stream.buf = writeBuf(stream.buf, digits[r5]) + stream.buf = writeBuf(stream.buf, digits[r4]) + stream.buf = writeBuf(stream.buf, digits[r3]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) +} + +// WriteInt64 write int64 to stream +func (stream *Stream) WriteInt64(nval int64) { + var val uint64 + if nval < 0 { + val = uint64(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint64(nval) + } + stream.WriteUint64(val) +} + +// WriteInt write int to stream +func (stream *Stream) WriteInt(val int) { + stream.WriteInt64(int64(val)) +} + +// WriteUint write uint to stream +func (stream *Stream) WriteUint(val uint) { + stream.WriteUint64(uint64(val)) +} diff --git a/vendor/github.com/json-iterator/go/stream_str.go b/vendor/github.com/json-iterator/go/stream_str.go new file mode 100644 index 000000000..54c2ba0b3 --- /dev/null +++ b/vendor/github.com/json-iterator/go/stream_str.go @@ -0,0 +1,372 @@ +package jsoniter + +import ( + "unicode/utf8" +) + +// htmlSafeSet holds the value true if the ASCII character with the given +// array position can be safely represented inside a JSON string, embedded +// inside of HTML