From 574ebdf277872703454593ef796e6b337de73fb0 Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Fri, 12 Jan 2024 12:35:07 +0100 Subject: [PATCH] Update dependencies This update includes a newer version of the RTMP server that supports the enhances RTMP specification, i.e. HEVC, VP9, and AV1. --- go.mod | 78 +- go.sum | 206 +- internal/testhelper/sigpropagate/sigpropagate | Bin 0 -> 2243970 bytes .../github.com/99designs/gqlgen/CHANGELOG.md | 476 +- vendor/github.com/99designs/gqlgen/TESTING.md | 2 +- .../99designs/gqlgen/codegen/args.go | 3 +- .../99designs/gqlgen/codegen/config/binder.go | 52 +- .../99designs/gqlgen/codegen/config/config.go | 62 +- .../gqlgen/codegen/config/initialisms.go | 66 +- .../99designs/gqlgen/codegen/directive.go | 3 +- .../99designs/gqlgen/codegen/field.go | 10 +- .../99designs/gqlgen/codegen/field.gotpl | 92 +- .../99designs/gqlgen/codegen/generate.go | 3 +- .../99designs/gqlgen/codegen/generated!.gotpl | 10 +- .../99designs/gqlgen/codegen/input.gotpl | 24 +- .../99designs/gqlgen/codegen/interface.go | 9 +- .../99designs/gqlgen/codegen/object.go | 13 +- .../99designs/gqlgen/codegen/root_.gotpl | 10 +- .../gqlgen/codegen/templates/templates.go | 99 +- .../99designs/gqlgen/codegen/type.gotpl | 11 +- .../99designs/gqlgen/complexity/complexity.go | 3 +- .../gqlgen/graphql/context_operation.go | 4 +- .../99designs/gqlgen/graphql/duration.go | 27 + .../gqlgen/graphql/executor/executor.go | 5 +- .../99designs/gqlgen/graphql/fieldset.go | 2 +- .../gqlgen/graphql/handler/extension/apq.go | 5 +- .../graphql/handler/extension/complexity.go | 3 +- .../handler/extension/introspection.go | 3 +- .../gqlgen/graphql/handler/lru/lru.go | 3 +- .../gqlgen/graphql/handler/server.go | 3 +- .../gqlgen/graphql/handler/transport/error.go | 3 +- .../graphql/handler/transport/http_get.go | 5 +- .../gqlgen/graphql/handler/transport/util.go | 3 +- .../graphql/handler/transport/websocket.go | 85 +- .../gqlgen/graphql/introspection/schema.go | 4 - .../99designs/gqlgen/graphql/omittable.go | 23 + .../playground/apollo_sandbox_playground.go | 154 +- .../gqlgen/graphql/playground/playground.go | 28 +- .../99designs/gqlgen/graphql/uuid.go | 25 + .../99designs/gqlgen/graphql/version.go | 2 +- .../gqlgen/internal/code/packages.go | 58 +- .../gqlgen/internal/imports/prune.go | 4 +- .../gqlgen/internal/rewrite/rewriter.go | 3 +- vendor/github.com/99designs/gqlgen/main.go | 5 +- .../gqlgen/plugin/federation/entity.go | 3 +- .../gqlgen/plugin/federation/federation.go | 23 +- .../plugin/federation/fieldset/fieldset.go | 5 +- .../gqlgen/plugin/federation/readme.md | 3 + .../gqlgen/plugin/modelgen/models.go | 38 +- .../99designs/gqlgen/plugin/plugin.go | 5 +- .../gqlgen/plugin/resolvergen/resolver.go | 80 +- .../caddyserver/certmagic/README.md | 3 + .../github.com/caddyserver/certmagic/async.go | 25 +- .../caddyserver/certmagic/certificates.go | 3 +- .../caddyserver/certmagic/certmagic.go | 2 +- .../caddyserver/certmagic/handshake.go | 67 +- .../caddyserver/certmagic/maintain.go | 132 +- .../caddyserver/certmagic/solvers.go | 24 +- .../caddyserver/certmagic/storage.go | 2 +- vendor/github.com/datarhei/joy4/av/av.go | 23 +- .../datarhei/joy4/av/pktque/filters.go | 3 +- .../datarhei/joy4/codec/aacparser/parser.go | 5 +- .../datarhei/joy4/codec/av1parser/parser.go | 44 + .../datarhei/joy4/codec/h264parser/parser.go | 1 + .../datarhei/joy4/codec/hevcparser/parser.go | 695 +++ .../datarhei/joy4/codec/vp9parser/parser.go | 31 + .../datarhei/joy4/format/flv/flv.go | 354 +- .../datarhei/joy4/format/flv/flvio/flvio.go | 198 +- .../datarhei/joy4/format/rtmp/rtmp.go | 653 +-- .../datarhei/joy4/utils/bits/golomb_reader.go | 24 + .../gabriel-vasile/mimetype/README.md | 3 - .../mimetype/internal/magic/binary.go | 38 +- .../mimetype/internal/magic/magic.go | 4 +- .../mimetype/internal/magic/text_csv.go | 18 +- .../gabriel-vasile/mimetype/mimetype.go | 3 +- .../mimetype/supported_mimes.md | 2 +- .../go-openapi/jsonpointer/.golangci.yml | 61 + .../go-openapi/jsonpointer/README.md | 8 +- .../go-openapi/jsonpointer/pointer.go | 68 +- .../go-openapi/jsonreference/.golangci.yml | 59 +- .../go-openapi/jsonreference/README.md | 14 +- vendor/github.com/go-openapi/spec/.gitignore | 3 +- .../github.com/go-openapi/spec/.golangci.yml | 21 +- vendor/github.com/go-openapi/spec/README.md | 5 +- .../github.com/go-openapi/spec/appveyor.yml | 32 - vendor/github.com/go-openapi/spec/bindata.go | 297 -- vendor/github.com/go-openapi/spec/embed.go | 17 + vendor/github.com/go-openapi/spec/expander.go | 75 +- .../go-openapi/spec/normalizer_nonwindows.go | 2 +- .../github.com/go-openapi/spec/operation.go | 5 +- .../github.com/go-openapi/spec/parameter.go | 42 +- .../go-openapi/spec/schema_loader.go | 9 +- .../spec/schemas/jsonschema-draft-04.json | 149 + .../go-openapi/spec/schemas/v2/schema.json | 1607 ++++++ vendor/github.com/go-openapi/spec/spec.go | 6 +- vendor/github.com/go-openapi/spec/swagger.go | 4 +- vendor/github.com/go-openapi/spec/url_go18.go | 8 - vendor/github.com/go-openapi/spec/url_go19.go | 3 - vendor/github.com/go-openapi/swag/.gitignore | 1 + .../github.com/go-openapi/swag/.golangci.yml | 54 +- vendor/github.com/go-openapi/swag/README.md | 8 +- .../{post_go19.go => initialism_index.go} | 3 - vendor/github.com/go-openapi/swag/loading.go | 105 +- .../github.com/go-openapi/swag/post_go18.go | 24 - vendor/github.com/go-openapi/swag/pre_go19.go | 70 - vendor/github.com/go-openapi/swag/util.go | 12 +- vendor/github.com/go-openapi/swag/yaml.go | 36 +- .../go-playground/validator/v10/README.md | 3 +- .../go-playground/validator/v10/baked_in.go | 65 +- .../go-playground/validator/v10/cache.go | 5 + .../go-playground/validator/v10/doc.go | 7 + .../go-playground/validator/v10/regexes.go | 2 + .../go-playground/validator/v10/util.go | 17 + .../go-playground/validator/v10/validator.go | 26 +- .../validator/v10/validator_instance.go | 1 + .../golang-jwt/jwt/v5/MIGRATION_GUIDE.md | 14 +- vendor/github.com/golang-jwt/jwt/v5/ecdsa.go | 4 +- .../github.com/golang-jwt/jwt/v5/ed25519.go | 7 +- .../golang-jwt/jwt/v5/errors_go_other.go | 2 +- vendor/github.com/golang-jwt/jwt/v5/hmac.go | 4 +- vendor/github.com/golang-jwt/jwt/v5/none.go | 2 +- vendor/github.com/golang-jwt/jwt/v5/parser.go | 85 +- .../golang-jwt/jwt/v5/parser_option.go | 8 + vendor/github.com/golang-jwt/jwt/v5/rsa.go | 4 +- .../github.com/golang-jwt/jwt/v5/rsa_pss.go | 4 +- vendor/github.com/golang-jwt/jwt/v5/token.go | 14 + vendor/github.com/golang-jwt/jwt/v5/types.go | 5 +- .../github.com/golang-jwt/jwt/v5/validator.go | 47 +- vendor/github.com/golang/protobuf/AUTHORS | 3 - .../github.com/golang/protobuf/CONTRIBUTORS | 3 - vendor/github.com/golang/protobuf/LICENSE | 28 - .../golang/protobuf/proto/buffer.go | 324 -- .../golang/protobuf/proto/defaults.go | 63 - .../golang/protobuf/proto/deprecated.go | 113 - .../golang/protobuf/proto/discard.go | 58 - .../golang/protobuf/proto/extensions.go | 356 -- .../golang/protobuf/proto/properties.go | 306 -- .../github.com/golang/protobuf/proto/proto.go | 167 - .../golang/protobuf/proto/registry.go | 317 -- .../golang/protobuf/proto/text_decode.go | 801 --- .../golang/protobuf/proto/text_encode.go | 560 -- .../github.com/golang/protobuf/proto/wire.go | 78 - .../golang/protobuf/proto/wrappers.go | 34 - vendor/github.com/google/uuid/CHANGELOG.md | 18 + vendor/github.com/google/uuid/CONTRIBUTING.md | 2 +- vendor/github.com/google/uuid/time.go | 21 +- vendor/github.com/google/uuid/uuid.go | 79 +- vendor/github.com/google/uuid/version6.go | 56 + vendor/github.com/google/uuid/version7.go | 75 + .../gorilla/websocket/.editorconfig | 20 + .../github.com/gorilla/websocket/.gitignore | 26 +- .../gorilla/websocket/.golangci.yml | 3 + vendor/github.com/gorilla/websocket/AUTHORS | 9 - vendor/github.com/gorilla/websocket/LICENSE | 39 +- vendor/github.com/gorilla/websocket/Makefile | 34 + vendor/github.com/gorilla/websocket/README.md | 19 +- vendor/github.com/gorilla/websocket/client.go | 44 +- .../gorilla/websocket/compression.go | 9 +- vendor/github.com/gorilla/websocket/conn.go | 83 +- vendor/github.com/gorilla/websocket/mask.go | 4 + vendor/github.com/gorilla/websocket/proxy.go | 17 +- vendor/github.com/gorilla/websocket/server.go | 42 +- .../gorilla/websocket/tls_handshake.go | 3 - .../gorilla/websocket/tls_handshake_116.go | 21 - vendor/github.com/gorilla/websocket/util.go | 19 +- .../gorilla/websocket/x_net_proxy.go | 473 -- .../github.com/hashicorp/golang-lru/v2/2q.go | 36 +- .../github.com/klauspost/compress/s2/dict.go | 19 + .../klauspost/compress/s2/encode.go | 2 +- .../klauspost/compress/s2/encode_best.go | 3 + .../klauspost/compress/s2/encode_go.go | 2 + .../klauspost/compress/s2/encodeblock_amd64.s | 1610 ++++-- .../github.com/klauspost/compress/s2/index.go | 20 +- .../github.com/klauspost/cpuid/v2/README.md | 14 +- vendor/github.com/klauspost/cpuid/v2/cpuid.go | 52 +- .../klauspost/cpuid/v2/detect_x86.go | 1 + .../klauspost/cpuid/v2/featureid_string.go | 407 +- .../github.com/labstack/echo/v4/CHANGELOG.md | 41 + vendor/github.com/labstack/echo/v4/README.md | 2 +- vendor/github.com/labstack/echo/v4/binder.go | 2 +- vendor/github.com/labstack/echo/v4/context.go | 4 +- vendor/github.com/labstack/echo/v4/echo.go | 2 +- .../labstack/echo/v4/middleware/body_limit.go | 10 +- .../echo/v4/middleware/context_timeout.go | 2 +- .../labstack/echo/v4/middleware/cors.go | 13 +- .../labstack/echo/v4/middleware/csrf.go | 4 +- .../labstack/echo/v4/middleware/proxy.go | 4 + .../labstack/echo/v4/middleware/request_id.go | 5 +- .../echo/v4/middleware/request_logger.go | 24 + .../labstack/echo/v4/middleware/rewrite.go | 2 +- .../labstack/echo/v4/middleware/util.go | 46 + .../labstack/gommon/random/random.go | 48 - .../github.com/mattn/go-isatty/isatty_bsd.go | 3 +- .../mattn/go-isatty/isatty_others.go | 5 +- .../mattn/go-isatty/isatty_tcgets.go | 3 +- .../{ => v2}/LICENSE | 0 .../{ => v2}/NOTICE | 0 .../{ => v2}/pbutil/.gitignore | 0 .../{ => v2}/pbutil/Makefile | 0 .../{ => v2}/pbutil/decode.go | 16 +- .../{ => v2}/pbutil/doc.go | 0 .../{ => v2}/pbutil/encode.go | 5 +- vendor/github.com/miekg/dns/README.md | 1 + vendor/github.com/miekg/dns/acceptfunc.go | 2 - vendor/github.com/miekg/dns/defaults.go | 32 +- vendor/github.com/miekg/dns/dnssec_keyscan.go | 3 +- vendor/github.com/miekg/dns/edns.go | 3 +- vendor/github.com/miekg/dns/generate.go | 33 +- .../miekg/dns/listen_no_reuseport.go | 10 +- .../github.com/miekg/dns/listen_reuseport.go | 30 +- vendor/github.com/miekg/dns/msg.go | 53 +- vendor/github.com/miekg/dns/msg_helpers.go | 50 +- vendor/github.com/miekg/dns/scan.go | 51 +- vendor/github.com/miekg/dns/scan_rr.go | 9 +- vendor/github.com/miekg/dns/server.go | 10 +- vendor/github.com/miekg/dns/svcb.go | 39 +- vendor/github.com/miekg/dns/types.go | 10 +- vendor/github.com/miekg/dns/version.go | 2 +- vendor/github.com/miekg/dns/xfr.go | 18 +- vendor/github.com/minio/minio-go/v7/README.md | 120 +- .../minio/minio-go/v7/api-get-object.go | 13 +- .../minio/minio-go/v7/api-get-options.go | 8 +- .../minio/minio-go/v7/api-object-tagging.go | 38 +- .../minio/minio-go/v7/api-put-object.go | 5 + .../minio-go/v7/api-putobject-snowball.go | 17 + vendor/github.com/minio/minio-go/v7/api.go | 2 +- .../v7/pkg/credentials/assume_role.go | 10 +- .../minio-go/v7/pkg/credentials/iam_aws.go | 106 +- .../minio-go/v7/pkg/lifecycle/lifecycle.go | 48 +- .../v7/pkg/notification/notification.go | 9 + .../minio/minio-go/v7/s3-endpoints.go | 1 + vendor/github.com/minio/minio-go/v7/utils.go | 8 + .../client_golang/prometheus/counter.go | 26 +- .../client_golang/prometheus/desc.go | 28 +- .../prometheus/expvar_collector.go | 2 +- .../client_golang/prometheus/gauge.go | 8 +- .../client_golang/prometheus/histogram.go | 168 +- .../prometheus/internal/difflib.go | 2 +- .../client_golang/prometheus/labels.go | 60 +- .../client_golang/prometheus/metric.go | 3 + .../prometheus/process_collector_other.go | 4 +- .../prometheus/process_collector_wasip1.go} | 22 +- .../prometheus/promhttp/instrument_server.go | 11 +- .../client_golang/prometheus/registry.go | 6 +- .../client_golang/prometheus/summary.go | 41 +- .../client_golang/prometheus/value.go | 55 +- .../client_golang/prometheus/vec.go | 106 +- .../prometheus/client_model/go/metrics.pb.go | 354 +- .../prometheus/common/expfmt/decode.go | 2 +- .../prometheus/common/expfmt/encode.go | 2 +- .../prometheus/procfs/Makefile.common | 2 +- .../prometheus/procfs/fs_statfs_notype.go | 4 +- .../prometheus/procfs/fs_statfs_type.go | 4 +- .../prometheus/procfs/mountstats.go | 83 +- .../prometheus/procfs/proc_fdinfo.go | 8 +- .../github.com/prometheus/procfs/proc_maps.go | 20 +- .../prometheus/procfs/proc_status.go | 21 +- .../shirou/gopsutil/v3/cpu/cpu_aix_nocgo.go | 11 +- .../shirou/gopsutil/v3/cpu/cpu_fallback.go | 4 +- .../shirou/gopsutil/v3/cpu/cpu_linux.go | 2 +- .../shirou/gopsutil/v3/cpu/cpu_netbsd.go | 119 + .../gopsutil/v3/cpu/cpu_netbsd_amd64.go | 9 + .../gopsutil/v3/cpu/cpu_netbsd_arm64.go | 9 + .../shirou/gopsutil/v3/cpu/cpu_solaris.go | 5 +- .../shirou/gopsutil/v3/disk/disk_aix_nocgo.go | 3 +- .../shirou/gopsutil/v3/disk/disk_fallback.go | 4 +- .../shirou/gopsutil/v3/disk/disk_linux.go | 64 +- .../shirou/gopsutil/v3/disk/disk_netbsd.go | 152 + .../gopsutil/v3/disk/disk_netbsd_amd64.go | 45 + .../gopsutil/v3/disk/disk_netbsd_arm64.go | 45 + .../shirou/gopsutil/v3/disk/disk_solaris.go | 5 +- .../gopsutil/v3/internal/common/common.go | 5 +- .../v3/internal/common/common_netbsd.go | 66 + .../github.com/shirou/gopsutil/v3/mem/mem.go | 2 + .../shirou/gopsutil/v3/mem/mem_aix_nocgo.go | 7 +- .../shirou/gopsutil/v3/mem/mem_bsd.go | 4 +- .../shirou/gopsutil/v3/mem/mem_fallback.go | 4 +- .../shirou/gopsutil/v3/mem/mem_linux.go | 6 + .../shirou/gopsutil/v3/mem/mem_netbsd.go | 87 + .../shirou/gopsutil/v3/net/net_linux.go | 7 +- .../shirou/gopsutil/v3/net/net_solaris.go | 5 +- .../gopsutil/v3/process/process_freebsd.go | 4 +- .../gopsutil/v3/process/process_linux.go | 21 +- .../gopsutil/v3/process/process_solaris.go | 7 +- vendor/github.com/sosodev/duration/.gitignore | 1 + vendor/github.com/sosodev/duration/LICENSE | 21 + .../github.com/sosodev/duration/duration.go | 301 ++ vendor/github.com/sosodev/duration/readme.md | 54 + .../tklauser/go-sysconf/.cirrus.yml | 2 +- .../tklauser/go-sysconf/sysconf_linux.go | 20 +- .../tklauser/go-sysconf/sysconf_netbsd.go | 18 +- .../github.com/tklauser/numcpus/.cirrus.yml | 2 +- .../tklauser/numcpus/numcpus_linux.go | 13 +- .../vektah/gqlparser/v2/ast/path.go | 3 + .../vektah/gqlparser/v2/ast/selection.go | 8 +- .../vektah/gqlparser/v2/gqlerror/error.go | 38 +- .../vektah/gqlparser/v2/gqlparser.go | 8 +- .../vektah/gqlparser/v2/lexer/lexer.go | 5 +- .../vektah/gqlparser/v2/parser/query.go | 4 +- .../vektah/gqlparser/v2/parser/schema.go | 44 +- .../vektah/gqlparser/v2/validator/schema.go | 35 +- .../vektah/gqlparser/v2/validator/walk.go | 2 +- vendor/go.uber.org/zap/.golangci.yml | 77 + vendor/go.uber.org/zap/CHANGELOG.md | 221 +- vendor/go.uber.org/zap/Makefile | 80 +- vendor/go.uber.org/zap/array.go | 127 + vendor/go.uber.org/zap/array_go118.go | 156 - vendor/go.uber.org/zap/buffer/buffer.go | 5 + vendor/go.uber.org/zap/error.go | 5 +- vendor/go.uber.org/zap/field.go | 25 +- vendor/go.uber.org/zap/http_handler.go | 19 +- .../stacktrace/stack.go} | 71 +- vendor/go.uber.org/zap/logger.go | 42 +- vendor/go.uber.org/zap/sink.go | 5 +- vendor/go.uber.org/zap/writer.go | 12 +- vendor/go.uber.org/zap/zapcore/core.go | 6 +- vendor/go.uber.org/zap/zapcore/entry.go | 4 +- vendor/go.uber.org/zap/zapcore/error.go | 5 +- .../go.uber.org/zap/zapcore/json_encoder.go | 147 +- vendor/go.uber.org/zap/zapcore/lazy_with.go | 54 + .../golang.org/x/crypto/argon2/blamka_amd64.s | 12 +- .../x/crypto/blake2b/blake2bAVX2_amd64.go | 2 +- .../x/crypto/blake2b/blake2bAVX2_amd64.s | 2 +- .../x/crypto/blake2b/blake2b_amd64.go | 24 - .../golang.org/x/crypto/blake2b/register.go | 2 - vendor/golang.org/x/crypto/cryptobyte/asn1.go | 13 +- .../golang.org/x/crypto/sha3/keccakf_amd64.s | 4 +- vendor/golang.org/x/net/http2/Dockerfile | 51 - vendor/golang.org/x/net/http2/Makefile | 3 - vendor/golang.org/x/net/http2/databuffer.go | 59 +- vendor/golang.org/x/net/http2/go111.go | 30 - vendor/golang.org/x/net/http2/go115.go | 27 - vendor/golang.org/x/net/http2/go118.go | 17 - vendor/golang.org/x/net/http2/not_go111.go | 21 - vendor/golang.org/x/net/http2/not_go115.go | 31 - vendor/golang.org/x/net/http2/not_go118.go | 17 - vendor/golang.org/x/net/http2/server.go | 110 +- vendor/golang.org/x/net/http2/transport.go | 36 +- vendor/golang.org/x/net/idna/go118.go | 1 - vendor/golang.org/x/net/idna/idna10.0.0.go | 1 - vendor/golang.org/x/net/idna/idna9.0.0.go | 1 - vendor/golang.org/x/net/idna/pre_go118.go | 1 - vendor/golang.org/x/net/idna/tables10.0.0.go | 1 - vendor/golang.org/x/net/idna/tables11.0.0.go | 1 - vendor/golang.org/x/net/idna/tables12.0.0.go | 1 - vendor/golang.org/x/net/idna/tables13.0.0.go | 1 - vendor/golang.org/x/net/idna/tables15.0.0.go | 1 - vendor/golang.org/x/net/idna/tables9.0.0.go | 1 - vendor/golang.org/x/net/idna/trie12.0.0.go | 1 - vendor/golang.org/x/net/idna/trie13.0.0.go | 1 - .../x/net/internal/socket/cmsghdr.go | 1 - .../x/net/internal/socket/cmsghdr_bsd.go | 1 - .../internal/socket/cmsghdr_linux_32bit.go | 2 - .../internal/socket/cmsghdr_linux_64bit.go | 2 - .../internal/socket/cmsghdr_solaris_64bit.go | 1 - .../x/net/internal/socket/cmsghdr_stub.go | 1 - .../x/net/internal/socket/cmsghdr_unix.go | 1 - .../net/internal/socket/complete_dontwait.go | 1 - .../internal/socket/complete_nodontwait.go | 1 - .../golang.org/x/net/internal/socket/empty.s | 1 - .../x/net/internal/socket/error_unix.go | 1 - .../x/net/internal/socket/iovec_32bit.go | 2 - .../x/net/internal/socket/iovec_64bit.go | 2 - .../internal/socket/iovec_solaris_64bit.go | 1 - .../x/net/internal/socket/iovec_stub.go | 1 - .../x/net/internal/socket/mmsghdr_stub.go | 1 - .../x/net/internal/socket/mmsghdr_unix.go | 1 - .../x/net/internal/socket/msghdr_bsd.go | 1 - .../x/net/internal/socket/msghdr_bsdvar.go | 1 - .../net/internal/socket/msghdr_linux_32bit.go | 2 - .../net/internal/socket/msghdr_linux_64bit.go | 2 - .../internal/socket/msghdr_solaris_64bit.go | 1 - .../x/net/internal/socket/msghdr_stub.go | 1 - .../x/net/internal/socket/msghdr_zos_s390x.go | 1 - .../x/net/internal/socket/norace.go | 1 - .../golang.org/x/net/internal/socket/race.go | 1 - .../x/net/internal/socket/rawconn_mmsg.go | 1 - .../x/net/internal/socket/rawconn_msg.go | 1 - .../x/net/internal/socket/rawconn_nommsg.go | 1 - .../x/net/internal/socket/rawconn_nomsg.go | 1 - .../x/net/internal/socket/sys_bsd.go | 1 - .../x/net/internal/socket/sys_const_unix.go | 1 - .../x/net/internal/socket/sys_linux.go | 1 - .../net/internal/socket/sys_linux_loong64.go | 1 - .../net/internal/socket/sys_linux_riscv64.go | 1 - .../x/net/internal/socket/sys_posix.go | 1 - .../x/net/internal/socket/sys_stub.go | 1 - .../x/net/internal/socket/sys_unix.go | 1 - .../x/net/internal/socket/zsys_aix_ppc64.go | 1 - .../net/internal/socket/zsys_linux_loong64.go | 1 - .../net/internal/socket/zsys_linux_riscv64.go | 1 - .../golang.org/x/net/internal/socks/client.go | 168 + .../golang.org/x/net/internal/socks/socks.go | 317 ++ vendor/golang.org/x/net/ipv4/control_bsd.go | 1 - .../golang.org/x/net/ipv4/control_pktinfo.go | 1 - vendor/golang.org/x/net/ipv4/control_stub.go | 1 - vendor/golang.org/x/net/ipv4/control_unix.go | 1 - vendor/golang.org/x/net/ipv4/icmp_stub.go | 1 - vendor/golang.org/x/net/ipv4/payload_cmsg.go | 1 - .../golang.org/x/net/ipv4/payload_nocmsg.go | 1 - vendor/golang.org/x/net/ipv4/sockopt_posix.go | 1 - vendor/golang.org/x/net/ipv4/sockopt_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_aix.go | 1 - vendor/golang.org/x/net/ipv4/sys_asmreq.go | 1 - .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_asmreqn.go | 1 - .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_bpf.go | 1 - vendor/golang.org/x/net/ipv4/sys_bpf_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_bsd.go | 1 - vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 1 - .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_stub.go | 1 - .../golang.org/x/net/ipv4/zsys_aix_ppc64.go | 1 - .../x/net/ipv4/zsys_linux_loong64.go | 1 - .../x/net/ipv4/zsys_linux_riscv64.go | 1 - .../x/net/ipv6/control_rfc2292_unix.go | 1 - .../x/net/ipv6/control_rfc3542_unix.go | 1 - vendor/golang.org/x/net/ipv6/control_stub.go | 1 - vendor/golang.org/x/net/ipv6/control_unix.go | 1 - vendor/golang.org/x/net/ipv6/icmp_bsd.go | 1 - vendor/golang.org/x/net/ipv6/icmp_stub.go | 1 - vendor/golang.org/x/net/ipv6/payload_cmsg.go | 1 - .../golang.org/x/net/ipv6/payload_nocmsg.go | 1 - vendor/golang.org/x/net/ipv6/sockopt_posix.go | 1 - vendor/golang.org/x/net/ipv6/sockopt_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_aix.go | 1 - vendor/golang.org/x/net/ipv6/sys_asmreq.go | 1 - .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_bpf.go | 1 - vendor/golang.org/x/net/ipv6/sys_bpf_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_bsd.go | 1 - vendor/golang.org/x/net/ipv6/sys_ssmreq.go | 1 - .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_stub.go | 1 - .../golang.org/x/net/ipv6/zsys_aix_ppc64.go | 1 - .../x/net/ipv6/zsys_linux_loong64.go | 1 - .../x/net/ipv6/zsys_linux_riscv64.go | 1 - vendor/golang.org/x/net/proxy/dial.go | 54 + vendor/golang.org/x/net/proxy/direct.go | 31 + vendor/golang.org/x/net/proxy/per_host.go | 155 + vendor/golang.org/x/net/proxy/proxy.go | 149 + vendor/golang.org/x/net/proxy/socks5.go | 42 + .../x/net/publicsuffix/data/children | Bin 2876 -> 2976 bytes .../golang.org/x/net/publicsuffix/data/nodes | Bin 48280 -> 46610 bytes .../golang.org/x/net/publicsuffix/data/text | 2 +- vendor/golang.org/x/net/publicsuffix/table.go | 14 +- vendor/golang.org/x/sys/execabs/execabs.go | 102 - .../golang.org/x/sys/execabs/execabs_go118.go | 17 - .../golang.org/x/sys/execabs/execabs_go119.go | 20 - vendor/golang.org/x/sys/unix/fcntl.go | 2 +- vendor/golang.org/x/sys/unix/ioctl_linux.go | 5 + vendor/golang.org/x/sys/unix/mkerrors.sh | 40 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 2 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 26 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 14 + .../golang.org/x/sys/unix/syscall_solaris.go | 2 +- .../x/sys/unix/syscall_zos_s390x.go | 2 +- vendor/golang.org/x/sys/unix/zerrors_linux.go | 56 +- .../golang.org/x/sys/unix/zsyscall_linux.go | 15 + .../x/sys/unix/zsyscall_openbsd_386.go | 28 +- .../x/sys/unix/zsyscall_openbsd_386.s | 5 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 28 +- .../x/sys/unix/zsyscall_openbsd_amd64.s | 5 + .../x/sys/unix/zsyscall_openbsd_arm.go | 28 +- .../x/sys/unix/zsyscall_openbsd_arm.s | 5 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 28 +- .../x/sys/unix/zsyscall_openbsd_arm64.s | 5 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 28 +- .../x/sys/unix/zsyscall_openbsd_mips64.s | 5 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 28 +- .../x/sys/unix/zsyscall_openbsd_ppc64.s | 6 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 28 +- .../x/sys/unix/zsyscall_openbsd_riscv64.s | 5 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 32 + .../x/sys/windows/syscall_windows.go | 3 + .../x/sys/windows/zsyscall_windows.go | 28 + vendor/golang.org/x/time/rate/rate.go | 2 + .../x/tools/go/ast/astutil/enclosing.go | 8 +- .../x/tools/go/ast/astutil/rewrite.go | 8 +- .../x/tools/go/buildutil/fakecontext.go | 3 +- .../x/tools/go/buildutil/overlay.go | 3 +- .../golang.org/x/tools/go/internal/cgo/cgo.go | 6 +- .../x/tools/go/internal/cgo/cgo_pkgconfig.go | 2 +- .../tools/go/internal/packagesdriver/sizes.go | 24 +- vendor/golang.org/x/tools/go/loader/loader.go | 5 +- vendor/golang.org/x/tools/go/packages/doc.go | 34 +- .../x/tools/go/packages/external.go | 2 +- .../golang.org/x/tools/go/packages/golist.go | 92 +- .../x/tools/go/packages/golist_overlay.go | 492 -- .../x/tools/go/packages/packages.go | 185 +- .../x/tools/go/types/objectpath/objectpath.go | 130 +- vendor/golang.org/x/tools/imports/forward.go | 4 +- .../x/tools/internal/event/keys/util.go | 21 + .../x/tools/internal/fastwalk/fastwalk.go | 196 - .../internal/fastwalk/fastwalk_darwin.go | 119 - .../fastwalk/fastwalk_dirent_fileno.go | 14 - .../internal/fastwalk/fastwalk_dirent_ino.go | 15 - .../fastwalk/fastwalk_dirent_namlen_bsd.go | 14 - .../fastwalk/fastwalk_dirent_namlen_linux.go | 29 - .../internal/fastwalk/fastwalk_portable.go | 38 - .../tools/internal/fastwalk/fastwalk_unix.go | 153 - .../x/tools/internal/gcimporter/gcimporter.go | 3 +- .../x/tools/internal/gcimporter/iexport.go | 31 +- .../x/tools/internal/gcimporter/iimport.go | 39 +- .../x/tools/internal/gocommand/invoke.go | 29 +- .../x/tools/internal/gopathwalk/walk.go | 239 +- .../x/tools/internal/imports/fix.go | 63 +- .../x/tools/internal/imports/mod.go | 5 +- .../x/tools/internal/imports/zstdlib.go | 230 + .../internal/packagesinternal/packages.go | 8 - .../x/tools/internal/typeparams/common.go | 24 +- .../x/tools/internal/typeparams/coretype.go | 16 +- .../internal/typeparams/enabled_go117.go | 12 - .../internal/typeparams/enabled_go118.go | 15 - .../x/tools/internal/typeparams/normalize.go | 20 +- .../x/tools/internal/typeparams/termlist.go | 2 +- .../internal/typeparams/typeparams_go117.go | 197 - .../internal/typeparams/typeparams_go118.go | 151 - .../x/tools/internal/typeparams/typeterm.go | 9 +- .../x/tools/internal/typesinternal/types.go | 16 - .../x/tools/internal/versions/gover.go | 172 + .../x/tools/internal/versions/types.go | 19 + .../x/tools/internal/versions/types_go121.go | 20 + .../x/tools/internal/versions/types_go122.go | 24 + .../x/tools/internal/versions/versions.go | 52 + .../protobuf/encoding/prototext/decode.go | 8 +- .../protobuf/encoding/prototext/encode.go | 4 +- .../protobuf/encoding/protowire/wire.go | 28 +- .../protobuf/internal/descfmt/stringer.go | 183 +- .../protobuf/internal/filedesc/desc.go | 47 +- .../protobuf/internal/genid/descriptor_gen.go | 212 +- .../protobuf/internal/impl/codec_gen.go | 113 +- .../protobuf/internal/impl/legacy_message.go | 19 +- .../protobuf/internal/impl/message.go | 17 +- .../protobuf/internal/impl/pointer_reflect.go | 36 + .../protobuf/internal/impl/pointer_unsafe.go | 40 + ...ings_unsafe.go => strings_unsafe_go120.go} | 4 +- .../internal/strs/strings_unsafe_go121.go | 74 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/proto/decode.go | 2 +- .../google.golang.org/protobuf/proto/doc.go | 58 +- .../protobuf/proto/encode.go | 2 +- .../protobuf/proto/extension.go | 2 +- .../google.golang.org/protobuf/proto/merge.go | 2 +- .../google.golang.org/protobuf/proto/proto.go | 18 +- .../protobuf/reflect/protodesc/desc.go | 276 - .../protobuf/reflect/protodesc/desc_init.go | 248 - .../reflect/protodesc/desc_resolve.go | 286 - .../reflect/protodesc/desc_validate.go | 374 -- .../protobuf/reflect/protodesc/proto.go | 252 - .../protobuf/reflect/protoreflect/proto.go | 83 +- .../reflect/protoreflect/source_gen.go | 62 +- .../protobuf/reflect/protoreflect/type.go | 44 +- .../protobuf/reflect/protoreflect/value.go | 24 +- .../reflect/protoreflect/value_equal.go | 8 +- .../reflect/protoreflect/value_union.go | 44 +- ...{value_unsafe.go => value_unsafe_go120.go} | 4 +- .../protoreflect/value_unsafe_go121.go | 87 + .../reflect/protoregistry/registry.go | 24 +- .../types/descriptorpb/descriptor.pb.go | 4605 ----------------- vendor/modules.txt | 134 +- 562 files changed, 14318 insertions(+), 16394 deletions(-) create mode 100755 internal/testhelper/sigpropagate/sigpropagate create mode 100644 vendor/github.com/99designs/gqlgen/graphql/duration.go create mode 100644 vendor/github.com/99designs/gqlgen/graphql/uuid.go create mode 100644 vendor/github.com/datarhei/joy4/codec/av1parser/parser.go create mode 100644 vendor/github.com/datarhei/joy4/codec/hevcparser/parser.go create mode 100644 vendor/github.com/datarhei/joy4/codec/vp9parser/parser.go create mode 100644 vendor/github.com/go-openapi/jsonpointer/.golangci.yml delete mode 100644 vendor/github.com/go-openapi/spec/appveyor.yml delete mode 100644 vendor/github.com/go-openapi/spec/bindata.go create mode 100644 vendor/github.com/go-openapi/spec/embed.go create mode 100644 vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json create mode 100644 vendor/github.com/go-openapi/spec/schemas/v2/schema.json delete mode 100644 vendor/github.com/go-openapi/spec/url_go18.go rename vendor/github.com/go-openapi/swag/{post_go19.go => initialism_index.go} (98%) delete mode 100644 vendor/github.com/go-openapi/swag/post_go18.go delete mode 100644 vendor/github.com/go-openapi/swag/pre_go19.go delete mode 100644 vendor/github.com/golang/protobuf/AUTHORS delete mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/protobuf/LICENSE delete mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go delete mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go delete mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/golang/protobuf/proto/properties.go delete mode 100644 vendor/github.com/golang/protobuf/proto/proto.go delete mode 100644 vendor/github.com/golang/protobuf/proto/registry.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wire.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/google/uuid/version6.go create mode 100644 vendor/github.com/google/uuid/version7.go create mode 100644 vendor/github.com/gorilla/websocket/.editorconfig create mode 100644 vendor/github.com/gorilla/websocket/.golangci.yml delete mode 100644 vendor/github.com/gorilla/websocket/AUTHORS create mode 100644 vendor/github.com/gorilla/websocket/Makefile delete mode 100644 vendor/github.com/gorilla/websocket/tls_handshake_116.go delete mode 100644 vendor/github.com/gorilla/websocket/x_net_proxy.go delete mode 100644 vendor/github.com/labstack/gommon/random/random.go rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/LICENSE (100%) rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/NOTICE (100%) rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/pbutil/.gitignore (100%) rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/pbutil/Makefile (100%) rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/pbutil/decode.go (83%) rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/pbutil/doc.go (100%) rename vendor/github.com/matttproud/golang_protobuf_extensions/{ => v2}/pbutil/encode.go (91%) rename vendor/github.com/{go-openapi/swag/pre_go18.go => prometheus/client_golang/prometheus/process_collector_wasip1.go} (64%) create mode 100644 vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_amd64.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_arm64.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_amd64.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_arm64.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/internal/common/common_netbsd.go create mode 100644 vendor/github.com/shirou/gopsutil/v3/mem/mem_netbsd.go create mode 100644 vendor/github.com/sosodev/duration/.gitignore create mode 100644 vendor/github.com/sosodev/duration/LICENSE create mode 100644 vendor/github.com/sosodev/duration/duration.go create mode 100644 vendor/github.com/sosodev/duration/readme.md create mode 100644 vendor/go.uber.org/zap/.golangci.yml delete mode 100644 vendor/go.uber.org/zap/array_go118.go rename vendor/go.uber.org/zap/{stacktrace.go => internal/stacktrace/stack.go} (75%) create mode 100644 vendor/go.uber.org/zap/zapcore/lazy_with.go delete mode 100644 vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go delete mode 100644 vendor/golang.org/x/net/http2/Dockerfile delete mode 100644 vendor/golang.org/x/net/http2/Makefile delete mode 100644 vendor/golang.org/x/net/http2/go111.go delete mode 100644 vendor/golang.org/x/net/http2/go115.go delete mode 100644 vendor/golang.org/x/net/http2/go118.go delete mode 100644 vendor/golang.org/x/net/http2/not_go111.go delete mode 100644 vendor/golang.org/x/net/http2/not_go115.go delete mode 100644 vendor/golang.org/x/net/http2/not_go118.go create mode 100644 vendor/golang.org/x/net/internal/socks/client.go create mode 100644 vendor/golang.org/x/net/internal/socks/socks.go create mode 100644 vendor/golang.org/x/net/proxy/dial.go create mode 100644 vendor/golang.org/x/net/proxy/direct.go create mode 100644 vendor/golang.org/x/net/proxy/per_host.go create mode 100644 vendor/golang.org/x/net/proxy/proxy.go create mode 100644 vendor/golang.org/x/net/proxy/socks5.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs_go118.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs_go119.go create mode 100644 vendor/golang.org/x/tools/internal/event/keys/util.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_darwin.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go delete mode 100644 vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go delete mode 100644 vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go delete mode 100644 vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go delete mode 100644 vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go create mode 100644 vendor/golang.org/x/tools/internal/versions/gover.go create mode 100644 vendor/golang.org/x/tools/internal/versions/types.go create mode 100644 vendor/golang.org/x/tools/internal/versions/types_go121.go create mode 100644 vendor/golang.org/x/tools/internal/versions/types_go122.go create mode 100644 vendor/golang.org/x/tools/internal/versions/versions.go rename vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe.go => strings_unsafe_go120.go} (96%) create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/proto.go rename vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe.go => value_unsafe_go120.go} (97%) create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go delete mode 100644 vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go diff --git a/go.mod b/go.mod index 5b678d6f..51d11502 100644 --- a/go.mod +++ b/go.mod @@ -3,33 +3,33 @@ module github.com/datarhei/core/v16 go 1.18 require ( - github.com/99designs/gqlgen v0.17.36 + github.com/99designs/gqlgen v0.17.42 github.com/Masterminds/semver/v3 v3.2.1 github.com/atrox/haikunatorgo/v2 v2.0.1 - github.com/caddyserver/certmagic v0.19.2 + github.com/caddyserver/certmagic v0.20.0 github.com/datarhei/gosrt v0.5.5 - github.com/datarhei/joy4 v0.0.0-20230505074825-fde05957445a - github.com/go-playground/validator/v10 v10.15.3 + github.com/datarhei/joy4 v0.0.0-20240103155326-704dff2c27fb + github.com/go-playground/validator/v10 v10.16.0 github.com/gobwas/glob v0.2.3 - github.com/golang-jwt/jwt/v5 v5.0.0 - github.com/google/uuid v1.3.1 + github.com/golang-jwt/jwt/v5 v5.2.0 + github.com/google/uuid v1.5.0 github.com/invopop/jsonschema v0.4.0 github.com/joho/godotenv v1.5.1 github.com/labstack/echo-jwt v0.0.0-20221127215225-c84d41a71003 - github.com/labstack/echo/v4 v4.11.1 + github.com/labstack/echo/v4 v4.11.4 github.com/lithammer/shortuuid/v4 v4.0.0 - github.com/mattn/go-isatty v0.0.19 - github.com/minio/minio-go/v7 v7.0.63 + github.com/mattn/go-isatty v0.0.20 + github.com/minio/minio-go/v7 v7.0.66 github.com/prep/average v0.0.0-20200506183628-d26c465f48c3 - github.com/prometheus/client_golang v1.16.0 - github.com/shirou/gopsutil/v3 v3.23.8 + github.com/prometheus/client_golang v1.18.0 + github.com/shirou/gopsutil/v3 v3.23.12 github.com/stretchr/testify v1.8.4 github.com/swaggo/echo-swagger v1.4.1 github.com/swaggo/swag v1.16.2 - github.com/vektah/gqlparser/v2 v2.5.8 + github.com/vektah/gqlparser/v2 v2.5.10 github.com/xeipuuv/gojsonschema v1.2.0 - go.uber.org/zap v1.25.0 - golang.org/x/mod v0.12.0 + go.uber.org/zap v1.26.0 + golang.org/x/mod v0.14.0 ) require ( @@ -41,34 +41,33 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/spec v0.20.9 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/swag v0.22.7 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.6 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/iancoleman/orderedmap v0.2.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/labstack/gommon v0.4.0 // indirect + github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/labstack/gommon v0.4.2 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/libdns/libdns v0.2.1 // indirect - github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect + github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mholt/acmez v1.2.0 // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/miekg/dns v1.1.57 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -76,16 +75,17 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/rs/xid v1.5.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sosodev/duration v1.2.0 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/urfave/cli/v2 v2.25.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect @@ -95,13 +95,13 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.17.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 72d2582c..1033f36c 100644 --- a/go.sum +++ b/go.sum @@ -1,33 +1,32 @@ -github.com/99designs/gqlgen v0.17.36 h1:u/o/rv2SZ9s5280dyUOOrkpIIkr/7kITMXYD3rkJ9go= -github.com/99designs/gqlgen v0.17.36/go.mod h1:6RdyY8puhCoWAQVr2qzF2OMVfudQzc8ACxzpzluoQm4= +github.com/99designs/gqlgen v0.17.42 h1:BVWDOb2VVHQC5k3m6oa0XhDnxltLLrU4so7x/u39Zu4= +github.com/99designs/gqlgen v0.17.42/go.mod h1:GQ6SyMhwFbgHR0a8r2Wn8fYgEwPxxmndLFPhU63+cJE= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/atrox/haikunatorgo/v2 v2.0.1 h1:FCVx2KL2YvZtI1rI9WeEHxeLRrKGr0Dd4wfCJiUXupc= github.com/atrox/haikunatorgo/v2 v2.0.1/go.mod h1:BBQmx2o+1Z5poziaHRgddAZKOpijwfKdAmMnSYlFK70= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benburkert/openpgp v0.0.0-20160410205803-c2471f86866c h1:8XZeJrs4+ZYhJeJ2aZxADI2tGADS15AzIF8MQ8XAhT4= github.com/benburkert/openpgp v0.0.0-20160410205803-c2471f86866c/go.mod h1:x1vxHcL/9AVzuk5HOloOEPrtJY0MaalYr78afXZ+pWI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/caddyserver/certmagic v0.19.2 h1:HZd1AKLx4592MalEGQS39DKs2ZOAJCEM/xYPMQ2/ui0= -github.com/caddyserver/certmagic v0.19.2/go.mod h1:fsL01NomQ6N+kE2j37ZCnig2MFosG+MIO4ztnmG/zz8= +github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc= +github.com/caddyserver/certmagic v0.20.0/go.mod h1:N4sXgpICQUskEWpj7zVzvWD41p3NYacrNoZYiRM2jTg= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/datarhei/gosrt v0.5.5 h1:4Xx4v7pn/rz6EaWhZRE37fROW+rry0y4yBHZBkq5d8g= github.com/datarhei/gosrt v0.5.5/go.mod h1:In1zba2/999S1d+ENIJ0h9s3alHO3FvCNrIpykxYbEE= -github.com/datarhei/joy4 v0.0.0-20230505074825-fde05957445a h1:Tf4DSHY1xruBglr+yYP5Wct7czM86GKMYgbXH8a7OFo= -github.com/datarhei/joy4 v0.0.0-20230505074825-fde05957445a/go.mod h1:Jcw/6jZDQQmPx8A7INEkXmuEF7E9jjBbSTfVSLwmiQw= +github.com/datarhei/joy4 v0.0.0-20240103155326-704dff2c27fb h1:zzF0wtKJKMIDlqHfjBl5WgTFO3LeKBoJNInyOrkJZPc= +github.com/datarhei/joy4 v0.0.0-20240103155326-704dff2c27fb/go.mod h1:Jcw/6jZDQQmPx8A7INEkXmuEF7E9jjBbSTfVSLwmiQw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,59 +34,48 @@ github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+ github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= -github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= -github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/swag v0.22.7 h1:JWrc1uc/P9cSomxfnsFSVWoE1FW6bNbrVPmpQYpCcR8= +github.com/go-openapi/swag v0.22.7/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.3 h1:S+sSpunYjNPDuXkWbK+x+bA7iXiW296KG4dL3X7xUZo= -github.com/go-playground/validator/v10 v10.15.3/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= -github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/golang-lru/v2 v2.0.6 h1:3xi/Cafd1NaoEnS/yDssIiuVeDVywU0QdFGl3aQaQHM= -github.com/hashicorp/golang-lru/v2 v2.0.6/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.2.0 h1:sq1N/TFpYH++aViPcaKjys3bDClUEU7s5B+z6jq8pNA= github.com/iancoleman/orderedmap v0.2.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= @@ -99,25 +87,20 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo-jwt v0.0.0-20221127215225-c84d41a71003 h1:FyalHKl9hnJvhNbrABJXXjC2hG7gvIF0ioW9i0xHNQU= github.com/labstack/echo-jwt v0.0.0-20221127215225-c84d41a71003/go.mod h1:ovRFgyKvi73jQIFCWz9ByQwzhIyohkzY0MFAlPGyr8Q= -github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= -github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8= +github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/libdns/libdns v0.2.1 h1:Wu59T7wSHRgtA0cfxC+n1c/e+O3upJGWytknkmFEDis= @@ -125,30 +108,25 @@ github.com/libdns/libdns v0.2.1/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSO github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c= github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= -github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= +github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30= github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= +github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= -github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= +github.com/minio/minio-go/v7 v7.0.66 h1:bnTOXOHjOqv/gcMuiVbN9o2ngRItvqE774dG9nq0Dzw= +github.com/minio/minio-go/v7 v7.0.66/go.mod h1:DHAgmyQEGdW3Cif0UooKOyrT3Vxs82zNdV6tkKhRtbs= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -158,7 +136,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -167,40 +144,38 @@ github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3g github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prep/average v0.0.0-20200506183628-d26c465f48c3 h1:Y7qCvg282QmlyrVQuL2fgGwebuw7zvfnRym09r+dUGc= github.com/prep/average v0.0.0-20200506183628-d26c465f48c3/go.mod h1:0ZE5gcyWKS151WBDIpmLshHY0l+3edpuKnBUWVVbWKk= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= -github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us= +github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -210,19 +185,20 @@ github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc= github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vektah/gqlparser/v2 v2.5.8 h1:pm6WOnGdzFOCfcQo9L3+xzW51mKrlwTEg4Wr7AH1JW4= -github.com/vektah/gqlparser/v2 v2.5.8/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= +github.com/vektah/gqlparser/v2 v2.5.10 h1:6zSM4azXC9u4Nxy5YmdmGu4uKamfwsdKTwp5zsEealU= +github.com/vektah/gqlparser/v2 v2.5.10/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -243,21 +219,17 @@ github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -265,32 +237,24 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/testhelper/sigpropagate/sigpropagate b/internal/testhelper/sigpropagate/sigpropagate new file mode 100755 index 0000000000000000000000000000000000000000..5ae30f6514cd305b3efac0aebb2763fce94b6459 GIT binary patch literal 2243970 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 rg&p1sDI?>{P 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%0AW=mecZ?5bW5Jot3AFfLZ_elKov(C;Rd;?M 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%0AROfc%v4F3|)$1w7~E27aTxCMwsB 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

u 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

9$*^hZA!-SHH88b8lr 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�TwB&>#$7ZL<3ru-0dW39B+ftY$=QhJMTqpdShFRx_!xrN{)X&;!N#=mDPj>Kc>2y4nf zV>RDkPl-vB#)VA~iER*nno5`J_G+c68LPzWZ1j1TOaGQ`RQIW=B)dzlUccrRBC`u| z=t@|sU7aq*a^aY+CfRORvB^ByYV* z6Ub~DVF3)O0w9s1#CF%vGihSyYiB#!Zzn74xZ@0$s@QQiyVAmJzDHm3bQ0zo%lg=? zCZr1H?p8Y`7;^`_c&}GZNn`5H4|}q&&xL_ys6)+BHBokj{QUY%b+FFeY{t2TE6WC5 z%vXlWj<>Wgvnr_W1-RtII=;m;sPlBl@!~7rLhj>08zZx;!HWsGZRSOBVOqA)q#N=d zt5+M|O&vCM`0QS3pn?-L`LwC%OjC7Srb~FVrCd%~wJQ^+qXzwYOSq7_3tg-ft5EPh zY7d+*h(h?8Z{(KK&W5s0-V2v$$cmL>ME!|gVyz^jzSfq&W$jh!Rhgps@E>D~D`NCB z*~!KO7w-E}HjYB3-Vh}Y20l&})4;8Vwy6dD&%R9DpUV%@*d|gs|K^ewqQCN5CL4%^ zO^MDHFy2!)_)!f|_aw&&{800fvZTg}a84F(Wr#N@>b|T8tH-1{%6@x6s=t#a0Y< zJrtqSvGWV0NduMShy!1^=&mGL^^iHJXqh2joz%J{f}n?5am%J&1Xqi=ur*{L)=ERi zbqEC$-2x(Vw&!Ykw`rDqJ5R`KL??SjIG8NYZupq&}9R+!in)%;$D6%*Z3|I zGjU(h3(SR0(5&Mqy?&%>S{Zh(V_>>2vGmCY^U}4|LDEQg5w0^0h@-mBs@s)x#RXb` z*v`z%b8o!yJjBwAeYb`iFH`*vb=Ju4Nf~??X)w>0vVE2T9*(UBOv-Np{1;-{A-LAJ z8Erz-ug*kkZ(Vhgwn?p@q_@zyL@6sb*34BQfOoBHtV1e$D0V!V6P&+zW%;G-x6yT0 z{g^iu6&(7SlFePTeM~-I!%t!OUYFn4YEsF5wCs%){YqW>66RR!}iYBuxSfiapb3;ED&d=Y)BW-2e!gj6s{abT4tc zUHyzRY&yKuvk) zHzT%MHeJVs9)4+x8gJV152-OlMy5@rH_dLk8Y@G48X7)$=!K<8T^1N4di~s`OLt+rf}NGj>4;=h=)|vlAJkQ?|sMG>{>t_i6H_-OY>a zl0jpeV@M@!v96A}p zb*>hmGqP+OqiD9aF+t7blpbH!WmHaFN$sa`1mT4g5H@YlqENYSgr=hAn7MV7O7u-S zYPD7j7jiZ=U6t^PMOR$Be8ozBQkR1=Yt{~tyXgJsfT$(kG{2f(6}%qxLt8~=Vj zqYNy%sZo`R%~yOc#DCtzWhJR^w8JsjiOKpl`EY0JZ;^%h1p-h~q8UrN<;GS6wwAY_ z_htfSQ%TsfT#TpnRXXCD-Ic=OtIKUBu58 zt|S@kRB_NpQ*8oR%a(xO8t762>pK>cn^FQ*me$}>>P=8%#{2ir)C?Pan+uao%|G^ zMx;2Cf0iG^4#<#7i_|6Sji1M+f2ODCL+ahn5;S%7?4i(THH=qGz-v+1RH2Dw1~1R$cIX5|EogYxxg=?| zng$8sG*VI->l+F|X@zR%m#kw_7Xn8Pt>ElTi)JaUATv)5mKHZGL1;oBS{FQVPaLdC*3l@$h@WA(ayo4d2^;+l(yz8+nC~B z_y)nPNwxI*N9jj7IN^<21offY8+Dn1A4#z$k_H4)gvuTZQB$$Ev?o=*)9HN>j^B7A zlX^mqaxcFPa$EUfoTVD+C7dnysndlZj?(|(IB74`O*3O0+D{gTsI@3l|f~8>F4@TI!4_QC3CJ{ zM^%GE*&H+N;2Oc%+_=KgFjD~GN5!~U3B?Y!%I9##o5L8K+$M=Sjlr!-`duS-Cg;yD zisJbfWs0JuC|9bC`J~=%Zp-kQH&v=)>_LnNHs_;*VbBE6yUf~d?{YGwAOMToKzIg7R6abv85;$76*y3uP9zo6t60Z(~9EcqIhLdoKh4U&Z)JWQfoPU==m1K zc={jL2xZrAiMbfTpW02NapbulmD>ZW1yo5r`)FC)jr2`?>*m!3*kWOn?^27Xa1>L(IaQ6t;Ud>eKm86lxf zI37*;)P~*n=9XgMik9La&o7i9&n+2OuG1e1qNPOzHR0r&4;L+muoa)E6;IcmCa=nV z(K7Dhy)FCj(QJiP8#$_|)l`0}0*a?b0JX6ML5SmP&l5BFMExZ%~k=aYM z!{)Lm{;c+A!^}IO5KHpsVK$GoB-Tdp5=~B;o0Viz(PZf$74U(X|9Zc0IXG`O%1az1 zqso>Mr^&$jW?(Ec;$#^Z%M7i_jLKVX!@t))Y~bXgfmPY#VT|;}xWK7PJcIbJ9=lL}^ z6O@U_pRyynm7l!AkH+LMWTd=#B0h|LEjh}sf;S_-V|nN<%qVY4&#;uCD*eCk;PU!^ ztvpnJ(RNg!vWqurN+>4BrCaJ+b~(`#-^Bv5tBqZl>}pdCSN2_W@nyKjYW5UW=|+CS zO}xzwe}s+IGQ0Rs-{nv3IqXjlUk1qXJEL!DSAmvcCcCgc>Mg&jAlVfcgLi3Xq&K^zhYXkQvoIO& z?Yqk0vzZ-h84mM+GMqEB@0v;|Oe=p9BD>;JUl8djP5@xMS86$=eoXFFw&JO<>x1{C zlWeTkcjae7a%1uEN8ioPyR^%%^_IyMMXjmv9jNb$SAS(!IHRaX z*;US`C%?k*WQ-^_&gh%U??f!JdpK^laQLS0dWzbJhJEBPvs-$Gd3qF1F=2vz7oQY6 z?kL^hF0b11J5xNfTi$V$MzgYh6t8HJhGsx~Q=1Jt@uhq@*TEgW;xG%T{NE~W9EPB`Kni9^{{S84#VE6fS0 z%su^{2D4}NtbrrK8BU2Q?V2Nw(y|OAEIu9XrBGt^5lWxvP5hCaVENPdUci6xU9@mN zj7d}2oA4ZVwWZR19uECQxEV&7g`+4YQWVY$d#=_zQ>vRgTjVcCuEF6db*yQMQr zKT9ohV`X!~OHT?n>bE1DqBe4b>>j?S!NXUnd0a*F$kML9ul!Ezvg=V>4SST8(vz1b zvDDA^ycGA;Sj+BGKthF+5 zmg%O=C{4l&aJVMKdhoS=OIBRL|I;r|8VR z(OX`QT+r!O=HjHx{m9|QW{voUx8yS#n`f4B4{Nf>ge`4jTSiN`hg5Gu&CA)su>@xP zY6Uw&qjk$+s_ziheMpn52uJfmnKGV{gY$$qucUjKHQJPAK5GjWSMx|~9173I<(}>( zi&OX(Qf<_63P<$dpS;c>SRspU@lj?$*SBJ%My5vki)I%Ii{^P%E%+=?ET?&uXcqVJ znkhH%DC4q5T1b(|=3ag#2qwN`<{rF^OleZ{WSbP52+JAU#Gg277MC~TD8@AU3Qu2? z6-y(%k`KFkqr(!U@`!dRPZ#ub%W0WDhVC-G=9j{W{0Wc1gnNrL>n~J@;zqes0<7QN z@w+=dlCZ)_&8bm-#jvt{S-@kDN2ZU2I_pF9U15%-yHFUy&aYY-I@Y&WD0&=}^d@hM z4gXX|PG?T607O@MPlD|Sh0k0nu;?!xU5wV)BlpHI>SR)Qa+i{4^o059?v;M#1~!+7 z^b9Aq2;b>V)@g}uW!KSFES%f$Pv0{*eZxjsIYfGfY4U^-wz}zFbU}BIV@r>S7||oW z5x^4d z$i33fGQ&*ipXr_^i^`*9f?9FPl=Kna@e8Y*(~y(Vm4Sx);b|}q|HFs-z!LuH%LdgK z?rk^~-O4MC%|LZI+D)JjPQC4a;r}m{M>bQod1soCr%7QxB~KGZpH%xWtG?3s+54X) zJ8~DA*N85D)I3!Dox7JmVLhw`ti5Lw^>TWup}wu9J+`5kH0cYWGt`Z3W>2Yh5>u|{ zEgZGY<9ui^EPgFc88Lo*dm}B3vNn@fyhf*KHIE%_?k%nIgAv{OqFOP$nbr_kap)1& zyJ#6(X!a-U{w=Geds_5JIvXozlhk?9mHxHatX5TqM}RGwA*xv^ueCN?4+MQQBdL0q zh)=VCC`(HZe}*@YX!vhwv%NLBx4!Y^r=4;VQ}4j1o+{s2e(CJhSrC8BBy8R$_bLyc zwYz(Lqxh_Emfgy;-ZiV0GzeRInp&*$5LQenxkmT$^}e`4Z=}b9sAiCv$eA8&St$|OOz?TuFd%8j!?Hb{?O{*7YTiRz6 zMl$(Kl=4Z{Yl|!^E(=fTn>MYHACG_B7{(@VE6o3$o8@2ZTw{Yk;?TjJXqGpP-4?c$ zMb@sYtVfMGPI51~x3Z?R^%mBH^z)^YPnm3ec$B5&!s^q_e{EDj=_rU)S2i%)q+WSB z9n(sHa_b}9uwonm$-VK0CLYj*t!~=8>QkpMfd*T8pz2*>>@o_^Ld0j2aBFN#xPC#46L z!VI(wO0U8r2l8)e9>vUz=3Ay`%;=V}lYH<#2RBO7-8?edqpb71lSk&Y1W@NaM*#CV zm}4F9t%i=o(pI4xE2bs7@bn69tKgje78qbE^kvEr=Fh0WmAqXNQ564&46g=Dkws=5 z*|?W?T>vwhHmLANB>%4`({ii5MVVib!5(ORiT?IPZ*_9fgVxO?XuS#l6Y1HD{Wr;d z3wlYL!EZ=d<sZ#n=g}-C^-RNQ}zs3&!|Ime*d&RrIMT{%ZN&M)?jv-;?NfUg+&~ zd%~Yu1`WFQdS!mG)G^60(|M7piWP?v{sOp;{fgvYibDK#=PmxUj7GCe8Q{w9$4Y2J|aA| zpGn|4kIZ-aoZrN6~!e9e>P$D7YaZ6i{HP-{llhaE~|T9qkj-?hZ1jyNqWsT;`Rd@$B=_6j>-=yg@yMJF zR{CF^@UDb+C-*9k0q9X4YEO58qdhIZy(sPkZ{d;oId~y&rkZAi>lv={!^hwk)n{kw z4~2U&tol@bqCUkhec<31wSVP5+W$~k{1Egv{!izJpQrjAN&hJS?@YMkO{4`pxtTwh z*}LEe@-i{y=USMN|3%0^H2};1Z&LcZ*`HT=zA?G~@=VW9)aMCxr|-v&jIiPhJdTE@ z@ZQfO^9)$!8}+wiqQ}2D#rOWxz3hKtu8TtLMe#>_+3*J*KHaXFyTBA#@h8du|Lgeu zH0(O*JskP1;BS*(ilkV|Bct{ptVc%WD|?i$`a7Ihn7nL0qw*w?1~wX)eS%rIx>?1Wb({Kc<1{a;dg zAO0KX*Iy=j&$k@kmg?(M;5xMEPrm$ZA79Q-?u9iU3H+7sF!#f6@V9Uq^uQ;4w$l^(Xo({xQuL67B(uH*5oix90mYcl)c5`(Er*5+46gp1*%dcp-Qt_DeH7 zzJgUAL6?8U7yhq()bYK^|4`xQ{`Zq#D?j>uneG4V^P9S%qWCwk()-~I_f>FD1*?2> z_y18`4R3WNyehqltL{~vFO(kfV@?;p=C~SOHNHH5r&1AZ_m+a ze0)`z%hZ1E^%d)ZSApw{jnkW*zEc=0!;YEVG<@;%H3_eTal5czmhknz@$jEa_|L&g z-?r3Vnttp2+nU*zbE(q9jx-8+cGouInPhvGoeq-=)(03|KPCC9TuhdW+Lyq z3;L3T{~SCWd~?DZaj)>`_RVy&)K-2br}TXT+z0-Lgnz@tQT4H$N9JQKHH$ySBlQ<5 z+vqP2BDCrUM}H#RLs)@7m?jp#tH3b7$3#lyJH-&;FcGR_pO)|g2omp;|CIg(VA20u zqN}`>pD6G2x!i6yF{O#_T$WRt+#OBdG#ggIm5GiE= z*_QvINo7E}uvQ_vP^uK$+1{tZRgoe$lIUodYq=%ClL=NmJ+NZY%oCT6Uh8f~o%T^|#b)jYcp(ZE!2ipyvmdVYUC)ZA^y(|vJBq4JRg#x8Z^@JfCUK#o} z(LU*e(4aDPAx-)ws`j5`!d;6j1D_cG;0MRn zNNGu`mykxZK2E|+sOfQc zD!XF*1Z1@JrY2->!d^~j&++d$0@t_ka!1ae9`~DZ|2i&I2b{623RMQUPFn?wC;$Cc|=U^7jLB7}dRt^85O85~@?!Iq`aMaiA$i6F` z`le?~_Wc0g+xVt*_h#RB@x704-8_?~HS+r`-{rRIJ`aCm77k7=PQ{ylkMgXBvz_p_ z;C2sD=~e zpm6efjPh4GJdl;cM#9;_x9vQu&TQ1nKE8MJO;1nuUEvND@0P>QKffJj8sK>-3qSa( zj=!$T_o2dhhxYe^gOMjl8Je)kgy_x$028|3K z%)UQB_+5mpv>wRnB~Q=J%zfmmj{9mk=$oErvv4Av)pCe<+i;)rLxivI?O8cQzLeHo zS@`#n{$9SRe0sC;Z0CEOZ+i0dY)tvp_nlcdyZEj$P`r8hM>^#`&u@H}pMk7=qP~>Q zy;*v~y~4@k&C4h62UPxYt7l!7&OH2md~bp7W5veeMx=@Bi>r(4`8I(^OUvU9nG*+J^k}W@(&9mU`T~*M!Vi=lKJDjKFP!Cg(e5gC*qw8TM z^U(8}OL=~ov@$NfvZfuG*VG1zeOZX7RKk4DCvO_sD->m1<7CW#Ig`d_IAr7wsc2Ie?;bf& z)6D50gS`A&9i{23zv8c#W|{{B*oQo!XlX85hV#GHa;`KJVs1qIBQ`eo4u7b*xA_vP z=5@`hnpZZ9?sZn2*nMJg;`kF=POP8UZ1&oTO(%+X#3vY1OiuAYVe*N;GDoe3!xY=0 z=T*0-nM3}N*=A*U%qq_~R)wF^-}18JftMA3{j%b3URHePWkt)I6@&c0j3=4;zNVsl z_*U2VbCTt50nA~Z={$d$lK4yBJ>d7GG8eux!&9-#{K{Vzp3)WJ{W<>Bh7li`5tjeJ z+Lzivn5mp>pYOR0e~Q3V&L4E|h2-eMQ*k3B|66#6|DTBtZHg)$a~*gR?<))yh4xjI z=GKIdMgKXG)p7fo6yDF7EDMiLcrguA;YU3wJ<4ySM|7ebMDNPzl7sFBGhs6${CI}n zNd+$hzthQu_F;Rlm;10Vx#C~m><(TDu4Db8Ln|+(C(7$K61o%o?nKwV>YsMi5B)M88PQdrIUP|*Nk5_P>D$jY8SO(UzV8`A=2`dp>rVJjQh3U< z%*s}m%Y0Ow2xcQ#^*7g0QG6WShCTRC>0bzr{QQ#i*1?h9uR|XId%wXxGIaS5`cu%? zgFAR+L|6F+{U^ky^v@9yqx>m7`voxC2NHhLP*HsO3~x_&z!x&Y+iFD-c>Oe&kuG4FXv>wC%In$Zn;r5}#uS#z}IMSM`=f>&_f@d?HRw~8d-*<`{2vCZd=!Sv9Tz+Or-`n8P_?J6Mm>^0egSi= zgVvkeYhPUHjs8G*b%wR?t@4X~?^iQSi2jk}|331w1bj`xv*;*<`D{kv^pVYmQu$1~#{0`x zCam_O_@ez(+tX0}|76@p{w}L~_#;wypT5!Szk7ryph|xt(a$>yean1PNm%i#e!~B`TfDt|3qF-md5B-5Jfs((`s+&JYdn?z zsR=7Q)nA0CeQuRs>~l+RU^_VU1}=ZQ^Y3Q9$z1Xd?{Bs`EVjdMB&m3H!rDg{j(v5} zRo+1t-jm@E|Bk2s6^Wm;?=L-s*!LIzD1E^{(yN#bp2s62{_f|U^S9EUiqGZ;N_)=V zJHV|xGF|jH$_v4m(fB-oEyn8y-|P8J^T6Usu= z=Td!WJ|TLvZ|$o}$3kT$BfO4x;Kg92zs@5g|H@zZSAU@Ky`0a0RemLAej^<78zo%f zhaQ2j!VA3rL*D-!O5=;->x3Thy%_p3+~@wqpW%Njndt@hH1h`|d>`+?(u-&VhhD^d z=oDeO&#ClwgCo773oqi4IsW6Wr}tP2e1IU`}RArpN|`vw|v+6 zVR@pz3rvv3loY<`+rT;ffsB67Lq6V+EHhsMQ$*#y{3rgG>p{IH(RcrCQ9OcuZo+@~ zu%|D^yKjJ}XLPw&d4zj~*9ngBv`;4tTba?m{#4R_a>|eP_3Ka;Il0&aR{8WKJQQ8= z2mM*x-vxd&xffPl1+MA^EFwM1zw#*a7k}@4&j}6h{4s0( z(dQe8qRfbY7V-pth+YThbn!#bwU4j-+{+_#8@SH9k4I)4{+IFoVv1jS1%2QtJTl+K zeLL?n68#5Ym5uz!eB=AxU%bJgt#7-rNBqa4EB-p}^Y~YTBmUEW;Pg+?Z^}roLHW7V z5Ota8dosGx8}zpxbpMR{?Si;J$gUiWPVJ11vK%2O#NqGAD?$v%mItP zK9lgV=o|ml``9+t{TX38_(f1Tv8cq6zQ`{sl=ac&qmgHUha$mx? zfV;6TNcc9e(ii>VYr$K=8xsAahiN0E=emSHR;$^1Pf4AReuuwtNOP|xP63gGOAzEqkjH^iE%IZ6Cz@&^mEXg5P#m6;*%c6GVpRa#=IB$ zHr}r{R21I?@4?=gu=FnEH|o2pXCb|iUAVnDh5zj_t_LzM`4?V^J#bUfyBJ9H@!)Rk zG5?hwMjgB@g(p3gC19ozW+pSyuVb4>oy!RC;vHD+RfpW8y$UbM@Q2_}@zw+$nJ?mh z3-5i+28(-0??mFh$)UCX&EN>{HYU5u&!I#YzAMA3Kk;|e-<521@5TQs_{P*P$+BNd zpWe;CKIT>9k(YaE_awUNS7t1{R*-hu9@;YY!RAtkfON5|nL2+}cEfno#^byC(=j}E zjJ#v`9m7xbf6XUaE)fY^dCJXL9_`I?b4ZhJv1zW!NsE0QU}dYgPH{vM2C&6rAMH;g z9G!k^8MVFTl(DBYk7^#R)VEA8>f{uA@e=paXEPWI{XK_<{qWGR#}5q~?)nlUE9RHV zf~oV6eKX3xQZ}APZsNQ4Q}j*GD)vX7uHbO@5Z_gUXcISzM9kJ78Bmw2D8;BcpXsvg|bdA8#&_I(0}yB(Eyw2#$?pKhK> zS^AXUJU!KNitv=~Jbl&lhP%jbD!mmr+CCy3cn4zo*nEHhP!p_Gw1%R`_ADm@*C-n z{6;y2yQt5|N2D*X+`WtE#TfNVssA0fz4#FSKUlnfTk-z)6a&r0j%JN7-4;$?Gd-5= z9OZpNZPW?7^c15`sF#nq&;E4NfG2}*NEvt&m~e{~34as2`qdxt$oxCsRR*UTa=fmB zzm(yh(gD`NQ+Z^xVX1kC`X(9SXL$#f9OVJ9%1cIa6op4$YesUE^0Io_9Hok!UM-jm!{_Z5V9Lhs;_84p7&;T`)pk~6OYD-Id$>!`lI zXoxq1#B}W2C}$bTU3z%OIQtpg_kkbek@@&!5AQ=MJ%0gS&G&a0wJ3C+@OJERo=|eZ zg<#G7WF9@u*U@tv7N3H?2m1#T{!=Qa6Z_{g_u{v3FM3x-*S^staO@kMM)>Q%5A(<< zJp;TWJ;##M?wsO%z{x3o?R%(v@_i4bZ$FQW&Z8*4IFBMZi_)`HM9e!G-0$T55kr0+ zV;A5ti#X$<6CvirviIncj%+Na>N>Md4qQ@B#2t@LSw@@#k$`es527@q0J4 z;CJn_>;%U?i}0Qdub=I541zJUjE1H5aACq%f|dXC6CTL~dkOY$rua?;D?ibm=vu7) z_b2z=7dXAC**^&H!W#Gu;77m*X=5_lhw0}1Q2~tT+j$3FSo6NXsxPuMsJ>KQ5x>r3 zt_SOp`8g9l@t5)>^Ij@WbrbRZZkOXbjEX}_dRQ=&VtPhpRJDdCmWZH@;ry4u5+gn4At z9`^B$_ApfXRhN-|?Mod1uOdw{(9y3~67Yu;!)Ux(2+qf|W#AakRKL@~ zB-4z_Zy&b(hR_v;-rm%pzXSf+46XkZccAly>#@f9LeURq^e_L8_dl(KAtO2RcHSXJ z*7?#Wz%jqj`LcuLHO70L-@YHeyHft;{%LTy|0~?9{gQ1n{|N5FR(Dv4f0Vx9AI z!7YhiZC{#isJtTnPjB<_CeE||30Udb}yy#B|VE6VP@J|4$;Se<{}NZh+q{GxBg9`ujh=KDTNlYfn$ zN`H)>q8|hY{igT1!;q^At3S!{#ti@Z1JH@@mejv%{&N>N=07^W_yoA_!4{f-u~aYT zU&50scv5qNe)|XA@2?X7>;rEhtTXUqhKd)C`CIKnzLx%ea(@bV8T54tYd&-*c!GIG z4hG{-#UA^F>aSLUrzE=it5w)fPFVfD+~@s$8@M&m)!vt2kM^(m-ehph_x|YP-hX_0 zxO))Zj5TmIJ=&)gKfW^MSK+JtBmDoUd$m{9XSCPrcX|2$Fx8*xlHqjq*|ZKLC#Q zFRb-1u#E*(C14rJ_z^nJ;$3feBF1vf4m`ur+qKZ zAC&W#Ug%T7Hz#__L*70*Qu`2A_&Hvg;j{SVX@s^9cA(-rEfMK2#lh^ndcN^o9R#|D%teD=1T$W9@q$!o9+uK|d+;!-F2) zZOsM^_hZem@)P*Sk2$}zyYu4LV7c#3xSD^tpAIc|zp~gW-xWXi{_dni7v6{e9Iv8m0{`G?_aAyWKTDWqV&=z>L&v?!S>{&g zs-GC|PxuApMfk5UDsqaSdjEBQ!pGWIQTPXO8{u#LmGkpoC;uM-PsJYNul7~8g6W3L zRQFB(_BYN?bVFty2k*l6tixj3bKZX~PIwOZKJ1edUIbSE6Lg*DTn%k)q6@2i zmA;MCeWXwOmeZl-`<89sOOyNCA9MOR#$g$qS6$Crdq*5fBnyT zO-UpvgG^w_3l*jw$x%Zt7&zpDfy3XHiofj@yc66*D~G?K0u-8l|_+YdGJr*lC&E4T}P4-oD?o?Tfwd!Kv$`MrF*k7ozpIZ7}HSLLq} zpVFnWiu{B;HgL#e1BbtXl>Rz?pCz5Uz-`#|93cJ&z+KquJUgMQc2DDx>E_We&@_fO z&lDboE51Odp4`9cFZ>@%-X{MGEB@7AhW`&y3HzEG^FLw9gFlNK zncd)nwZ?cMto|;>k5%J*e0se*FRlWs|5FmmaY48+<8wpUVHjM3=m;8+*8yfAxQX<$oDC_b+R^?*jIi>T<2x((p$w}%Oa@1LxUBBueT+XR zbb44j)rnx_eh=?(|6=%;ApTSQul(ojrw821BXifQy}rNW(CT9$_WcQerd|{S*cT-H zZSXGa=Oz3Bu*xUuU+W>o7yh;WSq6TRM@IWM^%`ZwBcuE)e|i5Q|9Sth4xFc7b<@ft z^J4s~K6C#o!MXoBIFBC|8x+6VPwqc2KgB<(;$Qrbr+;h3{{T4RSO0XZ^vQpoKKYOE z7t>Jd;6JSK2P1id$}{8*l6R>5CWwd;R`~^1`tJwl;qL`U_)1?tVdwc@2X4iUjQrPm z=l-kZ_c-+2{}bTc|FO#N_KN=yE0sr=PN&b z(DVGP14ns?zc+*T^T=rbW-{+uV|5e~z{=Yh-Oa8wL9OKKdw|e`!Ek)R|!OJJ)mD)d4`NNiGgq8omFQ)uf z;yzEm(iiC;s=nHx@8^+G`5)k&`+pQ1{$KNUA1{?Anajabd2cqvK4_wUAj3*e;Qy@u zzuM~cANPGtS?={8^6}BXNmrio^5rZCh#TN9=_UvNF5`y%E4{mH%fzYTldeo4}x_A7qN`8Vf(-M2Uy zdfd0D`QcRZ7xP2m-U{BH;s31v=gxQj{WximIq*l`zImC^_^kBisd-Q+0kC4ObWq&QKyV0Wmmi)F0 z_rFf@y$`JP>UTV3j1Dd6!goRoeANM;&%R=eyMJ54f8ek<4g4JTg(>{A!B2tzFtsP? z{r7=G@Bg#lJz$pVW>)^b^WVCJzYhQ03+2rTfAt5>zh^M7mgxt#^ImTVUi*8`-_8`j z($@to(kJ=v5^%_WrB^=y&h_dyf-mKf`RI>|;%mI`Px1ZYN$Q-me9oxc#|+*^-U5#% zvvn5j?@sw`15X7XNa>Nh^&$M`^486`&E>6fZs(O%IJQ)X9+9r$GiRK zzP6c?(c4L1(B-}#|AD`b`@Mv-$U@_uII!B=+=NB%BmA7M`V9KppM_ru|2N6K^m?_w zHzDEsz?wf^obXrVp7_;fWj;z^YX1`rkxyaV_a^+6gf|cO4-bHwprt%-50j$nQnco5uat z>d76J0ef1D zfhOz&JT;zXeQzrU>b%={#_K(`7+9z03@Jvs=}U6HI#6;w$x&4Xf$yu}&<_oIgtHNM zbkSJqN)N&OyE_j0opHDzA-j_7RTKqh}T2OAgwO zUC;K^N#^vh>n-;YP942h`OzbN>fQ<-0PldNrw)BQ@jQ)P&qnlTBOHAn&o?~^zh1%Z zS^5-DA9yEj^+<19$nIN*ci%d4S9kNSdh@RK=3QOQ zyT&)~Dn{%o;D_d-);w05n&Cx1g0_qRnW~!68n+i)^g+`3=&gBO$bt5pmw;mqBb|?K zzJG*oGLliW^X^MnYqsg&Cq=|aMzxoBv|)wU4UX_Mr&FKsJ-*3kjw7C#V#sBrWW5}t zb!YYxaNL=#Is5J4E0TN3Om|>!O;~Gug%@)O;qDACc!~SJFu9k^=}zpIrTkm~{Q&s1 zME@3e5B3ui{YM0@JtL;RW+c;_*wpBw-cBWIzveF!T{@_+LaBo~>J-mU=uo~A+>P7y zslq;h`&HnWQ_6oQ_=`L;Ylwdt?<Xh|$e+^J#rHgY z3&F6N8KvhT+~?^Lzqcm3bcP=XpUfkp@TT(4!)pWQ;Vl8@;q`zcJgq?vfMZRf@>vCr z@{tTg?mx#PBN>SDcB>(mfv7%m`mT(w{zK&%{fF@03~PaMX`v3<_^QkIZFt z=jRcmNk-vq=N;jVTHxd3_l@fGi5XooNU~hYBp*53<3EtxOJ+e4SewwNW1Z!f4!`pA zp_Cq#r^-LdQ|&|aynQG?IX_cHB|m?Z_~rjCJTj`^&Ajva-2!eE5p%5ep}P+>=Z?D% z6rS2^9-hXsJUo?8p1wLbZ*StC-2Xao_}BQq103VObf!0gKgA=X_IE$=Mg3||OzW@n zom`v(qjrNYOIR{qt)Z^LkIa=sT<3jC!tVn2fSLN6(U}I7=jRjF_`C!h|F_~|LegX{h#=6B{=v`I;Q>Lc@`RLDDXn;f&T|s<#AC8Z|z!_ zVNRr6wz~`VEPv!SS0B)iVlmul$DlXBN9o&5q>%6Zn4|dhB5eKbPSb(?3&X zgX(uRxRpodZ^+M9-ftdZ(Awi3tWh57UmgYD<7De!)V88Mh^{qSPTv9!y7+%8?t}l8 z-fiG1DLjpL+p*{TsQ7b!ycZnl)p$M$Je4?PG+z{d#C%bA`E-HvyL|S6<1Qc7r|LWE z^U8MbkG>60%2e;lQh(6P_q;z)c}D)E^LrmS`YYv6>C5xC3>^8B`*oRnwO{2g&#%IZ z{3^U9;5Qp`9Em9o(kSCBIfRy&VO4{dc@DlPtMQl!BO8UNSM;6Zbe4@lgcytC*h45 zR)4h@9Q~F0(dcMf2WyLW{5P?k9!3$F*>`H$XTO-uf_5|+}N z>p)EhQ|xAbkH0D(m5IzZdG6!+kpSj-n6I6%X0q-NEZ)y?JL$>s>I!})!{-o4Cr`xx z{69HAUY^o>4|pZ?36!~v=zDnQbk%>*rBf?@4jo!y(R2KG1xv=5)1RiV3jEK%_3;Ka zHS^&2PSNjuHbjC4X(-Ww8@OkMd2nYv`G!q+9b+}}%C zgnQ8yUeJF`W_IINv(iRac@7a4*f3h#AfOa)(^aWgh7 zMJoCv6sj9R`LD@l;UHroS^CqhKLb2POs~w!5@oEF-^T#f*`ZO8MFL&|I>8g*Qf0Mw} zU+w3c%&^nEfBB(9TVFqlJ=PC8lPmmiqW=K@&tgAI1%t8Q5GA~62|v`~M{qxIEh-Z5X$crXC&<&pUZGTX!Z)wDqw;q|<8yt{%Q zsNkn6SY;LdH6AX59^;|TuqwYF<&hEA+%Cr&?*hyJqu}tbJ;A5Ju_w3*Jc)3=V4-<_ z>)0c|e=*z3?+uAA_ZzY2?zdFjZv%&WtrsYga(=A!avxZ85E)^WZ;tm?a5HX$uJGEx zBa(mRPxTl16K<>Et+)-k*5muY1E~=n3rnX*?dzjFGM6NLt3%WIsnXT{g0A(p@Eys0 z6?a_h>Ax@0PpG^5{RwM+`2_YU32VOh9QK&+X+Afd{N(dFjVGVHR za@=3Rw^#686?|`o#qVDN=luQzIQU)b5%s-+<$fnP+zYEc1eSZ@aIf~I@S}a5*GJl^ zt2gsaW?diCAn=)K{CpR9H8|EYy4zlObfVw$0mfc%j4wK)JC$&L#W$IIz)$mz_1->k z8~6;;B%|;a@{aJ7ez}kIi!L1WYJaT#xO<^L$s;4I@hNb1eJJ|wj4oU!t>IqnRs1={ zLOXJQPVHayyEM_O{ek#rH?*9;_JCWHdxbw8dmer}IQYF6=I8-`Czan?@G|fr9vOwd zm3JQg064<`2JRPvCynF}#`ZgT%3}vO%0u$eUdk)vqq-wP>5V%g zgtujQ{wEpBaUbayex!mWKh5cyzXujS?j^k7$No=wdwVP2WY+b0|957_pK>4kDSlr< ze8KO+{Tcp!Dkm>L)yDw-r|`(A|51LTKE8~5g-BWO!Flk^*#edo8c5wo6@1rMkE34aa$fiM3ldB^>a6J1#P1Uc3j z;T%hTACB~KcmA~Teh-8u85Y<`gw@BY7 z$9pPxZv{V)Ff3&HL((&C5RGGx~uOeVkpvHyQ1V)_Lc5oU5+lj&tpU^n>$#kkw$Ovu3m}DtgE@ zB=>j@{6i-fl5;$PJ=p13zp0{eb1&|{m;7s9x(EB`64t){z1VNf=#NzB2Qs?$@fU(a zPW$ky7_-5z=8=)yek<>gpkqV%aeBYkhjvC{K2amt8(SC)R^?R*dScPenw zvr~>S;?IS=bN-wT&g0t+4*#}qNBDX9YhDxS7yXF}{n3oB`oYPd`l*AXe#D<$;NZ_s z(zz}J-7s`G*ip?CBB7m2=*!dMMH zV>o{>Z#&!D-@}RiG4Kw)|2E;DzS8yB&Q9r(o`&+5>uJbo)<@wUZE+>65b?WoL3jeDKtNc{HdHMB%qx|H4 zd*=RF^{4Q*R>B*|!V_KT&*QrR;cX>t5uW@@cRu`UohJTRn*0lkKXMF948q+N++V?)D_CtM!V~`~y!|{fs?Rpw zIsZ%t2mi=@4>;W0x(giqtol^^d3~+}xAMqH??UNOpDQE0mv>uOo=15{daj4whg-=SWU6NcCHHFQ`_x2Ne#I|&e*3_YU&(Fuf@8c<{+_~b zo_O?=Ex{MFJxXbBxfrGB{oCJ>isXV8GqdZl9UEsX@dcaYB%8$a2{HQ!1A^yBPHNLmvMn>_i zC^Y}HsMf{4dyHbCvv-(s1m7hHS%I|(28HJCNLE)?XBYfRe zr~0Y$O-Awcfb;w<1GhTa^0yFsReRHXVn1$VEWS$qmSy?V z{H6_e_n2$fn^b;dejvH3`p0>RuJmljo~P$_aHL1^Jp|74_Xs%hr}S0JuM>J6UN<weyJlV)@mqi~d;?qWO$o?}${ssYz)gH6oHy~elP{r%wF{nxp$8<~UBOC!PTyIm-m<9UUFfz|Bwqyt|u9G z$ocdeO5KEW1CPu%z|(m%O*EskOq;R2E@AzKM=#+$lCbJHx&3;~72+_mT^?r|^DonEE5Vi+E%d-d^l^cwYiXc$Y%oO?WJG%&Z4@ z65g7G6<-%P+$+9EviKDKv$)N}SNVo}h4&yh5AUIjF8}L@Kli^C9R3xb(i8c!@~Onv z4G#CBtG*&U#lO80|Ls})%HQ-#e0#tV-^lTPm)=6+keLMD%=@Q?a0eD|M*KZswT~|1 zkkMUx{n$q&th@Q1z&_r|h3@84edumJHK`TpdwNAOfSGkx!_n-9HTxR1*&yCkuQkDz zM>V?BU+q55qiJ6BHE`rh^Nt6=C#Mi*;rIadH>VF5f*%E6dWt*HIQJCR80R$aXeW=+ zZnS^U32t@gh2#p#VaOG<4($TRx>5A*3ca^NSGni@RWITHvbv88Q4hLvO7$3bPH8`9 zFL;2uml5vf9a#H6!XM_55nb^Gy^5uOp?bg2T>HFhb0z;2FVRqF(TJ@SIF;v;&;WjZ~kx+-M&-%4?|jr$bjA$yDW3ieLGU_}@zd=>spw z;$H{Ofqq7h2V+cu{<&tBz%IyLhj{1cfSpsyB7}kZ^Zpw;6F*} z6Mi7W;`hnmDLgXOdA8(G?R?MWRz2XHpT%#jJTh{>i+ApRH#m2{2ORFD4>lFNCzbbN zCfvQ?(0`NMN$GzJkBsmx-hm}2nu^~$M8rrAr8(#zITSeLP}(PW3cSLd+j)zX*rU8u z9?D-{9(~{_Z>_Ti!1wUTNDjS~cdWA{*H`)Ha{cY#TX|&k8z16_J4l1fu($fWIPM6N zK2ks5Lmx@$c?6uN=Kwg;qyFVta9+O8fm?ZGM4wDtIlT@Jy7~w4d-M-&H+p?98zJA! z3BgLwg5wPq7l2n`eGOsAXq`op%YOfj&^LllOLWcSw}9#H%_zP{u|<5sQ!`xsEo{jl z#1E=t8Kp^@u&eNm%h;c~iQGMj;xg8woQTa{+=jA&Y9ObL}UI@;8q@)7ZZOc?(+B*eja}xIFG*{oX4;H=kad`NBq)NLj_{5O z?xF01enQ>#t@qrXoLb!1ZmKS^Xuz?%|X;cMO#;i-HSf1bW}aHQ{8?NM~` z!;}=h`Y+XQ)Strt5;zZkA2`C-c&qx3@lyK3>JP+oGRp66-g$nDN`6;oSoza<7x~k= z_#v?RBpH>L=Cx5?3V#{j_lt-TeJ}5z3s>V)SV32O8^L*ePlNOLB?5oN4TH(`@ZgteXDOmQ+b7Zg?9j)hxb%QKNkN>PA&ep zhHzwryLktG>pUNS?@n~#UC;xo{ttrxFMIC;p4D;P`M)oECB#1?V{FR~NhF!L*deyC zu}xfT3lKKMvLhQ26PLykl0dSBB%`f8_WA8TzvaNyz2AGzoH=vm%-or| ze_mhzCxt7uLCo_*`6CSL1jOI13A0Wxq~iw?MxOMY3A3(nR>vlPLh|@tW(HziVN{qt z9Ae#|QNI4|2y^d{GrD#Bk!1gCVf1_c|0q79{CxV^npYV9@sDDCpGfv(=b@MVIJTb^ ziO)Q=LdP}_7TDzBy8&dypMvv z?R^xUr|FRXB}`gGyq^MoEW&`-NWaI`^0#61)eDpMh1FC_@s{4Xe$U$O6LRfr~Rp{`q?z8;%D=# zCcO?nzP&{q)@$?cYE=tAm+azM=20D6-SdnI*OK2z{NERDP^$U;makReJd|!EUm6eC}Bt7v}m6 zanGh&$9B&K`MJWTk7o)bGCr4NE>He8_sh=hnQQM7|HIlK=GKR_r~iVonDi%g-s>a& zJjUOKuT-E>zu!Zdh*lvOD`@lvN_tM5lzV!v)<8=hU>Eq*dD%-u$XEnbm_ zZ}P+^?XN=TAjSgN>*J?IxH7WCJ-c~2w))L}FBE&Xi0|zk6gGRA3z5IgJ;;xE@%fz) zw)}{n)4~=%VB*~{-!fP${(IE#LEOXa*52R4#GZpNMcK6{?h&Kk-y^2}eERd^TYB^l zXZV|ijXztN6VEes4tm24aqhSBs)(8E4eF4XgTPz0_jtr%($`7Wr=KtE<*6@^`y77j zugCbI4A7mz_`~A0L3m8KRB51gVaijK@bYWq3mxC4J{jVftj%g`{+X=f;#<6;Z%BNv z@3^q(!~b)o$JYLCYK-mKexDEjo+wQ8|54$CWG>>}?UBjquaiBzn{ldGb*MZb?s<)g z@9%k?7q)v|q#skvS^8NOacpDyd4^=M^t_BR5&c=C_7?BVwcCV=L5O%C)V>NJqJ3`D z-r}A3-XrYed#`Y%Hi&pWroF{8bB`0k*8lKs|4HG0Nadw}E-3GMorA#Cycd-+CTlPAAnVV~btVat#5?h>~0B7ZC+ zPk-R$&pLVHr(D?L=b?&!y*9H@d|R7g?YcqO)~^3otc~oHK5K8p!y;je2karg68R7U zBX9V>Jg)JQcvmHd{gK8CYlQ2QJagd#I;KrSUsB>y#kPMp<-B;xHW1^HGs4!t-#3=a zRfyA+23Xv)>lR+E4QlyDTwCjiFx-RPq2nDXzbE8;@MjaB-}5@EnuOdy39~UeuuDMcfqf6Q6Ti4){*h~&H#9NWQY64$8>D+o3Du1 z+Lscaxfp%Xr3wGG_;otAYYTkxH~yP1k9GOhR9DC!Q(3+IVcB5vzbF2ArB{;(#CImw zioYdczDqeMY~Q8iJCXSB#l#0!JIr@(hJ`gm3&ivBjXJXD-ND-(X6|=Fc$e~kC=ao3 z_F?}PVQ)We!T888a`^S0_vZP0?0Z3JAfD&mrM-XNdqmjQeHm-Rx3M;T^_Z~r)t?ro z?f#a|L3{`Dr0}y5=E$#4{KKIzfz)2|S=^vDl6%v?uRG(MMMZl(Vd=2l>v>l7=HsejTy z$S>5M`2du~=%@ZIJ^WE&FYht(V3WW4&Umd{s&mjS!Y$gb4M=m#ia1ufJK-0EiLcue zzF+bub!>d}of0;E@N=@=^9#bpN4_kB87mwA4K*=d&PWZkxF*gmt?yH%T!foe=R?s$+{k=8E%#e-zna?zl69PdSXfZl~|MLEEf*dVek$=_UK#oA$`ks&@Gk9_1r+ZS5}!Uj{rDv>(y*AcdAbIM0Ajvbf-68zFB)>uYvpRln;xl%~ zUh8idYgWiU8*66Q#Tm<1NWMxN#MmAGrJ-4l?=Uq8TYF}#O1%29ZJThVHVA!v+IxLl zgiRmmvEQfPDQxLqd?@yZcdE`I@Dc3|e`>0(-NOETlNG`?7KOhi!*6ta%HJ)#UOs_% z-u-~~+Y*LPd-Ht8a>l=@Q86LD&DEHDZ5Ot=7wO~KHEOBn0UkARWW&p z-{U&ActgIy*+=}13j6rmC0v=(b6qq-%bo^dvxo02b_m;d7Fqi#D82nw49`!~ zzuuPgeNg>B?PZ6~L0m6dbZplPuBTwTp7L9Bj2C*6JlBuSI=1TvYb7V8$KoA4SA36& zSHt*+yu5!F37da-PKo}@Kc`eD?4MJjzHP3F|LCv1|3-u>L+Rpuw>llK*Exv%6%rHj zuMxKVX>a(`Tr{BQjS_MH&+_Ki9FnCmRo_MA2dj6V(Yd~cuR?fG7Q3pzLH!f!#p z7Un*a{Z{m=|3&^3w&zM_o{0FobV8)>D_oEV?{b*_Vy)z?zrdfv!rq@-g{^)WA7ejl z45EJ_{;Yo~Xnb5Dd{0T_FQ*^=|i5iHZRXy*yQ<6IsUZokiQ_@ zhaE*xA$Xs|tX-cHz9q7Ae8Jk7b-oIwi1EW5?XCW)pBiCbKefV@+91Azv_^aT z4ifzt?ceubl*jAeC2aaXH$T?j@Krh~BEOT``}|G`TYkKsy-@g@+91ZKbG5heDfd1W z37dZy@74(W@h;b^>y!_~``x5}DIm3NVajjy$-NKa?t=jv0AC%wL zlJPIT_vI%Zto%GDwnf<5GxEDK^1Gcp@4p@s_V2&$7k*hAM7$i){vbeve*9_r@h^4b z{mb>PGDydG9M-YLBl_kGn?B;NM%ert-bWVp^Vcz9o4@j$My>SQa~iMSsj-%@=|ex) zR>SDuEo}O$?uvbtJtxTcxMtFY^3tEJP=3~*Q9o;it$y$)@#6iDzs>*a)lkj}_bMIq zTf*~{|5XX2Z@#eUNqH)xy3k+l5w`yFf5zT!>GJkszuB9wiTCO% zoxSDC&)Yjk*xNfS?CsquTK)b)F@j!hm+e_)vT# zK6VOwe~k#6zu<4r@Q*n@{-Zze{yQaHsSSdER(sDsCv5ybc~A83n-La;dr>N{-HYNo z$y9DXbFZbp=|Agb?zdEHg z|1lpbm3@9bME~dKJ7*++Fy+U5hC#HZCa@j-p~{ARoSelig6GyR>? zK*-bHynKt3uNl<%NBCbZ3F5ik&q}`zb=eMddN8&(&Ow(B#rAkdgt-q(exZ)56Gon6 zlOGU&w(yOPU+eg9mA(dHUG@Tzp8B)&jpDZn(`P~OJG3|c=Tv#r?{$AQ1 z;Zm3)=HJw}&38`-oEQFh0j}2VglpxGryX9C!ACOqbOzJ^`t-DK!B4=rC;S$vOsOZT%Y`U(43+R>p}N^TKoOW>`CqATQhC}EUM0-@)c8CHdtMlyLEk+W z$Jd{YF!$et<>K7K3D5qQXun;bZxCK2UT@;RL%3eY0|~bZx9C{SF3_{WM|Jco36s8C z_FDQ+3ZD}1>BQeJO#juN@Lvlr7N*TX9XH2&(bxzPzxcZffhly~3yG{(?_W z`>^!PC*~APMPu|}fz$&V2AzhC>RfMWa{(6N;ldE&$5 z!Hh3FUMzbIQ$P66`xpP2f8n3W@Xu!W<+9hOr#zOP@62zJJqHw55Z{^S`s2SdKO{^{ zLOct%UHe4|bN$&ToRa7Mu}Ss_FSuHNMBI;@FMI5MB>c6)#-CLY$9D&Vbc|p66T>`f zLjPHxj{?Xy3LBsMfyDdlls>N;Utl(f`3U8~rx5jn{Z#?Q`Wex&)eq~z=Y?-eeEgeJ z-rj!&;mX9%-mgI(TfIEjCoexJZ1XMTE2PWIW4p<--a`Ae^_DEAJZr`G<>?T%@_bk6 z`-Hb$r9UFBcbm1h>mB!Bu+QJ0Su1SyO?s}kmL5!hVVL~qNT1KYLfG5g>P1xJFTiEP-E&K7m@fknkPd|R9 zKl0<}VPW%Uuus^R@1(Gm5B}*4pZ4PU#FtOcc-;8-qgvSfbI%82tkXsUseSIzfsHR{ zFGqwA2B!Xqk3Qpr_v^G_^qmvm^!@7PV#;41N$GiB(WCSMS`}8$^D* zCu8}6D;!4OK4H_xvu*r#dZY4y;CBlf|H{06`&s90Jj`#KE6efUHs@KXa;1G%et~#a z>bUkh1B&+x&guBMgn3qq`q`cE$0y};^W^hC)duYo<~OKbN*MhsN+#;h348tXguVVn z!sy4O0hDHl{>jsqGWd&^&8_kLzY(57#Uy%imcs{Ly=zexn_${kXYlL6Cw+d>k37Fm zyF&Xfq{KWY)S}}T6Xv-c>ip7#`8`_dZG-9(f1%{-9T)x<$G@^X_N)IX`I_?3Py6x^SH3)hE&0x@@-@jo*h^fRJ}`X4J7oW2;qE9N5l{2XDE5AXO$ z-mW{`=b9_*?{m!;zE1f-+}E0?z1`RPvgGT855g3YzC(MTev7cB=eaNXn;&U|xG%Ot z`=109@57w{%SMQK*m3RsJZwzZ=3#s%_mE`K0ln7uITq{u!laMybJPpl_d(vhDEeE& z`#^k0miqDE<2WGfzsEs+*mD>>_jOqKgW4c|uNV7uISxd9j_Jti6ZuoZCeQEn=49J( z?I6Yt=e5U1=tH&9o_|*qahNCS(ERh>n&?kI?;I8XnJAv)KJq>t+kIr@yOp1p?-Mrp zUs)dKU>{2LO@1RvZ~1}uO5QN_vq#w1&pu(RAMV>t*SN{%+02`WC!06%9O^>hxk>}k zzNoLNfZ{w#E*NiL#6S7_cqYHfB+oc~r}8UF`uI*?nS3{t_~>Wc==HYl< zr?BZ~UdA}i=2_T3SGvvqHNA0OwNWwBMo^|42|N*lyFKmM`$;J*GLVY{ynKI1U; zg>QU)QPxVyKn=eZ$7`!odAV;=uJiuBN{#SAZ4lpK#9oDMAimo;q$BI^P7lgA!exP* z%e^njtJw$IE%{*`saXX2Wa87zA?^cg)xJ8Q_f> z_Tdk2-&tX^Z_fMT_-aX#|3zWOA9ohV6X@Tb(SK6d>n|uiy#7*QuYZoP>BoQF!e%e_ zwPn(Gxb)21>ST(|+jwsBfUrF`$-J*Zw%WX}OwPmpUoJ%ZxgIedHv34wR{AYHcvO7D zq@O3gPfvTZ^o-ZG3tt-5hj-|<=-Bedp5sLmF~2WieBLpdEBVzaefGP6d?RoemIpEe;n3k zVu-?9#C=LxKL|t8x6XDdo3ReCAU&-eH|#m+;etD9<{>0pVjQe$Wr! z^pl?Jg{23Vt9=^gdl%(J6Tf!>_UZZkU6V)u4q@Xn|LKq^Ux?=9m~Rj3_{D^2pM5&E z_R0KoMA*+yDZlZVpB@lCq77octq>ibZyympCHz+^BgFjmkoGSH6z8Yq;+a13-|R5+ z?_ps-|HgkN&;0w8u+6`hD;BWNze7xU{X4|;4>o>!kK_*sUoIWcuLv*F@zp6lKP9|Y zm_8cXq78fAoaD2Z_K=h8bL>T5RQjXBm!$M3h4<_Dd`kai$($1YR*=?vK^mVjULqzS z@D7Jrx3AZETes)A=QYARl04%XY_jnT&pm_vbI;p^{d3P-g>AgeJFI7f?HyLeOEuEH z*Xif_VEXyS#UWw;jf-Q#w@L?uy<88>UdD6P!gD19G2SBHsUwK-xvF%0d=Bo;;K2;u zoWa8xyd#509L8UJgsnW}hkxp|LExRT)iC}zF6{krLfFzzmcI`R|ElT?LO*qFeEdlybU7!TXJIrD)LVVe&y-qfiH<4w6> ze7wnca!B|QZ4mS8VeKmeit(~b$L61Jt6+PC|2FY|D11W4*DFtm`8eY@n~w+o3S0Ux z-x02g;$i$tJgZv?RC1eqB&^GHAnaQ!?Con5u1tLDllZjyWWH4=Y}Y&d(IRaAU_OFA zo1ZYhsh90Gzu`IdW0GGl8HnfDDc`n)v7i3X+rLHF>}USBU)bhi6>)v!V8ZzKq>jh^D@?o@X5D?Z^228k^7D0U{IAP7 zgTkGK3;dmqPk%tXbwqYZf8Oy)Un6^c`nAHQpZpkK8pi$u!UvN+`XB1g`XBC#92TaJ zgnqj_;z?IW{P~10N%+qbo|-VtKZu1b8$Lw{lA;d`&N$1j#d0rHzC`+R=1N6U}(raoa?Z$keeVXyy`u<1u1?a}Ki zbM}Ai{W11dCi}p|w_)O8g?K(5whCK)6Awo{mOqHy%M=4p@o&hVI=(95@cmcuef!%X zZ0+xe(i4x+?6N4Q#h|9i{}h3)s4@i$GXN*hFdHfV4DM&CAJuMbh9*xt{n%ne>!I2EXJwIZ-*kJQ|pIRXsL0G*j1`&S#U(?3!^ z-#=~C|IYZ0wB!kK{oW#M*Y9TO8y0?3 zx<2uo82v9kfSwVb@o`n+g9kHsx5L<5uXJWFc&)?OM}3-oS&aM+C;wV_m*W>tm%YNX zwLw{Z%>M>;-p~K&&&zVZ8&NK==oHeR(>Btvrk`iEkTUvR*)ZV-s}KEpa|GqH_@SaZ1O&yr+dL zBRk|*u4A7c@n-pvzE;?$Um3z-*N4Ie#DREhx{2~lc#@}D{TD(-@BhDT$k#T`3k=D^A*Z}P#eVkxe@LC z{W50$%2kf=`4ZJthAl{4=FW7TT*xPeR_@L52@EbGy zHIC2yD~XKXzdAh_ug7I17V%!oLhTtBK-|xw{M7-;w!zrmO`i8!;N9r>jXE|y=?8^< z`Yn#ndoR0$@6-mNf2a1Ae!2L2gzwS@!QZdF@f*cIB)nJ~1pk=!#$Q(*`{S>s_Q!jf zjpEz-E6^!gazd3^<8)5rX#McA${*jJ%^yuP`@rmtSktr7kUrGYjG*J}UY0*V-ac)ZJD z-ZR=K{7RDNJ);9U_U{?d{$xfV`lmxWvi^zpjLr&wyb$@kXEaCUwfhs`wGQLYox;BS z^ktPXdG4$FT_fUoX2N5_*ngelpKyHSH!Ho#gVAT0^z-B!OAls#8~HhI=p&WLC0E59mC`~KA=&wPEW@Gfl- znDTkN+hNvMP6^xk%BRq$@-pUyh*!ox7O#94ZMJy+J826&CccH2C=GN(xJ~#^l0E1@ zBJA~_6*m3kcTWB^jD5T1KeLbT#%+;a`)(ZfllBXLfy_kQPr^TTKdGraK5w%w#T)mB z@W-Jb9q<2)>Dcb)AYUuK$(KnUe1A%he)?n6|74P1o%q~eV!ZT{)4xyH^z(cm{dc$H zvtDC-?msbq^SHv{i{-yq|AUGhAO8o0ef*ylw)iBTbBZ^MXX3v`*vJ1#iCDZLPycK3 z#6Q@_e}}N?C;s94_$S_9l1_+tJ|t}ViGQwNKK`p+d?PowO~ zyIzBjD1VRpq|Y$-TXL$eMx}v}FBdjG<5%W7e*8**@5iqvg)M*VAI$K%Rv4f0y8h=% zEWgq?_N&r4i1}!Z_6plT{Qg#>jy@k@cyF&o$Im2;zQxitu21sYh0T7(A18$U_+w1C zGNos}Lwye=%z8(+@bd}tdte>HHlAdBwnexq@v(PM*zASBEyL%2lJTjp#Y%fHr4RMz z@O3I2^)uzND1iOvbm;9rFKqVzYFnIN-jXuNJ}<_1&rYhmzn~35-(1<_^)X&DeehRg z_;ndRhT_jSzm6HKe}S_@Vxx6j_H#j#>3dZSUMq|hux+9BF8@|?D>ojjnDnb z^TKnJJpC8P*8X|ErCZqQoAo)ye+!d5&$od6^DS+{{`nUA`tkKM=_fW#KhIyB6}IOu zc%Gt6kl7HWgA zXGq6p5BPkS*wSWW)t#^|Gcm_9J$ znV*Ky58vnavoQMhczsIWt@^)Lc|!Puc<}xh5;lK4{CFHMyhnWqguZ#&n|;I|V=*6p z#Dm2j@iHXr<7HUb;)UmZ_RIh1gs=zyd3)3ajoSlXO?m>qAS^Qi@w^cAZ{_2=1s%fo zB>wBwKm2o&_xaPeSElrgFXVy=xp)^3@LGf7*}t|6*bDKhMk83H#^gH#>|!s2}eS+E1ly zgy`=ow733<{Az`Lek+76zvAg?ufpnf12NtJ+jt|(XM6(xV35w`7$0%Hd_G~uN5_S2 zeDqp;t{=u{{q}^gt>03UJlZ#snSdJ^9I75<(!C_JyCz4h0~pBMJ>^nYHyLD=NUZ-=nuhyK|rugO!MqvBh6 z$Zw(emY(N5@RvRBLHd)K^drJPeL?+&PtWzp(!W*d@y9dTAf8Vd(q3i+B7TN-&q@3Tl_pM`O~t0lJbPGuUpv4NByuK;^TF?aAg$FjY@uv(qbdT__I>CO|O58u-88-?Dg*wHvRlY)nVcH$j=b*KVN%`|JUnZi03k;w|HcJ zvQ6o2enR^n2CEDZyA9H+u zgNN&j{RR*6l*j8^BW(JR-|XZW-)$B4<2%YXT^q#pYHtP;Z^p+zCxyL#P6=1WDVRN8A+b?=RqC&_2<0~v)+AP7#ktd&(*O{UnA_(_c=^@%46xf-XGV; z7wDYnJF8=_kNKR}$9&f?`nC$2KJ1yU{>i65>EtON>nA=v{hg(!|2nSxt^e90qmFB{ z_W_vyoz(W6HVA%$M*XX7ZcFL2nE80E`fxuVuNFQp8=%+XZ+Cp`Su1SzfDbs#^Q$y{dw!Mmo?79O zr2lt&;{2y3^;g`_-73DnpF1e*@8{AVElTORpSwfY-_IQpw)m&L5x-U1Ao}aw+FN@Y zRQmnG%hL(k+W}$U-cAUcKHA%<3_k1d>-BGxpX-a2e|NE-=TiEYQvG~Mc)s{wbGXgn zG4Zzwf6MV3b!_rK5r0_tD~^B4@zGzW_%M0&9VcFrJock7#>bu!VQd4aHsqxqx`RDU0GXx&g-Z0}K>O)BaF&;XtqgjT< zIIrWXgsFe(((0e_5WiPt<00yg`tkkYLgC7kp7G2+VLzT>d~f{$>A9Z!^vo|UJ^VEp z{#wUpe6>sU;m22}g#GyHwD2>@9>#C1Pucj5_v7b@_w~eQzB^yXD--5@gS9$dFPkCO z^INokG@$r?Kke%)s&k0>>Ztbk0OI|AuAlaP{{~^?Yh(koRrsj(l?n6yKmEV0AAMeY z;`?BbmaH(k|1x3TH=%96J7Ml0Y!SBm2febF`2Tl_Px-b9Tlq-8)1`;c_003@g-!qI z6)`?Oko0kXV!P7&`v-l(PbEI(VSH!hDV5?1>HB-t2~?5rPZFLbdH6p__*U_`o_r{Z z=SWX|TYBV=37b6n%2XGo4|)1WlSf~@(?@#vK0VmdKbYj7arrl@{h2<}gME6irT^?Z zVtrbDEK_~Zp6t8dTyN(I`|BnBm$eVBpB)Y#k-mBI&-KY3zTdD&_=5?5TYSc@znL)d zbDcbV+LPz+$ndwl4u90~Z@)s<6XAPPe&Krp!uEXnJH$UD{6=R_h5T>!V^6uT*+cuH z|9UjZzux_?Y@-$?vf6|p}%m@wCO`m?Hp>E9c5Z2dd)(-C3cf8w8Kv_Xvj4{QH?K)LY#&LJJ! z_@DGggnfGYH%m`{ep1-?_osv_wLz>Gl&XC6fe`Z#`ahe0aJ{M%w(Aw+gBD>MA1skP z?d2a*f69D@wq^4l#!CyO*N>Ox3H$Mqs%*k|saDvJmsSW*mrf|mPqg>`tQR(aGC$cO zZ1WlXw@cXj5C3}q?H2a_+aqlLWBheY*pI)C3;XfcSz)t}@mEf^dOX`<>Vx|7^-(K+ zrOrWrroeC1eg{Cr^=*yz#5ibK6Mx9@$0l9iUnl)5gsne(P`F0=sRM}L1>|}`86lo0=DT-xzXM$EF!rwy zHv7Q!4x^9ppXuZN&`#-nENIvBOmhAn<#lVq@CTK@@ws2bdY<(U^NRF7h4i&1`;ccn z$K>J9*EPZT=s&GG^!f{GBPJj2S1ATOu9$WK^S*t9`1U*-@7pgH-@k7U-_m0*-y1M{ z!J`iIo2BPwD4v}C(=WM@9)9`E3;gVQ3+=TeIF6F`ltWldS?9(>zDIXpSJ$^8^Zg9 z|30Pvgz$Oczfhe*ly{MiZGDOSJA^HN%DYY2%Fpxu`-JOdGlV?reJ1}04ROBMlK9wL zAvv@6<-~tD@xL!TUwqTY_;!)-`o#b7gYnvOeZn6XroCU4aMk_s`eE-+F+QQcv+>H| zRdK!9-Zw(NTYQtpzeB1jXqJ%M_q9})g~%D-cE>~CrkW<8Mp=4EZr z^Wq=X{@KK*Js%Uc_Ra5fjS1WJn*O^&xJnzu^-vo;D1sp8G_)4#U~ z`~IE#_mwICJC#5E(MOWM`0nmzVfzj*_m7BYyMKhf6T)8Kn6T;Nd8}R1ZO>!zd|`uh zzhwC-UK(|5@iIkz-7jq4PxuAl6T-9!i0^3}*51CS!Sjq~gNJUY_?nr26?n(57*W z@G)V_Z<)&5DF1y`Iv~E!LD}v59JJ4BowxQ0u63C4Z=3L=+91Z4b=uqblKBPkN|~TA zAJFmj5$2db;ExX`%y^vZuZ_o%r>&Vh{6!i5<_y34b@)S$&-{V(_on=rKWrEF^M|9t zHh-Y~&XNDD{ep>q!`Ry`?Cot6w(`8z{nR?#OJNX*@!X(}{CI9i*pKH%giRmgx!oDO&tclewp&wPRQJy#oqzsq&({SD9j4Zk$Qr~MnB>&d9FT~EUG#bMr8+9ynmK=}KRu=n?2 z;mXJk{9_sZamU}P^6yuCKAPlT?|voUsXipxk0g1%A8=B~TN37av|0M>dI27GnDw%j z!iDuRaH(|I`dPTYrasTg&wTEL_@7Vu`5l2V;b#)QXF&c^o8_7Wf%nKKhPmFISDo4Q zi1om}X=<-gJoK-F!q$Hye@J!U<#%X2>E(9{n|!PC<7I=Als|ZvP8ojYjIKYzZ%FxV z6&}&?py~knTRHET_S}bn;BOVr_~300e^{9I!UmE4q>g?1eX_;UBY#@hbLqg)39~fotRa zwy5&;-pG1Yx3FKYqQA8El3hmGA8K3b6;~^Vw zU=QO}v*!ij>B61T3Bjj*7$1Ar2zz_|^S1DJWcZ`Pl~G-Izq&@pB}xAeH%Y(nm(?a9 z#_Jv0+jyGts0mCc&naOm5BX7EZ_i#~%a7k}qWxDW4aD^dd*-J6nV-_0%^vRWaV@s{ zd+@iYeH$Np3bM5dWg^BC^xxi|4q_*{!Z4kIcd&9K9ox;}smJ1IHTmM3Ph40%d{jHauF6`yu zd-=YMJpGZ$V{eDB+5hrNwQu2eZP53HM|8X_!eD>5u(yAQ+Mn4o?Hy`c!o4Xy@59sz zH>UKIZ=SH_Px)!jmLC3Y$EW=8tvt-n>ZEIZ(jWROVc#C9kIIxE?RiMYRSDCc@vpUK z^lcM1eXPgq753{f`-E+M<;&vJw^XG3SwF$wwtm9;&SGI(-(h~+CT!y=)?eWJ^%wka z>A5~P2>a{v7GYn$ZNinZ3Bq3L%iGKK((J{aUBccT+OOHedeUxTzn-+$rSH+ju|xU% zj?O`p_lS+fM{Ac3huO*IuM%ehI-z9%|d@_UEWRK?`$lyh?-}AR;@aYV$mHj3^ z<&5Un!tY7;VQ-nn%ii9F!Y2Pl$!`^IaOK&Z;qyB+o?oUqvh)j-zE=EJm*0NXfzNMD z*yNW;ezC6E>*O;C`$lF?ls_PB^1PorBsu?n<{{xPkXXce)j9273@DdleXk(hw!X*v znYF^Cf#^?8X>aWpdD@4`^L{4Szn@9}Z~A#Z6TW{xllJsd(EhL2<5;g_y|ml$X=|20 z_LOIEqr_b7fop>q)H zOk={&1*G>s#h)&o=hNSMKH~w;KOpS+tPgnp7MK20*Jyo7xS%x9m$jW0{#HO*H~dX&tQkf1NQp_;GGWh{%xJg%orHr{aohL_P#Cr{gO96_<)l~-!WmY|5OGa z)p)`9%OuYl^53TX)(Ec( zTx+ep!QUqA`Gbzn{jUSUemrqP_(g3H`VMPv`skm}3j6-~yyJ6yn=M=I`o{QUzA)Du z=(Vmli^Mnm*t=HP+gtDW*aP3>!KX5q@*1D(%WTCCK7o*L6E^;9;q3M1P)45dtWS^s z4U=EF;?w8XEo}V%74?NLeSM7y`})H7mLK(XPT1F1&iRY_;`;CFt6JFC*Bs%OqyxfV zi(Puk!}Y}1SA*jtpS|8NUoiXNXX~pXQ(t`A3i{~Te zsoXXnX8u+qT%`?SJ)l;5xiJv(4LUM;=DUN!Hs1~FpTd5Aw^O)M8$^2iVdvR6Zz7b(>->9&+Z@;kDe_Gh<2YdarAFD6yStD%nP6w3VuWV*MZ0vH6$Z=^YdHztekC*#Ay1{io$m zdFlTqlt;KyG7#@?u>RujH&fqcFYnVImYjc|eyjNQK0W23zD+*dpLIB_cPl+(dWiC! z)Uhug{i`qEIbmPE^TNJ-(^X%-eD%Vh zURI`KTQ6gMjsDiJuN8!?JxRtWp`IQnO6f2?N>3s-4_SZ~~}W53?G!^!i!*Qjt!lIMOR@%nO1p5uPT3LTg0 zx(Lx88@0Fg_<8ZcGgA7)3H$GZ55rfCK$MsIvGVY}fdj(!y#antg!Xn@($_8id0|^m zp*<4|vvm&2Vt%(BzQQCB<=H1}<$1mK!Tpd@+4_7+&->_%UGp5n^DK7eeKKOLk=?@tx)~Gq;nARv|rN?uFl|j8QhS;Z5d4a^ZGny zytr5V?wEa!^{J!6wmucc+rm~po=0PS`l~tzF}|k%q)ZU$cc^|WJ@#|GoRGi6talX( z7uK_ouM_t2TOHozmXxo1?tFKK$+VbqJe2@;j8_A9j4&1MSn=1K%45zdPjq+TWMRiEr(h z>j~qdh0+OuY0riqP{*@Vybniqu0{DV{}|K;Wij6eIv^f>EQG$3P9OKb_X*F6>>S?< zg8yqt{{Im^FWi$b&u=jPwdXk=zfEDgX;Qb-)KfE#V`8~&-I#xD;_&vw1I=Us{(}Qt*RhBTnhl%{{3GbFX?R!DO{2nI! zUrhMJ;&0b6F$f)bUwr;VOX`8XC%ju_(=Z?q_M8&-_KXR8drk_QJ?LZn;`N<%`rxm~ z@TqUh?^@*tpFRX)yhVN4`0Fp;qj-^j-xAs3_d{79^Y+yWd;98z%|85vy!Y1%Vec>a z-e0VDo4>d}-6nig8^ry$?K(afknDUQuCLsh_nqFg=k;k1-NM$sh+p~>i(l^N5pUdM zfcX8lG41X7<%cTb*v`fu_2M_EuD+o>A=)GHW9<|D^dF|5=L?xH)<^O1dur5|$N1kc z{ns|(sw7W;h`+B)IP_1#zW+KbT$%U-vgfRDlWc%^Ug@0hmm&=HcV75l!rcGsmOt(O z-)~l^u7yA1t2Vw)z6s$;NRk zeT`}(*1zD7Zej0_K4J3*{u~na{u~ze{v6AsKk3r*J+DR6E_~06_ciK;KbOh}ZgZIX z&0B@-{^`4w@p;w7)D&Of79D%c{MX}!svnPcW-$G!=W{Q~<6{}TSoP!iqZvG1b?5ng z8O;0Yo?ol_@|gPec(#1*@s; z?d7**@SaO1@_FCM%MWJosSK_!n<&38gDW(6^7@7|_)G?`QRm|2PiJt0`W(;SpTTn# zqsBk@wRr!2iF^q0ea4*P)qkI{AiO$o)emIk|NL9(-^725Hi+*zGF~-#`12kAgfR0X zzBvG8G3gl}S^9sJ{4wF)WM38|Pk(Ci`EM(|;=euV&tl}O#W(rOll)hrIk}sK8^u>K z1A*xu4ZlP9u<(o8pe#oJDe=7i`Lf09pDS$o(9ib^3}a7UMxN&_jE_9ehZ&|mXs=d( ze4i8itYRGE_m*}GGbV!W&~`-lxq#yDEz!PrC;ap1t5JLR`Wl73zHVXD_xPClZ?*TU zQ~lweMZ)HvEPs*W?}Xa_F4+VzzZlY9O(4)MYFphpde~w3hHJ#{6aJ+Xk6^C%hDkr1 zk>Be0?VMJ;LwO1~m)s)qYjd4wyleA6HND{T3L_hj%9hsmGuj^z)AZy0~?6*haow0FbEAIr$I z-uJWk4UUifq&NG~S1&*L{MS19*Wx!iKKe-S^)+PlG5_-RW%(VBk3RUO4}aE)Z~kRG zQZ9a#Hi+@v9PRyhq*mCEXBveowLy$``n30a;@kL)KTinT_>=XelfutygTnff{Acq~ z*0bQx4%|3@t`pzeS1)Y#p|4xm>+8tqgKzqH-{h$9=aYWkH=+KXNtp65-}2=-EnMmB znJ52wd*%z9J?Llb?)BFQKaK!gl`wdB%GtkH7Z`dw(-`vic*Q z&Inf}{lwE*VY3(iFkbZjDHVPu$$v`uSAegICzyZE7oMJv7=Q8nv-ekxu=$JMuc?#h z2a-JTwN}{dd#EB_D@qa{`TZIB71C$&tQXMV+Iqp3yW-l>4|E>l_c<0y*H4nZD;MZ` zt>f=ScJ3S1ar|+k?1mbYU#jn{>L6xq3dEB%{=f1LFH2jOkP|IP9fX1+g3 z8XCEvxndJsTO{>Hs}pCx<2UmOhB?tcucq}VeDmm%NC@o9r>n_@#(?F=lk(zgzfwBe9vM?b!P1i{ab}i z9$c#UF&ySUigEAHHevH8`s#&EANH(KJeWOQhV~_QE%NDerd0i#XT%(Jl#WVAfEy7m6q~~2_Z_jaIOOHKeS5L&F89e&W=k;-40l3j)DEr6c3tE&jZ`?n^{= z4nF;b@z;vqB5dOY_>GR=BmRgmV^#?MPRAb>|Aeqy6bSxt$Nz-*9lwvT;810ptHC@wW-iFLj|A_D#9iQv1r9UTrsrsKcIX?ZF@n=30*AL$8 z_%)7yt@wk&6^_5f@$V3y{;ksS8LyfC2Ju;ct#W+EXU2a_{Dtc8u5o&bcMHG8@pn1?9`RX^xYqIMUoHKY#b-U@7aYGr*!W);zfpLeo~Au%*9U{CeT}j$h~a4~V~2Si|H%#NV*v zw~2pP_y)&6u0V|UYjyN|!i=YDbZp~e?x*4l+A#D`MV#B%c#h{IhIHPZk60=BQpr{! zEMk7Z*xuSZmOpE`h96|sLfnD|BADxc&(nlSeh_6mP5 z;o0I>EB#EJgLs~5SlFKT!9M0wRgoR++b`_xV?6Bb8xyWf@;uKms(AL#a~u}FE#-IF zdbQo6iSw~C;e#nX<$-UQ`5bs<;xj*6D{S*K=F8iJtv}A<`6}<2_-)!CzIV=e+v=C+ zLulVGM|O_qO~!<8O_<-apnb_rf$+~!VecQ>kNJmqIV{>V{=>pP{~eBx|4s;7 z{?zYc$@3^q(!#^j5y?@RM`}$d=H0B?^_r!d}zV}4? z<9?R4Kl+aj;gWoG0Q!#zd;KSbz5WW-f$1mx8evOMeuKh3zae3t-##Z#{moOn`uaO7 zzSS4)u~g&Lm8pL4*9u|puR3A#7r)m7m=+Puc zxjbE37<@X1;9#tP;n$(0=6`yZs#68Siq}(9^NP1s$Enog>8yE-pZFg?h!zdJ^6KZ_ z_1VvU=+WO@{lW{6uKvvR1Haesd)HS5`gGM7-&$2QurNadZIO1ZNHnmme))s59$5W= ze1G}s)jt{-c=h*R2y}hg4Kz?Mt5>Jp>eU00G5+`Z0dXr;=k~v0V00qQ9ay(7}pW!OaeIZoUbQw-!%+E2dl@Cz?|_R`sxUOG^)bK0SA7e#wD9y|lEZX8mC9>6%ITr*G3%H9rR0)7MPC=IK>aXXKy$TwbUD zVe&v;U7-IrFiCx(|2I&`P5d`dszo{fZ=g&=X#a1ZA~*5hKuvDqzk$Kr#D4=5jF3SC z6O52S0~s?40~3spK?4(vkU;|(Gb#o$X4DL1%*g#;?vEwo{&@P6H3O>$=l;11)Sn|t zQ*e$ax|n3#72)8bKQ8*idEoz^aJXxo9=#kWR7@Evo0PMyFi=^@mHKU9X=$#^Zv#VR zxeC7xlvd_y{5DXwG&ktB+(6}!<_K<+(tOTuQhLD%j-_;>AyPWgkbwzC$e@7R%V61ntCCPX1DR@BI*_TBpB^9OH?$pjV{**hdzb=SZBDD?e=f0*|F^{$Zoz(X}*pL=)Q5C3VxXKFt5*Vmq! zc0)eoH#l^|lBDko|Md2syt4F$?|$K$m@v1YYrzdSEx3W(2Z6eqI@_B&+dJ-95b=%u zy*)Q}bTv11+_*u@c0ZLQ&{46zr)gtrMPFA}MMqQ5hSt{-E@V#r>!E%Wh~<7cmh;gS zp&ae{r>dd=_{SIjm9ww4x38_Wqr0`|#@_Y~-9261O&gl}TBmO8 zYWbNOrp#+;eWJDFx+zoF^|yDlOnF<_DOKwot(#lzq%!Yr?`ZA0V?%Q~RolA0slTJ| zo_E$RU%L99J1*2f;xD`BosTTPf63Ci<+XP#aOalYUAN?(Rd@I^_4WVy+?qB2>Resz zgj4stbIF6tR@~9lv+>r2N!vZ|eCMh=TAF$`wRfg7Pc--5A^%-KH}teV(catM)p^Hl z3l}bW`)#+~(%jU#sO7fS>gMWOZ(gwQ?F(*eX?^=mZ(q3XrdwLx-dtU6x~1uczV?l+ zcidEc)6H*NaMRnWZ*5rc_Sp9Dogc#p=k zd1YNxEWybV?N8@)W-|I`md%x^9k2zN)JEo{u(`U?>ammcGuW~N< zPua$TOn#YjQCT`OW$GB`@JsN0@L=gF&P||6lfDPW+~}*KBDv;A;am{~i&@BkS0<(l zj@2#haf4&&CYMg*TrOWEC#$fkQqkq%Tq-Rt(CIf>+HqeM3fIK6R1r=_K`HkzP#8@N zzMp(E=cJCn!ZXt^nK^S=&==~K3@G)K`%~IULypWj z27M|=LAs_YEN5Oi>sNwYs@616eq=mta9xo5cuE@z z7%QOgY0iZpzz~@&4}LD3lQvFFnL1rGlEjx^iaj9oN>vycuv)?Ms-QqrI*dVqI_0Zu8}d4i^tmXjxO^+; z@_0G8UinU)dTThRh9%>sO`lm-cIl;;-V@T&{6hP?L_WPVK2H@ITuiQtTZf#Ciw#gl zEAqQT+7PKU7?p79wD*QQ5KK;%uYN6^3tmot;<{^$Ac~CM-%k2M&%p^r2hYbShgjOs zACz6XC!7m)9{pcBZRWw4HU?#CC0`2XLSkh=l}|4Hi+IjV2~Pa$s85;TE;&c^4bBlP zBBiCZPy72QrzlE&gbWPt0&^zisR%CqNytO#)#gG(EAM<*mBi+lmZ&V@992$Ds@qjt zm_94W5pALU7w84&a1NKM0N4S|i~3@|sdZHcIf@ZlDy9_Q!a16ZYCVQv>6E)t+EDn= z1TUF+e>jIM21R->q}631Xu`&+(;rD`i>J((b>-D>s=D_2x83-GAcw(9m;CUds4tcy zS@f}ZjxtLQbyKH)CY%c?gYWUf9|nDxOa#a&isvtcb0IRYhQ!mp63>m>OA!BMN-HyB zKq@i!2t!>`k`xE0I5$p{XcMJB2V0%Ihj&2RTrn(S6oqk)zw$8<(z7JveI38*=3iPm%rhSTR11{(00kJ*`h12`baoe zta_Zunai(K;y(=fs7g#$!DRD+crKhQnKt9Jd=T&QlHO@0~T zoX*DZBMu4$zL^`cO*Kpv|5lVk5)Cw*lI=k*#&}FwTpaEdCv9X-2|tCLLLgMoRP~*@ zhWZXns2_E*q`3I7<%@zsF(EnQKZkR)7ltq~m#+tXAvEGS{ry%< zD{GWA_+aYve;Svg2MZxS;}yH333>L-y;pCwB#4!Lk@o?o{LV97+ukCa83>=mIHNp zFS~TsWwSrUITe8jpns(g`+SfKtr=I#%hP6Xe;e;{S&i5>kcMQ{+A?2iDTJxCx86rRj7@?%3nAa zG7A~TbJSPJRyN6~adr?PIH!bjR*U$xxOnEcTvV^WMYA}^1wNEDTx(~}#%0~bAT(E}GfaM1%7J#f(j7d>#%0~bAT(E}GfaM1%7J#f(j7d>#% z0~bAT(E}GfaM1%7J#f(j7d>#%1OGqqK)yMjzdM)j$>lfY^AG0p_viB6x%?x!{1f@S zKHai0m+#Bv*XQ%ga{1m|zB8Ba&*eAg@=dw?lezqc{G>J2xk>F^xk+8UI$n^Q)Z3k# z)ZLt$w7yeYOMcQjyYrLo)_!GgZc^W7?RCCeG960O)}EWxqkW&!_1%=4w6Q-wskSRW zseV~*(mG^%q`O5j;`fNZL3wS^`Ny>NDQ#b$&Tq&~+N7o`}`J&ax-NT=ion85&W&P4}U(;skYkfkD*3NvOI$Y#R~o?&?*y^l+W5{@O4}~Swvnu-U&X5Jmq88qbQQKdxZqa(x%noQQu!8IJ6bp93OqQS zFFe?){0r-QT6KJPN7IH}p}V8MH&=M7Rl!nFMJ@|}9|(U}uPG@Z?n#HbvC!=3N2lo`rD)2 zCE5Ozjyv_lztVe)!V>-?iHict_;S>2ny`JIE7nbyFP)Yk#x6-qTvM7pr^M%@A zTW_D-u2h}Uu(7FE`fK&1zf!fd^yCYx6&84}`3aRJoL}1Br?g8$d6)I|J*iwaDE12X zH!1iEt2^5_>o}&;)BV!irW!3grM!Y>{aw+e2raz3wMl;;4mL=$e6q2tQ+3fvAj%%f zwJO;5SbHa4ZS7UQ_lHv4-H+#&c6CW+S&&?=y3QBw>FL^(FWejCS1I;nk6u#96?oSo zSJ)sfbwOEriOhnU<0JBOh==x`Rz-y(M1NcQH+D}6wV*Q+QmW=BdUA!Pb!y@T#a|m5 zHa00LLR~9D(ALzhTsjm3ikv25K&?TZ@1#``OVmhfk7DxrV3q1fT(t!0?{4mpm!c)= zOctP_JJb-`>^^S+%L@F~!5m z(AL(ssH;|6SifEoA`dHCR10v4xB9*w=~4W5=8GR{Z|Q5x6>sWkSJV`Dv~N`K7dLnH zt79sDD4tY*qSjs9+eULO?p19_k{182T(KJaQt{Yr4!Z}M!)}$3Dy+XXU#xz)t0!N) ztfNb!-zqut70_0P&Eo?OzQbx3QW!t{tzW!Wsd)JNYd-KIh zpVVtIxnjB_rBkc!k-4k-TGaCu(^FxR0#Q5St6C>F_w_X8i{FJwWJ`M~UfJ2wx;bBb zHRGatrZ`Ad>SQnFqF8QpFfGMUi;*hxO z)%!mk@Mu)*LcPb_9}K;1@%8J}8RUv-Sc`&pk-Wa2c2>NxX+yiJSTRwzELYsA>y*$F zp>?RxDqpVn5jAq0+)qO*?rsh{B~U|A^3Cj8=|Huk7t9rJXr?h1lT16#Db60DUy?{? zU(b^vmfBlNiyt9Bxh|gU@8r5zyuQ6h?Xh^BVnXR!ajX1-2W3Q4bDL~Ym!<14rPZ~j zxOHQ9pLDKQ2)C6MZ>Xa=7t@KU#^}+~?(uk%-KN%VMEaUGDu+!Pr7VcMn`Hdmx(>?t zp3p2dty`)gO!3Bk6;SR`DV2bJje?6vX^zxdJ-uS{xt-QZh z+~2A9n`CDTtz4EhwaDt;j#i4P_OC9pSRKGd#r56PBRj65#r3ht=mn`}ozz%qy>e)d zl3X_*$rm>e^!Z|X_eXNYkN3CZtd`c6{_b2!Xz1_Cm8em#TDLh@qH0x%^Chc0H}xp| zOYZLK*{Iw~G)$mCC69!6#&RVZqjjlcf$DFcqAwlfawMYk`H}}^{gS?l_f8Jyb0sRU zs#g2Z^GKQESM^pxLDbun^z`>OZD`GxEZ?k-sYS}uULFc^ZB3mm9j!91H;f8O`a64@ z*0)xCt~BUBYWv+0kNjTTcmF}$SNvhzEB~I>^}5QcFfFn_U!ozH#!3Nqv0v7tp@-~R z*RD%xU-h5Ia*d_^fv-f|cqHy?y5l}qqOO-FT%y69Mws~$T}}JDd!;{}U)I*s)g`|A zVg*i+>(!ONQ^#sMW7bJFFM+^0cIhve>SdNl5PH}vXSTykIU23rshXv<`D6 zQpAzz+SIw@4@SQ1 z13z?QH>(`|8yWqU=mkX$U5JCnT_)7?m9%uN>d;6=@e@WFA^3?m+D`jMKJ-N#SET*X zv>()i%$%=ZZ*g>ei2hs&o#ujDz4vwfG8ptLRCs=VgcEZgb)cyNJ6#kV{a(>*ih89 zV@I%;$FJ^HkRKCFpQ?QCSW8guvlFHlR86asnH! z!qhA{jWjMpS;&u6)x+FoL8s^>lvRRpsqo;L8k*j-5H_mtBWvCg8uB0kL8$;Z3r4(- z;#E3P(^l4mnt7y$p{yxO_+(V|LW2J&XP?N2(=@VqN51(9()VxXZOp7W|~;Kmq0#R;nmH3$qSTK~OlM zs8u7ZhPMyQHA`VBLs=6V5DgIXlS=E5n*sHbT09C5otmTKVLH*^I8pN?^&kcCsw*if zcCzXOsu(^AI?l7Rw@W=@a<4>I6MH4PkI7Yn*;Kl!XyQX$!^A4Dz7S zag{1mgTzQ+L!B(#M_{33IDo2D+g0$H1w*Xz5#Xl|CQ~t1H-n<+th)NDrR3&kA?#GM zT^9UiI)RdqI#QFTX-5sc)1ckDEHzVM3d@4yuI8RB%uOool0{>vmfA&=7P}#E!(g zqo2VM(~9p2o2h;ZsdnDRPrEE>wO2604vffiOcHwZO9o-V$XevntsG%|b~j9$+So z*R4P|*O#JQ)zvD)m8I`s5LH*r(?&+uEMmK%%mw^E%1LHXvPq3N#0SNcN`O=sfl2B( zWLwlNJq?0Y=oma@8jP5b)vZM&I=D)tEh>Pc6OuFrBYY=qQc9PRdC|57E+pwj1r4-p zGAT3zglSk28yFxp#VQYgkunOh!x+>~97f6ns1L%=P}bNAxa;sEvq}(7lEa=wqo9(c zfl)S($S5H>f31gyAbxxR4FuHD8X=B*}bQbudC=|vSbYb6A2ZS*f*UzVM79I^6 zPzhk3to5fM6fTBJskBUZx(aF_w6OA?#=y}HV_=pxBK`}7DGf*oL9_$eA(HqCWo`fgp_FP^bw;qt zD8Rx%4=B1PBN;ARf&xrJy5MC3rboU@#wSc^Vwh1tQ0T8rRJg8;sKS9npOY(%88M8> zMH?rDMWu$rWRTSi5hiVzsCtIlOA;rIn6L6w-~gFtB;?WikQ$~9>Ld8+4KtwS>Mrt> zNGgVrho?XeoFZ3HQCEr31ie*Ju2SM*<$F_-I^0lKQC3BX%rLTns^3u8xDd7tiOaCc zNQ~34%Nxg1Vj&FEw6p@f+FB(OmAwm7TNh(iMca_tp({;Avr)JG#oCgTcRyxm<+#eIdKFM;~dh? zx^cBgJgBqj6f$8XYmGpArz5oiQ-I#WH+kyS8LR-~^D$#A=+Lm2gt5P^~#tb0&d?C=DT#S^e= za0?K+VbTsGV%8>_&a_1imo(P1o$L!%3u~$tIN9)ZwbgO5`yMk$O$tMu>}8bRrDyq+ zOhG6c$)hs$VI3zMS#!3p+4U8*^%z!Af7Id|O{#~o5ro6k%)@ZYhN}#dj4LObZ8mc7 z*)aHmp_b+#729R^EyL)E(9D$GmwfQT;zi}5Y?Zz(se--9CM_CWfsoY6uB=7k1oIJ? z#3YHlD0%m2#ZYNQjTl)cyQX4kY1tC;AG2p*`mU`ntzUr#m6p$i7S1gSWltdYZayXI zfMFonuOWj%*(1pprhysCp5&hv2TtMd!d0yRlQZCf7nj2RgB=QVX~`v&J+5}%XjmCc z9CSJcHj+-sZcnNzLw1Evp>$3*Mn+W~`K=&~d1=L>+9eI4>|$u7?!auwkdr0Zu-PI$ zGI0&cwxTa8M=BHU;FR1-vXH`B@}Z5Y=D+}cJ}1j#tAwyC&KlOWI@pZWTurN z&aP^hP=hf>3PZLQLk8IiB22>;vqm;8(!h0ul4mPZt-&fhvz<+5jm!i!h#u6Zbqg!W z3&fm-W>z&e!UMyp${;ImOh{l#L4#oVwbD`uQihZ(o+b0Ga_>rJ^=cX*=~Ptcq}O4L%;1GVV*aMm(0G;3s8dp>1tXmu z$*x(lh^!NJR^MX=4^iHIC>uEvP7|SaP?4%7JzG+_pb_KO$zG&bQ~ieg3E8OyDUH*5aW%DB z(Uv${6;l+y$_)Cg;0O9*d9qM>KiTS3g=YGclIAcgw8k=HK@|q?beh!ZTVdcAi)s^V z8yZ$PIW$`IC=2B%7ns_P>mBRWTaRaC;t z(mAXOnHMLgvbI)CZVp_US-*pk*9N5b~-0K_+*`$075y?)A~~K${I*ML&Z|%U{zEy5U4*u42gP18wm<1Yu=?c&M$@d;&ii`9fMxcXD)wT)BskC#f3QEXYAU zL;4!ZAve51B`ZQXWco)DdghaOz;u!`p<&E&%stS0@KcHyO7#Vw>)b;QRbs^l)(`w3 zBQDS2d;+E@+A2czl90%msa7|X!Irh=a%e)}$&5aBxCEP5Fkv}4 zdP-2!Lk?D*E3uG>ofy!6HPa}gpQGkB?Xu_0ML+N?pQE$lqsSoUDBG!Q2*EBw-dNfA z9P(c)>h-yPhN52RBo)fGJ2_-4r(^LCvsDgUffa~9Xwp^Z>JjLGlC8Gyn$|?PM|hsy zQ#=;VSyo%W5FYIUIMaIU=%vUU1UyLWs%%6~U-;!poZFxfDyIs%iqVEhpW2AALsxj7G7yjjO;GYY zg(W^t*bp-L(1`{FOpqr{glZ)&M}-Crb=6pv$f4;7CIKT6c+`sDINCLlgB=U7?2;VZyE+$dDGVksbw3 z?ZK)bA3Cf(Y8v}+^^sph#t8O@>?o2h%Fff+;RIU_cP}LkAb+)PM>Bd3oI(B;C&rPQ zea6xnE!h*e*yTw3X`D35;X3C`qLq*ODK*tKrUHzm<1Jk=Qb#lJ*6H%pjV=5}pVNtHk4Hd|(co#5U z;9x}qAsg8U^N~yDo07kP0#OxV00MDUE+!6%5kk3>Yr!`!#^(Cw95R4BvGQGg*z_rr zy^9$b5Malf0SGla!DO>=G0-z$xESnTs3-|uGLkY*E_te$li-7vhjNwu9<@R_6uDD4 zLj+T;Br4e)w6wHta;;9YIk{j1iC>*n&V^z0?jF@0hD|nn=?k;YzwAorMdsSd~kVn=J}n3?RYl zxkdE?MlUI!GLujwbwTcVYn42PIZ5LQIjlm1QLqZ)%vzvKgN9oLgC4i==kLbV^#}DvPHqXM;n$ z`9iD-I8M3RiPjb{m)xoG2&OQO&$<&iZY!_ zVLkh$O${44GBsrH$p(gUMH^dA|RPlxUtLjim8$LPTdCr??a2~)J+n&)LL zASQz2hLN`Bfjj-BXV~~qo=OmCm$HGbkR#wLMUV7T`KO`0k!lBo-hAWaX)m0&;^c{i zf{5!wdGI=^D^;c=l*jf4-W`^|@^or}%}<_m@=P!l%7bMj?^DGEPM%n>QA$eM#E{2I zQqumV%0N#J=h4aobt0y;M#Z%kJgF-`cF5CaNbkXb@R2NMnn z9^f0=Jc?>bFv{fQXd38WL4?pk!gc= zVMi2(a$aBEh(fI)GvWWiV}otb_YgnR9EWLwp5$oSznXwaf_4Pydx%63m|_GdCw`hX z&XAzqc2$TpJo*9S&-b~tOh3^ z*+_VodSo<&^j+-?!G-cLV~D^o<&%M!2nE!dneUBe%Gu)KL;43?k9_U(PMAVbE-;U( zs&8CC8bkA+ldqPHD2#+ZS{}-02V_)L4dpHKXVxqVcqIO%@=5ah@-Bly%0_^$Tv7rd zlaRq2j=_;7Ga8mshB&sUpBVP|xRKb5lPMsh3v7ZE>ohUCy{2rT^T%NSx8oDrJ0=$|1PBl zHC<1~oP17o=pJ?Q#U{WmU}nh2)|rwjy|zjHi$!r00K3IhM5YZuL{!hDerUnU6awP+ssKoHKr!8(gU(?Y&Vr62~-5h3ml9^jii z@J!p))SeNX^*&h&*F8R6pe9uWy0X=#F>r|q)fK`hr^UFnZ)Fs>&6;czPIc+7Ssf|{`TLD>J(}*(!S^HT!oTLvvpPTtPlsC0-i~)&QBR^3c>J+4b%fd?g*C4V zDmg{%pLN=5kGOo)3ZypWZvM-QqD0pK~Sq_)sI zZRbNz$*pCBO8A0vwEz5AS~dbbfnP+?Ww$w#YvP@Uwtl>Z@S$ABi)ZoLif4yW4L;F6_&#&|DUS6Ee;ZIAqHjDNMc=~4^=JI; zVYy#m=xap2sn7T>H{jLZ93hH)pZ+ejI`}%Szx@q;Ci7k~AH!W45b&=|HvKocqM;(ti2-uTDGddwWYDsGt$n8{GGas5~K8^oj6Z zfei0sZX+Spd6>ev#gvdo z1!nzY^aMr=o2XD0mDXP1jbIN=JG}rimiAGRQygmNdBEBw28i;l6&#H!REUuKQ5LZe z@c{=6T`19SyI}N-sU##76q<}h4~5#vn8OUF7R}meCgHlkw!szvsW{i{P`0b!1s)C= zz=u2m8;TT8sGS&c{|R`;L4(~6n=O{tEy2bf%ptUUkR%3+O(7_pE9{^QRM0e2jSAoh z8tHa@^;<86;>v>$w(`nqQ{PI3_EZBE{ML^D1n<1}D=PIOcsqn4YN-UKh~88U;HaLj zUTyS2ph?ikz!UshKsyd2fkJP`^g$}iQ~=(tss^bZz5LW`G5gh4ynPV5e{vz0aQ;=BqnJmi>zF(?!L zWiD+22nRBvfk?ES*oH}zast@`4+JBe6f#tRfvYTsH*yOgr=*%t0Y#SZX(^Sdf=gYK zlxFfVQ??O%rksLhw2P;nj4Jk(VA(xDolTlkpofXK*QO6@0;5r-!3w+qOQM8P#WNJW zDRv6A(?vC+=sFxM@D!f{0<3m81=^AE(?!4|Ff=&m9lfL);v6+>v`D>GL)V4wvC5w!w?h!Z_{Pm*ZykRS>aEGj%wslrFquHe84KyjuzP*Xd9zH;FU zs<0ijqJAV+c#z%1qKQ*5Um`=&bA)J40bX~(YYn4TjKMOkiV+I}qe%ym1rQI?ep<2B zlAh1=GQD2t6kx{#Mj?$9Y?8yw=MF*tn(&4U(z|HeE31D<|A;rahT2nfGEwE>%4zz; zm}@T@K00$&5?2s#}cve5B_jZ+UrNHNe1+Q9lRL_EwsCMUd(9?#$T#PBEgVN39p@lj)ILaLqPZH0mfxsO#gL)tY zx_VM9oUS&>Ov2ls9fZ9?xLmaP1m6_tkQ@=KB}t-TP9{F=ysE|{pvQ_oc}l<5i2XFg zGZxiU=2QG7)On*v`CMbLw^Y$ErVP;F8v0&+N*HxBPBiTm2hhIlQb+OvN=+|Ls3M&t=$4&?R*5^2c`(K?+~1#mJU&qR0pN?%H&ZFS@R-#rPN+$PN=;} zlMY@oYF3AdsDpTQFt-gA${}-hkx7Q)x_&CI>*H4jRLs{UCqIJsD^8$&}Q3u0n zr;H!ncO-2xbu84;Q>W>HEi)YzK8kDtlLPQ7rBw=!|9EEbc#!^9(@IBAC$!yG!M0%N z6Om_?3_F^EfwJg61`ZDNvmRc^8;gWWSj<5lE!g`)3LHl zX8F=;a`lzX_4!>CeAc602eS+J7gn>}=}2iE^_1F@!8-0^(5pdA&BLJendPf?1(QRs z;{ha$Fd(?+8ZF`nm3q+M z%Fxp#aI+ngeeTLD_N)2*P_TkDw_lyKYrwBg+Az?Gyd?_n)MoNArS;WVMr?FC1%p4} zt=Ah70!XwPsLXtTB>sxHdY{N(PgTkf&k}ALFNhU)*8}9dSlBkqIhG%b74zxXpIWAuz#Sh?19ch&@z{jZhPpK9Nj_|h}%K#mQ}g|SrMS*A3AHXlZ-hR zC+3Im^oj7M4_GVC-1D8F1bHIu44ay)mosX|meNaYojpMYCZ}S`^>hvhELlZ;7<`w9 zwkToujY=c|hJ8=w!4Lep$erF~ZVG9l5m%OPCH4L!H3K^yRI}g`w*q>fJVbG8kT-ym zS?}UCH)!5q{3?J@Y^AFZ32Z{l*(efMClIx?Z5 zw-&4l8Y3q<$+z{V)vy;{J)~}vS_TORSC2xw%d!P`X!4WJ9vnl<^WVquAJBe=<$*xkB3|=(Z4?6N;pv~|OKn{n zGKf-Uwb-M)NJvO;M0)d?niYo(A|6PD+(?_nk9bn@dRHYPyeo&FP>V=*Nk)i>NJA=AJ!V?~XJ zMUE_rP{2qFsCcHQk0<#VZwkdjy|m=CY|*ze&*`~BW|Lk)t^?hDVo;TV%i~wpq&dT? zX7ce!1Hn(-TS?IjY|XrheoVR}wSMoT`S&SfR3`=EJcjoPwjhlr?VCzyNt>u5Cx-U5 zj#~=Blai@(oPC3oML;&?v6G$_5kfN|_#uPPXMIxi*>t6c$}UL9^|3YwIE6{%GiX5v zSo>;}w82Mz|LK6*PV>fsHX_;>;qfBt z;}{9#<42uB~Z^1Mj1iD!73DF=74~PQ{C4>9p2Mhfop7LqdR0!V38Ki-f?ERbQw3=Xp?>~g$_eu}nscO`nHu#T*Y4}72_#uN|de{bkyzt*MJ^lCv zqqo`MkK2psXMo>Y)#@A@{8EN@d!?s;#@62RZSXOcUt(B#`0GyoVow|VDZ+mS`fpu! zn3ez4(tmrWr~mk;i$Al`KdwK^F9ZCrp1SKQC+Xo6@4WVJ8~lO8HM~0_ zJ^U5np~u?b7xD&1_s8_`S6{fa#s>cx>t8H`{D-XBeXR}tMOX9R^sn^v*Iax2W*hvW z<1~D2hZ|-J*&u!cDNgMnF+<&nQ@WY3`KhFlAkp9mAzu)VPg*N!- z7~Xj;efv-7TDHXoe=6&bn*sixzg&8O4gOn}e=Gxh;-qs9u)&`q<0k`rQ~tf*+u+}l z_P?IK{XIWlZk>NFl=f$U?{(3bjyC#}M{E6$gwp#T_sm)|*akmgq=t7FrXT;^*R4I? z24BkbqZg!yzklEcd;17~Ta;s0~!8+Y00zc2Zp4EFEWhp*{pgTIOU&&|;OPCpI1-3H%(5X*mD zdj4znJ7S^@{x_C?ECc=S=g+eGKW!#!`c7kd`aQp1cd3p30i!g0)4S>6?>lFC$OgY~ zjE0ZwkskiT;ZL4mgYQ|Q;o}+jfB3uuKD5Di=k~ix($inHZI4bi_^0;Q^rMfYhyT}^ z2Yz6KKbZM%%0NHsg=N><;Kwunkw??h4`to-vkm@-nJoWh>EZj%S~tT6|L_sq{>#(D zzqaeg_(*v3^@|sz|JS64Z>(Bu_1{*o{YYfc|LmvF`_@K3bd=^lk)i#wH*~$m27kWT zujT3achBC>n!oJF@{50z-hReU=x>cbe`I*)&GhguJXE>N#{aIIzjTMB=YQ`mE8nrf zcbKK+=VqY4(|4_`^UwYaAIkuL&x)h0`Ztl`6B*zieD<5TjsG0Z-zTP|Z~vB&`&jc2 z3r4X1N7BRptN*qCvC+SV?WbFk9{!uR`#olZkMR0g)5`SlH?BI=I)C5I^rMfZhhN(7 z$>(hJf8STP-+3#&{>AdDt^RYOi1jA}d{Li*gpK|thL2@{AO6jzA8qjO3jFcu+h6d` zs<&>j+{2LBV=-*`Md{Z*fi8)}2^+F#4R z35h`Z-i{m+cS^bFkwuej@G|~md)naz-_`G}?hp88@o#Z={X|m+__HrMgzRrK_$ZHm zcaojH@PF-H=Pj`DU&rv#SJK13_j}nw8+;pHe{Z@jJ$&Dq$41%UR}23c*1v!M<-u61 zaQFa`r|f??vc1$Km!0`i+Q0nw&Z7apn>;1(&-d0fP2G~?HxvH#{g*y!gTI*dCt<9= zoA3{waPNO?@I!h1F=32<6TaL1?jjrf=wi*k`%tp|FyT*Iv;IaK{2M&~#WK(@>eT&w z8~g^gKZ)VV{cqB5m-A?i4Su!opJDyx%h)at+4SdBSGPa*c>4BtyXv!_Z1f4<{Tu#H z;@tH7KVGx)EE|05LQUUXe>U6yf5)D(mks`UZoj$yY{DP8SM^Ia_)EC`?h)zr_m}eS zt!?nTO8(hczcuL}b3=oxqbwW! zPi6hjSidp*uflEpHyix^ViAq}xe34VqY-b};J56d<)6qvf5cAL-)w_l$@*umznJug z+#7q@2LA}>Kh54Eo#u=vh@Z_}e*u=Jro7zu!N2YoQJPdA8r?`j^T7 zw5uMr>Q4{Oe>m;a+s}rYU+=Ne&zJn4k-s+S_dI^Pb^bbTJj?Hn^!?xCq1nIL=Z9QYp@)}N|N`n_+PKL}nOFQjk(!i)Cb+eW{u#P1pG z-#;JP`D`2fEQ;UGMH@yZ_rLhvQdTV4{TCbm3LYpD8TkM5iO)va=-zcJ}I79{*G=8Z|om4>G!_yx*{9A%kgi_ z$Um9z!w0{9stx{Vj^E7uiwS?psNHwA!PhW+laYTh;Xi(|+j%zlUwQnwkEWO3wD&h! z$4?XI&&>RbNx#o&V>jC9$5?)5{=tObd|!2*4Zb7iFWldm|KTZLEKx7J;}2b`*F^a3 zm*f}V@yk6ztO8-Bvg2UH30XH*4~*uDLr82Iqh1v-gzj${~`M))c)x*$2pGk zAO#F3c1O^>Us+etE*x%U?!Tb@zp--1dDwtA@jUR)g*|Ug!&&yzkCh3i<_~8SrZVUn6pR;^lJZt(v=KH6`AH{1WqAzv-D>L1`^7I?G$#qVud z1OD5X`u7~*6Bc+=e+GT=b}{s4CsTja{>kI~#){sU^k;9cp9cDQCVkpJ>002;_J8#A zzMrH0Ip+AI{gW{ZyvhHHvl}h}|6!B=x2XLVc$5D_@_#D_|5+ygYX9WI)a@5MWBVTU z3*ZkHc*%d#{=G!C;}qp;9I52@PXDJb0DP{%i~iF7J9klY`lkN{?Yz5 zx28F~DZgREdK_w#pV~iF=Q!#QL;;QPZ}#8#{#Q2I`cLgYTHG97BiWlexiv1D$wVwSym){@Ui91Z-q&(rH!)~y_=W_l=;6?8QPRjB#@;btQY_|SX z#QvlHYaNgU#{mK-<#|(Yr}c+s@FN&rzHxvJ{#BO0*ZzNMKU(0V{Q3KfzOu>xU0(l`_%l`iRX+a7em3|Y zn7-uiQ^C7CE*)s&e>RUh;a}o-;akeNv({W{gFnZRpTl_sfs^vh^V(x9l;1^KSK8ojn~>c94!=hwa8ho$`P?lw_&k1pP3X%yguqGpYqw9{v%&Ao>z4vA z@1Y2sl#edh^1coJqu$BP6E^q+>#xAeI=H||`ThkPd)fG( z#p6fDzu*x#DPQ_v=G!*EE*P_XRficUgWSe_2Nsx>9~uce54#Lin#i4NM$pr@!aV(Zg)?zj2e{c8h-EPB=kKZyJ{9I}3z3V!Oz)2-uYq|ttFAK0i=c`Ws*AeFZ= zK8fb#wY+awY1XX&BWzZO$ftIn#XG~lm(^rP{Ii35qir2ADmXv=EyERXnW_-HQryk*jQ?$HfHUDY`LCPx=%qIP)&5+>7s9_8XQtv`=nMZn7M8sN{cCUL z&z{&*V-Ua1c}d$Ju_LMQoAE)%ioK`ighK7j{KS#$UkU#)-X~$gn{AjZWj~N6n-K*(s*zfjDM*qIV@q_riE{`u6{|1_rmlv$N z{0hQfV&rG9mi_s>zt2r*{Yr_5Z-`vvxwAX3y@&Ku?5F7G9=r1sY@fwGnDBx}${3%J zX`~~s`yaHwti8U%|2u0w+w{~mo<6dD%Y@&&U%!1rZY%IF_=W$6WyWE9ka$tkHQ@zL zO1Up()0E*)+VtlbZ+>O_#(vtLwQuDMpSRB6<^2AM=%>VAQVPFjnP*gd_(8u&PV3g~ zw;B4mhsdAf(gf?L_!$No@6zQnDX;!@<&VMs?aciI;1KN@5G6uEi`jT6Bu<ScZ}vG@@o)6+#uWH>HsH-m*Qglt z{)rU-c;id@_fD}7Z2#S7|C;^Wy77$bZT-6s$G0L6(IY7hHoZ&fUn##nv*d6a{>O~@ zUE3(#t2tgrxlJ>s}4O@9C$@^Gj%? zeo*X!W8{|^O|!z~8Y$0wa6IiF_wdX7vYGYM+kgIK%kmE_;LhW&h^7e8V6w}^y90Y(_6uRkmtnycf|TX z9kPEr@l4C~-&IgpJLIzS>o4@M^=~0t49V-sK08yt8I4!0=d&1>uP*CF_PKp@iso-S z+lMQ7e0lrFS$|}{@epP>$=$Sy))$+N-$ytYu`^(Wj$ zx8uGP`k!fjFESW-dc~**34hek&mQ~f2TlEKW5Ao2ZtLWl)0aQGobVT|)O?HnR8QjP zWdHhe`uv2DJg>``kI8-}`1$TNch#L6#4r7OXNvyKgx~u+^^AYej>L_Gzr>Kw zR<;kOe*R|X+OIVn^tOL{egolOZ|ILRNQ0R8y@12Vm~>{wUq#zC{zCTIjK4nT_fK4j z?^ymOd=he8h+UBS-n}|4RQVZ$|36aTH{k`3lyN!X^7S{0b|v|2Ht=_5`zG%%B$)pk z1Kzxh7zXx&IdgIef1T04zq0*F81cnu6QOY}!%NDlTfaL2_P?3`xplk-6#vuVe(*{I zuUraVDW5sxyc=xzpPZv1q`B@c+OLgsDfrA%@Jjjn#wGu<;XjA-x5B^V$=t_yJe!F5 zI%3q9teSkbZGJy=PyJwm^R=<3HD2M%K;vD;_)N;F(Z46<2cm3$PA<_8%KraE3-bel zSIVDmo^~0{?;0EY3bxNLvHg_&{ca2W|A-*sGCF6+CYyZvO8jf&$1=$$!Fa__dFk7$ zmIV1PV*Y3G`wimv#Qq}xohwI{()fxR`Mq0t{m~p>hIu!n0e{b^IblZY?+Cw{-~PUz ze$d2km|p{%k6-9?Z~WrpAb!!Gt=KUo^d}_qUR&iF~%<;*Y>#Ho)Y+=hshOXv3d}_b=UT|2_V$ zCAWWT!~YcgPxssZ9)IV=kKfzy{|rYY@m+fS1;d(KQ&T=uw)e~e{$~5TPl9}$R|LPW zpQ1nRs5Xv!nJIn$?=Q%muP^Me(Z>I$#D6%X_P_r({d@GAb@u>&GyS}DPvC!D@6WaA ze+-7GPM8doA|ENAz3KDCHv3$T{oizi9PMGr`lIBty!9CUnD@WnmGbgu5B|`G|7tIP ztMMn~@4U!-Z@jlB1O%^?8@4?ew&8!w!0-JXm<;%Zj+962(fSkE&n{;E@cg~x30>A1 z->FEx>t6}qQnr2lUhDqhmArn}3OzuF$X&`*d33=m<;O=pYu#TvZMNn~`d9p0FTb5) z9u~Y(u6b|aXq)`Evwtr5BcJH`=g;DI`mC|;PrdqRJO5sOyM_F}dBH_**!W+^@)7xq zA0%Ze`HLNw@}QO3?SQ{yXU-oU*;>m%eP84>-3I!9z44x{e<%4&<>1Zp_OQukFK>N>?E{Z1iRV+rd4gBU&)464XSQYk*dDz8>(17E zQ@SH)=hhP0r~SE7q$GHyTzkqr8*KQ`>a8IX{C)z3GeJB3DfuZUXU5-s$GDgce=+ZW zXu^wRgx7{Yu?9AJRapH}@&A6Pd#w$B!GRh=zK=xjnFi(aT&~YMxf7}I-#qKE-E8=k z{{|qJ_pPS$r<+BlfTabV86PsqYap)(9;Fa>L-M&A{ zhM)XHI%MB%IzN$oML7holn2h3d9w}wO>CdVo|*U`Li`%L((i**_&=RI?>QTO@;}wV z`*uzI;-`=wN?RonVHvHGId?JhN__w!E zKJ#zAY=jN}5MG~(UKGUd`_bi)580i_`>h@N$sv48dC#Y>>|(<|j`1f_@ZSsmZHwgp z&)#txeu}^7i1PR{<)1PR)9#oC#{c2`1vkJy_tq~YzNYX0yKul|K9v0}5r#~)Us>cL z1cv{#@@Vki?E8`zjn_}OV}tVd^>Z)i56NE+!6*2oeCmjY#@OVe;v)bx?G(iC_pjI= z6(=E9l0)!H*}Kn;m)h`Ox{rp4jMnc}neyMWTg&)=Wz`vTZTQ=A{wLbnj{i64kI06~ zRQ&&O&5-wO_-~;25l3W4P(Hr=TkWgyZ+^X%Lq9o0E>eCl@#Xhz_z&RxfBYYI{5#|O zGA+^nq8)7q+3*)|d>8-qzr(*h7|nUx?{7|FBSf1^q|LW_$fa?hrBmK?=c7cD;d9(C!n7kzNYG$vlG8xkN1Py zo8Jd`3G#Qh;~67=DDdWc(}G{*BIT0@ZC_{O|C9+DA~8wJ|C|xY{EPpvd2+TxKRE=i zlslrGPe%MQSnkXFFLPa8BXO_9bMc!ry#*Yv6@)H#@&p*A;FWUWA*a&*|7Q3LIR29T zx3W(*db7qKWBlRpYR8`)o8uq;Z4Y|CuNnSV`29}dU-ANxbq4?8%}M-ATq@<%$nC!Z zf5+ZNeEJ0E=cVZ-yJ@^K{YkkP55#Vhr+oV-_@63T^^pyK6X$0Ha(xQ?e@9%9fFC4> z;FZ#uF^sOp&t~#>n19*-Ci~QySpJ(ue<1(P zf*hsbmGY;rHa=&=AD^j#y!}7?9oP6Rx*cKuUQO$8U0VH#O}%uR4gX}upOE!O9>>vJ z{~Z2@jvh(hpKB(c7dSs4>yNTeEpnU2U%>nqIO+BO?bS7>*zh0A@)!M=b;u^h?~UJr zf>65g`|s=Kth3>F*?&k#zL38|7Qfw)Pv>oERvk$G) z_wSO|3vaREFJ}3Rd}JLga;L`c$;Yq{qL)(cKklQCZTNp4rS&tx{EPi;V*DQep(CyG zks-16zJ86i{QT9hZ|-OM`&q4=R{r`3>_O1)k$KFy1?w@Zvb^Vn|LuoN{@S)a_4Qcb z`9iPn1o6KK!xr=#)=y9L5$~?$F4t0;??sAT6aIJl zY}aBN{~eJKbHCK<7eW5Ld9fJl7jr=c`yhkz61y$*=YMpH_4_?-#)JQ_1;20C-L|mz zfxO0)9_i(?_@>jR+vG!k-!4`oT!7Z@cKM`=lLYeA(yMcA`04LQ#Tw)(`04D&`8E11 z6aMWNUHiQazxw+~OMGmx7UDPM-|?0U?*#s4-=CUtIArp@$iI2q6+!X^Ynx*PucJ*`TQ(cpo1y!KZ$WpM=JbJe9*ZnrF>4*u=KzAcR1uuCj3i3ADnOF zU;TZLlLQO;dM~^Exo@(5M))_&16~`k3Hsm6|Li{m{d=tAeCz71*tZ}Ryv&rJGn#-6#(M*pK>fQ0=Q`Vn4V6}nQI^!MHkvIzLwndo2k%uDCk=pT=9 zNAr)+kGGJ%H=mn?`Pyv%vxm*U$VUITy`YnzKZ)fZ>81Nu+ASrfQFVy?CGO_xW`#+A z!`lacY@@#v^b-O4@fOmTb**NExx%D>*D2RrZliw+=)2KC`}b~H`(Hucf!3u`9VY#M zEL_oGqrV#Z9}Ccrw~+op(7y!o9;ptK{u5{X_MDCWamaTh0`w#Mw5tWl?o^!H{50_`B@UHq1#J0G=t|k|^FFO?^ndHEfn#$t{Zh2c zM&CU%+o7M(chAB#eyI+jE9KzlMjc|Ke-8X>I+|`wPk;48*$(|Y`VWIXeyI+jE9J_M zj=R`Kf3d4EM9$IlX?--<{@-_kegyp3*1TTvXXU>w>x+Nc=u`YcN35Hj{|XQO{&vBnUO+UftV+P`Gay+5(hFD%sb-BL}T){m3qk0y$&shkG+Q=Agt zf%QQAQXSH6DL1rv{wy2)^ZIBEO@D%ZFs^AS{jb(7vFbm?mvl67|I_+su>F5F&eYhN z=a0T=vrov@eu_Woa5?UzI5S8;4E+zrh0huKsG*zxFLIai#ILh|v(dk`mxguc>;BjD z{WylEm|*`e$k*4-tC)c3m*Oz(|KLA%Dze%C^}rXa^pQmRX+C7$mr|aP`CsA_sW(e$ zx0H*Id8OFaeu~fOkhq`X%%J>*&Su1M^ve_nX>5M~%k_tmt^+{7+4^9~Q2m6P>#u)7 z1w22zU6*9}C-#860`^ewo29f{$_1BQZ{1&zM-v_nw^++PRr}-Zc5>+VXWK9I8|y#L zwaNc)vcB~|dir(P=S9CiOJ6k(|80EezVSBsujKV>r#496m;X6CC(C~zro7;I5d3B- z?UpiY()){T?Wg>WIykSQp}T9&qLIWY2(oE&-TC2f9ATygKhL_|1}+n!2W{Z_%rtx z{MGhPnsU#_Hu?nzY5MV>gYEa_KcH)}{6};GuWS7}4c+{IX}6RMsw(H$=s(5skL+Zp z|KGM>I6Lm~mwy8NX7=y5k@|_IOYQWx?(NTib%R?u-y%aM^I-w5QytQ7DPLW8-!@zO ze*u0vq9g3~_e{u}=((Tlq<*yDhsHz6M>{$6OLYicDf^5no@}E}`{(J1{eL8Xq5sL` zef!(!kJ?AmPfW45zYh8-@}_n#$NQjvW&XMIk`ag6=u`fb4#~@E`{(-~l4qbiD*enn zs)la2P}l z={L9kl!vBYOYOhue;!r&%MmvJlm32tY&r7Z(>VV(MDrnjrTUFC ze+(UwPImef|HW?fY5pIsgZyad=KnXN->-dJ8~rbeG;Abcr(Xh<501B2pf7)ge&o>? z2ioXM|I4}q<>`a+|6le0hd*4h#YX=IZhvB;Zof&t6{gtWeDfCM@mJcv{M&uMvC;pX z$6x${}K(QVM-3kEjbB zY}3E*xnG-RYq~^dC;SunN&X|UIPB1GU(AES@hJJ=IPTF;4mp$ZypNyGve942`B(Q) zO@C5%qVLB)bBz3>8Gk)O_90-Og??}^5!G$qII0W&eoGhg`<_HU@f-ASHtRq0A$l(* z@kK{(T{uq^>*u3i=#s0wLgXjyzyFVu7DNBK6mkE{`aZp16MYf+iNiFW$OwD?Z$#dY z4xvAY^;Px_>AU{_LSM=)>rSxd-wwq5>XbXq7o)iSOrQFI4k^FjfhhE=NHAA9&aub` z$DVPV8}MM$oeD(#C+(JUw^3WI^Y7bZHB4-tZug_m$DsZRo%PeQ9Qp~p1kULvbYs)8 zuLwUmiugqM?VTMZ{}0(TeZ=_t5(UV=MLrBU5A$~e;;vo(lozH$@a-q-mA~uf^^7H7`ciG0@ zchvtlB1r5~ml7T7bJ3fFJL>tSWNRCTe#Lyf8RztS3=;y)M|Dle&)_GA(3P^)ydO5$ z=zla&L&VS5^mjuS2K!&^PtlC9L%&q^XEW~6FV*pC<&J;Y_7{YZPl!*&``_aKkFv{O z{QureU^Dll?3Xm@nw)%nM87U*f3y6@rx^cqBo6lD@1Xo=2J*jk+gdww1J}`ST05I| zX_-H;$1Ou$(!T}#{WqC^DF5qz6^MU04=8p|O0)evWWM~-ZvO;Mw+{RF9)09Gl7Evi z|55(Y{l=#s8Qn7Zd-m@H{k+hTQsggX{F8B4+w|`>^gkU5rc3P%%Kuhe1pTe2vF;tb z-j4Abyw=#7=l|E7_i86UFzK`S&;C-x=747L@l8*+7=AO2^@sadKiA_P{p1k3a{YUo=dY&m-(<9(=qK6)`k(m_Oj4TT|KbU{ z|D)GxzJ-pICjGXb7QboJzy8Q4I*q>kBjZ~p|MEZS{|+9TZ_U4cakS<*wlpYz-~Y`N zf2E2?rTtQ_Ie&rm{YLu!2puwxO#L5#`8cTWEzQRtsnL4>kNB$VVI=?6#`onY|LOkV z%RkO}Q0aFm&HkTojP8GVug)XHC(>>ydoTa#51am9&GB#3qjvdkf_?|rJH#J|A{R)% zRQW)mD}1dvVZ^g&f3xqKmm~k!1p6oZXyyCe!FH4DEB?@7`zH5CYxw2C{tWq+;Em-#Q%eqR|c z(hn;~_ZUO-j~V~c`-8DJ{QOgd^I+0$DJB0T^snalJ5~HEbfv7W|6!#~|0w^K_{FCm zZy|k&zhd%UjR=}cX}^?v?Rm-GXn(W)$D8(q`~&-sBU7{;Kv=B~DZk}wsEaz*!6;GQ zV+HaOi5nbe0Zbv4l9!Wq^W)Aw{f-)g_BZ>!nR6hX*fr$PzPr}=C;Wwk&8{kyrkCDQ({DAc?H`A8yw zasfH*D39P$=t|lByG38x=wCAma4Q{Wt;ByR=&wawK!?zO8F4`T7JLr~^kUaI&Oj(C z?Z-WWQV_TLc~XSO>e#T)gqe6hs|#N`b^LvyJCBhXT^3B$?WZ}14k`0_yqorBg4hAh z+e*JnyQQ4HwnLjBefhr8ila3h`G56arO)p@n)C(le|kNAFwuX&@IMEDe!QFSe-=!$ zxBocyH(icT1n+^;{#UjB2>q}O9DcBSXlNF`-`K@9{GV2H^aB$AuTDXK4CiO${avB| zAEqDQo=jilF69erZ<%hBe-YCcdoZ$guFHZMf35xQX&Nq7`)@ey-N$Y8Pc-PS{)_Y@Ym?~< zA5!*M@a;=B|BL>qU0^qY=n%U~abA!= zlfDa*(sxuo!}~*|u3M+%`x<-m|Aj9pN8CPct&Km5&**Ru(|Tv}XU1bDzY7e0Q^jkV zivPdxB{dxfeNFo}o8@n}jo~MD@$QdUp6<1L%~WPLr(@#VJO$$p+KzY)|oGrvLWEy5p_E#>drqu;XbfB6RS z9~}vfV<^rE`l06<{b#O!BXym`kIAn>Zuw8-Cgp`kKXCa`@w>e5)pC6o z_QxFl9)-~NDd@8ZS4es7PP<=5{FNN8{eZJLKA`n^_cwkRh0E`W313pu{7Z+c{&$=` zIG!=%U!6ex zJ5Qc+oG8CX*NUs8H2FKz;6pH+XVkZpzhy7%eV~m$dcQC6nP5lB@3{$IQkwiVFdt$^ z1Vaw5yGea2{z@2ND3_-kRW^(CPw+%}{{y}M=YEdw|I7Z56#UV9fpoa)f5#aharXzw z{ae8Gu}{+LpUL0D-L~wo@kj3mCIbAqyiY{rCguN{zanmDgv)n6n0i`}Ke5kmj|G1L zFQ_R6f3&ZK4p;q;SLe8Y-6xXecLduPsTcdfU|u2h(*MWSHx4BJh8p`z==-kjKRqxf zR%W*^vcJXUM>kJoJ0gD;dxf*HnH82@8FAk*eqHrQ*-5FX*&>742V>^%JpwgZn~$hx+@6q7`=e$^Idi8L1r4{mXeX;qPnVkL60f zn(Yv|37;?DcF}Rc{+0C|mkiK+>?>mX;>>Ruf4$j`MEHAf!o#jJc)Yx#OQA3Kr8M{d zUGaY(4Y%$8qxWCk|MU5aw~)V%GQS!6Cwx2H51HgAa(w;W^~-GfHyi!y2IS{fwoHCK z*}j*1r>Z9LRSKg}>#pFOAzN@{#*e#`q+{CF@AG~8vDmShW`>78FFaf z;Li9b?fsxla$I@#9?93ekhgLJc^KKp9hrrFhSS2%VaRg??+ag23LPmAy7RqbA-`tp zd*6XSrxNR1Jg++ob^n4rbx2A4)8VTB9Y^^8jQncwIh6T1luG1xBPbJyoA*G{mGVjE zVd~|(&z`x#Hh)YQ3HXJ9{U6Mqj0-7c|A)(jx*Wy*YuLZ5ST7S9<`0vDlD|J(2ly{-f)~PZqjTirl2!^lb@=KjUu%%5Y-%Sp`O!sL7Ex<`K^`I-LdYWRPNfc%`gmi2FZx$eK{?)rJ5pK0Hp zJSY7s*BiDS_C~OO#ed!m{@hw$e(@Ia_cxYP%ox9?8}+7~gddZ?e=O|wg^j=`mx;>xn|-| z)&4`UsI4gK01oupP_$EyLi&u@9a+el^B2D_+VOpYw-C?w2;4- zSWZnmoa=qj&rT^rr1WQGg_! z-nRWhTHo(t{(bxIB)A9!WUs-S-=@;e{) zFA?A`(L(+@azDzx1);n15t^^~4qc{_pFA&R_tpbvko`0Nz9sD+PvrPkD$48p0w-mv zecftb`Oz)k*Dd(W@$v3SgFnu~_=xeoY?FyHCIHFw(!v znZMPowY(z3Ad{7jGc2aB-Q(@@8|G@vTsW!rN3Z7f$H>zfkLbVfC8epCR}QFaZHs^3 zMgPW*7bvX%rr_`G{`wi0AC>iAGd^D?`N<6Nx$rG~9(K;~cZ2p%^3PjoemlYEFUI>! zWZsZ+2G(KeaMk~g^PKphhW{+~fs z=P!EF|3-f1yytZ+p9p_aZXLP(OWXb&TAxt|uLn?`d1t)g%IEUK1~|@kjZ4I%1r+*ZleWPxFlZ zeeynd>^;!OPu>St2}>j`<$dsyck#YBesKSj_Gf8oe*QrCTlV|qGi?0Lr~C_!rd7IM zTgsp8!4m%DTKJRemhyLI&eH8R{_cbP6@PCB`SZWuqP`!5{OtPI+o)eQ`k!cTdky`C z-^`BsI`#(SiC18(lC_k=_<1~N&%RD*d%2VaZ zg)iZ^*Wj1v{j+BKC;x%`1|5m7HGkyCL*=~j@sGWI{VD1da{fRDQTlHEb&m5g<-d6R ztnVFiVr~8Vu{}f13xJpVCHweRS@@H3eA~lMw#lyu`2#xQm)ZHN?&RYqzRdlnZyDp~ zedAibr&h29I)k4a!k3hDuex_<8-Hyvf6x)XLi0y{9!Pldi@?wX?MZLrI&rYRUx0V} z=vRdM)Q+OrILGh)Zu)xloUlVbIpj>rk=OLU(Z(P7S9G}SSCO9=T&KAaT|)Hau3&M#OUf&L*x&m7tpdz%bVRSz^7||N32#*XRsIg2es5=+{BB_RMXuBQksn~n z&wbdJk4=8GP9!|q_zS{oX*7R-Y2o*;ejj{)VmbS#bB*^`HlMEf#I&XkDO0__BJYnh zb<_JKq`zjepCA8^#wYV-D*irM8SP@@F9sVCJnGK)Yy3IyC&z2TpUd?oe-S1s<)a^b zu`0;lc9!3ThWrZ7{A>IrdTKaRej-92DR&f1r@wy)>#q;t?m{YyL_o#bR4M*=WyBIX2ikUdH=QZOtQW@OgDC&UEYk=D@1-$ zv1Z!ezYNBIl7Cq2!ngRhJcYLK-^`8_drmihZL-E-~om;H~zzpQ_o`@a(`XNg}$jt|KG z1kQ(xUYLB#weT%v-PxN;ZTcU_{$V* z`-!w$%EfnId7I6Cp2_){rgt>o#3y9|gl;H1+1`b5oj|@pY+$CpAMyg{7rf^IAGE)A z?wjXtx-{(fqK$w0z8)R!s38A-{%d#Ux9Gdp4*jYE@jdY*{!ZlE)(-v5_S6{hiL2Ig`NEd#FAds%hxaE9L4G0fvcEo+xTt0N^V$rp2kuk46b>S?uFLzD zWE>V&@bmmVy&?ffQA+>I?cpCT%q9L~#{Qu9$$m}`?0@)s%lMb|7ju7*?2B;PC+};Q zeGyVGdM*5!rFs9SO}Eqg$<6XZ#6KMo=G)YN^Lyw;f&5Q=ZYyW(-u_r1efk>u9@Oul zf#*w(ZRPxAj0a7<`TxSdl<(d6tyTZKj@PhF?C+ZV-)QK2A)Y5b<>-eAIyj#1GM*p0 zfAaGaG2R50%I2Kwn%;av_`i7JPh*4nFaGD6DUerfK>sgknf~-+J8$a$bv(}|cwI&G ze;wD0{g0$#oa+Tn9(yAe-N`n8(fjvteBVaC?-Aqo@WtHc z*>6GpFXH*@g)wMfVE;mFP0Qr}G`~mcyqG+H9bU!PTrX;zQ^)hyXpLXmWr*3k6uzbW z_@e864)R~e{`0YuF@9eQ=s)MVMen6F_5aAxnxDj$Wd1wz_!9dg{NFlVKNsV1or!<* z{=!Mmenb4r`?I1yDnF0?1@e76hx5$Bx0LdIyCYdb-u`grM+6t){7J&_pZ7KDGvyzo z-GcX!UCvYf&uRqN6s-vVlpl9T`}-pjDfpND8^XWXA9MeP)SG{&+uPS+v{(2uOW|M2 z-uv%-w$1;1a+HQ_;_veebIE`9-xGOq5ZZ_Jqv+IZ^%H+n=1|E`$n}PzWdDJ__eJkx zxYP0XQ1R>5UE?d5mhI3l)zO=8Ncnu>i{=M4H|J$4= z75+E#_>CCfS3i~cbl%W>qC3>FH-Eoh>JfIQJxchl%jJmYJC+3bzkFwnf8Yc>@QlxY z;=km7FxwgTBP|Ev{}O4}CQVo5%j`8P{FPvRtD@t6^V_v*)unE!hL`dC2J|O!f)5_M z#xDQf@O$YH`G3Oml*m)xb)3(QdZhEzv5oaso^LGxDN55my;xfurTr)7-)HzYjo%Y} zByRlA@h^5#FbMxrFMJCBQZIHz;LK9`C&D-Sl&^>d^+)zM{)GK`Zh(J>zn3g_UrJN{ ze-rIzTf0Ee$SgL)mf71R-yL!%Bcn9&{+2EhnPn$4*$^NPsucM0GrTky<@9?}Ve5ER- z-{ihqb@ z0+6B<|6j_}SFPw4)PE;S*|oS^~IZYhtuf3Eub91rmNh{V72{ikTxfd7+%|5W}@#P~kH=)dU~iT@-1r?fX! zDSS)$d~Gk~Ka_C(S@>7qhr;(YW&dsLM!Wv}Kla`PPOhTbAHQMC1QbRTjDXmzPGTH~ zuoxD#vriz)kVzygn(3M8S;$OxXL=?isMsKCRD{uohzi;uOGLn7H7H7}EI|PW6h%cG z6g7y*u!wnx&;R#Seb2pht8XWf_w>E@`@fsd&6zrN>eQ)I+o@A^t82+W_N=W(mE*rk z{uCK1e0t@`{nCEQ)W43O^857Z-$(cNq_48_>%5~-?(dP`ElZPc5Bd21TmN1kZ6aydKNl0B@YqM6UgGXg*U^5Mhw~cp)Un-;Q+}Oy6n=cE)wBP54%g6L z8)G}t`aXvHb?GNBj)sZ%f#MZ@`=W==a^+7^{vV%aQ>y$US6lt7+zPiP zf8`HWPGA1iQx@M`Lw+rnFaIbJ3Ri4=u+f#jnexBT5|_WQ;g!i>OaJ9RZe9PIe8D}r zRsLf>@U0KH@>eMTou|a*Z~DqBlRw3N?CZZoyz1F+Kegm9up9~>*>vzaSN?Izzq=>@ z_$!pZ^g?p`86&=d^7!)i5bpz(Tj5W>v*+GP@^3iVrVQKvHLpznZ7(OwA3SgI|ET=K zERe!$_xdXVKezSvzus3o!}VNJDZKOH3$AtL@1g(d?U;Y% zQT;bv`^x06)qhie+q(Stv@7u$CsyH!&pmm9D}RCVpGAXA}pt zAFA}vbxey2=t1S9aMjOle<{iT_NkdR;n+{C+~TK&%S_Go;6NB~>RS^yyffB2mqfUW z5O(8_hAHNTPkB>3{Dn8f!*BNZYcW)Ah5H}e@`)t*AA*0-Jmbmoj~@;D6#he%Y4^S3 z{=vuTU)1<_OtZ92x8k=1@E(t_Ti$WdyWz=AaelSrUp{BfkCNnnGuuyTlHITM_1`7o{KbM8-F^@t9gQ*Yi{-UgZS5ST(|9{c||J9|@`P=j@ z+b4fZjq|rD@-K0G*ZOZDUhfIla@FfP^9MFxx{1Sk{*~@~H-0Ej~s5DmR0{*xd_%A^P9I^S7%1 zUmu4y(-ED&t<;cT&)=&2dvpK7_XplVeFmQY?QX?WPW3q4@8L1Lnn&wR)pJD&i zc5ZXS*w1r`c-bReF_cr)6w6ds%u+1LkQUOc6fV|8X2&u6sj)`^!CS|7X7& zdVV_EzYcComS6X;RsLhLHedhz@JD%0Qt>MPr#!sM|BfR0j9RGjYdpmdj(pwGkBR)l z-uaUc&IE;f{%1SoS3jYDeoW7G1YfiAX#N%UU)?{_a_K(4_7`pcs((#Cbn6Opzf;P) zzh(sOrvjyh=YPJjefrmSlEw$36EqXRomW}8{dTgahgUs6#d=Zt6nQCRF!;>gpL*7e zKc4>UW&db(B!Bvw+b930^qv@R{Jeztz#IRkQT__?+CGjZUg@=5zWh(m|2G`RuY1F& zC;!hELH>bA{^0iQlV8vCqZzIcSLr^5wv$itT$but<^LATt9X^aqznl^J^kzE ze)}z+{CB<$?Pn;Gzp|b3-|x*kn%%c4XPNgDsr-MKYuiipG=^E2r+k^H4^ZJ+)h*7m@CcFpb^>n(p@|M%;>%y~`q|G3r* z>rwTuP|Lq(dBa+fzmD?j{)PNLXk}7#ek}cMD?gSU=20l)r~Gban)qE+9*%oN2gB5} zwg;7SYrivEUWwFb2k!iqQig;Ve(ywc{>nc;cKCA4Uk^q45AN7L{jcUdI~D3vv-@3} z)xY9Ze+Tu&@mj8DJ$lu90~sp(&4LZLi2lpezn(w2VHV^+GrE7IQbYb@)0Sa@eDxk9 z{oNFzgQoXcIraRB%Ku!q#p`#tD(4*Tf0Vv$<5Og`o`Z6U@T)<}$iJELkJA7AhbFY2 zEt)&ZQc2doo}Ff>-{RaPO-5;a5c}FRIax9)HCAR49iLT zQ{~#i@@jvFd&N9jZwi~9x#urQ>qoIasbhwI;iQlkPYt;7`pY*?a5a_SmMWjgYw|@ z?{oPPI+iQH-tW@#JKUFocMa>a@C3?_x7MTOQrOnKKGFYo?Yk_8^h37(v6BLMYdvW8vFFdHuV07rVO95k zzwUU*`!W0bwUYvzxn!#I-WV^(Z(bh{FFpu_mqxPI!I9|J%lNKQoRsfrFa0S<@0R%&=i~L>wvBDsraw`7m-PUhOIzKGmkCc}=_Rl@G9@XwqDE5!&EKP>`{et@4HJ>${ zrxcIsFwcMHJCyqGsuY?_G!H5NZya{$u`<6^curaEyC3Y0^4&2Zc$Vw+6u* z3|HoP^@UfM?}ulcVCgq<{+93m%gvGhF1XjqrR7q1BKc_fYMtNJ`*C$WrtN4t?WBPB z{Al@pMSCLsHtYXSF`qY3AF0<{yq1H}W{j7=Rez8D+iNx_ji1v0%yYLbm-zAiH}u11 zik%|7;<6v)jQz#1ot%zXVhbb^SsuZLiIms{mr4Dsq|giRpfhorwy0xvry~l z-HPY>yNUECkdL-ot*50PK23TB%2&e|jL*JH?msNk&!y`_ng7z~;(QqUL7DTQmP?_2 zU#;bPE&Hqf&WYyJ!|&TGo`0d};bmJzo>`|`J?Q;F+MYj6eJEc2&Ndb7N&cbqd$%9> zI;p=j*YA4&^P3Kb&+ma~{Z+azx&NvEP0M#P^&9LG|IYE7#QXlY&2wxywA?C}`oZ*G z2rb9o+5g&}j<*9XUmgEY_|5uR3zGWZ7`{)HXY77kE-8o1s+#|ads%xVeFVVjTbpNl?h~J;Zy98u1&!yhBLm=03HGUd&mU~Qj~ns6kGli|fBHvJ`%L|C`^xuvo#&2^ zm#=~AxYVyLUd#76`V-18Tl^>utS=LvUSRPJlsiTKW%^r6UU`(S!f*b#_ZLa+^AiVH z1?cw`zzz5(GczI)7}`>QU9DQ2h(*$uRs5g!i0k zJ{xttO~0Gk!4(g$D}y=er|`yG9d~p*((zXFN%M~;!qcvq_EzbCO`PXOcCziha4htR z^XK|h9!xIZ6zD-7EnhAF!-)DHMlFBU^KIImJv+?bZ$+Uqa_aMu+2z(jR%t zq_jJ~Z)W*qeU$p}gy7>JwDOd>PSSc)sOQtQeBY(Kn!o1TPrFg^XkO-N_T*KIS$_v1 z{X?679q9+jC%xF}J4L(#rPJ_J=j?wu)(^Y*_oEJDpKk2J34!cS?uvh^?=L_wZSw-J z!J!;Cyczwpf_1s#Ui89GV4l%9f!Qf>`WrlcPkZ!wzM`e2E-3uR#2|z9mCH}ZSuNl1 zes#rLr2fj@{P6BY$oH9O{A~NN)tB}gg)%S7`S1c6hQD*dexv!!rd^}UyoM$ z>i=7aN)u+++&jsPKeSKR(tmp%?C-JrqV#E=Bh!AVQ0(ss__v;2?PsZh(W@c3W;duLMnm;0yXY2&@qa{kC2$NckC{_n;6 z_hDX#hUbnm{_n~A=c}GZ-Y)$sJ+EX6;rzFPe``N@^Pf+7zqJ2m`VU4qKh4ItnErkc zoT%f{&usnc{I3vZqJy^d5i*?f9qiex@fr z9%}xdZ;#_qU5StOBaQstm6fN(|KXj zuj}(N^U?1w)BDBiKgacJ$=g>vi|cbOr|PAo<@eS_4|LjkR(jQoo`WkrYU5L0xiuK- zmxxI>G@IYg@$XNN`>)1Yobm5bTOPHa6w3G~eIZSLd+R!HTD<%(>H3}bQE55<)%R%m z?SJ{MdtaK={tusp_CFZeH|bv{*T0lsp0fEL-^wjs&)Chj+%nGW7VH$-v4dDYRz4Sv(X*fj z36BoqK1jU2AOB2my}1VK7I%Dq9pc^fW69%x0{Ls2WeB_bL6fnMAaTQI;=XLWAMx@t zg~5MXZiTaVZ3~jhKYEN!kzQ!aFZYDVnP;sZY#GJ!pN)MBS03@_h&*X*yvX}E?9aI6 z>%n?j;#)GfTNCdc-uinz8mh$WqvaWHNBQtxDF@8KT`&;RuKb?*9X z1?@k%KeT)T)-UR(AG3N8TSp#+dj4{wMOV#pLdVKdXcD9PO(X;{T%aCGjhWznu5OroU{{wGm$n%wR-{@LhYJxeb=58A36?bIj;2htDZ0O z@MudZyGqugzEc#UorNX#YyHJi0E` z{iSB&pWyhT{);x^Ypqu`o#uD@$Ijl{)z5~VY`x!&`LogyosS>;t(CKm{1xi>JWBir zy#7vf;Gdh<^cQm+4mhsXGeINy1W#Lebo|+wdeh%WPmx~FDXQMIe0!~6J0|}bq}Th( zE5xUX*Logd_@OWS-1tu!42Ic$eklpC|D^ke!S9pxqw5#d&*wQ$>A521tK+KTwVs~& zkd+_!J?HARlRcQP-ruYBrRkLKmtL5?N%XUp`gw%?YX$cAN{)WgPsYnt zXR{A{{hUSl{dJz-FEssQw699n*?O6*d_6sbZNu1wN#jrYXxO{OsQtA4Vf*wGjz2t?%xwS1jz8-EN>fm6KPva5 zCv;vT`l;tWk?v3Rv_L<9j`UM{YWwu_Ege_s-_U%%0%_`$y@uU7e+PuU-9pFu7gH9=Q9wIC106^80(~HI`oW^By$B(tCsO{85?bhBUpx zXUS|c;m`de@xL%hZbtoP3O9qsYQPcg>${hP=C z`yT&GJ^of3uw}Kvh`9FV1C~qw9P#$AKUs?ZFdTFeAo7;`@8=4Rp)1I zyHqid5@3w+p9c$iWw|cf7^>T{|4f3Bz@{H7T-g?{F(Ej zj%&IuQh9aUSGfQ4Q@ULLSpCkHpM0O+R*3Z1#_#l1Zwh_=`QO!OzB9S52{^B*o(|FR zjdUQ*Q)O$$Y1L-MLtVZ&acPy&FDbq z2c^IL_-Ef_>Oc4n{6S;SMfcN|xnH2=Q>gdTYWsU9#})nEInDQY-M8j=ujO0K z{qo8QwtZ{)9;aT_zoqh?NIq(JYkT@#w=J*Y;jS{zYfiIx9bdKGd}Jt&SG%J?Jt)1} z9b^}b@{bDP;}^a6XxIKI(LQ_sYe4YB==|!~bGCfi4ixJAfh|h&==s&LUsFEji6TS-!ZO_)vi|#N3ow(F0*>j z_PLq#+8$J{aSyNGzg)RAu16e;Gtc!N9^K14TRc8+lbYwb*_My4CsM@EqMRy^*7p{V zUfVg7g+R-t@SLGFAB29Z?$=m_hM(??)~99ef4_;G6zcj^??ZZ99SCrKUhdgQe=P`p zCx#2cH@z0&a&+&;nZh6Oa{opN_*Wra8R2~nw)Dp%eK3OaQ&TVw-5mrcW4}LrkG-cu z(yc>u8{(&fUhIH}WPS#p_25?l?4|vHWnEAK-3st4BfXycdWTdbL9+v?b z_&+1P@c+-=|1smx-|UfOAN`&c-S!6SN0fUC_jJzTj2soWPrCMuhu3mHL2a1jkk{Ss zmfgbOawB=X22w}Xno@PeqIP%nI z+GGByW{w}dVqZDy=h7BCe#jn*JPOr5m@MrH&sR>2_iu|0f=4_%o8-ZR-uSr#6NKwz z+5yrG<#`Y1J)PIa{JJaf9;Eh^^1Kx?CpPCF&F;pha&x#{Qt_()-D#I8UiCjo*X`t^`rq5br*M*Vo-6C(c-8aQKOD!ap5MiD%_>it z{4e$P=T!f{Xp8e{A$=|2>wj6x9#16czaINfV~+lVziprXC(^%A@!J1~SuVw^{@<;3 zG3izRdwP6S|0hxZ$|uEwc6xZ#{~J9%s{ac-c~t-19zIR}hZd}!HDA?#z;>(nZRub0 zSNXns?^}Knv(LFcEFFOH=N=uUVLSXsvi@a%OCBBnSLk@_wg00z&X>IL{CKX1D#WY) zSCUV_bKbAB*#w(({lWUeXB6i7nf43fu|02|F6Bc!rcLwwTGxU2&{#^T^*c)bx<8k) zhChvZ;5zaS20-?s3S&UzWl(UN%oI?-zSf*Ph=eg6EQr$@Eq#LJ+JT| z2#cN2@)ev%zy+mRpMyEXnM#N+)C7I4BZeGAS{;JqF6>8mVG@OzVg1+vPk z=Pe{op1&eHfn#3=KfLG4M1%axSJj#KSCn_;M#zu%jYmbiCEa4QOMz{deH-$ z5dP}wXHzo%lz2Ws{hN#DK;Bi(_&>qgp|55-g=+ucQ$_P!%>5y4&m<3;=W?86JA@f- zp2Z%1XX3v^J^|^WKJ#3-EY1gJta+{?y{?C}#N#}NmL?zVUqA5nx3vAYt+o8MpQgxv zXW9dbZy>(D7^m0q<x|>m-}oDP70HU1y%7y>;@D#E)^DQ#n=NbJZ?mxzeOx;^CW#-<9@nrOE22g?I&eZbQTE zYrbsz59cB6KfAZ0ejbeKr^53f+HVy4{pT*vp3r>W;@KryKXq&us&B2IBRzVppFeaZ z*Uz(O#qnA{!?d4te%1PUk$e=d`rd(dp5oIiz-x&gd&%ab`W|I@mA*&DQ9NZY-vaR? z#4De*#M@NW`wve~T$*@3&ipVS{t6po|DP-s zdRc@Mzl9sV1O5q@Ui}z~`w%Kf{}%Y9$NxEm-TjQ*!SV3L)8px{M%bkn|A#A&_(4jJ zyy_288UE_!ul^5>|0Lvf`KM(4e@P_6nUGIu1%4LvX(vBOllX+~nz6?n-Z?$VJ`np% z9{ruCe^vdZp+|ZDr`BIRWRtg6{k5RK$otQ#zp|+n^k2eDf6y`R+Sh5$Uvj^2YIU^# zGRAv`cV{|j>$md0GomwD%@O<*8oNI|coc4A4uQt9!{3Om_ zDSmgcp7@VYp3*NY{V?&LR{YN`{$k>N;M?z|@85cle7`z_der%?1qG`7F`D1XyIK2V z4>DA!^|zMw_a!|CvnXzV{B?zut3ta$<+`htcd4+hb?_t_q%17L_@*G7w zQ}Nmk#%LcZUe{U2dGwPlo8S|)Kb2nnKWZN;K1F&x_oH%RSTxUO<{SLXmQUN$EX|ke zDY!w+qx-h07cBi$;%}io1KMG4A-)#S_Mq|i?a}k7*#8C3{{Q507~k8K3V*-a*01VK zq3)jyvwjEWTlrESkJs-y53lKig_b_>?8Or46|egFsE2Q&i06BFG*9!?dHmDF*L(P8 z;y>f@X(9gWYIjo36~tFOd>iqTJ^nq!r#yUt_@8lAYzQNsh>w2ikDuH&`FzJ)iNyL!OEB|F`Ue z{Rq6@BtIJqdxP|&4`Tg~x6E)G{+9POOh5bxzDK}&4D%~JTo=fz{(!b0gC4K?1KJ)! z81FpNxBLp_#e27w@2B`K8SmxLpZF(Q?m|4?zQb&J#x`R;k9R547bZg=c=x3|P0zsJ zfcL$OuYa*FkoSGm=h!Bs$6M?1V}|-KDxvGpzvI&X%#(M$m;YxG*7CRPI3ala4e|6>Iq|~x zDTiMZ=qu2tmOpjSj=?RU*YNO^9fCWZ{6-GkG5A?)6hDGNZW+qs%KIa)ezZMo;UA-f zzuoKYKXvV|8MME~=R!YlTI&7AZLhWM0Nunq3U&V8!0}z@A^-f4?kAO2#K-+`KZ)a} zw$I(vFL{=w*LK(5ZRZ2Eza~?jd$}$TNS`A9eh-gsVjka4gbK|w#XEn%ZV>D<&*rQ1 z_i?085nrPGY2qK$e0grPnfQklPx@iv5B2z5O#IK3o_xy0|5EYfvzhp5%7=O$CtiW- zSK$XP+Vl9N@!$NuE)tb5wfdL!(;M+m>*0Uf`ga}5;`Wa((m$%WZLN>>oPg4A?|Qif zeqMR~^_HF+P=5aUS{jSc>YB9Q+Hy-m({-EIXLz6o}+wd*J^wAf8RmdtN;5B zYRA`ee^l*n9Z!zu`8d5_3+gt{D&otypj3*Kvglxqhi@YOY!9C%{^8YD56Y*7_>}5_ z{ko0#CeNPhA^u+4mnwgO_*K-Kj#q=kU!-~?|Fy)=Ab;iae&W-_k3D7OEfHS}=sH|s z&#&r_aOanCo}ZBOE9F}!1ep`r9(axg-O@Y?qg!=@0I;;ox!$ zb(~+zdK}|-*k#gR-p}+;+k7_=e+uPKw^;lL@&50^RES@%a&kR6O8nor@2K~{JVN{k z^Q}<+G2-uLyH)%a;_KMXgNl_`d`$9un|#v0wD<<%UrYKD@lC{6*08*HS~!FF!>G5) zTUal|+gzgmbsSK5%7K4sOPb$K;znoNa?20qQ*cP|`fz@GTGlV0i^kj+5O&93T%jBb zKS=tP55u0v+Yf$f4@x>cH>Nx;k@k%BQ0gq~C*mE&9HDUnUqZWg!$(8j3h09mqGWh? zggx%Ye+2Wh8-5Y|-SFiN@$lXlzuovBzAGMnw|744H1GV@*F1jy{XDwft1n@Fg7FaS% zUwe_?_&K;60B;`hy7?ny9@Jh8zH`su=%n`f)}@xNbf~qv|Et>P*cY)r#Jj!ibNovv z58mx*pQ>Ad|6AJUcp2rx`~R2rsdcoy?KAjbdv{X%te;`qXF6@iPdUeX$X3<|dY)JF z*K@rZ*7Lm@*5B6~e$B){UOn%t@p|sJ{?)is9j~7ME#Pl?{rwj`53K3+T(E}qe6WV) z_x$9Xu!d#*Am@2CoU|S&m7{n)M?A9Y#6Vu%KO5N{VZ1Oq%(-Iar{{|`?9Uf^-dN*n ztsh2r18=-Z>jzhUJ(sNf{QWsSzng;W@@^4F`DIc0F6Dk@1#$A;4ufBL3B1b-ze5H- zC;bCn{7=2G{w|{OL~8T+)mawZ)H6zzhkNCYwiDzqAc?I>)BV@ zUNyg@_Ns9L{r0-8^{%$x!fE)u1H9YXZ?4t8RR+I3Z*O~LvkigYe)qij;xn+muDU-% z=Ks=Tk&!z_J3uiC)h=jY4mqxa#`d-CUNe5h_AG3LmVdxrD8N>b_y1LUp#WP!-v6@~ zv}MJi-@XTmxBf7xearY<`Hi+>{LOJ%F$#6u*7iNB{+fyL_WjQq&qpzq%d6vgfWPJa ze`P#xLs{hg-!h&LufXpc;r;I#&o{)IdocO&XUy+&UhJKJF#Bf@M*Ama?xX2*I0bripr_{VsTMZfDQ5&u(_=W8~f^~BHOxuP-tp2{%s zw@^;yUnag5(DtJ6$#-0Pp6m~_@O(&t{@srsgfaca=zhI2e3y#04?XHQzA@EPh?*+6h!T$ao6N8O!jPq-d z4H1W5oxff}w448v$j{v`??HLo@HpawOQJLrP@!)6=MRgA2XN5HjsKt*E`Yx)-(S4) zUWE4G#{2iUW0;A>tNlI-eGGqVV(>MuK7D`V&7yCoJUc;Ol`ljxe-HX}!w-1j-B5lv z{xzO{8$JE+gLt<*M|kyrIm+wm>o!OJ@xNkC?X&h8gII+JDmc!<9euZ)dR{z&n6`>&7>O z-u2J6ce_ zzju4-e*pcs`KiA?=z(VOei!Lo|E~DwUHW4^d5`zPE4}<$n&Ro->xF%P{*}|LzEWM- zKfwEs`uE395=fAb~k8uo+Cm-7Cr=gXbm5${hsOpk|O$Q!F7Au-)FbzU}P6-_x}#|LuH3({h2z}t{bsUY#xQW{%nT) z^3*zi|8}k`(qHBJ#gYeK=Q^Zxr^V~I^j%#q5uYOcRm&`$($66NUeYVRh4{zyJ52KF zA^w!Pl;bY)BmPd6hwFrki62$|#FvTxsfXV{{1@p*)pgMb@sD}*8;Sp;%1Qne;&xKLSv|o8n z@c7gb|5{HTJ?{~C>wg>}HP0Wta;1oW-orN#U+3}B^C9&fUeAY2_V8))d64ZP&34jE z{0{2BAij!5>^E5JF#WxWD9j$kKpeU?o5dTKjulg@^ zyiq??g}-yrOnRFO=AQ%YU&Dmg@7xo=KWCyX&r64340|s6KB)38J3e7qWFCb&KDBXt z`bwI5^3D(X_bHP+2+tkwXv{gh~K2`Ws}Xnhxh{9Md>dVUn2fTTCN`x&-QW_ z>DB+Xp7;)aCstv3wO#jnc>L6xd7fZD7-PN{6F;=v=BM}gUp&due}(tbR8F+zEfc>d z^%>l2(~S^+2J=m0Lrz$4B7T3;rxuX8v6)Q#_$MuWKz*i&|Gf6&`IdhJ@q3&@`kz=R z_maxXE&Ju!)U%$We?Rd@Q4gVC zk@!v2TblK?p7_Vu-jq+7_&o+~zKXws_zl`_S*{JlulR7hyd%UPK>cXD-AMfYbSLu_*=F8)319k@mAZ>|Jt5=*sd=2{|xz;I3BGhevI{@?PHkuE688l>xIN$ z&T&WU`(ol}l3vH1GVxy{Ui;w&<-_(}+TZG7gm}N*+(7)Vsef%xHxmC*wm-$+M0|<; zP4PDq|0kAL@wX6vJ>^mSt;B!B!+)LlxjJ6(JK&APU!?tkzvpus@pqF?n(gWv#Q!_{ zzvlZ*;-As-vc7I7{z@$``BaF1S<6NICgLAqKdf+G93{Sk`zX}@A0z(N ziYNaq#J}Fd+rcsjUexwR`a1UGho}c_KlQ|KV7n@jelqdj(028G+YeI2KhAO~eFO1- z@bFE|L2`pFT3gQhX2bAKZLM*p6^YQpK; z`Df((qZ=>hAKmb4J$~nS`FDEt^E;Hk;?&=A)KAITk9j91M3?_Q;P2|U-P31}r*Aor zRw?7V{v{L58=j{`cm(eh)ThgTm8ZYMz4%ejA0y{4-Sqx>OaJ?<(>;AH^2+ynPrqFr z|3S#-ejo62uRomc>H8_@*Ol)BUis#G<$J^{-yhKa-Sj7V^kW|Viyr-;C;z71;{0Cl z%DcnC@%Wu_KaSi_rZRlQlm7yQ-TrZa*Zwwp^6CCyOAGoA-itkcmwDmipb?7ZKJW3HFf~3N?2fROU0~UxUxBc+Z>8DSOTW=8|842Gz8+c_ z50Ae+9^PSoJbVu7)75tc_2-7K@$`3 z+I4rS-9`K(q<>lME8@q9S3gcby=^9bFXpS?A&wLOC6%A+a0>N)q8odHJe+_!ZAiejVw*s_lVx_+G?cruH-OdlUZ_)hEmQdg6ahdDIS9 z`}1axzx;lPJY6iW((gn3O_WpZ!2O8-7V&ELridT#_^2Iw6y*%qKBtiW9*>XOw>!+U zdRINGeR~4!NtNd~@;Qt7rbleLH1T!HhyIaf;=e^b=(@FqcwP7D`a!Cpo_}lG$)=O_PkPc0;qUX6 z-)-j~Wv5WrMJvef#yK{<-V?6*j`N(Gwxc>mY$Sc^>$ZF<*Z-}r?E1p2t(yO_^;K~A z#9(XdtI81*gMa1vYV62~!M}2SH8#WfUJYxj;OKwu`l=;8F>u#c<#$aC{wvp4shJal z|65;SJi_@RwYS~%RciLcU~B8Ek-7i9>#M>66N7)|`l^8T{m)!qjim66q1<^U^eKi%&$Z#gr529ifTqOPV*^j%=sgw| zh#&c}4F`lRi_E zBZQ+0A7TE4O+T~Y7QzDIFku_{jxan*I8IpqbIL>5Mpz;&6IKZ8e_`o|$+wB&5rx0B z@fFn*VTyWhAxwXdbaxWoVC%i*LR)`Lf7-#+YidW<=baX|5f0SU?Cv%W0Y^~92-t&ET8gstQ>92Z2KNR*TNFzE8K14$0u2Q)2GQVWAP&$ z7B-Qt?Ma5eY{!$9zuJCV>9*t1a1Y0;g_ciH*~`fH{;9hf_$J6I&xbZ!I=Dg2vrn6i zhuLqQe>>WS4`TRbFZ`C1ZG02s|2ofx8yLqFa2LHDO!}u7e;C6Pme}~W zF#M4dZFm~PS1zz&OiSij@PsYTB!-{fV#CldrR390NDckf-kx+ig6i74!VjE6=MBxA9uO&v@lKrQ60YXZm}{57U!* z_I|UC7q_`Q2hF!(Z6CAn0fp3mN+R*JEwo{A8_V$BsjrZ4gS@h3;FzFy*+zQFu>k5^@;O}|6?3pbj0d~0FkV|;pvjX!kS$#W&Xe5)O| zHUIRXHvXnBUwD&Aulx_Pc)dSK?pcud!idNJ9hUChg$c(`Kf3>6Ih*3;*HoGrg8?f{lOEm%by#4k~T&^yU3*{EnOVhD8ZG zx|Q=4(+BHp{C+!4UncS6AB?9@pJ3y=E_>o3i4X9tjbxNQ*5cbYva?$S$t_<3op5K+MvX1{RX$Oo|sQ9J!yMNzsvHe5WarauLp$R zNIUrumO2<-Z0UnNtY1y;v3B!UITW`1#Fo2!x=mMJZ{eA_H=8M1=@gD%ZRs`aL&+=Y zsoU4eS5G*ZFh$rv*hDyku$eGTn8aIf=Urg?&xM4S5MDueE#b|Cw-eq+cqd^k{^f3K zcWodXA>2q2ebO85xj7-22``@!)p?eAd1X@o}*9!EHba3SGogv$tP@qeLg?Yox= zce>1mUq$#j!u<#jCOm?08euK|<*!+O8wf`THxgC|HxZ5!juAdWSd0IDBbNWcgwqI* zAUuw64&g$=(+HOl*5ZFI3_8*Od4v}dUP5>U;kAS}6Uz5>lJ0iGTKrQ7Tlw1#vT&TR ziFhC0e4wQpCG^wz`HWAs^f$l7!a36{Y$IO7N>?JC(koOtpZ_ICSblYcFB7(SVWqo* z_?tbb>3seTGbsO&7HYWusCZcMskdAFLJw-Z&;R|$TKZ|nSU7x~g(WYnbQhBTW)EsQ zpMNmh^1Jh07T(VA##!;O(jCG0f(JF7&wsxgET2xoiwT$AXz`B_?st<7&mer1aG4kO z`ESGmP1^A&;by|%Xp5grxDnQX&?!8)243S&WBefD*bR1m(fh~b9vqQH=aJFV?K~b3 zDt=pV7(c8aa`|+^Tb_&0v~oW|*z`Udem~(R!q>gu;@b$XCEP+d=L0r=nD9};hO;bw zE#aMnJHfXsa$Wce;c-m&y3_6aIlP_l+Etc*d*OJWrB`@KzYQzAIcLMS6E+OlaC6>5 z4R2Z<55J1x3ZcfEN^$<1wu?=-E%>TeNY}!23WpiqL>Nr8`ET^#951Z#oy4C@c!fvj z6wUnEGSS+H>+3AMcspS*$&5&!*P+4MZNRh54I zHu9hLxJ{4U&BW)E+ekl${x0=LBr-`tegbQ+kK;WXYdws`0mj?l;R!(rf2X(L@4N9^ zAV0=B_X5-=a24Px7|Z3ihSL)MOAw@R7^w2^pqV`(7@GsSeJ2EMI0!TbAAK6(@&MvN z(^dq;xLsKX-bj~5n$(9ukFmD$5?+kmX~5FM_*+_Y55jl@k@mtH|dn6_H~Q?=C18;!BWE&P-O2_gE|Pfovtj2k@L!W`Y-B z32z#2@MDzaN5JD7^ECJcxa%w}d4WfH6k((*=Ye|;^pLTPgK(uH{zf@U2&exH2ze_4 z<oh{Qz&}dAvKL9nM0TBp$RCw4FfeA8oaa{#1S^_&){yX~1*wc0p$!0==}8 z3DEVsfWun>zJxcxo0hhWw~_%wdCO>r>2}29O>YJsFu+@pzoid-3}x&9giK@jz_NS- zcs_}^7r_@W_yPV#d|GJm1}Iw^`YoLfDD6rh-inMN=&xzK711NY=}Q6eroRLn-qZ%< zaRbVB3-I3n+=w{5r3&J2#oyNg_ig-rHF({D@Qr|1Al=O<_jUODHl+VL-mfAKJSxDI z5U$*W_-jB1o+*UW;L(P3W8m9{G!?w5>yaLLjDcqCO5pK#3G%cdZ3=XibC9lt_d~#c z5bsCvt_S|(fFA+;FycM|9>4`3!{2x-pbtP_IUh6^;Qb`R_`3r7G{P0omxMsc&6^f-^j1@2*N)>JYY)x{uy}u9N~wN4)`*{0m7+YfFEFbPxOn|ObAlo zSL>2Y0A>FjU&7p6fXczgBXE&i1!Z<~uhWt9O%t;$0Hi1E?ZZ~PH9}2 z%_T=j%H){2YYX{-!EEQE>|js6vzSb@JlB!$@6T5;SG>)AtE@7eowIwg9jmf6WJ(a)ft>I&^wq-61QQhROFNzZD8I|t|Mv( zgJ==QG-g*f#+r~@V?i>>(row4fo`WIbQFdf7vy>edoz8#XF9qNd|@Epku4UN6b5_q zIWG-F&90rbZqQ58nePR&NNd6-Uz7~uxZ=8E$6(*wT&BGbjiy>wlg{KDMV@-}d&1%- z#SaYS27CLnZwrYsgZcj6j>hFc9Cbv*rxx9UZID6c#>M%;1-a&IrVtgU9ZJabbwi8L z$WnCW+zFY1f~dw(nG&Iy^q_Ioh@HE7DATts&eic`S{)&E(byDp^cULmo$CS?yb?nwRP8YtMA73h`ZsPZxX?&VVw5aaMVC9d$&E zpu-O%ml%OjZX8pb(>svu7+fF&V8}Sv+gD909VC_(BW{>N)!tNviOQ)ohaFW#bolft z6ncx6Gfe0x4a&)yma0ThMjQcccnGK?j)6Yo2vh1fN_7#(W<_7w)uD*JUKpLx3_>cM z1ZMVi&z##DC9xetDH^8s7Ymu(l*VFqaCtF1FmoWA!>losTeU1dFEi9P7$)q`tje~6 zbar2+SPZf4`F!7W$R8p?hV7YRShZCHQ^Qm{G)-xo=~QQ!ww5rBU6>0F3-jvBJMC5i zC-n~YES0HJi#L>u(b!-Wl^re5Xb+P$Og*E0)=<}!#_sH3)J6(JC}?4Dpb>9K+R>fw zKo<(bqNa|XOfEz;Ozn~Il*R$n9U8Bb6zF0$*BKQ^2n7=+?izAfW8@#~?N}8lKbOhn zW!w+RA$O*CaP^eNPPCisP#94||A$YX(l|TcU&st(XXZLv&%oHOiVHbqbKBxH3r#@g z?)<>E@|)q2HA;Eghq}UCwftT^$5hgdd@|0EE|HByCZw|iO_&2loi!e+qc30dtE_ur zZ*g!+V`0b{2pgt$vjLdi60!u|QfK=MgV9tIq6_&*tzlj@Bo+mTi18*Nm@vC|E}FnA zc`Stlwvr#Jf0fw5FjTbmi`hPm&bjuO;uRU=ZRXiX+J>oUq%8yauHHV_?e0*WFRts& z_Ju7wp+zpp4N8Mtn9ppDO2!Q#i?z4Ls(cscbMy0Id8(r4uEm@dM$cceXy%HRrAuZ< z!(?Z+eW-gjI<~Q(L&`YXQ@RXJ3vylg#x<}g!!j76oLJkc-Hf2FS+X3L* zwY`JQ`Mfix!|D)or^+lFh%6du3d^y0?(NQHI~{{%AhKOzB(9m$yEc@RIUPQ|Dlf(y zbwpK6!&I4XnlU)$y9YA;nAEZz`GKfm#$vJX9q8>S&KknR z9nhF}G3ehrIB`rhzl*TSt#i8sH*DPv+ZevK-oUqe6L>p5VLmqzyCB4N zd4tf?4PiM$5Y5Okon{Z-$WNQGpt! zcJ;0``JlTEWFytUK+I*#vNKGp%$7uRCQ!{o-Px8*ca##idEgYMTAD=@Ta%q>N3f73 zrY|cfGPCU^g9^$h&!|y>umg<>gF-I5c2M|-Jgl0!oicW;9>Q9)Kcv9$vuL)Y4lx6; zcCc89NR;b5EPX?&&fYakWe#!l)tT)a>KMdahVgLrK(^BvG%$pA^bIV|i^GKNwrG}B z@cC$!cIS%_qqBP`GXPE@I+r~o-+nsmFBg*;7|6KukFl^!RXJ2^2U|1!g}$g{T_`|y zZ6UsV=XyR`p$Ju9zB_8`U48is{6_7)&Zu3;4oER!vcz-s@SaKF#YXl;!&LMK>raZ? zi5M1obJ@&*X{m^cHCVJJEK(y?G3>N1thV~4t&0-Zz`@#=KOp(T`D<;?eW+M4N4s+n9E?RZsX-^9`9(ri~>b}cLnQK&Wmsi;_Wiat)t4@8x( z^&2M1bgs$dI9fRWMGO4@{vLH8zofYh_%<3IP zA*M9W&qi(BWLFf6vm;-K+NMf@Nir0|&Y2iNbixc{LdPH^>Fw(?b3=R%hqt8z*%zlY zir?HdY3Se7IX!O0v}e?+bn_B7XX_xwy;=FS#s{d82_~2LBjDF^y%uJvvLrr*i<5PU zySkxRnCasZg++zE(c77wwN8dV8JJauMzN8ks8~Hwzx=E0=Z1(z++oib?2%|?9J18N`gw)G(#j29K zdf8e$oE5V0h)L~cA%l6CH`c}jgR|vqK|ki;sB6Gim4NN;keOO0_nB)ly?wHN3OP9| z?YQ$8_HM{3q?X*IFE;iTg{3pi!`eo*I_pO+?!u%Jj_nyK!ZFZ+;_}Z;MpT?`k>dtM zG6bD?88+x(3K@xYEaUc^YymwvM8mm_os(=+h%h@E@F!vYduBEqK)2EgmxM%(*3w7f zsAGqmJTE%hAfi@>*@jLN#cU-bq|Sm#iLCqxV#2~f!Q_05w(9Hw!mPr6%nKzz7PcFP8O;j9{Hgl{NB z*QjXm)x->k?hZ8HfiM|1W&1PMe-UP2M!EU3tLQlHDqW2nWk`k5pj5K!i+KhMg=n;Z z9n~!zAJ&45)gkG8>#YdGl-20%a0e@C=j3xyLOV1G%A*yVO;k9gF+MEW1k17m{b==~ z>5zLzrZ|6D{v_;iy8VwTiDlX_RYnY0P8bfRG{T<|mAPN`r&cb;LTvWBj@U41Vhpkw zYpyKzC1ll)(;v?MwrmW{=?(Wd67;-44%2uQYc>qL&1fn9>^!Daw5cq%J23T6F~;5e zymPXoN*P9pQH#{-G7Z8u$Y`z*pCgKxiH0vFx0In`#p{9%Ks4qxC@frsv1aJTA)o$2 zBP_cxt&F-0oz#XxV-xfv7IU?iGA@|k8~gI@7)@7W7;n!Ec0`9$pu-boquctBXTb;T z8Xme|8{4qA3RU?qAjC`&*cdT;02@uwOj4sTunwzzuCNla1!HMVY4oc=X1hV@Cs37R zjvKN9cGIH@?CKv}+&Z(ks5O+=w3?RXRJdWl>Y6`$8GH^!^bM!SB$8v-aUtByTjzxeARV$7~hcOLPhjMT#(>ic0KQ|(N00g#( zVS`-2PiA>@4Bq$q_(T|hJ3TKFIaw^ae0FeYeE&U0VB_Gx>X2%Ni$jEP zZIAU|!N85?ZkQE~w{3Z@gGck#8=!t3yKm^`6A1wuBPM~chnXfjmKd=epD9-Ek`IhT zv&9)oD6C`wjcV>4jLf8BPo^_!M%@G1b)L{6KN(wu0o)|%aJ8B0Exr;AS%`=Rl^qbLk!GGSd||3j zI?a{L5cYf?ri<8`$`bZk60Px_c-DOa-9UCtZ?yDD5HB2ETixT0$(f2{X4_e2bA1>E ztIY2N;iUgB9m<*I>ipSBDSYE3hYc!kcgpeoxFcSo){-)e5B~`oqODfbNJ%J|v7r{a zUCGQx;_gkDIQ)JfF65=)e1lluH*Opp~93StiSY`tY+k3yTE$QxU#C5nLa zH{uT1I#=Iu1RH1mlKHd4L^#RR>+GtD4TLj`a~CaKuxP=ukSZ~M8htWcBsC#l8(8gP z=SR%M?M-3EqP6i9(dgk;KiY`fb1}!t8YyOac&o48Vk}lnhK_7&M+S>jSEo{iOS6NR zRGbkJ^Oq8G*7XK0KU&NSN0)xI9RAr#v^@wU=ihK94muIjIjVJolE{I;kchD!r>GVe ziwOD#=E0-8)skU;3q@=1R>>8W&}(JEW0tM)HI~dGrVGNhpz@Rn#=L~s`0#+wroguq zDX|iDj+iATUE;Wi3K=n&TZj4^`!mr2#aOZq`6j`c+)Q{u=i0`;$O<*MS*|k+PN3yE z*fx>(C&W0u?$)Dkhsx@ZJ0PhSV`jz=23?~?+ zq*zqOyh2gqV`6tFA`-~*KuZXlkGnX*X?|3ZVGwGhim}WwPOK+YjGf9Xnwl-Ft@5zm zi8u_IbAK_4kh|z3OxK8|=TKj#P>R+=A}gRFo7b1=hS8>{K-6YbF+$ZDQ(#fdfc1)D zD3<4BrV2AM%8{dS+fa~cCSj^1@$@|0R){eEBv4r?W6Cma1INi5*IDdLWp!1$-Jyn- zpaG}vRk4sw`T6)(lcf;}A5~Y$TgY}` z7reLt=I#{lQx%jZ7AqCy7Bv>e8gJ>e5HuP{O z!YTRw_Fm^31bc`XO$gf+@iWXcw`~`2a#VMXXHP2{V@d)su(SNFo0!`tAx&p*v4C&$ z5@OmjxDg>{VV(ge6Fwz`?_GR8IdnMhYrHr?JQkx|GQu47k5V21*(f`3KhJroW z2?H}Mgr0#xBaj6dWR6A`RFyOg>vA5n9@Q{mEYi19OqQ*Cu^O`lHaz8oa4~k0GE8anl*D#mu2B*paH3?%Wez&} zd*mTsnQ>%@TjZsr9;9|+G4T8udKo&Mj7aX<{qeEKQ&*V34raAVCGkeKYJwulTD4Ab zI)L>>xI#)vZ0G0|hio*?zzX5a<&xVB7y(PEvlW&@N7fwI3+aRilTp=FWOMhqA|n_M z@qBidn=-Cd7$HM=ENje1BuDi`aA~^D`3} zlDUPvvpFtREeRK8)-8{J2OnEmdmY$W<$JBciLr-hOqW!{+HFk^rDu>qe*?v3c`WrY z!>_}KPO-I^lg{*)>iB38Z3xhm9c4*!Q5SdI{YXh`qqmwCwdSV`y&|aNPMkx-3F?{d z(c73lg(eh=u7zd!h1oS(_!x05NEjD+Jz$nQjXA=*_G(|qU|F7P(U22!iG6TgC6hNA zY8r8R_@C(d^$=zhXBszotk_n;(!gB{#H*PYzo=Rym8*KV%eu3+skjzPq#wKd54p*D zwZ+se5{1~9%ruoa=v>6(@!apMvIaCCGFX?Qgfa*WUI>U>~&`Tn(Ph_)4>Mx z7QpL@o=DXM2?gSuVRYdzmuhgMqLrjHT2!4WisNUpA~Q++%yg_YCZlC}Lm101s$9w2 zbz#}`wz-%MJullRrD5K(mE`ELW=r4W5E~4(Mu7CyBaNm;WUNGrH>Y)KC&O+_M=pVF zRIH*I1KpGTqLL^+HjY$B#k*HLS*v_+7FBL_Vso~;n!s^zRF^Eu!U!2Bz+7WLr*d>< zC%q|+{jNEw$o2?X9E24t--v74Bx})JPR4`w@xyi7rZ)b##rczFX$CNDR1RbwVzaBw zhbm#%o)k1E3_=_XA2~l5J0*xFVu+j-ypy!r@X7YuZFj>Y{`sR#x5#LCt9gn;AS7^8 zdBZ#faffQt+c29%8?%iDg--zS@o2=g2v=MJEi6te{`@>XJH$!MtSAIVj-%h2G@-~a zZM@`WQLYCsJx}mfX=^SZwwlT`icp-+d~%t#N#LnlbQYZqN0FREB_`z2o1M?t{aXeT zum1>@lv-xZP)tKAm?TQ)vuHWADJD$37dx{VKUN7D!)vAF;v|pHp>C86TdhMK&KKC4 zPL9RNCY@_3`YC6Ecs|;;97Xl+4RJ~FcPN?8wYc)gIX4@Z7fzZSe9D8-CvM{Ef+Hx4 z!>-;fKXjAZ*w%uy?>x4(#9QXI%B@gV4>`=vWr%ah`Bl+{0to{db3U~@j}43r7N+=; z51*W;-j`B`xV_Ba*f5NF2iBdI+%gsNcjIA+m=pZC=O~QN!3zNf*k{A1g}9(9zWPCon)mKJ!bI_H2O@{O19(K6 z0(mD{7=?)#jXv7Hh@)%VP3E%o3u6!VIfZnU(CcU?VUP+pue}TJL`m-A$j>u2=TW#k zu8#8QW}&Q+O-aI#$ljnNZY6BZV8ant&xLWZYi=453S-QNKxSHuq2jmC2$6S14X#C4 zjBh|N%|+7;R;m^mySgSHzpn_L54Y5|uaj$;FmF1CkKo_Vq05AF$POXaX0cC{frDYu zneUecMM#M?LcR!xSX5y1O)lDMtFs3gQh63kKOE<=D(H`epi7i1%*zIgG5ZT;!Y8fK z@QJ`0+|%Q_WN;;mxiBf0kA1B!Yu9CRq-CDlM=*8vc9^s4QOCxoR5%@vYji?MBC5!1 z(4B9Qv}PU&30>rJA8Wp@n<-bz>NHLAFrr414#$}vOM-~xB+)9#rJt2de0WWnOiZmr zwWKG%90VhiJ4S6B8oDCa!@oY^w>oB3+w=1L#Bp z5l;4Too-J;8>qoe##!7!47u;}4{mAj1V9dLa|lg(g{ z>p(Lhzc46BH0yUs$fF?7Xu2>&an2FSOWZMlTTeoP4OzSl5z0%6!D7JHrgI*k(`vxM zV3d(TG0dVnZ`NF~H5`tN$1}C3k6Q4lLThh#JgT=ivmM*AEm6ydi$RPkGe5NS<}huG zmn_UMjK(+vtE6XZBr-T}g##8hmV0dU4l_U}N=RKC!t9mnoF59*iBsnOCpi!dA3#Mk znc})!2S!HOK8?mf8NnNm3>iTcLMGo^n3Y5r0ev#`s4sYc6sg*drPC2DylS=>d2 ztfcy}lZ_u)&|#wA{k)?yzrZy)CC+p_uN6eMb9d$O(LgsWygr<~33>9ev;|$WhKkY1 zU_S~9iMR%69qM%M-Jr!EN8;iaT&Cgd9w{Oc3mEh;z4#`~LkKbK8PlS>DH(0Xh^T&% zq+`%IBZGXq-4zW=JQo*3M7>23OWjknb~QE=mVB6Lgz`)Ye0+f`4snI;T--+=smt6q z7c-ms&5e{YxnLCU?Q%%Pbc&H;SZKwtr2DVVG6Lpcj8d<^iXovBagK$ucjs|cY}96q zMc;3Z?1UtKa48N}A>wf1X>x==^2rU{OL3oIK8K^Ei*R6Mt$eQ@N(@#^;Y~k?z_;xj z=2{_xn`Hhxh{ibALo3I~d*mF6Q;_1|8O$GMwey9c`9f5wz0A$rr*UD%D0Il)`5GZc z9K%QCa`i+j)*}ut%&wY4RV-IYQjbpYu&Co8W#+<=mzi)|mz@;*IH2E%6?I4(jx2K< z?so`qVOmr#L%G;`B4ORQz<#PU({Vla%O{MXSnRbeAp+xJIG4?f>J!~R-x2Lk+Mrh< z@+nV5f{7SA{V*Ft*6kkORbIgl?zBsiPo#rLBR%E*P`D`X^7o8cW|cvJVv zTz+MDh=d{GF|%J{#*<=D^Qa(sB#{K73bD-y27!FQ?Okv!$E*_2dcAe*gMMkHQ64az zVARB$JzAbafTD!OLJh5spXlOotwKm*8(YuNpxikTJ92Mg(ADrQXw{`V3GHXw&QWNj zV^vCLQ4?}JwGwIW3T;ZUS0qIqRvo$07@Vo8%GidZ#4F9(z==2ED84_6>W{EyE(wM0 z&g0;j6AAYL+I6u|Esb~<5LM_%h#Fjlx=c!hZ*wyJsUfqZX`~{f-0U<6ePPU2iK;4K zIp&4Kr$>p5dKaSg8#&yV?tE{jK^}F4LyifmQx3dp290{VL_{M)KinuC*_4@s;t`mH zFeikmqiG@{D_HwDCB|VDwiT+W5o118_Tr4e9gaR;q-hZOT$fzdo0Tk+Kb?UX=$Fb(R+$sw0u^Dp0gw;ky`w!+L3SFqaur|1elw_Hx#1KX#dOw2v22;^CDYJX#Zpu`N z*)Vm1wJmDwWaIO8dxN7~vLJ0W(4k!1z0p)9Ga;L8NP%H)0Jl5KjVsX{h)y1xG-ba5 zmTHs;-!Gb9oWT7j+}w{=VsNciMK+%qrj`BQrR-NB67sHg=UtH-gpqxL;{cr0{4Fm0 z$Ur-m=D3~Mo7j`pXl@pAuW=E#z8tg;Wx*xZ_Uf(>(=c_wc&nG-9&YUN8kJQ=&dm)$ z6z_`&o6bhbm{}tgPO-;#$x5EQo>-$g_wq`^v+4^*S&o7?%bUFyUy zfW?%If1VpkDb=tTE+VMNS!%;XgfrdKHn#lbiiK`$KSkz~u>tUl1|dU(m}|z=XameC zLr5sIg0&!5Mh+W6I-WMu-R8qp?o^(bxKXQtoQvEoY1vVkA490y0On+vcXxD~RD`p) zn^ouDD)YWi#w*($YK*&f@^)}4zl{iakT6!P?!5VR949fB$5@_3)-svRbcA9>>+X;_A~DWv8rF_6 zIYurSm#ay+6^TszO8@H%Q7Q}Rr;TF7e-X(P$8SB=N_1)a{a4gxoGgX0L$VECg< zBsrog$2q^KH<(M{BV|dPmjf1HvHdrOlc}P%CoN^Bnh>Et-CbB=h9NXQz39iiS+~2( z9rjJgV#>(jYE=8KWROV^=!~2EP*(-ES=jV}FIE zvfBeu*GIcTCzxfvc?#2a_FoRBcT(;7zE#I|R7=d+AwxpgQKB_X3_ zXYdrL+dxBc;@dt>a_spp@qhWliIyg^wfOLk(JG>-q?pA`NsBXa$&g&#V7?}=QEqsW zy%?iTG4_TE#y=NEqX7@BTaueQbNb_z$1(V&~eu+Bw1auJUim z{#(No939-o;wL$w-HDo#`p%aF?NonJMRT$V`b$~&N+l4ml0P@IA+)jD_vICI9m~hVT|M66xl<=`tFkJ>G5M~Gv!VTO6-)~o)@t<0G@4ofcTPxk`|NnEUc1^o> z?b>_St||;&G$Iwyv!Sh^)0SnS(>}?-gY3M~w zLx-9-dZ>BphMG5TsCoN_nm2H$c?&Z)eP^3E)Vz&D%^Nw?yp@}pw{lbSR&HwE%1zB% zxv6<8H#KkNrsf^Fsd+0icbI2!vZ-k+Gk5Z2fHN*Fnb6~@`6d&ZlNEHR#Y2NJ18?Jw zz^q$YCLZNxq}Zt7Y!V0badicsp54eJ5bCGP&j{bhFKM=8 z)8w$f&Zu<#D3>s0e5{gev$)mOgccDka6UPaL3yO!T%Kg%DwuoUHO}$u=_~{Unhx$^ z*=dVF$0u=<)#vOCnys#qLS1yUdVLw;pr+2A<@9G{RcwaalS+<`{VBKf4mV4Hv9M`I z9P(hn>26N{-JfIyu-cQdU7xM*xLKpC^RQqXD6m?K@>v|# z3ysv_J;O3WyliKD$ z>q3h)iGOmg;h_i<@ag(?IP!TiGO2#ZP?**O5s<9e*A2?vuk-oeD?uCdr; zm(|RKUD`}4P#4MJ7_4R1AEcY6XI8ZZScAk zv;pp2H=5LQpe%eUh-E`JC(X!)reat&G?l{a@KVp%Igp=IJZDDfE)AK>?0HWDlfojH z=_I2h210Jk(mLVV+m$e%shU2Z%5lbWY!ztjmb^7gS7N8Qsx8S~Ij=Qo&*m0_)@`sm z64*nRJISrl!CH?ZRF~^i7U6PXCdBO%(=LakBeEbuXk~K&-%8-@ETvY;Vw$kB*qo7laqT> zja&OcL6a70Kw8z~NqD{i+P;06<3o-g=30RhDgTY$?UuFdwXa&#@oU&+FqeA3YM5@( zPm0n2?aCCn8glvQ4a56)j33R6!{c`6Nqx!MI}lOE@ScH7^UMUM0}%Uf+GMpPxcw?g z)!=!qD`L<7B&Lxfkq4)b;t|})a_Tn+<8ht%emxd(8 zt6*m@Sj&cB3g_a2%)QkLb<}l50%vilkV%Lx_0FXX(7n1{jS0*V&S^P$5S{$h(=}asM?Fni}GMmWej^^iuqmzdY z=QMG|dTmpx$Bc30bA1p@styLJJs*@=92>my>de;3F*HsGJD4;ae%vzk<r|)zTTwiFP*oY~a{7tD26F)qzK|eA<2j_D#7=llofu z8CK27mG$YhpkdwIdj)k%DSMWSJP@T@V2VaDsR@kC_+p&TJ__kuxz~b z&CV!1*|;?8I{Y;OLdCS@)fckOosX0^L`Lat+@;#z5L6RVP_o3~A(gycs}EjDNf|xa zhH`(io~qs^2D3_1xonc$mPZ#c&9UuSjWP;tmihD*oJ)`~#mAs0XLAC08oUz?p{^d& z!zX7g8uHxIrtXXaL{_SjvJgDTAhen*;+pv8xdxN4X;M>xou^n-bVYEXa$ts(m zl_fyU8nee$-cN0d*>pL(KsEv*v?nb!7&FuRA7@V<%Pcfy6YHKAs3@xhSfthuvhkyn zW8+uO=!wEJnt+)*X`S6|zb$)UO%hV)yO9r1EiL)*ROMEjs1f?S_pps*q2KAAba3ajMK8}!nK zaotj*dRud|5ixx7*rDm8EJCD{jt(i#kHjdNouy{DiQJxwm>oGTu-*phLcuWC z&}DWiM2thnL)O|F9sNMitj@|wyE5Tdmo#}v{76-j;NV@=Wq)EzXGGA;FiQHE;~G+UQZdRkyzguPK_daC|lSJvO66T{=H zf|OM1(zXFgtJMZ*b3zSmfVLz+6NeAz7Ban=04ZdyzRKKbFrjg}D{p+JuBy>JwBs`@ z+S?n_ZG2kG=J9C-o5yb%Nc*KF#QZRs7HR`j7<1KcNSa2qN>ksYBt;gFR)}lBP#T(M zqP>1O-rTGn*TL^SaSV>S9mbker5-rVW=bz-$Q(&n51AsmJ|?YpeN4J?S|5|Tu+_(; zUTpO-sk>f%OzO*4ACvJ-Y=}w;qai9qOG8v^JY;+o8&b8#M8;>aAysQ!WPBGJQnkiL z&WG`srI{z_$|7r~N9|?uk71AJzM0+GDW^XBjKgC?RBN+Ev>P!r8PFTw8qAk*4Wt68XM=O*ub9=QN1OrJ+C!#&P$Pl z*rTfVV>lnYo}D*FWhNiHUqe~F>Xh~RQ!cV@TE#wuBEg13(qhLzG^v|K*wDlwsN0-@ zgmu*9E|j!AcGYm(QPvpUoh^0O`zZOxXlbwlavlL*!OoG(Q$N;?__!RKJUn3ckTi?P zn+aoxNId5jxX~#qsk#%~2AuReg3-Z?L0BDUa~Xn|Rx1LF!kkecA7=MZ6pTx$QV?y5Ve8CGHqe9#(54dYz3rx-T?eIULVjSRM`b7{BS+B(2?ymh?kR!sr86sE1!-!DwIs zO|B16L)AK`vS#R5L@8GB@Ie(_L0M(jh$BPL=Q46yBa# z*edeCl{WgoJn^k7)wFQ+2s(07&z0P+cX#G9pNbrY*cYK2BARcJ;Oy4x8aGZvn=cX! z>3WQwiEuei)_bRO*EA+4dZw;J>LbSFfIT+Cd(6z^u^#%4NN130aZaw0HiUmlv~xP6+y z$qjlm2gev-y*PZ$$n5o#Y|!u+jT0jiT++g&t-8hfQg^+(DQf(tI#RFCD&=bg7@OFgbH7#bvfKFguaTQ&`m zK|a$>=U=#G^Lbn9vA_BJ3ojVFsG$!o*nGj3p$jt`|6npYd^6=oA(_IXkfgKVQ<^4u z*ZJNaCzOORHZY$n9`c@=X?OyvoFRD`)sxASH+KMjM$@rJ6eZDiJNdTZbhl8Rx1@SP zK0Kv_e0Zu3=EKuY$cLwjU_Lyhmwb5IZ3$<3LRyz3Y`<>E$hrhrtL^UGtr2O^6$v(M z*s$8Yb2lX9gPVe9ck^VxbN4l*;puG+nXqR0=5K09f$Q#R$VN1;N#>3Q1neWnlO~Vh zCBTYJy2(fb@*9~rYv$<8-f64oIAw1(NgmIyG54@8UGYB05#{!yGsn)~GBP$gb3LLd zQp0q*ETc}wBP>=OLk!9;^4SY@nnhTb#%2-f3f(MRC68v|I$t*nPn?mPMXINE({Ssw z-89DeZ#Runr-Wt^v1@g+xLB@g7Kfb0e!Qe(c(s^K0^lXX^QZ z9{-Y&Pq4SrrA>+;@& zX5tcUPAWJzILFVMHT{jBd^<4RpwTW~_iD6_Pu%9)LD9>x`+PI7%pQ-wVw+@^Q3;#@F+yCrI-Gzy zB1m4dvt}yJ;L)GgdE$T^NT$>zKLy0fWwpnNRQAgSyWx@~u}kY&Yj32BrK#%=x5OV$ zCyyitYeI@KWaY{vin8pO&uD(6w$)2uk_x9eQeTKWR)Z7BW-V?a6z8`H#T!`EntSoU z__eX+Yrt*`^csSdE*eAK20$ygH>5Z;Id>h0t#S@dLzLZUnFc>4y|=S2CPv?W6=3&H zx(lAtgmLsi8nKNHKJ5LSc0;BS#vK^n7@ph*(ip`WzusBYP<_kJID4QW!d`jQ7@Qfc zjgj;yo;-8N=Z$gEp@vC0C`tLIARjcCabC9>8uUJROC+96vVC@B{AyxwQj>f zJ7?_F6{RGmvEbJ6bJLnbyR>_<>oeIxx6RCqo}4eW>qR{*qj?#eou;T+KXA%`t=p31 zm8)_V8wo@tSXkPf1&#J0FBU{`yJwqMTpPach!;WGX-khxqmON4?K5{)I|ezd_7EGy zjH9@4&nJ&vKCb80+BbKYSQNua9oDz)fcmzz2;V&wwJaCE z(>lO4rc?i6d+IuN?Wt|U+jsBI=c_5)*#NohlHjB?xFllpbs!S=yGc$EUO&L(fHdsI zF-T>{l9w4h5^dPt(HO@csr$?3P0YTtnSk@R*nl_{XV@ksAL7U# zO&!Ov9!N$zCMPt9IM5!;Jbbl!@v?O^4n1;gZfEj>2T`Lr{0HaQ z_-*Fo39ZPk$s5MUl!-<_$4(r*^yHrDiA{X)fr^9m3eDL`$oJBd_Gp;%l9+5hu*f(; z)GkL7NoWMz(6mT$zSIiZS?D^%Pz{8jq4A3vVe)N&Thj$pHPeQ;X+wkBz9a{N=UAg? z0B0?hp4p9KM%<=ZsQYO0=301Zw%>B+<|ut^R5}=73Z2BnG@J#bqc8S5F>R@g+%dXqGc!4_}Qf zJI-VK=+vbw_*|w;<>~@rk89OgHV#ldPqm_bQ`{w&oqn4v z*;2lfvup;(R$}OSik;AoAbG5O`ZNB7d%ek-#rBz#k63A+nJO`-j@ccZ>17!Xziol+Cynm69knkrr%Z_=<_BjRa} zW6{U#HPZ7W{y%}0OdHU6c4~Y7i*?TAkRXg)w7;_`I&~y8P>P%DviLuS1tEjrn54!g z5f}2|QMXVb_B_<}izah~aFos()|1cTLR_#jEM+71v9n|S06q&D;A~jr02O7^5Hl1P zpx!d;2ljIicLeGJE@Q1V7l8RLEs70n<2TSeG@Tq!;!~jnruh<(rm72!Jg{sA$LoD| zR8Sd!rMqFO(L2WN(G_}0{Or|O*dx~x9JjKOC)fd&4y9bw@#*6&leJ595Qdno2p2s~ zV%Eu5W7au%;d!L7JC7#Vvn`8KWGkRdXTP?(Eqq$GMM%WzqO8SMq_w*Ucm` zlRDe5NH>{rrpuNY^#+Sik#k3y6<%_6g{E<%Ru;Bm;@&1nT{In)M#8DL9h%%RK8q+Eqf_ks!Xono5MJvH$@1?i#32)bw92fEkt;vV>3BKnOlW8hD$1gG;O!5 zMOBIP{06XHljC{^Y<-1QgN_5?q*FU4XJTB(!EEWVGMlTu%g44!S%4cf!xq3sVUSO@ zm(>@RQT^l0)q`)(=t=HYORB+;P?xskJ#w5o;Bw1FrKw|Ym8NJ6R;zg-l zS$1_DUteptiVHn*baaC21!w0jO_Acj?a6<3Cd$Ebz(?BEZsc)C#yBTGWvQx;E*l3) z9RPT68y6E?M08mn5#^Mn;b?nfHYg$BWb0#;Z;mL9+CvRq&WuWg0dspg&ZB9!t7&xP3n>#cRm(Ls8#TG!>-m3*b@VzDrACf zj?Lir;;EVmzglh8?s}q0CgmG-w`r7{MNCZSD3nQrx`L2@^6qNi$S;%dX2`5}^k-&8 zOHP@%OWX_@FtMyVrvr5CSkc!kR!KEC{9K|Ye9j6^F$V0o!KN6$yCG`RDsxCBwHTm| z_SbEQSarHKn)H-XM3Z2fd90OM%VeB)Vwum;QWBaarzEfr8JXd!7;$S}QH^ZDmR~kD zOV2IV8GpN;uiKC^gO!wHWBsy5)O8z%-5hOo_^jo+1;lK|yxSDSs_DtR7K3OhNk6&X zg=C!?+W@SFEe@}*gU|7Dmj%PQ4oKG=>Vhn*YHYb>RgS_kGg(~U$=SW5sdVW|Q{bZ+ z4r4?Xl>V1z^*Q+J{gLV{m67#$j5f7MK9(vAenS@k+v8wi?B$ zq8m?`@~+7>K5~a|2#-tIuP1TFnOFr^HGbC+cc|bld#VL1he^0r$hInNQW6KU@#~6n z;0VDK#k#*{OA<9qA#+EQB{^53&ilG4>revLSU*+39klwKH9g>1 zN1Vuou~ZWW3|mi}SY(Yu)q5nZtXrLrt*;mef%;MSZcZ#94u?g((__$gL92#)psY~b%Q;g&7nXSo-JF_)@)oXd#Jr=*} zFDI48uM=Fgkm=1`=*uY;uzHogIGRtp#!gmoHhTQ#2(_GGo#Oax*3BmeVNu>Pw!w2Q zm$u$@G8b9zDV2*nd^LU2ved)cp>1OIGNIPdx*@H7Y`e0@P8{FVGBsTT@wAI}G|>{G z-kmjv6eYHnDY>~|Jm-O#ORD|creZ`NpC^8vij%`^`vOk1iEePp%~ihMX*M6(;5nO% zR*u>dXOryO$a(AKlDbjYGI72CZ!WFAw8`2H;g(q+(IMS3wr!*v^3Bq&+hCb&tlh@d zO@cGb7a`2D-$dR_WP&)=@JUvbrVnr9%xt%3Nq5c;&y8)r`ot7YDakITSzY$BR>$pn zAB2sVoVDwLPvI&uwk##5`20znYzz(hFlSM4F0u=9wlbBiZ2IIi5(_ecd)YMRfX3`v ztO~iVGJ5+EJBy>*9@Gj(!mf?C0hdi@gGLX{GF7OHkpf!)&7Oo%moN7<&&Ug`#T7rtw9W_Iq$92L_Da3qf6(x3=o zb2q|59VC4{JIw8%<2#Q}vuDp{Z=BAhWek!tro&a<4HxX@*k3)@m3W`!Y}RweHkO)8Eae6l^=sxDvk zF0Ic)EnhB7pR$P8!y!{_>MGH}8}-aI%^&OLzL_UaMqQDQOM-Q7by?HNQRR8sRg7AXi5}C>A zjYnn&w91!b@Q=BT3uQ4Ap9xD&an4O5xZ^?no?VPTx8EEFsJ3Y;M{JP1*&8sy$K4%YVRjX%x)ih^ER}E1~m$!)5q?xQEX4R|! zD+V-+P>O-6HPUL@tf*(3WPwOJt(M%KyZ0VEuzO!a{WEz$CwY%mjf3x{AllhY%5eQU zK7GWF(1s!u1)8c&+ppAZ^-UAn@o;LbZ=OlM_6{Z%$eX9o`r4Ql6=qzdyesC`$vlwn z!CgD_D29l|@`RG$OdS?gapEQs5vwN#m(KB-qbIcwb)gN7qcKo};J_RqjDCUVsJ=6$ zxEIB~J$X%4M_K=tRLF zj;7pfJ>!^@`RYf(l$#iHu7nOX_{8jh9{gn8(VPJ(6XUe87IDbacndbmP(^K*v{~$S zJmYq7nQ`+tc2`WDXpybe4Vxv?7P!XL_0OzJl0}iaXsPRC##LtB1~sWCeuxeYkJHPK z@(EpT5lP!9*I9NvXWs1wA`IP_^D?0`jNk0LrcxPF!y?b%BnT7uc8uLwa5vC0`CV@Z zJOSfs?sA)!ctbKD)*UJ*S*zCc&Irka3LRSCY^Ev;F(k4LAedYvu0VF+01<}stQvE6$YOVgSF%8%{54fq&24G*)ofere*a{|1B021SJT7rI^GwZ$Gwen|b4F;3u6-Py zhU!S1N|boXX@+VL<@X45q#5hGwUE29c?h$F+P4#Oc7n8SS6V-C1u~x#ztbnhlnUUQ z=PY?8txsN33`K%AQ0oV5w?s8d*Th`KY^8F6dpP^o^2l5$Z9sR3(@$`X zjL#g3LUNV2NQ{?aH5se6X?8r>wdGvM;0^4{$c5yI%GMvd z7p982JY2j?oJ-u4q=sVxiZW9i$M_*N2%=_nFtJ}onmbf|_-ecRG*b_Ef41{?h_lpE za^bcYv#o55-P|fqn|4#%*r819aqUn%66@CH**&3XwQhZNQE7PERGW)kO0NS>F-I{v z-DpvoZf<&d&!}!0(-&0O*>PfUg*g z{f=}Krm7k9@zlPiJ08_X$vyA9_5|jpOt`ipRb@0nk5SuxVot9i_t3W0#Vej`v#*&% z+&y`CP6dyKF!eryQj|wCcV?BsLoQJUfW1a1j*i);w95w@`{An(jL)(es2!NgZRb>8 zM@&j}Cy+*jyL&nKY7xWkq9!p7VGy(q zgPaywpH4Rh+HPQxGjrHz(hZr|J=3$ZES1DUQhiQ#@g@n352-|#9iP)nu+`Xe7$G=T z1@r2OYp>fr&@PXe=)l#qtxXED#{71>Wql;OO5)SGswZC$RI8k;_R zg6&wUfF>oz8Ai(-_2IK@7_;jic_c;SCbzujc81kwFre&XCG$Oqf5gg$Sl8f{8aU}jHDdTWtgM9xsK;#%zoXlM)+K3nz9?2dJS!H4~BO%Vy5`ANq zc+WcbVir@!XJCy^2x-W?6~*ewBl-S_iFOYwChcRJ)g~DiF->b0jiW1W)pho!>Lfl} zlb9|Vnqt$i`r9yM<4jSdb!@hQh-#@~D1fT2TzY~tc6DmOy#;@)#&A8yx>>k7w{3UF zkv1l>oneKyI7jvr991PCes{aA<2URH!^b&4Ac=nLwA=ApUrU?uuq`lw%`~DeMxATp zA~I0hn+Myx?NlD8i8lhp?@kEFy;*p@N_?X#Z~A~DsX7qKAiGI6+eWNeDpRJjPoJ77Mu@J9la55_pFA+tz@>_j|7f_pHFLhC?9mG zx-R5{{#5%hA7nL*=~-({gaC8%8HMWF#6VsFvkUX8af8&lWQonxg{yrCBcIJPT4IWm z>uVBc4yUV+x?as{GrC4JGkIJcH{x8QM%2gGm7O$I@8GLT8kee@Q|h9S zwe5kzY7(XsBXp66&3;QgI5Th*wYhcFrq)qINtCsYrL9%FaZD1n64$F_i$68t)GINE zH?fXd*T+0mWCX6ulCA**){0gagE8E?;l{yMyuueZsZ<gH?S47e$ZM*X*aj$$JMMd(0J3k<(rPB#`)*Tw~h>=5s-v}yIt_JXj&b1 z3^$p1;w&AlHUwvfT7n9WG|LRmbQvV>y?ksmKpV2=^x#NsX^2WLe1q6nCiv*zTB3<; z;22yvLR%{n1?UgjV;bNf5(LC>>oz#uS`B1eWu8fpiDBZ+M7U$MQ(DSZ!4_aCJqkXa zEZ@XMMj;JVLA*SkDJC)9#_6&x;K~boBXM6yX3;B`8`6I z!hD}HZt3y7cSdP6?1jYrj?ar}&&z;)8u4G__m6zeq|N*IXg~f9b^JP?8)(Pt`5Xn$ zA0fX2?b*k#=B0msO}dYQr*7JHUew0FqFsaJ`w+j^(gub588EjKzdvfr3G%4cwg1P& ztsy^!A0+OoDE{v$U&AWoslWPn4)u5={q5c!e)t4w-%9)!`23E~+TJwow5Si?KwWN+ z!k2)92l;%QJRVEfR1|(kRKGZ1{q3Rde?$D&`1}W-HGQ79htG9-|zD&F7mwfd=&os{OaFX&{#aa1D;>5 zG{+~-NAuLYG!G5aeDpW|`ylx!9qL$(!*tB*vyL65Ri!f>J4(-5e=UESbdTc`r+GEc z8m{?$3^;xM3BOt={nPjUCGIy)qrYDyEPmg}v$k35tnJi#UqRU0_)IQ!aKFvKKZEC` zglnHZn%~n-^Slr7`|=1j&R2hb+$1a;ul3eGyOcb%u5!ou1tGA%d@ss`(9~4adr-AejLHX^q^^9MjqEv#;^I5`Dj=t zVfXR;VDzqGgM_^#^R8jpKka*^5A7QbS9;f9r6v9Sd{k$B*1p-tyW&pYKSbW&<`dJo zj>qg+i`%Vj(lM`NU(+d%(BJL=Z^ez4uXw1>YwcPGyN}-oX^-~l|6lr3+o!x;$8-F*@x<)RMqE%iHezCWjD9vm;T&78| zM*mk5xR%%p8wO6PglscTJ%QG*O|>E$`bJ%@Y}x}cfF9kC+gCG+i9wWn_27;6P&gw` zjkX7|7cI62Nym-71knzid8((b-}vNTGctYTNc+qck`157=BZ}X?oI78b8Dm{$FYNA zrfUy-?D|8PgWJPI*VN1dgw3Ko#Pn=5Oxq2Nq-SyC;$EC1oL102SG8QUhk#R9XOdGX zHmT#hSyJviXtSrtx6j9d=t&Ok!Dde$!*16e2D>0VKFdakwj%~>?({q)VK?I+Vv%~D zoNy?;8v9{;C_PL4{4Mjq;FUN%!96kU!R+~A?Lk^kXE9wJ)%~0EHEnKmg1wp}_Jq^+ z1;!)1J(QkmIvpx zscG{7%(5A79uV&E(F$#zr#h5n;pU^w7>-q0SgIGJ{=c$wRo<4?G%sg-t^RQ#itKfj=d1g*V11FueFKPbi zlE&*9{q3{Si-I^pxP6Dr&+RFT!_MZLZmkE~x`o+! zYs9XA>&7{}w>_ZUuh<^l2u%|>z_ka`yRT1$V;;9a45@iCOvWhA`l==2t}r`4p=vD- zk1{w;wYH}+t=Nk_kAOzpO75%QXHK@yXXbi)t5|y=d__;N?tgM5xqj*t;pZnkF78rC)V7ot^_9D5 z@Ki+kD1lRV=gZoj(%ilR(I7%8nPR)}iFroTtll!&KEv6$YmOlF&IfgJ_LN!+n8VFH zg(h&Pnya2g)ILvV9hwJ5uh?kY3py>R%HJM}i=dj?E@H8k_^4sc3>GnzUV?cFV93&3 zjd^N-dYbMjKt^2R6d?6-%^bD2YYmGUl|8-AV9GJ24uPZ4^y+P-wgH9p}-yk75WtQB>X7oA*V` za&aeTe?|+Ks5;h0uz3^i%9BaaM;-y=h|ZWT%nvbKbQD;-89N45cgIsGIRbCr2t9GFwYm_O=#GC zhebe|nr_o`dFUf!tOs!6aoahrA<3z?&Q|14=Re-9`ebX+}xYjEc8mrFW zEt9rqog~){6m2jX70_;BCBa}!Dq17jV{4|924;{^_B^(%q*kGAVV;CZ7)h7N%_t!D7ogDA73I{I=yF$+VqDG`@|ASy$!}{`I?gO`?6m8>8RmKncaW zJ%1<@b{lciL72cs`^9iVX|pU^4-HxAHsI#fKvRLfX^z`X)*dJVZVr^&)38zBP8F^V z+2k{2;y>IXSIAR)e|}D8A=;D}XLR&6+Zvnytp(iyjz`dI{DSPBQX!De<{v`#kcZc`6Lg59*{9eq>rnp7EBJv55Pm26R z$LF)P6A7VmfEf}xbtWO1-a zUR#hi6y)^<|BixOB#-pTFEFyWy2NxRSl^&n-#~jT)(3E7rG`L}zXZOottv}ZTd1W~ zC}}C5f|j<*wiqxfQ}NzXu_ZrF9ur>HqU1-(i_3DaFYomIS5$(RSAx%!&DNwQ16q@_ zX{W8pCRdX%Uy}m$p;W&dRDxnurz-Us;8R=y9?#FzsqDSKQaC2Z!N;G-lfx&qsMVAG z5k)9?GC4eDYWucI@K&v@e;}cQ9ZCmVgMy=jUD_+u3#^4f4tKs^3Baz_x*XTOC+H1| z5-JUu@Mix$dDzI!{&^3ZF0c1L#QRL8OcVn|39HLIN;>@x+in`{heoOBG16xqQ5U|& zVrH}1YleZ?Yf55#V`>6?AvC4143W~#aKc<&GW~S1G38_CcyU^$j47HzLBg&A=x0nC z-=FZIQ9c)Th26T7g~n0xZ^(h28fJ;U*uvozCgx) z(4pASVF4wrpfT&gL=haF8x*7<13Cguvz#H^%5bi9SG%M;=qm8(_JYcP(2Vduh0z(@ zVhYcqQu3eD?S@4ts|`M@tAoI2>qsd$2R~6$)sjdQ0A)0%q8G@=jVSk!pZVNC||2n2;z3+@-)J!Xj|v zQ)+mZ`CGZu$X({TJ5AXOK4iRmjZGTJGtJYb;ul3}w;)H&En*f+X+a4>Hf7)RmQBzn ztHVY8LuQMtkuF)tw1f>9!lUn#;@joKq+voFnk&o*$WG1J{LXre{RcRPA_9B8N!MZqO4X;uuoc(h+X(l(i{Qi6h?p$LS!b@KHXYi zi!^(@$66%o^rgsVQjUJzTlyWxrw}eA`<+6&r!-9*lMm4;C=VIE8*dZDd5-r;3*Z9v zI|kQ81>WKq_Y_w>hD@R37@LFfR!60RuwA(l(iE;*jo&V(W^id4*;LISv+ao6;KG0o zyv0#Ny>)RlwT{MPoaL&kb5mNBD=0-u8smDbu_8=CQAt@?huAdaRG?hmjo;b&xf~V7 z!8OLE5cKo?xo7qL>@)H4@uwmL>`i`;k(ih(q%&mnedhN zxz~Poeos}mLl*ZvHyi(9so3Yxey{cJQE_)+xCp(4X~+Jb#Y~Rk!E?26dbk~oF#FTj z#lqI$Q${|mL{kj-kP^8^K5P6hF&_sD%!iG92;soDzhG0yaB1hCsN!g8T9SOIr|qeM_uA}Az;)p--8mMsx%@P4W(bUeP^mwT8;!=Sh* zD0NoZ0OoQ(Tj%w@U?I6%9dLuCt6F`Q(5j=W_1+7EC`%*v`|?TVQ!-r;R60A7CZ3~J z?k7`1l&IEgBfA-pr;P+&u*LgLQ0Qg8T*xR|#D_8C{{1yn#?|XwCC(nRQV3D;0>ePC zwQ9A7f>&GSy~Zz;ic9@P44WddWgmTH1xmSIt6sjT=+zKi(f0o*A`p^rsk1oZ{k*C~ zgA(@7#@u4$_E0M3&4IinFqJ~hzoppu=SAOinhyI<0iETVKO2Ohju2O^XInXFfteuJ z0vZK9SoEg@)DucWQuC4MTv@cZpVrpO$Sf~Hbq%B6g7@88DUjFJWPyKQ4dLufRe8F9 zcg-&+ZC{{mubB>QJ9;^SSV$N8wA0AerI(0zaban=#0<$ESz>r9cmsam|5CzVi@76^ zw;K5cwUu9~R`9QozOAz_Y;Np?L((Tc%qk3cP>!lpT7cQjS}V)HK)#-%HEC@4~X0^ z2fddmGevp!$)m7I{7f( zJ?t7K+~q;P>5XxK1~zZ(8|-$EBO7HhAi1~CWw!NW!Q9o#T_`$<{;DDrxd5rbW=J1h{xzbaS|6jjqS z8fI$2a|EvZ2{B(5c@2^@nirESpXX_Hp6dszDh3@!6NSrzXUI2&;BT11QxZ1BfQ07P zpsWUd6_eS{Lcxr~j4KSsuJRf*reX*%{L(DIIC3xi1;U{!J`Gpm4QUMOG@55uZKdgx zQnl1gNY4fRg+A%;|^mdfB!(^cBy~8j6 zh-%6Y(C4GUPb0Kg1ROUm8P%k_OD<6bZ^y=nGN=~HT_x=Ez7UjFqqwd`h1J=ef_yj& ze?P)hVZIfZcZAD|O?WnjhfE`SA z@onyCIXS^5|Vcrt@3$-@{3xoW2 zM1D3RKOf=oUq!`NW8PGRfO~k2)8jH+gY^JYQHK&j&;Ks^DU{4bCAPnTB*K)fncqj6$8xs}dU(&)k})I$|63m27k6vIkaxwBHh zIBLp((hL5-i`vVXdTD-ycg?um14vLKv?Ih$Q>m;Z8)Tqf=@HBugfFO~E}11EX7I|w zm4&V_Tp)Iw_^aU~Ys{J983B5fS zHi7+KZ@)wPJ!HQt_WQ*M<^b(|SRl?v4~ z%vHm%g#&WAzgPPG37&716aICoxA#PcIHVSFzslJd_>kgJi` z>ho(#%Axe1zmf_?Ov3gXBcJ~M+!UVe%dJ-WlawbjJ^WJD6vv_A$O)6TX_sK4Nfx1T~!O676{g&QJ%Ya#a0SgSWvX>9MdX20mY|ZA*m5cipl{%Jr?HGU46OoTC*K)sZCe_YjtPp#$ z7)*a#qmzH3MTcSFnM$Q>r<`td#~l@f261#;_3lwgv?O0F(#0Pt$t`7Q=jKYV3TdUA ze&ENAYVBK7w1&$f+QW{1@8_(P)U4Tl${7^;}*|FGr1p+Xn1RU(zPDs*e zCp9Y<&Xv5=k&yyyBM3#izXyJ=>p0g8grf@&$*6y*_7;&h>#7{z<!0GRk;IG6#D?#8vtz##Iw5HH$q{zt* zY8ZXIvpR?956FtFGf0s>ES4*QB2BK^tJ=MHU6Gm@YPM|D9O@XALq+dZChVj(clhQd za3Yl6h3{joK$FzYyhl)ki_o-8$u)kL@+hGsEcvn#8Im4Tu4T+VmICN8L+Q()iw@=| zYzpB6X7qj|517jRrs!RFgZCw@mCE(#a75!O#v>AGh}suXv{Z$4LQpPbbEQZZGTaHB zQkJS6`>1x)d(KP>{q zw~M?4TJSOAQX~^fuqIhVJVU4dDpEtpTxAy$#XmzE&18U(=oeLASpZURmK7?jhwdxz zo;k>BC(>sT!%*#M;bfr$Dae;|IqN6@o+*CO{W`c=?U3Jg`2WK4)^g%>ei>ipcb6658YGixCQ+*&mfx z_Fe{|Lal~@c%#h9oLuW)?C&G7wiNYHX{8S>L4`%wmhuT!FKNKda=Oxme-piXj`u?! z^;PlCcf~HqRF_Ac6v#4VqMFf?pi@__i@_OWu(box`k9Np-=Z&26f6d*L38}pb9nwXX&g-rPj$=nClS?nO$N-Ng$UgH#sAyV%8B9 z2BR?yc>jU`OUr8Q8InRG#k+#3I|I2ZIMaT2-ia1?tGrjdN0*iAScnJHRofqQHX{lN zKIk@G`VqcLtmFBtn|7O?6TMY9fNrh_TDWXfG0>miiNpH^9&no?GgWj<8D;l!8w~L65am*KJo=mHxme zO~O)xcvsaSu3>N-7Ibyk7mKBSBrp|?jL(ye*OfgNsd^+DN{Dpik3NHm_yMI1(eL=?nAshXR`F=#W zn(sCKQoc_sqcziSk7l@B5+V)+RhAn~a8|g1@3S!%Jr0}b9{=%Hqt%7|d+Bb^TLV*g zu2HS89Q+lNKdaf_r-DkLzcSvfK{g!pdq#70P2LY>yzbgCx zQkHjP%qzVea}_kKS+G!ul>$`{f+B=R_{tzo7bT`|zJFQ{{;kYxo~4}k+5v49Xxh<5 ze=jL?K)4s1b!r8uC~ZI$ERU))3^Vs5?6O12doI?lg9VK)`AbU(T&NF>A2Ps_L8B_7 zDmW@xQ1(|?=a=WyzdB>tkrTP55T9)6DtIgSSc1zLn<8>|*;A zM(;8U#4HP^NeUO^Qa3(#&dF@SyAZ~t2vGsDfZ)1OE~cWPoQFm0QU3YzRC8Nk{#n;e z56NwT{9PbJGUVSDntu%BDszT^fjkrlMvWtIg-0>*vEGkqs%Z99m(d`oUzW=U0{K)B zepQs0OX<+l&GMd= zu&`Bvh!t*-_0|VrEigLKoofbZfI4Tmye{$|EsqK>m2DKpq!a3>+RM}9!zaiU@V>7sh}Y1DnC7p#N=VK6lW$YPOvVC=8M zJ{tIM4p0mocoiuS9|$8``!I@Q6yCZ-jpN=MBz%E%yihvh@7fEQV;^MRB%^Qm9sl6N zq*OTR#fnl!@9&qt^gD3P!j%msagSenBdiV5#v!MQ;0db6Pr{gCK;WxuR0S# zUygwB2HE4ipCJ_@E~1na3e`Zpj1-@Eyb1Pw{wsb5l1F#B%bW!xu2^RcgJ6Vf1cK3S z`)%y^o;w*wmD65h5mhZkziXo3!PlWqn;~x(QniI|b2$>cP6fp$BPrDq5*3pq@x~$;B2gWtEC5=L}XhF7ai3dfqv3qNQG?+g7mZ zeNtzt=b7O7iY-P1qShHy?yW}Np;**r8R=op2&kiqGYFdavOUN7vhB7WZMBC{kt!v> zMl@rf&8J{Xt=R7l+qJ!~Gr?<(|2kt{Yc|`El6`g|i|jMa3^sVrQrq)KBys!vSG6I@ z!y?}n`5%~}jl9~(ZAM;X)n=sUlu5`x>)OGg&ICM%^sEEY(+5de03@{Rky+H~tqTs{)I(Gt>so>XdhPSXyj! zIa^^)vy8GIXN7-PLm(UwlHw=qpl5m@G`pfvM4z(i+H!0(w;|%tLb^ynJA%a49>^*k z!aWQ^ItfX+$@c zhRgiNxrBIcg6J;ni{wxW)@u4%k{%?h?N+%8a}!P`_@SZSMTias2CMpix4LPTSXU?U zQfwq2#}KN*IVqU9&wYLOjr?Xv{ok%TrxTV zYGYo})}EuSUGJJ4l5+2p{3mbr_L5EqC=zUc7Y3(_k7WljU?EdH4d|&bxxYW~KOZok z`H15EQuc9$>rv~Z+FjQZvIc=@Bn%TYKSO(D4N~)J$Z#2ythzd}h2S)-%D%r_SElze z2sV2UsATkXd8XDI6kP&}LYz$i63-On?>D>9piUV7e7!L2oGNhDF>@U^p%Lt_B(d72%Uz|5-b+E!MZV^ zZ2OlgH=uw`T8b^tdJc8yYo~s(lr3l7XilEP=keZiaW$uNFnlV{@y{^dG3E}n4xUZj z{os7&pXKV`z;q0w@IUCA2dt9nFCzX-QZZMM6l5y?@a3prY($G>6sZvSX4_Z9hZv@c zJ%ypLf>|ys*4+B}T1HzHKYI?lXAZ+D!1#~1i0aXrh76v&WvzEFBS3Kknvs{1A?-7y zL9_Bs*n}eabkg1>3+$wVxlB{9^FEqMjch|s=(RCh@MVR|10Ng0u3F~(y9%-_ZNlga z@H=EGCGXu@pNX4%Z}76yf@R0NU%`nS7j4{MLxT{Z#yn!5JFKv&aAwvY`#?v{+D24G=FBEt`@bT zvd><5bCrj;R8>8ew^rod3iN?f1{|m;=gL44ncDUMl6P^FY@~_chaLgl=#4exsm-#s zY>L;w4Id*r{N)Ubz5s^7Nb18~*Ziy$;@a>FmR!K++sg86rAOc8E{zRU}QzsVr zi{)=bFyODTw$x9RaPB%a4Xn0EQb^pn(*(Hpq-WeW<2OQ6&r@V z65h13up5ixBf}cjpPq71DhJi#8GZ)~eSKl6NTQg~y;?`XfHnKUg%3&yWzgTx7VY(CBeZ{} zR;nSP2EnG_gN5+@%5r^qQ_X*e&b~(8Rl~n1yZ~O`lPvIEth0C(KI>y*va5Fn|4xq< zla0C=`JsvgTbH3r)-EY*6>qRMgUV`_mX=_B@UInplchCFj%Dw@4usvB{2pf}^Rf=u zxsm5}$e;PQ*5uhW827VK7?mN?vG1$N2WtM1HJbELRobskPFm>_QYkh^ol2`U!I?o^@ zLxPK<-&9zfQgrkMy-<)Qv|>%ce;QjryiN4TPEhfXobf%u>i%T={Uc+40{gw{doZZM zi#{U$heb7!4@+@*;q)>-`5zWHl6^apjUAq1zpEAw=;DWE1&vx|Aqw`pW0mesV~^VE zRm7afXD$Oh>HSojukKjqFt1=LrtN5`KC(a&xeHQPf486rF!EiPAQS74I*e477XOuyDSuxr%h$>b z1`Nr%#EKw#P@aiJ=&ABO-~39%+F){y-WDK^T>MYhT#U^z;S z>`tKJNJ7CIwD^nptRwZKf$WwE>DL`C!JiVk3>|YPLex4IsWoniGDOIGOBAQ+R>6eI z^0Tt}Wm$eN1fo|}7DK=!Wd#h}RGBE6^^A}U%y6{IqczY0F zZg+ogmjIWa;M!1yY9|H1lHtnLKa7fgd0OF#7_AqmgNT{M#ktG$Rm+{#juK9^YVWp_ zcF~+2z7HJ)S&o5o5ll!Mt}2RdDpbi!r5hw=yDC;yn@X)%4LZBAC@JHUj+N+>1$3(p zbYWzV4TrQFt0e4&p_-@JfjQT}v#Qr7ej zJQTjPz@fwU!TfJbb%41#hhFS*MPNotzDDI*ecS--9NTEMvT|!J}At=Mi z`>BxCVr$q0f4NX?_E4BkHb}xY&GtLh)_0Em#$yf?^vA3d23pdI#b4^UB>WK`iX6n8 zx7hMPV>xEQ0S!DT!B>SKfb8_-a~aRG7BRg-{B$!M$>B_-GLGolf&mr{L=F9Bf2j`sQwV z6Nr*`EyQeb-y-0ViRb_(qVNnw=fdap1h?ZyAm8bfZ+F6X@Jq!3-IwQSisvtqA;uX_ zjLBU5H{`41Y!S+jt|>0Y8E0*^SF=@93m&a@g6_a~B{U=Iz1wex7DfanLFP*p${17u zt^zMehtyu64ulWUvEM^JxJNoM zVDvMKRAz%YolQD%BVWOc>)x+R|Jw1ec&WwCCe|>stIK)<`!vQu$? zlJ0$_>7}l)zekM%9n#;^M_=-UjjBWCBm`^aRItqw&PDe~86*_(F2xk_RU}rsjm6iU z5l{s~u7t^epE9{Rrt?(z%{{W1R6AH7vqEu&a!$u1>)x8YwZ_wH@uQ9M`6bJ{lzvCe zytUK3tdyqh9_pnk=69Op?|wpcdV*NdK$79#ho3y2m zg$??_GSlfCk`bxtqZK+n(f=h>+E)QpD!RJ>L^0EZm^}Fvv@3*XRCRv3m|p!-SFzAx zoi%QjZ8|!wmVb`zueCJ4z^4Nj>^DfqRc2)2RpvkSx&JEP{`RV;BeR=-Cg^2$phcfW z)t8S3^7^9ORW!F%RR>(1NjnJ6uw;aktGjlcz6v+>OrAi427>LEp}88ngJ+y z7nj>;i&3`VWKcirPpI&WH1!DVstP4{_+*wjYpqA3&l49cJp}dXMg}0X!69|-wipvrfKcgJJ zhh|<}SZrr*WV$oJ!DVWZY>pA@wGMUkTQA8D)d|@FAxrw~vixhzoks35g*!PV;~rTv z>(8wM8AU#888Ceq$0{*GUN44qaYD<)D(eg_9kHA|S94Fv`y%^PvEPCHUhF-;th9=u z6UwUKMhG_FQ1xG5t(N>T5Ib&XpU6G$0(AYsf;>==H<#rt<=}qkivOP& z`LQ9CdFhGrilV%+82q6CZxMLQ?+fO3ocoHeE}8{qv%Iem@$jD)%y|r>-xuXSu!08n zm&1?Xza|G{C$r9NB7L$(9wDDEYj^xW3kgaWXf6J+2z9Zf%tBwkOv*Qnd5Bny+21ew zKP(eUL#XA;RlSjyR^&eQSW)likNJXr(aWfORmFdKrP51lKJ3d!G^|fP=*xSVcB#Q_ z75@b=Z%E7p?0)(Zdr6>X-H-M~Uq0stpY`PnY6=Wc5v_kLID{PE3>sCUe2l+`@m?rZ znfZDPJ?!nriO6(z1qi@UjT#SLfgJ|(D2Y_OLb6qXKxJnp0zEl}ij|8@4Dex%?lS%5 zKHRl|mjzW_&Bpv{mREE$$f_!E<+Wx_^-TYaGOJAJE9=8^unZ3P=hp0I6*jDF@`o1T zDOcfxwy{~~->crDBx5X(9%tGRcBm-{4SD}mE7b6q=+xoG?->XuKZ5Ob{#b_tRncQD^G#XBKn+b1&2|qntuuLp}+`PLL*M6 z;zfQ##=?e(O%!?FVJW@KeqU<8S9zcA!2U(G5Eg&w%P+vBC1Ltg?yorZXlTS0<_VbO z9|ha|t}kEqS$zIBgkUFa{9s>DHNWd5v3#?`avAfqYrivAmX;Ma%;l9w78si=0^tEuN^$=SJ2%l`0V! z$Xf?YC~HbTDay~a&OvDXdT4z<xpXcCGvg@F1{ z^bxS2SWtNMu{}yC(m@GDKp-KMPy+-+lt2O~AR-7NiV6u;L{tQnBFOvw?K2Ys`usn> zpSNUk&OP_sQ}$ka?bX-XMotP2PC_}kY?^Iai#y7GR5E)#a(_j%U~D{_7{Xp?fy?-X z3P0}Cg#;n#z}x3F4SV+!nV%B9*vxx?d=*mlhnkQ}+U}OF+a}PACY+bTGKd~%-%2AM zC-<08mnS6*1~LBT2_?i&|IXl`e-=#EgFBcREj9^S+9Yj^9JiP;G2cZ7N^Bi$L|Gwy zbO+9|o`=9?3JFD553qUN6|U4#@mn)|*A>2a22aa}ukDU5Y|;81kjviZ-e?w6=DHek zytBO^zw~&Lt>HVg`;?X~R&w~MEjvx0r?>2k7KHv_>{;ixY?;no(6S5lc~Q$QZb9=d zuiF)M|7+;5;sSn)?B*YC6myv$0P9sPThX#BTW%#!hdU#p{It{Ejam+A7rvF~j=x5~ z^X0D%_cFM~QS9!k*sm)b|A&3becJXhs#h#CT!Dk|2d3I1gbQMD{&U@qj_sKW)}J}{ z`-dH*oGa`uoD}85;j}Aumj8aM~E(1-f72nVzft#hc75rp=75REo2^_ z(rKqjmp{GJ&gisDJ8TWcdWVF|P1lKceF9AMkdp@C8%=*Jzteu8_ubfOt2*6GzjLx62sz?y6p{g-=kvY+ zFcPZ_DNChfqkM)dms({oT!!W>o~d{U5|f1FbRF)_gjE!(^e#?8DJ+G@$-xbcC&mEV zc^9S{AfTxX;VRV#_~gpI;0M4aR2t8dhB_v(pX{j>lfv8b={Bvpshd&RjI+dmBUZrS zpl~xGyEDb%@On)g*urM}t)P{&c<(gPx+=dkx0aQXahT{Ct4^NerqH^H`CQvZQC~{d zrs$N2gA~xo(XoY9Nm8x&5Z&-6IQQf*5ENzGnuFk&HVmSLoB%z8uHY!SUQ-a=k` zx+Q4fydBRw=5K}ly~@^@SB);QA#80JAU^=GV?vwuVbpu;Q*S$k8p|r<>|AHYC}$ewe%B`x)BHK~zQ)#^SN>likiP{2`34ZEMxXwd5O^9hmi@(` z7@u})8g>(|U;e&OK;R7((D{c^ZOY9^SBya5b+eNL1TbNDq!rnckD|qikOyyvp=QPl z){p4{#h9x1so(g2?|uH3-sc@w0tRH;W?|>xEIBxMN^D)tGA4ow72XF?WRWcA^Xpw+ZBFGe^c&+9C-a@GV4~B3r z$(j%tVDufc$Lh9L_P^LI3u(Z2s6bGBhxuQb?ZUf`s@qBR_^H~kDF0;5y;eh%KN5-5 zV3_6sG1=aQ-0oyL2V&a-Ke1IRX_$yD3P%?r|bi+R+8_D3@q2|0_XsM1#nU(*#kJvjjXd9bqdz5#_Hz}c*rOHq<77Q!T?@;yM=Bez*0mLI z;Wvr>R+{j`iF-t!cUSBVTo?Wii9M_De@xt;^f}r7>UfsFOdR!c)fS;+FZp4D@wY(A zNU!y;CHCRKOn;ZUr^qT<&rCn#{+_tk_{mns?p8@j;-zX7srB{@$X7u$!X$_2x)VGt zC5u2h8twz!&SHhB9bg}Zq+Oo66;d*Lp}i@r0)Cg)sJIAJ?B}UHAQpqe>%kP>e09aX zUlxx}-9KP8n8;`Pz75#eLkQfg<{sGC_;{?_0_Q?tTr&V@#V`AJ7?)Q4Am<(_e0_Fw7NyLb+s)$q=EU%wA_X1+5Vh~)aN z-+5A+ajfigS&lr%Desosp~xA(aXtC^fA(a@lk4lB{2X4Sw~?J3Pe>Cp4W#P??^jaP0#-Ld zxriS9882Q>yDsp4nUsKkMY~A1a$n$DVe{wRZ@hm3A;-v}0JbQU&w2M}Z_lel+CR~* zJ9*>??IL?iqShUxfAEAo_L8h|TZSf_}Z8_(f!j2Kx0<>i)JN{rWP+1l%IXkKGo#+uusR_OxG@ z?b`+Y8jleBzCgcb{x9_Fs?@C%{VLm^%64fvT>F0TW-C!Lf?5WccxlH7MSC1hB8v88 zYS7b<*%cMt^D+BQ>W%=L+=1k3K+%FMBEkGQp1dJNdk++iA2TwCMA5GQ|D2+EDB1LX zqH0PX9f_*gELdxX!hTBF*TOyz`^jOCC9M`+VFMZDYcJ%J{rz4|++!FM_rl4L`@O+F zlxRdBU9lfRc(^j-_im2RA(fNC7ITJtioD9P&gEEyR2c$3)zxrnIK+Mj2Q7+L_~z)KAxn2 z^g_t~ojKyN5VFrU>q0w=o=b4mLR5?d=6HP#Q}aep|I!@wRS?YiGekm-${~{`}z&`SCazHY##O#!hWN$uZMjp>c-`wp( z!T|785DS9@f7r!==*GiXwUOIe55%LT5;(sk`vuuv8ciUu`YL%<0()J$?HlNuW<2RL>1s!1-*jM4`ObJ zTtwbI1u~J2;g|zqAE)V?DE9aDDAomv&5pNs8{=18k7B8R=xr$0`nOOF>*L!{Ecq8G zmV;s)pjh%RP^>4AuBR|A6A_lmLw$vf|Em9=Zs85o17l#IOX%j92dH=u&dJ1A!bz`S zdO zlj2e$vd#s_pMD*&=EM>}fBuE;HtZEi-=@Efcty(nh5l9@uu;>Hf11Pc&uB)EsC-pH z$eYo(()?~Eq`zro{bdFD=L*R`tN%&8U$IpQlyqo05Mnz+<5A7p3lEeNMJ3Jvo1VspKC>KNd@677kO56@|~^ zn$%yH+TKC_IX!c@?cUViKH{!T-E}ZMdx=s?ZtI(B_ok%zi=9%#3L{DVnS+T7up9g#s6j?C<+3~Zy01lR9w_onW8@#TdW0Fixy z89=fRLJ&_FpwWdWSw$xC`5Uu(RoWiKijaD#A~FBv-=rpUYcPt{w+8 zB$`kfJGvE9V9sz;pa+f4NSQxc`!ajVDfpAPgx4>SKLIs69ghn}XBc9|b4)LcCnFDY z7^ntirSip2P1}SLm0T_@axPr?T@n~UfvOs*;oUq` zN?cgt!&L3zn1HPUq0TkMizF-vyvZU%_=Gpu*MdoSB%;1 zA?d%KevM>}_0a5~!dhwTcutv(wDvja);1^S)AKzZK1Y(moP=|Yug6~-8?Dm7rsO(= z0XWy$)r@r*fYr|bMZ`NLAUVOlRSd*)sV6+2e1dJ42=xIw{Wg9HSnL)l!vpRg zADP8RXZDTEy{2>vf&G=#UQJ`A>j`+TD|3}Ps6-G6f4Q&ZUQdVbf%Ycx-&1=ng(knD z%YTUd8C#uGM3P$c8aC4KJ@u2rpno4y`wmdOg4AE3hG#9#sX2n5lns&)Mg}DCZU^$c z2&x^y3RnnK8xGV$O`34ZrfOsC=Nun0e&PY8ufiMrqk7laBMPPeSFi7KvviP@|{U&q2 z78LHw?0yAic=z)Rh^@;g;~<24ha!Gtl1D{S)~7m1Mhw>x`Gb=itWwycDs#yIlrTdT zM@kYNlX0KJz{wJg9N5}}CO)8v1r*VD$7bQ2<6JpfR8BEWxYZO*5UPE%WQ$d*0-DAC z+>)KAXeY3S1tth5qC;op{+!&tBQ!cAXS}E%1@2F^zh`!4Zr|p-JA*=Yc0%q?&h4b! zQ6u!Y+!k$kEqMUP>-!11`dIB4M#gcIxYu=&ZAE{*BT@rdke1+n22E;G&e@O&`HX=Z zO08m6v5(@%4`y}BXE4o*=`<}&s<}~r6IiqZEF4qAm@b+k@tp0W#|o*Bq#pIw6Xo?}{IR#}fJ0jt9v(#3e>t2XIhw z4H!?xpQ;m)yoFr5JuGOA^#}BDG&%|8CIdWezf zb$wEp@j$w(XHN*N*D;k1R^m~>YIvZ32f;Zc)p0gM_O)j$CEz)=BP4GS0>856yOSo- z?^_^Zs`v@XKuq&KY~#$qJf;Rx5yd8E=-jt!ZYlZk{MJj1upC}!_8x=NEPqqOEvqB= zkf!uJu@a~SFPU4Un-+TF-O0wF4gw}5Ic(mK;{r$BonT~m!H?v$L#J`>FLn27okoPK zDcDpZi&I@1WIlC5B=k@9?WQ=iS`7+A)Bwz!)wq#fp=h=#HUo8bqWiH@$q>H4o-6n@ zie^D^$umu-kbRj@BQ+;(XycCVYMFpCE>&vER^arrTuNm?K^4y*v2@HzJzmQE)=;NW zq^d}%EWu`a=um@jgfaz)_YNpIF`#5gS*rbWquZORq9rLc%sjF`5QJ$k1rA1VVsqg{ zD@G6}>L(3VEC<(N?;7kKi{Nk+B7C#d3&wqp1R;^9!<%*#nR1Ml@N$s)XWgjg1Q-0O zA*Vb=6;BhhysFc$#O@QH+i6RQ(cn*YO8ar6BI-)w0S9p7lW%p0Knw=kOAULz;jssW z&U4}oIq1FJ+qC<6BU<0DI2oSpR&;_WdMYIqWp>ozpPTk{6TO&u!aS%YTcEj>Jv|{H zX@D|Q9}ia{uY(36$Iu(d@u`X>AU#=)Un>(Q_@}24Q`53PwfqpcN5v-y7-0~KAX1aQ z*R&smCh_pm_N|c~{Jc}iEMJ2`NvslzC{|!32MmmWPyU09O8ZYB zYo;}7OhT}p8(qS%px+hu4-8)GO#a$wi@V$@(EqpxB&svKd{Am2;I8r|Sy3yATBUD= zx;eyt@a*B^EV>#5BIKd%k6;MnmrawmOj63{ky1tgL!}XvEG#$Zoq=~l2B|SlObhs2 zQXaulJC3R)P~n~>aEaD5dNh?_o$aGb7%)T{Oayqx<5cG3u2hvM&EKB7+X7D}kN|PE zDtdvyX!pC?Pe2_ynPcPb24BYn;TGsnt}lxxQwTt*+e*DJ1`f<)s3yicz>S7L4|R}X zW+V7dBT2pdWY=^Pv0<@}XE1w40*js*Zbf$n40 z*j@J`Dr!e}1x0&0Rt0fn90^dgE02$`+SihfY?2#|COp%2v)%ndJebl|kx`I2X*@W% zfJTl0^ppV53GqTG5GU!gKLrR+;?1Lg+m6CYl_7O(-K3kaPMMe{aaw#r#BEeq#(~kn zT)Rlk>mi|26?fEP>@UwiP?2~rEFMk%Z8C~cY9aR}_*lb$RZs~Ag=)i(W$25?3N%{> z$edIFs4M_&mJQj2GT}juHk60YeuNeHc7|-p)O6h+?)QED(S<0e_LQw+*8i2 zrA;;orm;`^S`hMn;` z#9gH8Oe(qpQcL|gouh?B(MngQ>XT3M24xOmWnECTtc5s$*3_haUV~uS3IRhZAj6<< z#DFK{SZ+2qI-W@(ofEz;AuhM>ZcgOaM<`u=g2)9vhyNN5~ zLtT~8gM4}(zSN3^#BvI&E;ScT-=2CUl+|Mmfj}G~Ricr~?IV>m zbTZUU37y>Hu=*miXnMvwV>seL(V3P#7!tJx{cD-ME-R)Oo5&8S6%-!HFnEs>lcf+O z{$8HzlD^^90Al;B2=lCX7RwCEeCf6o6olI54?<(we>_I8l~y8a4=I_B`RJqKwsu$C z_$G}uVz20?w{g0idNG9!&0LszR4V0Bo(B-yTcrKLSe{^x1Gl?;;|@=}8+gqVP-tO~ z^jl`Nu_|ytAU>n4A6-5se>5dj*#fF!q=$$^leMdM*YG3+K(n7D=cJA zw}!OZ3aGXc)R7ezfJPU(^h(~(9HqFh$3j0cTu3vr58&4X_UkX_<(2)aJYgWZPN)i4 zDH*Ni0$&bhB^_j8WX`~eI$TT3nm|Sziy>v} z@^Nb^yPJQj5^m_)B9xFGrpMO0bFk*3z6?LEFXkH;e1Q6Edy2YCELI6+!tNKXsj zev;bg)+X-e;@eHBO>J%Mt}eb^#X_yEo!qkG+xe;O*!mAAV?Iy8tpEPjN8QoIw{N8O zk=CII7U8#-5<8@|2vS>o{e5DGwN5stFfQ&Spz9=Son!8v;yWP}-?7$Z<}eoMcgzNt zTI&XLD~s>fB!ok>ZZ~&f@%@6teq=53LeD6^pUw&g)_RPH$Kv}ji9Kp9q6~r$fJ$sJ zL47T}NY4T~p8tm!ajSKrbB`3?AI7fWS{J$^X2Kl$)CI1E3Ufp8`}edcWeXqYWySYP zNxEuN6s#YTPtICL-GB4s9JGrP3$f!zF(>Ux7IzeJE!>m9c1>n_1oAHPpbEwL_m7n zdWPKM;`z{HXWe$@4{*fSxK${0-q(_qQ`=@_R-BhgV5~PZYSK$Pcgeg12 zba!dljfGrs#oNnd*) z8P!IrZ4V}6+vAgQ?Fq?Hdr~s7Jtdjk-ZdhM;pT2-Zoj#-agr`{jOw(HmeP{cS&~ceRp-&_HN00+6$B2 z+j}N^^uDk9-X-=vJbJt4%+ffz75km|DP-bUgRzZ)R@`9qwvx@4*@uTe394vZh=1c| z=n(9tn_rQZ5hb7|QtOb}2Lok+BdJO`#a$#+Nx{JeB7~Je0i_r6pi(6sn4%vAjMILg_y(A{Dv0pIGS|j1 zBj^7oxz+MbusJNSZMo(X{C1xT2R7dB%7B~`n!d*44!Z2MP zuvv|nWR>+dtI7>VK%^XTJUgE1XEQn8oGcgfY!$F-p~p<3{NnWTEVAwTYf~!l5;T{MUD!_y``yES z>(z|&4c2`r5=#&%@eEw9^@E14F=K6oYb;r5`8DQOnq6aQ*mIuae}7-xTmHX!7tik+ zc}wx$=1Ob7JKi;Zx8Jq*8dwbI8yyemJvuESdhSkErB!6J<1t4BCl_a*4ovg6a!mYK zrX=V*D_UjeA%K>)pa_drcgFmox)0n5r*r-|86nd6r&WGah>-LIh!d zGE~8c6xsiMXE>$Kcec#glOYHN8V)tTx42uBm<8nj%?A{>hR0Np;*cf=$tEE~f)EH7 zA7qCjvZ@@u&Y-S69p_)9@-|8chBR9KvG}9($J|H!C+RMwtNn-EVV%=j3BgpOS(^~O ziJwUy0^y~HyH~jgr8w(Ih6_5$-gN>owqmoD3{5BgLY<_wDXEj<_+Q!eVvvspo*_zRd7=#Gd_0Lg`Pb#NdoBPLb z@?sQJEYK;bKLhOu3)pvJe_outxpW!jx1(q~uo@Ik<2}_elHX8(yHR^tTq6Ts$vQV3 zL%=%spJ9Iq0X%#eR2cKZ>^v*--iy3Ncdq5=F_-|(v;176bQ5Qa>(*8gG4@#@tQMvm)n_eVJ=Y#W!>%#a;6Z?%E_;S;}SuSQ1}| z=OXzfpD9lt{2`79rjOlz~yB}wLcw7E#(U0 zg&He}LrXAJxJ5>!*L|3!_;NoXI7}mVq?~9qQQilg{Q^$se(gvVzMzz>Og$ns;ugCrv2Al5_JNhK_G z0T&jKMdo?Dk~~YwcPL8EnxNk-CyU8Nrs0B~2g3#XDzd)PE2R^g+m%ms2{=f!JEFf;siO(W6HRu zMZrg5??7}dZgJVt?5Sjl%9YfYWIkHh2PyE-o@tsV%%W-QXCsZk9;4ZYwRa=GF>?$! z?hUadJ2Pw@drC;%x>S7RE%zS3Tjf2q-E4>Trb1>Cs6}k+wYE)ZuH(i9Z2H_|vBjq- zzm`Z!J;jQrbQT}A&-u?5!>K9z<|J-M>uO-(36(H6zJ;}32F+V)_FxVjBk$imC}%k& zE#x6EZ}><00mJx5SL%*8=HR;(_XEZB{VhxXm|?j1dEy_zk_QRAqwen_a+dn2+`x?G z4^Jh*?j_Dqi8b%&uy54kW9xQI-Jh(4Jby-A{&zxKF`jC3Yjf;VZ!>$|P_vtAj+E=aRP8xDgWLoarcTZ~{09l;g(%U5xXfBbb}Mpj zCedEqf)8WTd^C5D<^G}Ev(n*1FxydZ!)o3LYj~lFpd2Y>k#)IJ`$MBd=`H+84gWNS zbIUC7YW?-ToMmc5qyUd)l~@V*-9q&1tM0p1zY>ugx`J0?Q}hO`Wv60?q(O_DHheUm z&OYCim#R(8Dp_>w?+wnqN=;Q9q^o0p7a)T8zEn?eL%vcM#k!|NJ&{1MepT`hQlQg+ zw-hh2^Ef)|{ z;pX~n_IPJZxh1TH&M&a-+3(P~6Z@TOi0v7AwJijF_OLy(J^ZHWjE-nwBRZ-MdvEwA zb6S)*2pIkIAOZC~-5#CM-&!Pbi*3OG8tyeH1%~UfK_X#MR%yLXHq&H{yVR|A+%~kM zJvGcB#btN2oysE|GkkYDl{hC#@Doe6@mpteY;JFmO{ybu3cqX(jcuK0CB*Ta^o%{D zUv)x-%Bn-B;&o8z`|9>Y?4Kw9SA`>W1Cd$niyJyD}tCrHuY5RW67fGS!NvUD>piO+R^59Dh+mNj-wTxJ0$6Qzb|h9P&~~ zgv$T*x&imaY+PFM+v&$4jT+pKK?lX4(!tO#<9`X~CDKzh(IVSS5oiS^#CwrDtIQ>( zSZ_TBnm(#L2mu&p<89oYQ1YerAHhzVsF?pkDlDht3(^NeSYX?>(h-6foz^Zl>{_OT zzfQHg$E&-D>Epl^;y>)KUCg_a+ji7W_Dp7H9bi}QW6#O#O+Wa1CF7cJ>|}3rG9{00 zhq}}=Sg~@1M|@Bcd_Ar*0}|KClBG!Z1PJguCu}?dC|)JeR9OySTcq@0W$^W2iFcpC zinhpUNznweTC{L?7!ylwJwVtvVuPw*F&mMrF(g|@MW|+An(;iRXHtSx_ov5l)uj`k8U4i&j+2FGK)%qqL zK`In!BxNk@MBvb}4CB;J)O`-qxF77qJWH#w+zttY`oc8jY55!n<1}~>xmA325>^i1 z-p?IO%oCN%t%W=JhX#+|R_K1K^*L7ocFW=t^+3^!e?bF8uXK`E(* z{f?_CaSccmJUS9gs?SR3j3YKVAt@v<0U|xpaNN7pI37EvwzXWW;Wyl^6qkjqD2);K zQ0{&cR^7plrlc>!L-CXb`+O_!KoTlWAz9$C$65J0t@v4SXQuw)#Hcdxnxp=B+MWrXjUUO;H&VZ z8E_@hn3lI@OyF#GK>4FQ5LY$C2_mAEK4g0iMO9Q*Cc#M%rbT^&HWz`#9)vz3Nr!}P zmubF=uhKr=Ok@YGr_k87juxKbJ%h^7vd9vU^)jsP=gxz2_|b{VSq-34ik#E20?gfR zoT74yNkyEUQprL;;5U@}S12I8s&)#LwXMq$PSe!3vv+ZFA6N|e<9KfnDMBsp57Zu0 zAWW6Ni0W7o&}I52nnw^Y$-y-m!Nfh7iR;+&w`!f_dr-p+Hw?vP#&Y@&E$#HCLw`AbSXwC{>n}} zys(Lrb#*GaH><2?xuIvXV#91crbQ>hI4}w-w2!5a?JKCP$5)NYw4V`rj!F})byc)+ zo|-t0cK0iIjC>qV#z_won$AOVsS=1K@Pxwp_ocPO+^(`tz*=Y9qC7Cw8b!(pLw7Te)ML8*ej{FLCi% zu6zzu0HxsL$mwp-#gn-c=>oP!z!3HZuq-E8mLHuXuJiOT=|$aSXAftW8YESuz^d!x zU5^JMQM3alp(Zpvu_lWdHk34}Iw{A)=sOv#I;?FIW(D*S{c;?OkJBxU(cD1K5%`Jf z3u6B&s{#XeiB%3s51kRM@EPg^ESr*L=XSVR1UyT3(%(uU$`W==#0(T8REfTTI?Vb$ zDc6wLks;Yh62~ABdMLn&*jR|42}T1J=HbeK0+~j?epr(MX@K9OqQx;a;bCtyT8$@E z`&h)35YkieV+n`Rs!n{UFrb*-QtJyn8DHRB)+exDY{UWaIm-^M;eNc%TG_|7;! z`v486|IPvS{cua{X9l~0IL|wv=LlTX1}E!_7-8gI&{1TWdxDe;f|P1f+Sm|AC1$oV zEzJnJV`M{F-g31g`}=SLBFez$-C(H5#wA9be0VNx z*hBoGWj<53gsmK{P(T)oS`vs?!eD==xjRzZ-tTQMdi={Z^h|$*@<=*#L|iG;9$wV4 zClhF~O~T{6rO1KuA3>aJlkyFM`yi1h?i?*|o7uOT=`l^er|nT@kc1OBJcxB7a^4eT zcX*(KWT*N6<)HAiu6^q~B}!+XNoWT7PZ&q4gAy&_=N96Zm3e`^bP)g$*KB zuws%Hpa&NK-cig$FETDFrpy6ZZmPHkDhYO{cB@PQKHT2jX?rYor*eNvaoKcKGA11@ zBy2=CWSIBJnGy+KLmia>b|3ar3*fh5+wpRvSb!blBsT;1uFt3r#(s84a%epa2SdZ@ z{!s+oeY(aCo{jiSW@*Y%b-7_YCmAtM$=$&4xrtq#+loB?y?3|8%E(x@fmvo9po^Dd z@T3lLZpT7Y{oy5a8p`cLCC*Z$yFVvpaY;KHhQhTSc4c0eW-h2g!(%(L#BKhVk{w-g zkIQWfhM!QflgY@3_%MdHHmf~Go&=PM!EyfG3;~OSV@T5{t21Ne;ye(2mc62XKS;PL z4p2z6VyZV%u$dMqxD*A;k@ME3Wk_y?_%dRysdNeVDN~p|&4SFZPWLkv4>M4?kW zgIamibmg-;P#ZOmAs~QJLPA0JW+jKR#C4!+d2|nv+(wt$ekJ0yKlOt&4C0nU+!mKY zIElzpkQC{Vc(X8qHA2OjXNfL%XqRK@A9?=8Rz4(NVB0!2Tj1Hq`N7E%#tqMRcyn?{ zeke}Sa9oO>P%FqvYx`9)9V2Jh*&pCNukUY*4sdVmZ$}+qM;_phJ;07Rz#ZxR^XN!i z^OwY4ln8vUntKmRwA-J3P64He|~N;IA`~ z9Wql~Ho{k^UtdmtxUaiqUnshX&K5)iIt#Zci`%eBwmq3sMVU}$#oCU7RxjPxE#DW; z@bbPwEDoG|WnbUVBt3&O{}O8cIRrLdaX#7nfi5jmm%m%8{h(wlZ1Yurf7u_f9zFkC zl$X^jQU5)|M?{$L@+*?kp}7beq74Nm_>Nkoj72d<-AP(+2k5XNCKTqZjkZDV97l3Q zwy65yH#%%l_3L4Oy1mgMx=|`5jA7ZXe{y=5C*yj`7_{c}!0cmLA%qR_byM1*R)CRg z^h?|1cnYiLY*eE_y~9r@UtK&UXDgp?#3>EmKDv0xr0C{K=_wpt9qtFD_vyfXm_v4P zk3lKWLzL``2zf-Bo}!W&d)eYf^3xP2Yy*$JY-j^gW{*UkWYu_=U0b$Q<@CmKc5|7f zwp~o9A&?{o2&fY?j9y-YSC!grbuSPzV&h3Cm-(kXd@KPz{aaZ2Ne?>zY;v*oPZ*+{~5AZ-taT*g4E9hU2?lW zb(DfaAOlMHfDcc}-Ewxap6%Q>)BMEZ=!6slEHz%Ugv`#%Egl6%-4nWTzq)Z(fYvGs z4iB%}38f2=e~s=cm3JC_qh&ZQI?JP7y;94Y*-))qg?+J7g)+$r3Z}k5N>xuhB(6*R z9K!0}fEZ$M7G(_lyq~EV2Gu8}G0ex5@@yX&rS3i`Yq1m-$1301-=G zd!DtZrl&ewOQ>`28E(TgTvo!3Z7`q&rv`VvRIlNplh7UezgPXAI^Z1eX5;p~kW+rC zMlWJ{9~QCX73D958^34^$a@%p`6)CwigrTyuEwmiiPF$b?9oI!d`e^hk<>w6fFHQ zVPLBIjo1hPKxgT(OQvEgBQ*n{zuu@V!VxMo1L@>}Jg)A~BmV=-;Kua1NBT#p;IKHYbB$*LR2W4)|H#4)`Gb!VwN zV2QJ(ZnGs$Qy>qarI-&(D|D>vov?@CyJavtOPAT^;Y{(XKdAD_G>m}%WN~j6-QSrJ zQjvQMY}b|TC*W>=x2AgP#u4RwOoyG^;hxM5kz){9vD=>Pa1V6Y9UT~nW7aLSZEc=H ztmuez=$sM+&3FqeBwNN*`Sa5iBJB54`R*0cZk3qTc4u|i*&Y62289R}%qyr&$lEMM z)U-#m`tvWFepQo*zI*d{Wgf6q3elOgN@-Z+BNGl(SGXEDTM{~F6iquMrY41=Q5a&W zbTXd-=CbmBpd_1v9C^?pE7&Sw0N5)P4JVWR8vAIF%@Y+HS!J`&4@(Ng0fbsb5Z$u_ zfR;GF%%(<*+a2-@Go;vEM6hE&4s|BYT5%601DqX*ab_kax;_*|EF7KoJOTW%>vR8T z*#)vY+%=lv{`qKoV6^}FXm?&GnaXe8_aWeTT&J<Bjr}g{yChs41 z0Z>;h+iAO%di4A_fS4L(n$>srHGvg<%}mmGoEw#YY9 z7`0>piMb=rPq#$2kiw2o9B;J*lR8q1pyfhR3b!n?q(H>;siX+8mF8Z+ahbXE4SR7w z(s+f%;X06)dj~;E13AkF`R)7)+b(*lJA^`<&}pv?@PxmV?D>-W<5*kN%}6{}vPVnq zl};?A0P>E}?t#$)=JTC6+x&%{kc6{3%dZkZ<^8$j1XkToDs=wtO8n!B-KE;S?oI`z zV7HKo%ugeBb{9LLZ6^}BEpxhX@+dj!V!yk;vCE%P@{22Opchij1a_nfCioIWPrTj8 zWl?khh@?seImO%|$gC;Al%>`KLrrKVA!^-$!HW?}*aqtou2xbgdyo_ofL`fZ!DmJ# z162WJu4%=D_Moh0{gu9QKY~SjJB^t;9w`=Q?k;Zx!h>N0s1{_P8+fLesm1_ZeRc&E zvNrtf;OPFIG8wp6C`$O*4tt2y9^RkEcM&imi(2}-x_dowPqoL~)U@TXd%8^w%kSIv zr#9>4{xqC=xeb6&&*LG0G2XM#E9My#u{7-mo^*Sx2sw&8?4ECLV(24)HWt(?pABq*CE6_b3 zkg%ijuhFX~AXysy05_(;jU4e_d$^YwiOc``(G>mQ!GG+sV@C_aj`we(&Y5-hcWM5w zb;K;>`f7(!DDLGBPzNJ0f5%kaGZavYc7_ujU7ke{dUNz3(z7c-#|fta>@FlHt7z z$Hl%DJwZ+zkD!`i)mZ)DOy&Vra@@}(F%h?PQm1_jieg80k^mN#%dK>Ul`dD5J;Jh3>fhea8M%vllgpLM z#y-D-Wo6MeoDJF=adxLSa_o-4cR^!Zd}QJti|x_ao`~)7*q$Q8NhS!zk3SQW9b}|d zkyiDm*!~#Xb6D%laMW~@W+9G?0f(ru*zIcXrg-sG=pW$r??rRBaf;joi^`7j-cKj? zyF?DQIKIgFODM9N+M`63A+Wt+?g-}&chq!(Zr~A}T=S%%i~#Wm0l7a!j6>T^PH z!MGudQ7CT!`C=^Mkuxz$On@!t3pAM?AYTbEFUBj69?XEp9~`w)+=D)SmeS>!-H@?z zt)r~eE8+b8soj@Kjmo7zomz@dWZ`T)T#lSF7RbZTHP!9yH*(W#`%)KzVG7BcZqt$e zsq{lP2JFb#T^z%}wnBp+fO($p>~LpCIJ?+EXY3j8Pm*P#z{o>{k>lb$<)UL=dHC3y za0L9&0l`QRftuEUnlLpZa1YQ@OG)vqP|xZ8(4f&3iC`#;TJQ&khRJx_U@~5U$+!v# zy8}qFx9*b>5c+`BTmv8{U2cslY+L}|l=1O68y|;&$jhL@D@x`2WBZ8+pz!Ic++Cd~ zgJk}>b>!-U($3wRyPxIpJ30DhDLJuZ*v{C;?)%KogdkR$j?lZe{7Wk8{0r|-E|x+Z z2xdAMc{c^de&I_G`uH)PZI37ZsRU{L`>1E!dqas8z{8Qk{7x&=^q^fqsqj)tJSY=l z(i_iolbHf&ZyAy$-VpN9^%Gni;)4d9V7$x_3I#PpsRAdF&g$eyNR7j&JBeUg5jOtN z)LrK|G8U$wf})1%{5bhk*XPK~&$teyV*-GY9Dzl27O#jgdBx5|Fs%deqrRsPi7AdW8=J^x0ST zE)-dsUWeOSGC_@d2aOrWHjS;q)?#CgI2u=Fi2(boeU9lt39>^|9e$RXXYO-07EA2s zQUarsvGJGO7rO?bg6katTEsWo$(7^;Rn=MOcBcF+0r1V^D`au8 zDsJ+}U>SL-Y_F=o(xc^!O4|>GeGW;t>Rg4^h_ zwe%z{#3n+H*-TyzEI*x-Mb!q}D5Y2|vI&Rf1!An9dF$E9dg4`_aRAl*SN{2O^rsM0 zm)YaqFklt?mmyr4VK{oYqLmz83BRtZ@ajh^3SuP7d{ORxpS$Oz|twnLzup+z{3u*;DoexyB^|3uv{hY;P;Y}X?$3p=f4@DYS zKdT0#7i;dAvOhDiZzo!bT|#tNi`^Yz^y(lx49IpM+_^?nCpn^^>k!&L$ z;bvDXMDZtQKX4_qKzx^NFks-uGUR*hCZiFpv4IU5u^>8@Dn(v<~DUhMY@xD zNk=tq*E&-_kI>=v41Q<~*up>e33WJveD<9oTrls9m^;o7JFS6ABRJFBL z602>MNYCrl_#aiQ7%x>RB7v{1N?niVFu*IZ~Z7cw@FuVsz(Y#T4AMz3{Br^LZ|Q#HO-cCt7waPW*Ldk=?D9K57h0)xEZOOV8!q6ujo|3RJQg4ntl zzf$kM|0P1d~ zzuJurj${)y#R260zaX~qJHA)_4)rwf&F>qBdK~TWq$HYYEd7a zqN|^cI~-uM)|%F(NA@TohT<9@7G7ofS1P#*QkB*}1cNw|6)m3R7GO%(%q^Z?iJsAu zFVK@$rJgkBA9@yJb$B5def!6U*!}qcd)~PpVFpPJiSes;cj_n8ex^wP42R;*<3?H# z$RPrr%+=y#MR1vdW~7aNJQy>_hkddZQazzmG^J;_zbwVTu)T~k$J}PMnen9bejUg9 z8IG|Tl(9Hm5M3w-_`_=Z-$-fB#w6tIxXp}GA78b*vUIYo&g|CA-I6)>2PbcU1xfyK z#G5-TJv? z*>>8nz}v%T#sqvP9J~j*zkXO95!HeeU_{eqFOjzd(E%=~@zmvuaTz$Rv`4LXC!Y&3 z)ov7|IcEK}bo~g1?prO7p2;;{xyFko*_9c6y#kgLFhLCr;;0s!EVLQLM)O)3+4kQN z+$ux;MsO>s`V-B*wsUlZRvW%i4}CysPe022|JXelYV5AbyKTp0d_wccJ`=S>d>=t9~|i6I!Z z-dy=kQK~)^LyWfAe%w2G#3E}F;x=I*dQdDJ&4>xE_EH#^5BwBxG++>1 zIQM3YZ!%*a)UjGEdb!MkuU}4&GIylK5R+f!cBENxKq)Ac0J;V>0AZMxgf1$$fD>i^ zdZ9tRR7j!|;&qlM}nQ%QaB{^L@kM23(RMT{h9U_{xbBgP6E z6r(z_RI=1Pq%zP;T|Mm6C9bj*XiR7qlcz3k5Hd1iV60=tAZ`rLz>}2^RBMpnPwLw@ zZEA5^CTglc>kSwPh@~n{*NP7sMp2C)RLYx}f}*K3=FY7!v#zhW(QX1#Nm+WETNJxD zyd8~mHFi&yY?XJc?YzooS3}k8)9zD9l!M9TWp@T^UZ&~oye(x^{C$+mv-{B;>GMS_ zofFrdBbVG=UI97(#%Yn~Dt`o5y~0~K~EIl!EzfW1LIz1^%Pm|7e zN`(h5?qJ9-Qur3&T%t2eJL2V;zby6Bf`f$91|ecb_0Wet?EPQDXQkAf%7|9`DuYA- z3Gzanfku##NF4BmOjt$Skww-JDQ#w5R3&L+J&2Q@sZ4Sk<#AG`gDLCcx^d}*bSRs| z*~zuwM5Se!R$!;7h|Ql76ac2p2cy?I(v6WOiSu{WRQ?c(lM&acYHKaJ(Iy~8OLr0} zL?d`Q`{1Uvcb419&dj7e!6ZJ?m=eKSU`lcKD8x|flq&cnH<4tDK37rou%)&z*yB+M zu*#2Hf~G&AvCe!T-nP~@K8+|AXQ!#QWD<_GeDfCmvc;#2@y?|vQ)%Il9pynEm4cHZy#U)`y)(dcq$fbHghh3(at@E{B zDrh#8OmKsEkCE21@3FM1oIm}fUg79g7B(aOx-YILFCg$ zyiUJN#N-g-V+I9N?JA8QD~_{Q!E`DN!=3x$P2E`i2&+Rp{F+Tx;3Gth$+_|HOu`5i za(BB?;u@sQ#DH-=VBCK;<+&zgb*3pZj)EjggL=!iR&+mXz;3E5exHg$l-Nk!O;%$~ zn#ZcP`d^%WLa_xTLm`4~0rvBOeiT|mL4TSBUcC7&U=ro}Yib2j0IlHtjb`+8BTenx zid$Oo->%!)PxY7kP3*rJ|k@Jg7iK z$r^mC^Eq1m4d_I5I|463Eu9GvD2HRB7pap`ix%OY#XN8X zGv;i(G^+(`7SN?u8xah3=6WX1_bWa$c(dBOOPuHl`U0bT}qLFn0;5s!R zH^kPAo-Lf#tnl;Jo}!t#LZvCV+2xJT_e57=8F#|hk-Q>TGP+Sseqv|o?(nNetaWd zk+a>=X=M6xiF4?p8;;76oMYCdF{{1a++YFdkv3jZCAz>~*5I%d?m12SOHBiR9+|`P z(w`qn)Yk2Yx}DOrGn$@wN^EgbUnd2W6w~6XqI&0y6m%-OqzOnP)sj?eq<7NI)G3wTPu13C?&Jr0-(*~XUzT1>}j(nEhF}PJ%pZT6yd9)*PH{o zL}U%4o;bg0fgT}V)*%(es$v-XPvoUCg06pYA1`i4FYCpFZ+Y=pUTnPhH7gdK0_(G{ zy!rMMYuHC|L4^0uz}QJM0@@G1yRcNrw2?t^cz<0>fI$#cuoN_&8(q=nosv?e!a4t0 z_j!^tzC`RdO~+257>KcPSK$%rb1b`pilokC9pXVOUoPvmYrE~bZlK*2tOKc^YFoI?3FD4zZWPZ&rx*QYT8hedi~1_XQo=r_JXNq( z2tdd<%>d5L)ImHOtq}4XI;APZ5&luII%LVJH~do(&DixSx*v&eMhGYAr%>$%K_nG& zAw@!#+RVVG%VF=AfHpVVyIB!Niz@IK)G{yQ2Q2mQh38pg6 zV@d6#-bN8BYhK=rL$g5fs;{Tdi|nR$Jq z08l!t5)Cvdx0_>FA@MYyAKi_ZgF1%I-TtRWlpJm$C$q=l&K=?6!`&p9FD{BwsEjOx z^7e7Td#iX1)0$Og)VxnBixYwi=(#_Uz_Q4;(QEU=;%K13+o+R4kU-qVhe9STh98x3 zVJk&H^9Z2~yPt=d{nM@iu%YHY{+5R;#V>*Yu*Va;o#_1uK0X=$oA=8^(wtxJ{cA26 zLP1m2_NJRcDiU@dQE+0tVW?UpNoWq`A)Pv7lZSe#eNs-zfi7auPC(Pnr{~lB@Ucuz z8QP2+==Ql$>$7_~`b6H;QkQYC=A2@@inM0IWE zk42tGiwv7`O$X+()(=x9&+-P6I3h?ECi+ZfkovsFrmr^gD?S^|F$9{WD8#4-Gwp^(nDlM#lO^P+agc1oa27bX z3d|!$h@ijCk)&J1K=P9~i2#c8L01{8d-G|f-j0?EZ4Lis)iz*@+sZqc2qgBO&+M(U zC73Y=>cjmV+Qd)ojm}dlq03%~-`3NYse>B3r(&Fv3`bJN30ehH=rt*a{!EM`Ab#1; z4)p{!rO=|P6EYgIqNni?OUW}&L_s%f?r4CGPbpgyU*}dMrp9B#{u5!pd)U{)eknia zpeuuc-Hn0LqH{3v87ZGc_~j+6afuRGhC{#v42DF}8NtF%{lah`Va58vm9e^5b&RSS z(jx96_7~)3tMWuyp^zjnVA6?>va9f>9+ig9$1rg--p5n<){A+*Pv4l*b$-b;t*afi zD$j}e9G^AvGUw*-yeUW~zcal-mP554wNa`g(g(zS_{|VB+6SC4d}h_SHry}z_V%94 zivE=G2+FO{Rv=>3*j=1DY_7{=*3iqw!V7D5N?1?tb?=T9wRj@bpS&ow$0Xa41^Y)= zJJb7#%*{#eoE|%irF1~y53uH85zO_%fW0{2*)#A6$02~@oiO!#6yk6}kFBH#X16`9 zZ@)wAaF5~pa1i#_6TRY^5ZH0ByT}nu;OwE;*2T6qc2CI9pqS#4ZQ+-8`unIqqPVJa z$ldp@@2t-Br-^$2|9NIFj$urf_keS=;+p-c+kV;Y!yd-;b-S9*k|vWE{W;j(XdXrR zUb9QRKT2%$w_Wxdp?=Vwpg)gm?D-Ec`Ou=n=K;c8;bmg7c?>;U9=l)X@Q0r|dj?eJ zH1@jeg;M;Y{J&*)UtD_t6F-^Vu{*ECkQ3&P4?<+>N6y{OY8_D9OViq&so@*`VVTTB z3K^ykm*Yn;W~Z-|V|>3=Vk|o@*UBNW8&B_8>gsyJ<5?-X<8fTaa$G|7Pt6)D@%X9i>7i#u-(gneG&OGU#nSPNnxlga=(@fPUKT!k%klWX26)^?uvU z4tDsxNt%5Pi=MkziC$UQ1C~3C_-)WdQkWtlZZ&(r8X^&IZ-pKaRSW8)B3Flu%BBFc;AKzJ&B1=%Yk1+KoFxG;(7`WSg`%c~AUt zCTj)HXgS|4>&RPd)D_(%t(7Lh7ssZw32HY+g|c(p=Wiq=tVg6Q>2c^H#J8cbBNsq6 zl{->`Vk8nUgNzz~=CAW|5Th6lu@z~OV_Oav>_VI+!Z~L@;iqy(arJtZI zL`hNNOKr54&8SU@&g%uQvFdAj_#tRK;s?YGswn<4I`Ebx8mJA+5T)VIYIJcWQ?_`A z{a!gkN673*4vErwUM!P#Aq%_~W#J<*3#1rugk^J)r`-4L4c#%qEfOQ zf@|jHxi9d{VHx%&)T+ra9Ml{k0&ZiAm)tt_V>8|{8@{|XpHo>^EnZx*Q%e4{ z5@y)g4cP>Gq$z%5$=zIXHo# zrA#CgjI3-ImHj2e*OdJ2C3J)?L}M%vF+nXZw=2t@;P=Qjjp9w2`)VKa=`+qU^9`JTmW#0dO*4pLtbM8I2Cb#FNH%ba1kN_cu2*@yi4*mrO zbsQb*%)H~w`2Hn?D$={Ogb+gLMY>2r6$6AKA|OIQU>HC|nurMR_qX=BA>%vq|NL`v z_Bm(oefD1aSKz>ULnN$GEWXlIR75W$ulFEN_aY5lqS; z=WV>YffSh{TnJjuWHZaXK-zffx&3A-D%Vu66`}Y61nRFt)GD zH&a7|7{&pSA?e3tyAq)$OD1YH0zU(E2kB7;T(^@ooXrHz&GNtXTmg%na9{#3OEFAmW8> zgfIucQ=SF~cIM?NydP0_)p%jbbrOcVN}54R?2aBp`6z|xsx5YD)^-c?wZl3PW8dQ5 zZm(<~sYW|i^0#{ahIw5(A;gOsdxyBPy{gfj1XlUq$Bz2;lCp^3A>-U%rz#eFW368v zL*FQ{LD2}vNWlmr?DUT!_}g8rBTW*iq!~65I}sBZpe9D)lKAhC)du5>b-9lt%7~{G z*lSE05y~wc;d{b{PEaexwuo;-MH3LS6tK-Xipayh4PUP?&%TH)S((ysG~ZUkxJM!} zG3==AO@(}bF;!wI-lk#&Sg+q#SoB&n^rNHOg*@Jp{$<^u4le+`cZ*$|H38831xd7T z+5%J~dLm5^mzVP6$9NySW~2ZqE;IHC+Qi|dB}M1Hr6to5xtg%XAny0 zStPA9wQ&}g!$A5O2siKI=93oqXy4W>CcF7Xmd~BvZD>(3I$kT|9=zWEnUp+**P7HK zyQPB?D9qH;slU5}+kejeoyY-s7DbX2pX1HqbXmrey{I95nEEH0?w5)Ir{Lyy{p-wN z>EWioMSD)byYBBC=Wl3+00OODZ`)|*)%iQ4kQjiF!GvD142rR_MlqN0iNJi=l=MRH z%UWwIZ35LH$$@`j$wH}pE4mCd z9Rog{RCF66x`>ZvLb+p@Cj=<29mH!@R{>#U0q9NoF`wr{|AK=UjE|=>olSU%uEMbt zOxT_Xoc5^JlxKifdvsk{5+P>%)bDBAxAGyTf$#SeTV)^aEvAH`--i+n3ULQk3ICZe zSP$>WdypkP`Fi^@D}6l^SUZFS%x3g_nTf=yl>Z_8DO3jS3L2_+5-DXQ;$rwquPA$3 zrudJO?+r=evO7HtEb@ArhGKqjJQ5kFv_0;$?$&RA$#@aOrmYNd;fcGsu)6Q%Y;|3XNo7^lKFEcSP)tjF~uY zusWl*#z&d0E!eYi8sA&6KgBM{Un^q2nnAF-p#sz}IYzD)CJ)qEfj}l?Nr_ymCwFh*1;F3c&ooUlr^*#v+7B+({{-}&tNldZqhpbBSM&XN? z&3I##L$0`gs8&bHYaUEq>x*u$r+;k+2znvHItbw6MYK_YV35?Kpvm$=D8`P_!*$H6 zD^gp@l{7B|ji9yzZ9Utisa-}W6)-`NMiiUMkR_3ECDm|}Q9f|Tfd$2d7S;BNmQh&P zC>e^L6~_;ywoytC;x46ECb$D^cCr=a)9Dt?(E{x#)P-sn(b~LhkjiE#HxOfUNt@2Y z0815;xB|=-e^R?NFc$RFS@K?4`qydJUa`m#3E0SF56ZEpfcNnzZE*$)(Na z*>P=C-SOcw$;J-qH%JQQU=`-X3E+MWBB+d5?2f9uNWSC^O^%Igw#H>!^zTPG`w(_$Tz7lT(*a^!LT?JR?7pZ+`)H!#QmrZxB z?NndLqwL}qGDo|82aBtu)|J$-4>C%+!s;u<-zSJo!bYd^DuZf-y(WEx16R=4kk||E zt<=5AiVJ`LS+!TH_GHtZlC1Tsrn{B;SPgrsjv7cIuYfc!R_qmWETN~Oz5tQ+UvejO zxHUrr)!?P?v2z=k2UR{#HWK}02pI3z<iN`BolyEdpC4geb-_FLI{a?$37K4TThD7 zEAHMmdb2Aa0gvx~+;BHH?50M1TO-6gq`6tlIzt}$Xg^E}yTSyYnnh(zh@`F{#OgOT6 zeM78RI1Dc~b?I>hLiJp;Aaf8=x$|Kdt+nW)mCE?b*POOvpY?u2kKNp3S9Zw4ep?T> zB)^ph*4#TGtBn_%n@Ip_ZNKR0agaCYF;oyF;}ur2hhJ)CIt(L;8s1L^sd%FSfZrxu zqeIu|;~FPY+n*3J|On(v{zz6#odw0^_%*t`(AxE3yJNU=%vZ*dzNdX2l96>Lm9(7G*lz_e6j!kJ z{tFn={}Bw`(dz!qV4xE9%^h}=m;vvx-PP&t?sWK>I^F3c;Cu{*&`@Tcn~dssjI|s^ z7j#hjC5J&bF)U~F7)*QQBJa0Htcqy^$kf>Zl2Apx_AyQ3>QyBM=iL&qMOlD+k?GJq`$^HQ+D$2@oTyGpr9om zz;#%`2tL0U0uql6V_Xv3bas=z-#8o(LLSc5=X1!wiWkP8DVH`IQ8B1MFSkXiRgTXR zBwP-q@$)PNWtMW3SDhEW6R-tS6FpI60Byq-nPf2u5jq3)s?>(4oZyonO1DzymB@!k zkb4=L>YLK+>4ZYqA=DR@J=j*IWftk*T+3A{pLMn%*N7e-L7Vyh2+&zI!qYhlRY0^s zp{s{^lB-70!WmC!LJIcu5q5)J)x^a8YsakVoA zJ#jxoxE&3Qza*`up*qK0E0BDJ)ek$40O#%R9Ty(KC5wJp7@ymBh=mzWNo^b7IHX44%}F)+hc?d(5?h61mQZ^pTa5GWgpz8crQPQ3PG=M2Unceh z-JqRX6QApn3j|0~FS32H>it&EmDkuH*1yFAGdf%i^odXYgd;E8lt9y%WfcI%V@#oI zY{YN{KM@ls=O$kvXvLrBJog~6=5bfpfhYubcjA8G+ykI9Bj;act<&nt9>@M&*Lbt zOM=bjSFvZoV_~M6?rYw^N@WyQ6n~15{2jLe7vha^dZU7*0T*lXKHwHbTVvbdp-_Gb zrH-Vx(1UbAz+|af=0y3o@8u*x97fGQY&2MiQT0`YnhDQnC)ZSQ6NZ-&U^Wg%2}uhs zZWgc}Q;)S&sO*{ZtLElj5An&D`zqS~!F47dyT}OmK zJOP1SV@j!XNM()qcOeCBxr%irj}it5Uy?fYVA(ce6D{;+>v>e*^%Li)1>AL#A`!ApyCU&SzWH>~XsS2vS?*8lX#iUa0 zYFmel2E(=`&Gd4ei6t2X@cmSsvhS+Kkf=J8Qf z{LgO6?H}P;cpTUjMxiegHsRy_lW~-t_)2LFfA}%K??~M>Mdhbd!x&H|ibr zP#L5Mq7$@@SqNpB5O$}sp%{g~L4RBu2lpSGGvbHch#SV`Gr>=C6ESyARL1@?>z1rA z{V)g&L6?Z&YQ!LGpB1)?j+94^g2@jT9KklTcxT?6JF4hL?4^QxvA`DZLa%SHW133{ zq*fvXW90)?Fx}RHMTuG}iBwV<4{PP^0w3KuaL|shjl*_!@M$8l?9Cck5$ zo-5n?@I*UIx!g^Wt1Z>4WXsP10!%7HQ)eFLY zRK*>QsLc}lo1_OL%`p{sY=!q*3jUfx+>d~+pA+lNl2_u~Ol+5(w1Ehcd(rQ~?0rHi z8_wonWQ8Qlq$0bTd~_H)Mw!qdC{hy#g#1-2-FKmc1W?OQ@O=BUTtBt zAO+VUtH|SkL`3^0`3gTHu)o~?spZz0KeUT%I~*E zUE%I1rXzkO5&9`7bMV$8TV#SA2KV9{I zsMr^hr>pS{EIZ$?`Rn7--HKiKVbLy*<2$QlOG`$*t7vx@J-1k1#sBL=3aope=0hn161a)^({h-(Pu(VWNTE#k-jRu9b1PM*aMHf`i7sI>W~%s)x)=E=CztKxFJV4|tJF|i*f{Ny_w(w)q}um!B-bWON7Nr0z+#;ZGmYpOter$EINKW0j%TIm249-g z*3eGM>$45bh)E&-h1IkPzVm!h~{3%9u_Ul%r{-FcS($ zc+v`C+ZDaW#4~x+?hEY&T2L(j)rYwnqXK(adBco{H)IV_G~p)Eifpso<#0YU6iPbo zBO(f?RTZ{G6E}!R7t7r@Bp4p!t{z3c@j_%*)879E1waYTjTHylg#`Q;-$?Lo zpAjtsDwrFP!AaA2&nsB{3TKyMg(R`aU+&$F-mdi_n3vFSsTIt7fkU6Lhh6-Tvn4Di z(V~QmTbL)@7}u`S-^b?r=1>=D?AxuaD!&w3-HZ_=a=_aII`I*--vVo{H+K$%&c$>f z*y!C^*uu@YNJs^bZwWiWxF2h$-DCcq7M5+abRx#G`9do=#az0Kq)7v7L_gZ*Ae_gQ zIte8WTIaC)-!>tLwP8jAjX+F;0AL9t>=243ncjJNZ3c{j@{5J4j1UUx|A1Fj2aQ7- z>2ec-Bmsx#TMxXRU)eORESoCrUDo?*G;Icd#yD0H%6Obw;OQ_Ns2o2=)}C zJPMCcEOvOkJlgQW8HieHnn^YWLT7AybC&%P3J@>U`LwQi-zR_caTTIJK0kUCiQp*l z2a<$=kU{8!^DlV+qZlq4uOKF}C0=|-JYYMjyE5m>AeFJVi1hcBU^Eh`MhPZ7T~dXL znJ7+J&SIRb1PrP;0_ElC3m{7v?Q!MTgC;15kal1mB}!V&GB-D@@O{EI3ER$(ELjGH z2Z&ZF@^TpSSPjVgA%e7|wEgEm>q-lpRwju`R{64fAwMD-%wVyurKNF28b}8K`${!> zLjW$M6^bFu5;34Qgre`aVqTB)xwMgBtvTM=(O$NM#GUNyBqdcMPusPr@wJZJGMzPl zy?5vq!w4wpL*8UGW>oYU<43QXo9{jdKX?TQ*sH{(seKN;N=a%+?1;qON53Bf0qEKO zs`>r=_flL)=)d1izw7?mW3IZ&`%@BsYT|FgKnLmNI$+7_AoZd1^QWBuEEpA?nh($} z-2WS9>vk#};pT)4N$x`n0NhfSlvXCAqo}CFg?feAfC{RdI)P;9qvMz(-0n2sg%DFu zmzocLH0+zuHVU3h95)I@>xIs$sw2_?t8kbVSm4#*l`SYnBl|=}^T0xqS5wJuPGE6=O7X@nT}`y#ZU+ zNE^u;M_2rx%C`LDvyZ5d6QC8v@Z%Bb^V|{mumI>c2*y!vMgCX&Ruq3r*$}Gl3rhu* z<64552;?CZ{2rcHoxXr0Tals6^)S>^Ited=EV+D6{X{M$UaSG~hC~$X7wyr=NPt3T zbOlrbNGZOLOeQ`(3i)#czC32o$={o!F!yTEn@g&q#%48Gm^+XrN3j;ZrkocI;&G!;*4d zR@H?i&`VL`hn7~EyO1kA127S-)_Hd)exeXGF0l%?DfZfMr-ha9n>0GK5`I&Q-rzTQ z$sY0UvG5z7LjfbaiP-14<+=BGj}@}sHp4b|q*PWA({X5dFTb~6D38*f#>c|PUq|<{ zz1zcml5pJI-s8j9;wrNXZTwztZ{rllOYcaqx=15`+d5hf`LtEo)#Pf>V_^?|O0|If zSukeIqp7X+{!b1+>yr+9@G?Sip-G}(VVY+=fyG49QJ)a{xvS#=((78&8 zZwBLy?cczh?`Mg9@V+ zYSs2{Szaf^$sFPjOQJ(H`LY|bl5BP|9~j6ZIA%~ zfQp*J*0~TIrsX3HOwO|Vn12A!g;PgqrmTgBATsC4+!y=*@~1~bpf79 zIZVoWb9?raf1q-n2}XqxA~;^gl%!un1Z23S_I*M!Y$uVK#Pid_3%`e3lTwUpJXYeo z^dnOVewuwjw&4yp1A!MmjKV;4sY6@7E>L!2&|(O)g8TJHhc-w`&~3O-n98j+iz>Ci zEXI5H=EDp#==N-j-b=I7VjGE3KM?g}cY0hTr6KvT2KN|@jfwlI26r!|1!8gj3Q8Pq zPf;x90=Yn_Ca0cdWOOrxP*P|H=@ExQBkC8LUnQc@jP6t-7C{Yo4|@GL_Z+GUp)Pb? zO60P5EJ>;;{AxNnlZOsBlK4wZQO*%Xv$B=R-+)CclXwMOvC@KnODe zxOZQQqFDi|Q+QSt@;bCHdWHgFI1gEufhc1>C!q&s*Z>C|uiYuFacJ6YbKTzc7D0@U zH(YZvsIlFvT?7)%lE>I9e#(+?q!hmGU5nnVr+cZ-*6S5++#uGfC}R{wW1&W`mh5=Y z)}5dE8#B9sxOZEgV9#xTx?)#X4fhh2*eM=NbL5hrY)7XF5%Jfu3vP@>IP>RL={tlZ z`Ds9n(nG~7dNAdYRkC|}zYkI#_eFdP&K*rK7DJ?6=G(PbK>=B%SbprQB&ZgprtGCT zYuPcd6BoAa^2N8n;Pz_ly-W01BfT1XNyR-}b$_fijwC&ZL6vP*iJ3vXpy@A}g@_8U ztLgZHGWfY7wE3!#sX<1Ehkk5)E^Q>cd<^y^THe;DRSc5=W!9(t>*!oaAWMVbfN5d1O~WQha5k9A;^m0A{B$n9$!4h6)uB65N{H13Ip)#PMld4J z1Q19RoudGTo`v9x_)2VZghw)A61f@#CXVnV$OvgVEnISYnXwL?u-?*jv|D|qoz;MP zul^!I7Xi-r`O;+&Bds&kVq{xjFdUb0Kl5P%&lu>n`#RHfQj5-P z;^%ybC}RJz?C0>behgPBmUaKLG$FcMpKej&CwB?;#NFw3kghEZB?STVEc8r}O2GMI>Pf#*>$QF2=7bO8j` z+m7oHV-5|}$nQBbA8{$VuL+0`Z!+R@h)wg7Ks7?GG|I;j*X%E7`tgv83iv|6vWts+ z;Z6)^W>}u3=n38VKWSDH?#!Z`M5Mu?S$>N^1^u3d=w<2*+l9K*t>I1*#o z%}w742cn8F*#*S@wwRIc4RVzQO|bKzo*#gu#{jR z*}N6Ozl^E?p&kLo8qA|?sjy&V#a|mbWE1)wsHQAe3HinWqrA=5R7?fU*u%Ib?~829 z{-qcsh$~io?bi#{t0(H25`8GiGdvd55upLGv4*3&6?8YGL92L)1}+OnhUD3^C^|h( zWeEWDlHZe=Z_@SuZ1$m1YE9Lpy3k}tX;3wZm53mO#)-)lX=WzwMzSYS4|wa6A|WYV z3VWaJLw?8;u0CdOnYWoxKi5(zDVNnr@16*tfaKcg|#xO;x@fGSaJdu!$c9)EY5{q)su!;*Po1)8R!fR&{ z3%3;tZ8@DSN1Bq0ekb=TpEw<)Y(pr7QPWx47pL;BbUTqu8PC2cO$vkw1adMw$rA~8 zB*cvc#iA8tMG0AviC3Z0CiJSo@6ctWD=W3S5(`O|xql`aJDO7)^g{?VL+%^mS_5d7 zLy11(3kXNh(%9t(-B5e$z4Wko%+Z7K5Wax{en-5dPI^PdF?3?Ws}!9n(+*`PeuU&} zSH&vkBU9OTq5qqx(dr3NrclFIkV}r1ZQGv_`_~eQ5vXi$IHSYGro{bm z4helO>`Byd$)a>yd=j;RCoVaX)ULxZ?d?0%mvF!Hc89qKj4sqKBt}fe@m`nwD77PL zGUe@Fop)LipBbx{*yV};e?h%`s{Tzxo{G?Nys#8VFV{SfVca7rPU!isT5rhjtVsc# z7yJ^FT;QLIaFKU2HEozlVgNBEkP0sSyJt@k?b<-ytz(Po>0Pq;z&9_Di};rt@sJ;&WpJvxsyVD~v3 z-v`q#;?K@bB}UV`wcgJ4cAmE%dVJ0Hh-ghY?v7{J+m16a2%}Rs!+sF&KGvu0QM*N+ zqb^knWJTW)+r8ET@CKRNRwuys(%7%U%N#1k6zuG=kL`9%?Ec_9I6#2axrPsN8`b&v z4t?X5E%OU=gg4)B$@vo4zX`quxc^JwwSXL02@~X$M0R2MK_|;-PZ&{{n)I*zcN;3u)2jOIxTOh=(U**%I|6aDA#eQn3q{CtJoFSG3>WDgR*y#?HJ z*p4B(V9IsFoaCQ#IBNln9V;_8{n18LcdD4T;ND>`D)8ZLb8j&W`Alm3kY6j2+lV=JlL&MRV(nfcwEQYLn&K-a+qKL#aPNApzEvaYxdK_u8 z(fR~MNompiJesr>C9IW=hOS2Y0E*V@N64D=Epo#;Zx-iuM3b_%T6^-pA$(A0q6pjZ z@ie043iM=tvfBC#GSsdHa-Hs_vOA^dPNg7s`H{>NcE&|z_v}!OOHY-iG@hhE)#OH( zhC<9iI}e5t$wD82_WXXa?uUBKy=b79-|G)q?S19>{y=%F$5%WZXg}l*aNlu(j8in+ z$20S*2Ng)pQ2Ot=eWFS7Tv~XgbSBR~5At4(?yWI}H&p%2RlBL`Z>`!b)%3P1S&+C; zjZ}>dRcgBWhjFlnzaW{#Y4OFXf4S;Apn;L?6UC?yVrMNcZXk?O7CdywlODBSAzCT$ zRRsTq)dlkL`DnkMXd{LRsB)+3CFkpxX zFR@U$ZCN5Uz_Foqqx^QI8;o1zH!VhRp(zA8OhY~kvyEloA8X&{8g!9v?a`%mQN2p& zmzwzy0M|#%^9D)$0<2`Wm*2;^@bMDXGvKtGU+0x_`!0VHyTS|2hQxom@#f!>L-2e|9?Xh4#i0!dW( zurCaTI@aWHK?$zMIB_=>x%|=Qj=`!%emddB-(`wcDI9@2!KuIN&Wqg-v3}ZhpcCV} zn0H(hL^>F?j)NqRfI>2jYYq2PYfMos8%G7;Ifk&kl3D z*qyv>@i`26GYT|r6eM|wE%y|ojahu1CWcnD)KG|JO26tLyZj)#;vnwvyT6sxwe}#p z_#j);+VKEoznl~iqHAvV?mt~)xo{%I(dCc&Zx8$$pxb^?ydSk(0X>W(*p9(5tQnF9 zf;B@fs$4dx;2!nRK~@FD%G(=loG#il1-i7sx^FO^C5etl(t|wHHODs|Q-ZROr^@+2 zwJpu$5ZsI^KjCCMtVAAkw2F4f_AB2YSoAHUrZe>*wR~HAtij`#h$!=o)J&T1Hhg&q7B~eknFAZQrn$ zWB2c<^^0sbz2N@;1Wo>XPe5FDgL7ma|JW67XN8l7JcFuc6H)c|2Xfsk4?bdhV7xe1 zSuBZ`Y*?F!+aXX+?{vuFRVM0-?iSTS!9*of$_Hz~7Fw9wXuT&pxb3UaO4>%)leGAy zU8`5ny1e7G6rdEB9a)O&c3R1u3?7C*9M(_}>E%V{p^>MEn`aKtbivt%h5if*=UX&f6O3hznshJSBe{EHn#lXUn6~^H*Dz^hb1aw9YbG1 z(*w9luw#6dP@$D>a)@RlM!3MW+bLpqq;sE|5PgeM9a=<$OxtbrAW^eHR-ZhTEXz2a z%lymet>3=-D&CBu8Si5^bAlO zsDhoy5hGxhfeu1tCP6`Eo(cq~i(j~G{mArnBes5|J8VA}wo}%PBwV)n_2M_|>+Tz$ zzRBX7t!Gd7DcjSIphh-fa>my0X`k9TdYkDbv`m%!l`gm|lx%^D!P!n=u_B45fYi>0 z)V&3icJ9F=vT-X=Hb^{l( z>z!ST7tww#+XGMfO@4R?JmKpKk;mTJjp95z@WnCn?fv{Jigu1CQmw6zDy@VNK|ML8 z5EBT;P%h*!X@{ac_G!NNXkr-{x&agcQ8l5bh#isw_;y~!Xvt_ahpS8cN0&}hB1JGn za79X8u@fCxBmmnzKU;6R2caYl+X9ZEXi4EQ%Ai?i*p|8~ox{;S+!o!9+B>wRqDofD z^`)QZ8*&e$ayXN)VheH)Vf0|HBl(q=K5<)bp$SU~t3VJ;ap?>7VL}kO5~WyzoJy&m zXh{z~Zkcg}dLbiKV31==OchqDG^&swR|LhDG*7kU6sqHE+ev9=a!@JC%tF6heS)FX z$*scKCW#|5KdRS6!rbstW&;eH@{K^mI;b+dqz{}4q87%5!0~7lhKySmMU7EKlV}ME zXy}++Q7o~}kWywqUW+k*WUT%aOQuAt0JH$3*uYq3Sxp}5njV9`Byy)`F;9(T*c$*J zjF0!?AmH49Ct}mhPL~@#upvkr#w!`_J=xl6s zh`~93{%-O;p#e|)eM@i`#IZ_Qon^^62*X-Gq_Xo&mT~7or2F zM9<5%2+X?)3Nb{tG^x&v}=+pn9D-6ll5bb_%Iykkh)wU1SyM-1AX#KoEbjp z(5lV*uG_rt_Rae?Y~J_i=6z3X-nSgoNvIYVD&aQ{j-vz7-V}O(g@8vWwbnBx-z0=F zP}oxJT9h{6N*93O*@mK5!bz$R@d;Ci48zEMVvxfwt34VIoi*t{;mG$&W4s-<=$z(udPq@nf zFSKM?bdxEpeP8UtbRf|a)rqzM2R7(-r*Od}db{hfZ*uAwkE+7hxYU{I&ieQ_$7pReyl;$sq1dO)k`6m;fD7VpKSLt`ihbvdRpFFZ3lVhiq?aVTRVkK}-6fZ|y4DH?j+hdprDzS1JCX*YHy6xdQ zc|Y21{Tvq3J!N~0V6QwFg|$Rz9&>{f4ooP}0Uk7wz%@Ca|G)1XFOrgB`xCj3(d6T; z>uF(!R)|pJYcyRRmv-egoo)QL;towYSi^b~JJhEdau`bi$Yc-_h$`_zAvmbKEk;a^ z6Of9ZOd|wxLo)`UwcAD4sSGhoOgffY@@f9aFYIJ_7Fn1?KL}4LPI_Jq>rF z{$ct(s@OOYIh)(ov6$&RX>G7(Qh=qeRUI#)aJ| zXLQ-_I4WuY4t(a`z$X_uK*6&6CTD4JPbUdZi;<7r`FjdtfBY@RtE{8Rcu1R2Jh6+p zE$b2Twk>t&KH)mEam-KwOXy%VsdPd9s9c#*dyIHdKJzN7glLg?qa;=(EBVZ4qjn!> zggXH1V;j)4j_3-y#cJ@1RCLl5UGz)?OcbOflaj@b?_Sbqh)8Tl%zuHLZmuRiO#GQ> zX>=rI!SbIR*EV)gbhK9_RBnv}7e&{%Axp{047CDI0zC;wf`{Ll-Vijy!QwnYk^sNy zJ0cc73ACy%a(#MrXIHVmCBI>1ls-ZW)}@_w&?kF?t1) zNml|1i0Eisex(f)%7v)GZ%b{J-ptx~ph9tH&%-)+j-4bV%0OBL2c$#o_VgdJiR%`WO{3~m$}1yf z0;m@!Tbu#hH;a`%dcVW|RCXWI9v(Qpai>(=1r;6B_j4*fvONI}aMg<|z*93!#-jSf z4$6cnm8h7Ix}X|3B(Pw0%h0uvC32Ta9@pU)fJ8H*+i1H*MB)UJ|A>I*RfuPXV4ezY zDD1j)qH`X9Z2UsijlwMFe)=zJ}Asv=&wSVQf8nJJ=%B(%Ru!di(j;^mn6IQMH}L@iOEdGPPcWBDt!D; z<|^f;CtZOy3m2dhJ52hY@_VC)^PhOhUI@>0$V9N0Kx>H;(Y+@Sx1hQ~0dnGY;3jmW zQ&J!0`+QN|Fqe@h7i8=tY4sQS+Zfj8h2E|9{vs(V(k!4J z-kvBMT^3UuU!%BIcD0vU-@k1$*t0z#+!p>Qv3a}&4G`yUERo$pINpDrueSw;76b~f>fh?2$LBfaBs&MWqw zR*JVyieOc~;?L(NQM4FpNL&nkm*RLP_O)TK3yZUBR%y>wvv1aIJk)AZ!6;H55*p1H=bY>zzz9@;`DYaWO2QX zUniHM3)@}Rfw#|CDNGqt2SRMH&i{5I+oB`EbH=k$vt`s=!7+0ta|^~n+*xB2{pkgP z;$+&}g>$xq#rF$IlO-ZZ#P%ieY+AVBLuz2l=kb#cS-Z0MD-r$84TVMD$i| zN8hs6Epz>0ef(qCwufyTwuLP|=X?I|ZT1n^{)|n6oTj*A{qEJpwHfZ)?jOtF_KR(I z|JBL_KblN%qbXDg)E_NP7~s5-8Gd>#dR$(7oFndXE8r$VNJ)kf5}iGz>|REEPAUFF z5!=RzN{A7^8PicNEfLo}T0BAm1fqXx=OVMCkDXKYgl?}%{Y@FBI9OqFs^Mx*&!l*p zW{%U(vJ&q-Ne5LYhy$a))cbM#=Q#O9(o7~K-Qe!=7GIk9ljD#z%WajB%G`~{{m5@A z)XE4Eq~eu2Ffj+5mXhqfN@0GTvc(iAORh>OXs#4ytVx0+h(=}1a6=H(u63?&E5iNTEG*z{O=z-yQCL2#6)iE>$>W5F&pF$y1DgB(9hr*IGYLqqD=0fxgBH zk7BR~G1%}M>4NerU~CT$KUEK(X%m!uAHXns&-ha$5Q&T`wyjnwm6UY{jRUTi%FF0G z{eU0dyxexul$D6~L(*X;SPA)J^KOPvKZ<6vCS}nkQc+`VM2|5>9?1LX>CK;>x1Q*Q zFm@;xQwXV2kMZ0(*VGtOZNhx*kFoA~VtayV9IYPm1mtx|jFQkftwa9DOWkfPaY16C z`wB;xKX||VU!Jn*Iv~;qKx_zmpMIpcHyLZg71%ElN$#6EI`R7-DBQCHx>t4w>SG$8 zX?m`X1qH@46dj4Aj@?)WngZDrfq{~88*JB8gNG|#;WXFVMaQE$qb!EOq4Q)$JT+L+ zk^Z-3mS4L3dP5xz~7sFNOhN~v>n>}w!qFVs~S4Er=f2(lSfR~J2 z9v1$0GwR&P9cFDl^p8DRyo(+qS&#+mVvZo(NA|WCG!A~L8#59i&Pr=rffVwZ!X;r~ z`gbR9Uh1xZ&1?%L+W9?uvba}6SB0VHvF*Q&aTnhl_2&ri(}5=92OkCig&Yc-&^n*x z>d)I=d!$PpuhAB6SEF-eE96hJle^bFrFK|qs*QxPl>GvZrb^uX#LSlapwtA7{pXm)6h~E+-9Bq|n?BfTxXQ5h6A6_66P_1CQN{Az;}=a2%gI zX$2tF&`j17X|T@OdiUvd%=6NbU2Ip+D|yu1BlelS)4fLL`gtW@9f&UuF=ji=#>^GY zh!}N~X}xBN|KSolXNi5v&R=Y=Ehe^u)REoo2p2!_Njqh!q`8)VmHdn+z69JYd*n-y zAR@^Kkd#KGzVHPs7$F2CCVT>6jbb(xm%RB!`;RXIZ!ijtpn`wOW90A6pm;ZHH3-X7 z(!>76e;vPwyUY|$a0O8mU*tCC-uj|{`-{mbUm{P8NMc@@q~79QOtz3J#%3U76#&P_ zZMZp_Ha+P}$D>5FQ zP35~P&KL!yj#Iln6)YJl493x!ARyzy3I%xsGeFMQ0v|^1;hbf*!(nN(v>AZ!KP$3s zF;MsO21Bn@x?lc0c38}RrkpmCdq1oAYZx5ym+nJntF5pC@{yH8bv(J|m~(QQ+q4K# z;UFcTAFaPN^~#C!gVi9{3=u|rbtkb>r00Cg0pE`omDp8DIl^_bb4I&gdezIX?YcXm;Vd*CvtZ;lGG zfxA9IvAd&w8dji$se-|8z$4j zqZ%FAMx*0!S3+{f{t84Gy&Xz9+^a#{WA-~uMK+~pEs?oaS}O;et>GBYdMQG~|A#-| z6eV9>MtgctJ+>ca{sKB|=qh$$YR6*gqJ)N)W9tv(oUz#_fRbCFz_rKmjjT1Gun0kg z7sAOPWbJ?U3XIZ=QZ9oedbjodA@9h{V$2K$z#US;IleRwj&2_vCxh&hN%FM%=@90C zwM=U!I#c^!Op=$`&*I3Ur35UpPs#|S!l5+mzfMX6ZhqD))q&^bt98yctaqzp&dXum z7QIwRZ>OYp#XXhX=N(f(knW9F>StIcT1E4P=9p;?L+aV%O zbxcGV)RJDZJfS!n0_483af#Q7*#V+#8?;+FmC}GLAs=r7(Pc{u`DiHB3`LoP0*`;e z-qA=-EXtgZIC4aRdoQPPGt5=C1S;ln3%)3_W~_Lp#5Wpv@yJu6$8?Qtf!7=+X1YxQ zz>sMSxl^Fzl7)ITllnbX$Cx_8F@pGa$ZnX@vV-9@bWwnAGy?u+H(U888;C9|sni#A zk#2CeVGw2dD5`W{F*_|OpN&9|$U&h9JhlDYVN?bY1toEPz6#x_^g{wyIT;Al^!yN< zmK?^-DzGwJnjB>$5fqOycQn<1C{2sCiHqiNu|ReW0?26M5CTILx)$taMz5FBDa=~Q zohuGz{sM15#{vUle%Nh)#(xo;y{%eF?{vG3GR?&N8p75WpTj-yhb2FP;qysB|D|7aaC3A2|bb{QxDd%vl~gxyY) zry9x)8pLpNjDWzc7!u?djK<4NX6sa3P%)XUu^WbGK{%y`U^*v*is}s#J`jUQn#9Uh zrT-s=I_pK|fUqK!TBD#^77D0YZ-Iy@-#=40AaiIt=Fp{*3D7wTgka+ASDuVe(5s+bgY4X#8 zf4bm)pd5f#DxPX#uT<=31@}O~H{_029J?=-=mNxCur4u>d_;V;Uyg|raDE;E8BGRQ zeioZ@kZY-p5Q-RMnj;QM^N1@(9$i=NQ#apWfRyily^)m!&A`M^W=U!$S}YT){4pC1 zi=sHTC%eevmf$7((bVYOYT?DAds&tIE;A+65Ht!qeZORXEZOq1eLwN!NE{>G_t=Ek zPsa z$ZN?bNzw`TktTx{!c0pO;ZTpoyx*@rVY8S@RL=+9lbQ z{VcoIc5ZE69KPp^v63I>%u4uO8`shGYSEg87JqTTep_)*vm&Vo^V>@Ob%~;PRgF#) zl<|AF;x1{p%ka+Fl?`_lMd+~K$jErBjFt$?OnD4yqBGkfK;`U{0O+VTJGRXo6ShCE z*B-CqsOluE=hcS2-tfN-TW4EgPLeNaQuy6e*zvh-?t(Vz`bq(-+r@2eEfyF5Wj_p3 z0DXI?YL8Yuy{8@}&K^8gZWjUU%v?JpwMgi=cY_@0ZoR6!6E1+kwj9FOp};EMstO!M zfDStd%mbt#Pm+EQP2x2Y*jVO$~f2CMny}{3#ofFx=f9l z02=cwIiW;MkhI(ovy@=&Us{>loYxtxq3;lGwO`blj}wF{p#lrYB%YKvg$ohs#~Fb1 z)mroQ8i9=*_?S+4WmhaMU1iyo)UbZ6Nw&eh_D);2y3OwgB=*k^C{p3kf5-0wM`<8E z@`iQ;(&DpYa2fg!0cp|G>W-psQ|zG(Rg(Ti(WVlJp8Ac~)Mt_v8?{s~tkQhV*TsMe*kA(ad#R-sY}q!$}8q#(hnD zD#9QxK@jg$usc#y5HRe*4*1!5ot#ChI7ko8g=KFnvXeW#(P>ZW z{q0Uhfb5EF$>fF4ly^*U27%H4L=`*%x`fj|LuWQfb00ONvw)NE3!#620IWi}(#%hB zHq5b`a2{%k{uDPdlSfoT7YLmJWwclYoo;pZjz_)Z8i~O zvQo@^v~(zXFEjwcYN3I{M-tUqbNbE=d$81j`YNxYn*B?6j2<9x8hYXh1JFOo0LTbv z5lFARfEc&m315sfT&ScLK~J=*7mK=BEg}R3U&Mv5J#*=0h%tv@C{45(CE{@@QDv@8 z`g$A|Mq573?c(40$9&>V7O4ij#m{SOxqnVq^o*D)}5Y(CfS6 z7kYt-D<0k*uj&rEVQi=LGLff_gGK$a+rQ9l7mfn~ZXFjy_A7O4y>mgn|NgkfIpcWh z=eqqX-F^>5K}WXrC%DZGz5HZjZ}`a_J^bW-O~fMGP1|Iu2uj?<)H9t@D)p?-4Qid_ zW?5q9ES@4lN{$|8dRzxs>e}SS&O1qmrIIndn2@Tjr$OE-GC~l^vmy4nm{k!^$PJQj z=k%u<=ufuV;)^U-{rxTy`1VBh@N*8xVYV#;AAkh4=U+?VjZlH`6P8L>bm#c&9&o|k z+iv%?+kKdp?V~O`JT`RI2Mhk3@yOK_X^?#rb*iA=1K1*kN3f?5^mNBKfN}SDdR>BH zVx;3S|Ma+Hdn7pWGq9gHJ6cJ)X<)FZ(naIkHRHSjt4ekf4SD?9J~WCSswoMbh8|Vu zLRd5#n|K+r_}_xXt2^Eb`3Wr}o<%Fi0-YSQtfw%Jl>Cy~Z4<^qx{$aOoE-9k4r0KgbFU0Psf}& ztF3sE6_KK3W1E)Wxfg01{e?kHSq(}?9RHgb5 zpe-STT-yo4#O^A+{f&EWoV_s4elyNq5?*t*lz#q7L_zcvyKP8`3ifk#1bV#RK7;r` z(uU+P>{bLwx?Z}+EBBKFlG)FNEP#N@ zD6B)4t(A7j3aG-;axl?I)t$olJ{kp3$Gn@z1dfHD18yg0>k+;7U>FMN8sjls!sZ5nWB$q`XxWpkg2)<*+RqwB` zfYD@#xcKses@sU39s-KL?5jQ1XHWJyZTtQ6{m3)QCIzojnUnhYfGIZDQwZz<7NVKb zf0o%-W#-)x9%Z{YURG($(+LTWT8iEs!p^M)tw{^7uw_!!p9DBLe^S4l+Ha@yLk@52 zvmf_S8S%sMwxZvy6@SK$Vowe=HVpxS&+~ZT2tJGLiE;~ek{uZdXUW9KwHm>Jl$08% zB^uhU8d^gz=cJf-v}OWzPaZ)t2dqH)>fy$1!-B7!pkXkeH_d)C*m!A>@)YibMtX9? z=b1U&-*%HFqD-*@5)(w;$dv=yvR6UT5;9@w0)~z4lTrs|O-OZXUNVEqTUm_OPmt8W z?=|Y92K)#8l5n6iXACyZ11;>1{>Hui%;gOO{=5M~I49U?;S=38g1Ej%6iwt>9pQRt zL7MI*xlouASeG!}GE^vnQc-3Lw_boDT;mXTk#(aGojxjlK_jHbql2K>4TFuF2kn>v zzj^?o9=lPNEu2~Te0nY>nzTx;G?+hCew8%3bu{3mW5zdMVZ#8FNd&Vsu%X}>$S;DS z56&xtSv7E9MAd8y+7N?4wVV_bz@srURv;Bg*tSKhCuWx@A3sMEXRG@#aQt@2-pF|d zx;w(cX%nFpS4?E0oxL^W-j%>0`gP?fEB?BP_G(|C7BBa)k2CUbZ}j=$MS* zlMpPlw85iJkB**{$1DhY?2p6t{xFwN_AY4YCt!Khu$?Eomw6{FOoWh*f-;%1BPA}s zOe#U(vC{?F=|Hu4FcdxA0;=7sWtN0pW*3>92e<~tj z@9K9T;5~eUrrz1_f8K9T^e6ZC`;GnfV7_-lzn2Y+lE~6Wav=^qfCVL8gjHo^f-oBy zBZcxTSiq=S;%)0Kfk(H*AEZ!e3P>J$6B>9K_c7~(S-X~^_kfdKJBdl%FewNlKbgox zuAjuzV+oq*PMm1ZY0suf{?|I|@k!QUKhHmL#`z<*as+Ju=_Gz{4^Fg)C)&j$wswT4 zO?)@YxP(U;VCU=%2S1O5AOj_r4UKelIV}R2SCu{=szhLk#3P1TXS`9eUX2+-NXpcJ z+&pYc8EPp(6Qk=U^9+ilNzpP;ASW}<^CmO86DBe8AXuGTvy%{=J%Y2QosdyaRm3%sKv0w`UD)$9!u|o>VmdePC=-4TR9}I$1R}9+at#{RLd{Ga* zY>NF0KBeyu*%}UES9JDw`S+Lp+O3#ltLEs*l6$tb&oiJ)N9~GH`^98n^xnaC#(eb` zJ9&r|klN|<-D&gTVxWc&-!`S7!V~MJaF3@7{>ULa0-68AN8LwugMjHYaDxx_%FMy&bgpgkbS&e)R-g zS}Qf18}F(WsuxcB9A8??yCb@9YWnWH%|Lu>UVO(y_rOH^$wYTMB$!r(YESbWf8z*G zgKXp98cpwRbJsNOohkl-PDsbl^|9Xr+keyU$KEjeSVKU0@^RcF1TGE?VHjh`slFH81R z$(}6P)1`O=MX&(SpLNQIQ~4D8srGAqds;vEG$%;J58G(H7<*%U(r>G}}Wl>J(Izj1L-{p#OzloS44z*g5s)yyQ zoxTHcZzdf{%JE=*lur|VwTMEGfAW+h&`Kz94T{>LA1*8V?$7FzU-afF$X&YCJyYz~DX0xsPPUWF7HshGmI0Hi2IKL;E0kl= zGFGJQh%&2=!0Iur(*cO5B07gN;y^Ko>%xXY9ZPoc63&bn*h7hcP&uopHC|=xDX;G6 ziRlu9xO(c|nPeYM60G=s{$yJ@Il!k5myvN0z0=V!P1&=uDiW3|YO)E{6-%MjhpPvrUy4B|mF>#17 zVPR%Gs4k+DU^Q|>gSJANw_0Giq4nt=B*iY>Q3AgHF%ezS`Wf7WoF%+d%Ak`gRclsT z(NT;(tji}S+tZWn@JY11Alu5lJcZx#{5&2#Ops9P@z!{`2w2Dq(m53i-H}IUg83sC zj-0b)@tMg--j>C2*jB=}FKoNF*q@&>dyD;};q$_eSnW%zKu>~=td^p^gZc7l(M-`) zKbO!4`})u>&0QTQwzToF6AJ!cNvF!4lM>;Zyl*GQ?-u#E(Ns4j9(Rl8$@9|wP5!(o=szF3G6Kd z85@(-LOpeV>x#0eS6cgOb5&gDu$UiLbAWUm5UY6B{xW!KIvdg1Gnq&*!Cg5WEPDc~ z!t|u}n<@4(0y3Fn*G_dePqj;@y30h?iMlcO8xz)HvGxzrd&w@J2`1h>6STi!1~_>A zOm{D7C)?VC2m58y{pHizp>~f>r?>$1X-?nP{cMgj2Y;2mh(p`82Q_b1>6V`zWJgb< zIH9v&>x%E{ivOW2zBH3;3jg3Vf3?{s{O!~2C)2gPa;Cp(COX2+^X;bjbV_@08Wkbp zP1BQGX8BuZS=fS))HxYu^P5WJrHWlzitl8N!2fXrlj~bZw{y45@E^=@yXf~Dr@0CK z(rMz9FZI~vvvN-PR8Q&j&>`*IaORinUtz3_ca|MLyGXMwQb;cTKg7Lvpj6ep_q~5> z?Y*bZnbY7}id7TW^5YJ^)c#7K6&a)iHOI5#9U zEul!U-8;fRFv9*aJbrYzJu=)sJ{;To=^eJZ14#HQg|5Jb_NNhy@bM8`b?0#Uc*h8M z#MejJtD}M<_z@)D&-?e;P`5hqJm}&$>5_D24!|4fdNGqAO7H4F9u*InM6MPVK7k2v>2L2A2x8hR(haus-Z`g?)JMVE)2Un~e>W&{8 zert3?!BZCxvq|pFp>*!-5&k^&{sbAh$@moG$uHGur7EtrzacnFaAwWzI17 zODhCl8zUSA>A{_AG9Xx5q7x!N5eF%dG=d#SDL#5=(n>w~r6A$A+oBeFWPI zgtl>%Z5XAb{{VCj&L5XX6qmde7>-KiupP0E1t$u$PaN7j$FUyPPs1<`7xe@0Yu22UgKb<;-FDC6%%_5A>@C`42jnty8K|NS$0D)lw zdD*%V;Tw{gr17a7MwN{=s)8d6ObpRAAg&y>vPfMjPrWjk?i{a1tg1377+Vrn2-{}T zt%8gS+dz(smc|O+y{c~;6morF@syz{%PU@1iDr%YB6Cvx))JlAL8hYPG<9nS+Hr94 z^fiu;9q2C^Z29zegMIh-Me=;Ec z`9Q*YHHQfmWfdUE#cQ$?XsZRRn z{15O{@t2wVepT+Ss#H3PuxT~!sdl8U#tzl=H8tx=DSD~{Ke>y0*drDHIOtQVln+N$ zd4bD!1L^&xgSp=Zy+JxE;pz2Qhdlu_+H0ej`)wUbojt8jPj!%UDoIY$PoLA1$2%BL zMa1>Te$D8Vj7{8}&mVAF@)dTuW`!cE%)T_y*vU}%$tkZN)ss}wl2a7qB`#WCzu6>Z zuOQPB)J6g~kbN4EeO(z_zbZlI8cO(rV2sZPR4zbaRJi+vV-v z4*vi>0n4P21v#+sh^q7_s-&o*soj8u+!Wbe;5zH0PuTj}d35Ns(Umhs1CR7a*`FAJ z>e2I70P{*$yVVK-Bkdd7Iibxdzx^z6vFWsUdO?uID?k{%t1;A`Lp6^+oe`wRX@0s6 z*YqX&*r~dkdPbLxNgp0&4-R9l&mQT{A4%U5ykxEz8DBdR%Y;&0RqWQ0cHSuaCV~8v zKp1JajI=+GwA)5nf4cJI82{!NmO^>&|2&5E{`(lauCHy&*qMjgl?U2exGFMD><{;$ zOpw?2wR=aijQ5NI4;F3BP&@WeTQkZ%HN>8TTd~VvO9alepxXC1ACD%z|7env`^Ry2nmpoR-Df2sT2 zo|JO+CaqbQJdj0#E#)k3PjTiDM~{9a!@PHMWX5nHG_PthpI$y>^K`6f@>jI z+PbBqJh8sftRc{*+KSc$r>@mStuDC$!}B7yT=j5mOSeb2jb#W7ASgW@CD#6nhkl#w zL)Jb*u8x)0^_8R9dUuayf}a~}_v(GqI3?mR$g+(LpT1(dC+mB=U-TwXYuWx^ve%IU z1b+KvoqgQF@v*&aU2ng(H*@p%!Q6evDjKV}`cQw|p)9;RzXMA3=@{1Mldu82>y_Awv_caAH>mI?OV`VyN>?s%P{?}qb@pQJbtssj!V{!v$f;w_;KV_sK>4* zo&E{q-8tjs;1>UBOmfp0`_mY^38f{;+>RcvJf!0T&(JT^-w!6V!QrS=Feof;ScUi> zWBglC1!=Lyk)8C$@#zsjY>VrOp`OBE+Rr#d1R$=1*H7K3;8DgH`Ga1_^FJi)fT9bI zi(n;J>Q4^a6gYM&7axPg(0l})s_Q66$4vl&?$p!n7$1VRsJ|0JyZ~O9?l4o+HtaxF z%rFS6il`j$D8+Acw0;6?+tFj(I@xGH?inA`7GG>`ZHHYu+AbJvAB|$+pYI@o_2v#k z24=@8vIoBE*JIp;QYA`Psr4Me^422@5C(-oiZ4Qt+O4Rsa2f<6<&BC)2M1i-5UMHl zCTJ&3lUGcZwbS~E=@Tkd4{O^h6Ta%O%*i`9Qi38*UYu2h+&vRA7YvfK?;T_9_OW)? zSad;u3j=v+v_1AO10iAiDHGTpmrSs0+ii_>Ltoq$uDUHgTAcj8-Oe7*PB=#jQ{-R# zitia~mxf2}s=&K)DDFzKzU_uT8_qvfZ&<|$NO`srgcU?%DXllHi(*ISMNVt(YFyyPGF(S!^_^_U#HLiFO} zG4A~_w!O`*YPXf`+Aid4pockupyFDcSS%04cLE|CORsC#EaMx;10z8dtAr zx7E7(7+p=*L~ut2B75)_7>8L>4+TnHgO2)Lpd&Xs-oIrR80ZyUI5BhDSa${n8dSvT z$2kJ??V@q^n{jr@IGkhQj_F5B{Gt{#$o*oph$n07Q6_4T zJ9hqn=(0(4i#VmRwhh}`{MVscJ~qc6vgI4_eIl@^d<;L>of9kfO%#90T!psE7s$s) zpS0bSgUJ5ZXd_eZ2V)%{-j`-)?Zoo&6YaGyRS><`{$;8@^KN2r!LBGY*&{6=jC=`@ z)}na3Bhb4N9szC4+&6I_X{zR$HZT8aIs``|JA;qQ*a9oL(PA=7u&GF9Wx@uS;%4^y z4v47lFOQ0P7}X@YVKU>w(SR|Lnux9v1^`rH>IHlq=dG}B9)%N!*uESS*qc{oaj2F~+)l<64jQ_|)_xQvBJIn>D z4BTw=>}#g@9z3ihn;kOB&ZjHvhvy}&sH_?T`yxk}t+r^3EJX)LYo?0D*4*8+F89hxjAfm7WdO)?@1?@H=ztDF9RVH*9~G&-kiIpE4h{Zad&s)?sNy+ zBq$#EI(c$dDj?FnQtKKH05*`X;W{{XJmch%+7x{>or}4`UfbQhwYz1rWdIE70VU$C zdd_h(2%e{h@RS-S6okG6^_36tHC2Y%W2Tntc@4PA(Rnji?7vQDmEW4qvo4BWYLZ8sI5?Ii67#0pxClgMB)R776O;M2mZ(^;M zAG!=FP_mt?Aub^=Sm#9q<95ixBUx3Jx9aaP$Ze+^Q|IWe8GzgUc>__e>#&FNcK7bW z)z5a=3mvw(L+sY?$JsG6?CcqE@!;53kzb%GTNsUfeptiRuf`Q#V+<6(8df1iv`zCE9MHx$gM+c|QH4G)4nyWi59v|W6||cqI@%Mx z6gmjD5n=JQ$ny#m=#xDGi@4AfQY+OnJR&Y;vZKWev1h@u$_7l>2l@k1;eQ6&rF`|X z%I90vV^}RKTB@-lBV@(GPWNlu5e8%}w!eEzI?Lj&v`#*M+70oJ8)bfNouiF@S;amriEdcz<@9y`be~4wwZBN6o0^Qo3;l!)yYFfJpcqo{FAxj#_O+j;@|rIe(_D z-QCvhPBltbdT@q4I>SFQ!?w<_UyP?_qPvRhiJ?BFx8wKZfdO5`e;)tesp~t_kf=YL zR{3O_PU1lq%y2i%;F7G}xx2q@ce|Bs57xY8cYhN6V?ydI76VZlBu4u0+#dP5+;mE~ zr=$=FZZ9Nj0Jc;#im`!GjiPNp5G_k;Ox#VU9>dY2U zqA5-)MBg!i-Qpd24Fjrx%8LH=hMDi~+7R+6qArDB!T$*G*lK;Z7?>Z85TR;{k!}Vq zT6qaRwBvW^g!Gv$8%R?1trBh8JNL5*kF?VJ%e&j9-R-jO_UdwbeYw51+}>R7-dJvLEr+P% z9C^{d`(;CSemr|`Fyu9R$Cq<2CgO_L__FG!-?p+*F5U}Namn7cPmm}(L50V}I5P+n zl;Hyom+(LzLONSbF6<7hBjs9gULqJvMt3-#u)fTrpcP%aSQ@Q(^@y@appuDkV~Tgn z5Xr%}HYsnH&xG7~UTw=*)0!cH+A%hy{*l!YIQ4Ht=c-f zcW+V}{C#h}^FZfTx7ta2+Ua}ZFb=IDnIf*C$z(F3zt`Q~?r!gN=d6DmYM<@l(Xq6; zb6ahrW@AIEozv>hRLi%sTb)E4fQ6JZly}D?pHfHK#NZo=IPe811Eiv+9s@#M-EbvC z0d}l0?Sva_r?^^9swM6$R-f{OadgK%_#Sfu5g-tjkFMcB00#)4LP&15xvD2Qt1H9) zze86(dVL=h9D*30&yz3F(44yz$5wYtH(TA!)^z)~(6YU&t@wAp{Ie_2a_c@o%TxQr z$8a~G<=F1=n(C*ci4U;9?9C!Pw2vQvI59l#BabFkUzIa78-3SBR|zc$&n{q4t+tBE zFVh%z$~0%Hdb+AttY^rDXzMJnTUPkak5?L&tuvVhSpPk3-Av^ifj(s%S#9JD$pbZX zk}A4Nbl<*wLDM4D0^muEB-*|RJ_(;>^&o`k*wijlNH4lC(<4k5Cwm#RD4f0r2tXBd zcvI+#E{LPI_SH(mVa1gA%S4y$SF>73$c>}R`FbUWK(ewXp);@~%;hXMNflcT{kVGexsKndB z@N#k%WVSCCoLO^k?8W1j;(~Pm7lksJ|ACB?odP)jB>HG}z#*a{xYY`a6eKUR3jVx0 zJGU-;f+_RI1INif%I=*IYT({3yEh>b{LKISYi0LQnS#5trGJ+F2TC4jc4i#~BvmwI z2K*d3c!ap>v6C&1qJfM=GCTL=h319FQ~FiLLT*}(F}fL}WV)4fthHU|rpMym!Vau{ zF7r9yb$7gy<2hKqbWE02lol(5QwZC;YQ&@K7&kUMt}(i24vf?@rR1-qPh*sqG`kC$ z?Y)t6AJ;_`R%@T*}nd_bI?>0 zAMEa$10!_*e(_r8o|p})d~iSa@P77}{p`{G?CIHV>ume;Y*dFg&#_ze{=gi|@L+9# zlt3nCjT~+++vJ{|oqb_;m}*2mI{hmYiqXCpYY2`=_Scs*9tRw16H*A2$<)&DkJ*IC z0v3G0v?G3V*P}^}Obj7BIo!NUiP~}e^~gf!@vQS^ze&Ysa2L$&oIkh)* zkDdVNIL=Pd`r$?KBQ5hsFipU0zX4|MY7R9?l*Yq zfDPJ!95btG8q`d{>IBVn>0!l|*Zk#CfN4z+2bbI+jHG}bBQk5&;C5mKAOuqfwDk^ zsl7T^1DnT}ID^ASLw}p$+T|Aur`$jlgH-Wmbp(6P75P6vZgStS`^~;=XU=nH%|n0j zUsQ%}vaf6N1QiQdhGbD!>2!vn%GY$T_=q9+UFB{q36lkvUe*c57y{t53r@B|Uw7 ze1HvcO*V?^s4i)Ta~DkDl|S2UoXxwc%m3Nz7RIj)g88t7WPvcrqO3iDzHd4}Ss1_@ zznn)8&p7}HX-fvWpr48R8gjEeRN^*&Ed{A$O|$)@$=W#DmwmD-?>@~LDLjQLSLf-Q z(YFg`+eNd%KJTNt5EReZ%%q;l9by3N0v%-{YZ8_^v)~k zMOI6&GJYFvJ=t1H%1@*YW?q&E$uBzZODKkm{@gik(;OD?%t`t4CiyPlTS;+PCFm{e ze>h)>10t!f8jqssSCyW{(dacey6a2eAA%y1)pKn99Q(x_JAID!-}_)6l;ix?f@J|8 zc_}Ey%UIYh1qGkvXu|JdY6jEEjn+MgmVGx!i7d^dgs(BtTVDcjVt?rzyJiljyQE;x z&T;Rn->Ik^?>q^-MuryVy)#ITO_LDF8ARWJ+{SSKsVyR4wXpXZYRN}u%m4Vw$p=|tM z)*fb4iDS>U)A6UjM7N)s58ZU}q;x#LkfSf-uE^Nc!Hk^zPN@u^pI>=tJ_BNB&a>m^ zu}I$q@Rixhj-Ag9j#&`b*@wE-2lL~B0ZCIzM890QfN#&{>>>Phd*Oblb1t8s%z%-b z2u_P#JJHvu%)v48AIh-L_(^Pc4jmG8{qR-`p3eY&v%CiIPjlsp{0Zvn5HiTDh7!Ve zt_vVf*iOSUFoPv)av_}iYc9(*>>KAmSP4uI5P z!xDfHQrFElkrd|qU04cPirZ3awvMtnP)RyRsg<|Lz2#goNCX+K_LHZNhwvYq6+1m>l^*xK+ zv*Lw6F!!lk_)yTGM{c)2EVLUIy6e^20Q=K?Zh7*2|NDjh+J%`R_MF-8s29J`Zd_<* z>uy2yyMDgEexbi%VKPD|;4uq9jmPTq#W)HfNF6;Nh21Oj?Y9dAI18Z)L|wz>-mY6b zv(SE{-`6d$kLSA;3y7!wI@i)Yds~3^=7QR{@7U8i|D%PrdXcSLdJqrMa#};wRHy7C- z7SM&W7J?98C^29EIMj}x&+@;hxq4|4#ghUcxL-)00M-GF&*#2EDIG?7XqeHt_#=?a zm*JN1Lf|x!MFP(7+@>6%=oNWX_)V_{h<=^NRGt^7D>z3@hq`As-`d!d$x|`}=lc{f z75V`<1vq?Hhr409k$fLjjsAeTQA^g1&rA|X`zhJ!lU+ds|#}p0~S5$udLf}likwJxS%ONNo{YdoKF>fPX?_>T2X4`0_rAsQ02;mfOLlH zHV{zaI~m$ap`0E^CDBUiL6-#ST6aU)Obf=)?XYw%O@h(|bPPW93HgEU8y zL-A065HUzee{C>mLNr~ahat!53jas99ioa?=yoLGS@`3VeWmJbf~&qrg%r{IkVd4$ zR#%>hR<`?(YS@mC$JOvjHhSP7hW49-{3QqRFsAt+mMigB9^`H>CwG+H6$k0_V~hOb zi}rHv`Nf`~&G@Cor4tq>CoXO{VX;4Pv2UQ@66`}*UXfV-U{OC^V8<=&&1bYkaS!w$ zN}QlIq417NRnC@pMqEOkK9Gfb>L5SV_hY%7dv>8cw@|oL*U9-p@6*FOp7*=iRR?kY zl}qq?-N|A-0i;MLqhgVVpa9v^wG$0L7H&Bvxn5eV*hsMTh>Xg*!C9Gq0=`}fWiU54 zMxT%;n+$qJB#Y8MY&Lq?Tq3;MQ^ejkwjwqED3FyBGRkqrj`M9=mUUztIxm`TBF3s81SiYz! zWsfZJKXK0;WY1~_o?C*rbf-Suv4kMh0w81lA4~jOOVZA;8%2siDbXa`j29dTpUImp zQbpKuRee>*R-!AcN*-k?DeLhf1tkS|h7%>^j4U>tMaFtodO$Vvh{KiWp@Z@40n;sV zuPhR+5The_?=R}wxk_i@7W*&_1EYtRapptCj<~=kCLws2y8%I8jPkWKllak^>RpN=W6=7 z1roMyiR496%K&uwh7edxwh^gNHGpLdpty|bhC6_e_h%lBiMP>>6SCuNOy_9Rvh*A+ z8h^Cs%DtvY5072uj$am(J`PXv%*kXfU}&6lBEH3Zs16~2viX+}vTX<1s|UH)4Pvq$S*nH)=++czUwC5z9s6_$<2emM^RZ-u9N}sUBVY}14788 zur>i)U^*lSNy}ug6pS$??9WCjj^Ys_csWv_k~xZ1l8U9uwd@UN+ckP(8QwBDYA&&} zSPJ{oGIz@|cRRgEZZk=W8q_Vuk)4CO%}7m2l1tSR*3Z|PyME`d#p`&yeR@b`#WJL- z%^DfPgJV~*P2wY@D+@b<9mIt0G6q61!P?-fY(uc;ml41Sm817l)1c7;%!?TPiqXl- zrGBNJea7BCIDYToSb8Xp0e@lgir_)P!pfj359^j?m=A=Hv(w7#r?-~l9htMiz;KX! z0d`EGgg|QRu3lzFqCzje@m)bK+?TSOeWp^E_yuv#$*cW|I+5gwXcKvdY)pdu)jjm5p z0&FCGu@?OQkyMQH5EUyJd-x?A|3p#&b}P`8)~8By1DFF#a_&qEvMl(n?$f2V;t(GA4Csr+wrjbSfQi?w9(lO4`#YGKa<*tYy4$-N z*70Aq596JP`HRB>gM1JhUSz}wAL_>%*VA8ZiWqlO?GCd22i&aP0S^l#(QmA$ zdTezpnG(+f+p;fg>dYx_YS$^kUDFz-rwqjLvT5=3-n>h!B@7Jx_^PjnSOVf&A? zn2_+t+<58m?I%dVPoLGbcCIFgh+_};s`tM2;^>rFr8My^$>RD?!)=%;ln}Ej~veFxMvigy~&M- z!-L+d-!%O@j^3oB+FO4&{%oq{*YT9_IjzT&xKEn{NV%lhZ31 z&T9~_Vzxw%Sb_|-b*UZ=iFgdNyDroUqOb%`z$etORydz!_U7ay-#u4hFSHgKig>B! zM7?{q_pqKIJJi6L=!YHAQw$FpXpfq`Yxa>DRNxN77cq#rEPAY!2WG?pKtS=jE#ilu z@Nl@gz_n}kg5C^{IwNgX&mlXXQH*}LM|3hwraRi%aj?OmKIn($K7y$*l<4cw#X$jd z|1#k;f_g!rl#$~8+lX4LxNZQAVncXioxkwB;h`YG)KHJ$zHNu}pq8 zaD(p=`p>UgwO*iRp{PpamxOU%`xH#q_^`da^;XC6Y%4YGTK*l?#}EEjwCkat&j zyE1G{ZAb22OhlkX-w{MfXclG#v=GaD3C;`ZiS405&429PnTi`FOvx&nV4hI76iNiIu6P)fjVRyV(i{ zibD77>{J3E9l=xfE0oIqI#>RK^B1Zo05O)YzB}h+o;4>_%>tu<2<#z7LGcSvH=@2@ zl#UO~OPp=V><01g18r7jQ%)z)jrz(y20FS2(#t5=PRy*tABd97oOotwi~;JB5b%Os zToI0V$zYb4jeOY3%eN%1+@)uLs2J}+T>q-JatdvOnSwPW?pY?I_lW3+y`wAf+;exv zb`NAUF5k$02~(xiHQjhV+(s4j%E1W}7DLALZ1lSIr_LF(k--6iwPPYM~) zNJli%QQWDLNJTqO(AWYw-|# zJ(Jv@$v>2_2Q$)6hV<|S*G}FxF>TDi0OlGm3LagJ2HRhA9W&Q&+QHFwqbq+faH(HGH(Bokay)9oZ<^ zHf)^+-pl%o*J15nwKxH7qCy?jA)iJcqUgJ>FUBpw!vm&H?s-(q-EXr4vj@$M&chC) zUCx4iFF7w^OiBq0x`8u`-BpR*sM=K_fsJcK&?9Ccv=9e`{j$Rw722d0N|Pu3Cp#P_ z5B-l_Se=3k@~8#W(@b2C{eozQ+N;23+wnOe!t@lW$f_M*PluxD7O{ccj!BrV-|Cg4 zky$;5GNOKN7}4S|miE6{@^@<>0mR>}Z?rWLv&>&t@ILz=QQ$^rKaQ`*fCNLNzby%{ zZRBo`W6H~O&>zU8kw(__CIm4i*%M#eS++R1!t|A6Qao)lN#)+OsRSVWoouYPz|=EG zFfphyfUqo&;_b}TosKgoQz$C+IS0I#mZB36BL%H$@<4O^%qW`5wKyIoH@jo1)MM#p zCm>!1PzswgqIK$5`y4l=MAMLDISf?4>NPTY2b-U86x$6hQ_4ri-5&R#YHpn)g$8Qd z!Dw`Y6&_Cw=SEOf8kZRsy@=Fo$D0dnBNFt9T7Z2(%=0M}u2pNLpBzf&QJU)*b4N>P zWS~b|dK_G)8Le1vZ42jqnX$7nwq%!6Nnl2GLr@bAzs1xIk`$Eo3%s8C`zp&Tr`hhV zAC;w>kd@P7$raFvHk69Rw9uIp|C~%E2KO5Cw~WuR0p$H@+13!=f%9zY*4EiNoD>ogs|O^{ zZifQ;xDoV5SP=UnQDqn9)E8Oo7iBBa!}Sa%&PCP2wQcB%Ucj}H8&oOA->meIHAH)) z*NOgJk+o1mL+uIKQXA0R+m8Ydw9|Wq5(VNJ@F@Dq25yzZR{MaZ)3jI*SoTRXVqI$A zygV49`3we&dO%Kx*^dczBdRv=?Z?G-bc{yy$M68oE;RQm)g%$A%M#PV(kXgLC{>y= zqarDIUmLf8rW9=q7-=FHNmZ*}u*`!R2yKBPilI+QXm|8Q8LsN0p8;To{TQX$n<$3BFK?4jDMTv_fD6##;r1e~E{)p>zQXy3#IdlJ@CU3E z8uMBKQCWsWPqtd!7WwNDRziyzhRW)6KOs3Yo*$$r-#=2q>ny7Jo;*HJ7Nvm@rPt&5 z4GlJL&&A2JxD^HF1t4lB^ADPXa-U`fKNch}X!CZYU{ut<3#hS;SRk;ANPs*eKo)Eg zr2-YBF@w*DPjqdgNF8)$lKjBmvu{KPrxh?O|9BW4O5oglhGd^ub;*4nQ+Ng^vb?h3 zgXpOA3@x9?l_(VizkXR=bXd3jZFWjA&t?FL$AS2T%_QKa`0T)l3kRU#!>Iw69WvJj z?=?OuBw%QjjbJuHmAK`-xND-j_Ta8DccpZ8u0ea9Av@fRh5;{pw)wV~D6S_|E$RW4 z0OR>^Pp??F9z0U)zg&N(wn2Um%g({RFvrbBr#3ggzne|yBBk4bTsON6XcXPg?ECfu zx76Ka_9wVK?PZvTihb7|#vr&CoW?4P_W?(C;aLh{59m^hBx1<6lh#SQJuntv&&(O&q z=;OvCh9{qRsc-or^^VP0-&D;CC-s3}W>vr7Z;@D<`wi@ji zXQ$97_(BqU2d6vd-Z%TBk&%cEj56~UiBFglhxu<~eYypNNPk(qozKBo9s1QXelpwm zR5o*N;x{A`p5Ng-%^ZT8%N~Tvc8}&J)cj5EW%~Jly-)skcwsW)X1hy463$Z|$qlh1 z?2TAAza@2lPVF|32xM@_L)MsEX*RNXuG`Z#dq2ls!JUR{UD}xDwn5j0nJ~A2>yly} zs!l4ooRZX?sup63MnNdu6JC}s0LGfZD4(-Rzh=Fns29mvn&K{0&K-mb+_jQQW;nT0 z()mfY+>lwElq+ZyiZE!IiAg2h3(_4|T@@SMr?}KZP6fqiGK_R<00Ua|1E3%h0l!;r zq40E>3KlJxCd+mC9f4ce7VAlyv81J$ym4h-b-YRx*l8xGc9~ZluVRl-?En@CTM}14;Fg z*#~s-Tcd16F}j(RpxeIzA-Z!!5yM>4=3hqefl{l+BRC=O3A|-uq}H%q1Bry`K*1&I zL;MBQ=R9y0Z!H^8Q+{AGst^Uoj&lWz%q2;rC&g^+B!*Eb6;&SWxycJ(CayG$s zJZGb-avHj8;~=nEd6flB+Nm&JI$d}mwsVaq1Flr+sSq#WUo^YW1LC-#QqoBTpX-hl zmi$CJKtJLLx<0Do28{wJVZ)DUAX-DMjp&ZKn$^PDquF7R}y-tfdIVa80*z zr^e=nup9@4b#S}110@N6VC~PFd%@!8jY)N^gT7_M8iaXgMd~&Gyf^*U{N>gs+UnBR ztoWwc8|L4#Vmpe`l6%dh8|i~4=yn8n#BC!VH(j{N%3zjzMN{ty=v}fkvg8=IK-8Cr zb}ZX|xgUTLw%slt=YKO!5*&*=1H=uJ8*7F!fYs2i4CWB36_zR%ju=35M#0eaUTA#?nLC<6+_hSoj{VeYtIG6*Rb zJ+(eK3KF^(*(=1&yg-sSXRqjLoqx0;jX4U8aSrYqu0pKZFWH?ne(*iU5Jk_!3Xwdx zrcu7n+`uThM!1Ht+gL`n0$E$~cJPZEag?@v&#>#RvgjOqH|add2EZ74jJ{#=v386H z8L4*Nmw3B}bE2p%UdDcCuVzSWa{mv!)g0w+)G729-fmV90F?0YFBO5*U|M>!kQhvLaCjL=SHQE8T>i@s5IIfS{OK_;T z7NoQk*`bv%Vz~?vF_z1bq{v8`Mo4L{lr+%R;ht={dfe44*NCH`<(iYOw4Iagv|WE2P8vj2PMO4ha@9uhb3rkb0cv3vD~O+ z9PQ|20`1sj67Be8ciM@`RNBeOblNG&EF3tBD&y<-3}OxN7T|O>C|L%qHwczeh$e!z zUkyOyU=Xc%}J+Z3)N$ z6rnP9Cm7x+OASl>Nrn%|B0JUmX!aI*LK)ezJV;y_8v_f8oG%cogQr*AiO+BwA+fkT zho!brb!PI|l<2I4${n2rlZH;}-AC7{^t<1vd|Np%XSJV)A#Bjm|0LxUR&OZB5`T>$ zb}us0U9#2xO+WA*p`bI*L%%C_8HIJ^@K&wcET7fGLz_l3`yy)fy;gpP+^X<<>w2xF zFam+s%uB(`ydu=1z!xsP3}gh|xgw57LX(Httau+=SX{tNW7)yJ^BzxQviX#;ZYX`a zxONys=LdNdR34oPHc9)bj62R0iDB15z|l)t5de8+^LS+pqYD8mSBRrS4F!R#XrT zt_@a3PUpe7_w#$r#F;X%!e9f&g3z5Z#VSE1B`eXYN>LU^GgGGi_tfJC)srnyAOk7K+oGE zsWq5aK93M7@8la}eUSNIfQSwl7G8WEPK>k}(${ptgB_0{BXU!G=G1XhveC@qh(`KW z0VjzZl%nU*7ehBsbB(79_*W*CYf}4_*(Qt6WViVtOmB|W?Tn!@D0|FLmKTMx*&(q8 zPQDb)Wbiy)gO8*0Q@=9B=H=}P)pdqo3gF~mhjnPlcBAbU+Sbr!L+iE^>NB%romJLa zJM$K=v%0lb-g(<>v{hCv0U&UZ?k6%Vt_e>MGP7%nY=A>ui@#E`<^f|~L zh6ZxVh0?QKP_ppONB5hOKav944Ynbz&}+1BsrxsVZxnMRk&4!zk_kgQo>>kNFP_=b zLJ%0{+Nl^#(#qTjL>-WIE{nw_Yzps{Y`z1y3P=WiMl%PV=LA$Fq#CLa*v{RBf_D7c zSne8TjuQ3E99d>O^9)!uMAv5h+N?ibq9AyN-JrmIa-2)ig-i%*?9j2*Z;_^LLTD$3 zR!5?lhj8NL=n0wL0Vvs9#q1MH0D%3rfMmSv{1)QX2e{L%k8bnglRuUnOFek_?00S_%vkM6eeJ!970Xg_O}5>07g-Un#f!|4;CAj^ zJ^{p~5n*4CYBti~ATjnWsO3_7Hs_`Tj5~Js zSvh_g0QrCcFJ#?FqW;=oztdb-lxUq%Njcww8HCfBZkPQ_4u=1-e0IKloDZ<}R?c45 zu@!}Q8bZxDso`+*Bp}0|ndkTid3zh>P5c&c3UclP^!J8DWc}G0M``SHGqy>-eQEM; zUWko9aw@WI-o(ZNDttF@pXBZ0g5R~z&*km4yuHrO%HN%>;jVkKSxR1TF+k4pf{ff* zmOxDbq2%(Zs?PgDHtiIEGPcXS`xW5qze1?v>byIKObdB;yi)pyL7l2t4Cl9`@im`I zfDdwnvZeq=1^=8puL4E?O3GjXjJKo;rfJDF7O{DSY$1&Ze{=+7n3bne8V_(6!|wM0 zf_FiMe!BKXU9Kf;CtOYV)}_8DZL75x+RD9M2(`)eE%t$}>to8i{5c{WfB|My3C4|S z9osS?8K0X35KnHJ>ZTOs4z!1xVY9-W_e$I2w%|_Zj;-3l!El9W=J0j+83*Jz6lev8 z0yhH61d^sjXB4#zmADYBh5q_NJTDgVyrs~LID^CH7&jt0vlw4fv=X~bWQA~v7sX{feAaF#IJCPp%JEyet-=@{QYSxLvcSc@S_UKbm+;eY;SXWxWT--> zgWAOvrm-n+wkOe|Ceh5srXt3yVq>|fxv|1~ek_bE{_8DcvBpnuO^xB#w&?T{BwPx< zaU$Jdj?`Ww95MS6$?Ww0R?bn!E_m6V&G-8A2pZv$=jyl1uyrBe@Sz;GsIk}X%V#SD)8C@)*`U8x&X2(LwYsb{#^A zICltrb30)&^lgx23_F;l(8|fI6D$Bl#BN8q^_e|Ea6)w5quY>(S@kj*LRuhm1L;yr z_7`Qpz_y_QfkeuO&-p_`vC$@$9@DL2!DMqSByI8u>dDd@x0*RMx(N?tOw|~QNfEKT z-wSq0lzs^DQgoryGC0hh(RymblC?_tg)%S!yoodK!Wk=U261UK=SJsO@ZJW}6e||& zRsCG&st(M#y`vj<-oP355(i6ix+SMsWAqSpvd9zln{slAg0F=gM3Y5FFj6}nMWt`f zb7;x>Zji35KD6b~;v~S4YMTk4v%9n$=Sj>QaQ<_f9UX@ekeP!9ig2k{~dK`y3(OK;40#0nw`n7Qx94NOA&{T}x(@EzR`gBhw_&9)x6(B37%wORLR1jYzvy5 zk#sR$#$NBuZfT6}k0JjM{-xq&{`xH*LAf4vK*8Acqo{Z=>N=mSGuHjfE zeEGyGAByXR>Hf}Q%7ZQ*5D&ubG>T5=I0T*(v`MZ7)nep^=q z1fIFjI-;w?%w)P|l=m5rM@x>Acfiq>{-*#4%1ab35+lMAHcK8#SRfxoIvO`iHeKn$ z+q})NNEceyp7HK(a=r&9X0Nr(%irP!g)Gg|34fr{}0Ez9b!ud^&H+~Ky;(P zrv=lkbirBDR&-b)o#}oq@!`JI-JRx7^me0nx2O4a-d20R#=G-jSyJ1C0ObAmacnby z7kXvqetywe!TFAhPWN___ZOwLE6x@LMam@Cd}l=c3r%`)qJ|*kl)3o)`fI$M9v*t7 zw~KeV{$skuncgku`WChuE-HMdywc~_-sUmKslzvWyMC8zU(FCCP;2$EH3#LgEtcWwzlQURJogTG|($l_Jf zZUBvD#M|5a65;v+A|tCEm4cO8HO}u}1*>PwbwXy$+aW|rfk$M%7bMYgE&Ra_;YYua zsfAx8!~vR2VO-Y9y_hNHc-erk zd4_58^Z`q*w_YpFR#`Ln2X#>R+&fyswbFwkEAu2|Nw%G|4zTSToNdx~361zfAkNgm zrra0X{V`rChNR4V$DOSmlQLD;iSm|b7m7!abSKtayG6n5#3(= z)+~+?F|fDx++OUt(lYflJz8Z6*kLHc&`4`SR+tYRFNco%(Dn_dWuk|D`as6NYW8em z_b`y`-5HoRy9i5mjN^&t*sVwgN;;mon_4U~df~nKfJVURlAdraVi|L804()gnfQJM zcMkxaGzXTF&|e|1RxHbS5U_-RsFLddo~$K-L5!po!3Nael;%Jle7_9n>QU*K(%#Mu<3p292%tG7>a26LaVQjn9z zxE?G+epftgG^>1pcKhL~*#!vFp@jLwsTr~@hU8`&7m!c9nQpDOu0OS(fecD<=mPT~RUz}nq0a7j6CLXIsuq-?tzZBUq)g8Uhom}(d5Yj2@jndqGuw;q9w5_9nUAG_w<^%Z)kCFls8wI=XYo&6n8{q|awW9g zqfJ!Z3ruI(x7s*27Ad>K|H|Xg>#3u05(o-b!p9Vu6Pnv3?3UUi34-eDNoHGpQto26v3_<{;?78I zj@=s@Zn=PH=H+0Qg-)|z;AgE0*S?Dn1ek=t+Bs0roST9#W`PwXeLhma5`6V=cm@)~ zq82dmck(~MVJt!w$*u6J0oJ*l99nD8ALBgiOC{ppTd|v2BdHQPg9Dop@>NH>o6_U0 zaHGPMqwHe(zqdW?kH&wuCggj!wGcGVhGZG3Z&s;~une9MmP#fug7L!!%b zX%qTWO@Po`ieRNUk8z$vB*2Xz=Zc(Nlf!qf7m!ts2Vg9Z>;FQ&6`bAtN3s8>5@d`A zPG$jaxb={FmM>}i9r#(_J?IE)V**~(bPenr^e@c`EtR==NYlQR)GeOpE8O8=b1=J(hhr8Fy|J-4Kx98ZL z%*C@=dns$rXYEZ~&fG~k+m!R$v%V3O2Pv>N#%(0&l5-ugboN#*xq$GlaP(udYw**- zf}42}p@?0Hmp>8|Jvmhyg`L5?U&LcX;mFAjH60{QmtfFd62)8mKn8!95ET;vzdc1z z5acf=J)3}qJy~578MII`QPUf7RnyWxy0Kt?hCBlhS$m3F3q0Mw0IlHJZ&y3*OTsl8`zhEEh(obA`GteO@Cju=e>FPldqR=i?}? zvEwtG;#z%nwocjNL~#^z23Z*TG+eX&0E= ztXS3?68jZ7i8L!WphYFHf>}ZOP19S8=^a84=C=%M)Zty!T;o}zH zsZGOq=#>7>zLVnwt}jpmIKD+heNpQ<7~=zNXOceQ)F|4M-PYkoL3)eiDyoO)!QxpuiVa5E=Lae}GNtv*2PzFrj41x9(_K$JuVCEEHg|1FJEuTFqC8xXj#T*> zN#;pu*bIC`W^4MCZ6R_neco+J#YyC$%Ew#JS-E|-!!s)P*$TS`Eu%jH@B~x95llW& z5y<7}M7dJO7G?qxktgTWKvt^ymsi;r{@q!~-Gv>AnIT44K|XX|8MFD2`srCBGKZ4V zVge>PYPW|~PQe*nZ6Ah0#%nC?T5ayhtUGK_@N&47m6H~2Ok`E(2jD@GRr<1WD|4c+7R8ZzC9EGlHXW%}g1^ML8TE|?A@zy^@=k4jZ=^aXrQ>JsUuMu4Ci*zCZazM?AkJ>|8H zW?FND*9^T3pOR!I-QQX(1JJ$&JfYSvz-!sESYK)Ys#cO&(%$4Kb+(RffRR|!sDx7NQ&dr+FQ@`)kEb)*x^et; zgFV~;&coPUlR6g&$CuD!63xO%IDdik_?2vVj6m6(&~p*Ki1AZXP}k0G*0gp+H#Pa) zvf4}nN>mh_&lTJS@Rc0s&rWTXXzEIM#Pl4Aej;K*qxh&Z9aHlxR6HezR;Rn-kAzyF zsBsBan~JS)+#>0fK+K1Pwl%b~Hn=R;bOpn7VT3`CLKm9(Od(>rliJAWCUCZ}4qQGm zoIkJRPb$?N=D!Mv5v}e{&Bq@S0)Xl*YcJ&7^EpTREJqlO`kcog)RbOUjBhUz-hNv# ze!A#B$ff_x^>N7z`d1~)s0Kk+-BA#AVOL7OoWW}QMR2G4e?L)PBNf znK+gQel7E#_RSt#HIP>u$NTddj?zXG0T@z{D84-BFGhO-7XJoWPU`G13@ts#-5BF1 z2u-`8#LYxGDnbn4v{y@BDXEnT`-XCIMcFQJb`dp$4;Jkq9r?n8sTWO`)A&K89iM5)-)i}* z%?)#B6#Op>y}?6nQ^EhL&<)+7yQkpp*0H+^?yrR&F4;G@s)=)Y1E7aDg6Z2Gx#DpA z`oTV=8A|h+q!WBrV-832N~X|~;}U|$+*OKd!Q~4fkLefPPAFjQ%i^TO8!P2wHHk>M zgk%E4Ru424NahD;Qp6Y18hb!=2I3^p*41_C&w3Lgn^}<=xgD)TCbu2pa=H!vPxsBP z(WyY2wi!W$U}IQsvb!(|1b>~$dS#0ge(Ult*mkn^&}5bdbTgRc75BZ>#%z%Zw;0+% zp)GHLF0FDWThswW4u;x@<0ux1|pdek2nLliWNvJP-P+K#D>IxPm!_S$x)%AeW9*qi| zJ}0(}K5w+j2Gp{vT<_?IS%5kCKWnbpM`-4m54nZhY)zZdrLJ;=BPz|o1aJpEErq|~ zv}R7@NG|RbW}#&ZgkcrtpW|4exfy)tIai?+autpTa_$O;5wRQRPC`#zz+Bw5 zdT!Q+L1qY)jXg&Sc!NN4>d+&#@QQiKMRS$gBRZdLLY*YgRc4qQ2bBO&ip0c|`C%A< z)Sa&-vFI7T;A_hhKy6aU$IDx}O`gEj&$tD9LTc_j5xvaw2`+o0i}6(fbAvt_p^Q`t zV76H<-6qF8X{$4*6+4zeuHOh&5bzX`Exx-UR`%nfJXJ7{auPiX0=!u92Du-IpKYQq zRW;R~8)PynNgK1ueZrGsYD(Q!>IO-iCoac*_Y;i~?4Rcv=T zsbfF$_D}CW@a{@i(*|D=&^bsUw$(8?CslAL`8hN?vqG*K9T*FV{n5rys(fK^&F~l1 zqsrtBLoe#HNA$3SQm6rJ5GVn$a|Bn3xrGMtheel+0rfUK9!8dMrPCv@6C5wCkl75H zc!m~qR1G$&@KJ>meNJ{c-ign$s_3|04hQ&EaLduQ6#rFdPTT}7Dr4}0B@;uB$V?Xk zMoc}-Mba(FB{)t&o5(Ih`J^46mJ7ABGoZfmLFEc~K5CEWFlT%}FxJ|fYs2Q8!QRF2 zgVN9W-FWeHCO!f8R*VYBBD5{!j-g}yqmQI(7z4@}8_xufLa#$sE38F$V6#EE)W?0I zH8R-s_t7fozFls~rEm^wToV=}BMSuaVM2ZBdbd5X73qnyj{RATlS`;Py176(6O882N?Ijvr8B0_qtiEHxqBDOTpCeG*idTX=Om0|Ae0!9)L z6_VKm@*33JdwKtK-ml9e5wBGuqB-sW@y`15g+BYZS^0fz7OV?^!nXRReGOj*CND>H zYMG7JNnC`;miz!J1v1$JA{qA|B=^_i@8Eq;W^*cEQx}4mD&%}07WdDrv3!e5t6BBU z{{qzWE$&n=#10Xag$l)dE(gtcMtcb!htS$in`65kO$}?<@Mb9AGA#lZzle)CG z>ynX=7LkhJg6bgX65jf}s3VN?B2YWy3qAXxI#vhfsdGJDKLanx~Mf`AT8lRF<$p)VoppCo>vNP~Ozp>#u(u7((yDa5^}QV5c1;A3fQ2VS?~~|VzbQF16((4J~@-ffsG5}YD2D8D}OCL zq9s}ZpF@R+vjJ}gaSoZ3zzGVvF2~ZN>I2JC&3f1+AZ+XkplyO?Qf`88SAMOvgpHYv z9@5Ru2{9N?s}km5-=SgtIm2 z)V|Dyw8uH%5&pjb|6jp_@(i?5+wv(uc$EE8B<_qf<{eQvvp(Zil4}=|(+V9FRf5@^w$gn!>kVTXbFtu3T=%Z4SROeA_GW48Mo*O0hg)Pb9bq ziz93S5_q%SpZ5?u2XhkYuR++9mJvU0P9hqlqn9p0Ued>kw7{`$=Qx2tOqJ!%ttUB1HzBV_X#_xhc;2N zOH<(XUD!@-(V9Bgqb$kwFOWLG>_WM3loaq0oW8omEx5 z+l#}B(LtlPL+2&Ma9ocoo_IN8!_);gaeECbYh?RHPjC(WcbVrss>=9z?_WZXMgR+( z8bBeQ?OmU|1*u>hb%9Cj61TzkFglS2L2DztUsXeo8U!Bts4};%`-b~^W3+~(f=p1( z{k6_LL3J8dQfVL~(E;_Ok4wTnCBvJ@`vQoC4rh;sywNg2Z1j*I1m zs)zFAJV~m~unJFZh%O2jCqrr%k4!U6gQR!f=tg+1$`l8M&QLb?z$q0j{zMJgZteL#|L&b~I#=F5p9_&2MMjt_8aRD;RK;*Rp zKcl?iNGAS1DYEH8C#J7awhF+ML^g;aTG)O&mb4tLbLqEZn3&>s21MUV@2iXNuCsgU z{zZ&^UZ(6K3ApM=P$QqrHV`9kJ4ALF7I)*$8?9#m>na|mg$%n!7^L=SBlw@4A3U=C zeR+Rx9{>E^@X8|`08HKtstT@~V&}x9kqjwVb^y1G56R=|nZg7$%kfBCE#S9+;_$7` zC2}$8!a#8^kw=w}PNcrb2SAS43{YRj<>*KFimT9h)ld9z<<4WE-|Q4!SB!2GIKlEU zI54A%Q@iNla3Z{jc){mtCtNA)4bSf2LAnC-T-`mo$NNgYl%l%j4xM<~wjh8C$B@2} z+vtHfGrsxjRLh89J z1Ld}&Cu9de*xy!r=S;kSqEGlre7X2If>}g|qjP|1_31{i3x~7Be(n6^*gBn$ilf(I z0CT8$xp_S|UxVuz|DyGJC)LL#;XBWZZmNFbwh!(6^xV#0-{1LZUCdj8ouGS6)(sRRrla8u0!=zc zYw%e>g~jiuDsMqovR-`8{axL7EVjpE`%CN|jXmxH-QpLa$c|E)fU_)RKX&hU{q`V5 z8aSV&eI)k15W|uL*MO)mj8BZKNSe>B($uGCN0cP^V7*DGTZYqUZePK)5_BuqdQ{G@OJ?F`~!7KX{9XA zKyKI(k{fXO6m=(V{WecRh<1o$A+We;$%r5zvyr;#WK{%9Fd`HZ+5o&pL9i`b&V-UB zU#~89kbpmqPo+WBCirmm8*qv#>_l>|IwyLrVS+ zzZKcP$j|SZBkjp7zmGrM&LJ_Mx5w$VU652T@;>Js)_Ga!!4pIqc~Z80Qv3N5()Yx~ z{^2WA`}uCqT^7T@h+8W_RlC?@R(XQ7GhWF*zs5p6?8)XvT7c9m7G zArV11YbIyC@BKf$eNa7%NA6!fAnwJyHe!D2aJ^Xh5yZFk+>u=W=^!d;{h4abF&nLd z#!*(!ypn0c>{h6~g~_PG_xgsW3gQbsE!A+OmJB+qGRCb+xBpGvna9~xRr&tx;S6`a zH4mv&RZ>YRBSQ#tkR;3y6emPP38-MJtvF$~+ERoVnL$LFxrz`WL=gl;KqLVXBM*@V zq!E=wM5IyCMxgwVFjF?$$mh?x@BQPi+@@3uw*jR2Ws0(5wTq&eH9fY~L zvtZU0_$J{5%xwjGbJgD}C3#}kRsH&^<=)Rs^-+VvlU*5`FU025m=K`=Pg2r^2KWVp zsDXJuiWVZVp2KPw=EU|G8SE{!Up~!woWbG;pq6)nDQKBo_6|T!p@R?Iwb2NHNV5@L zpwRI~P!OtaHK7O@&>NpzFeeqvidR(orWoV1DyqnvV|!a{z8jl6Vifl{_N&H>S6<^| z#7-|@0?mLT2(x20b?oV1TnNp_`A zpD_;S_}gfiCef3@OFCem@k#Wr#xNpyw za@Q{dGsl>HjD%munh$_UKZLCSi!;KHn^Lo}>K?1Q+pE>PtM&^-bi-Ob2bI`7O@pK8 z7(WFQ&cg%2(?NkKYby0}3%Y}1rH$N?Jf1;%-$RfD;e>qRYx3b`EDd?aBxmaLTXA$z z0P&kJ9l02QsSihFI=R->#k8N<$0RilV;nz79jEwd>h*SF#yCVF>8xaKbq>5D8s;Qu znUg+@KigbqwZl%D6p+I?sJKVAavx1{a20N_i(A>+115H0;}YkC(Gvp0V9z*8DoSfL}S94B#QVe!ypEKu zUMP`kb1*dUP_^$ZCzPT?JE(mNTb0S^Xq~4;mMv!8G90_2dqb2Nsm3vou=a~d`>7&V zWRluz1_3rqNw|JV(k>@PLj1P)?aVgr9p=Z0y)SV;PRxCY|4UpSNsxQi*NS9nw?FX? z;^5|_er{rMtTB5j!jTi>(;iw^LnUhv((l0N1KMdTvJ!5x4BKmIq4FkShJ|yD{6t{p zX`!WsgoFS<>J_j}yxz90LzIhoQ#fSnAjtxy;1?%LT7`RPo(9y={B&_`Nk)@(?cnIv zA{M^iEVvtpFH3Ux1ly}rqGBPp(DViFjLbfsre~$~b4gZ_Dh&2l()RN)6r)3mELhhh zH9}ZUHVcU3HP`$)mZjlAXwkdPzohlGshPrnOUOcrNNQuE)$K}0?105XV)nEPh>=$} zZ{pa;9LAy+d$6)Q67Ft#ST-bnc#!K+w1n;w$<&M7pgn`3C(aqh5oq9ov0;i-4tmvo zk4Htk$W{Y|KME<9Q@(48?S+&G8)VC@q__th9Kd5cxYI*>7q>w`-CKfvpn$OYFpcaB zY1@lvkSRwQU%TYF&gW6W^rB=E9W-L@4AaL6#=Jy^i5hRYXmZ z-#bQUlDiN_5aNm$yFicm9Kv@b|1+WcVTi@H zW%v&R5*5@O0iKEF^TT5Ko+9~@%lEOcV0^R0++4Mga3lpQegSV*SOU?K4+4zuc(Tv36hcwSxQX*0nv>E;478>W>xOLUYZl-gqO!dHt)dzQycL z(wNEP82?t`tHDGJ+m}*z9c4fM{%n$3EtDjJFgf5`6{Gw3MgXj3D*X{fZ#-9 z3zB4?pVx3P$F&#efOI1y4yg-67>TJ=*8*`%%Xy{h&AP2*HKKdLx_tMCs@L7lvg(4f zXf}u(I`9Ei;(jdWP|-{2*Da|Y!V&IMA=X7+1(@`qO=fyPZEhnL7fTmL50?PjZW(++ z+0LE0|d23JB`4_cYp=VBt?Erd{ zQei}w{>n69uvr;UTfT&7ATL*5sN6k~_}_4`s3*4m-YK#9uUy4>3xf3(?_M64#wgJ( z@Mk1g32Guc^KEuov8YY*7Hq@NRu}P9;y&JE{su7IG|ey82P%XEn{!z_0HA~*NK1tQ&aYckt8f&E0v(UJjE|g=0hAG|m-DQ%z<5bW64p(rE5^*?Y?rY!$Wm8|8z(8MSV59A2CR=3;=Q)ZfMl0*d zDbS}Dy8O!=4H{FMd?f^;ZY)iytUY_^Mh?)Lf;*T@+9d`|DpbFy3-!R#Vkq+A#+TB| z(8sJsRl}2zpjx@^${eZcNJ!2n8E?w3hQ*pA3% zX(6xiw5@Q){QTlzw1M!z=0pTq?!vmoBJlpQxtgJ-C}FuPV)v7>d4!a?%=*m!Ml{=# z+9d{)!n)Z|w?C*0yL?aPAV?p+Z_HiB{z&nnDS}^ThGyq;oVlqvjwA$&+q``NqlBv% zuz$BkV{ff{ti8iLCf(mg!`u{Foq=0Uk0e7{#!yU1A^?uX&EG~<^tjH#0#9_i=x(3178up!GUy;^u>9S~~P3tn&F#Bc)_yZZ) zclsmjJ`4bhO6yE7o8S!JtPWR12(QL?;u?W8>WGrM)z@Se|oI8+|Os z56r6|9<)bq7FtijzP=g4WNGbC^Y#q0r=8j2mUIYvx7Gl3cBinQ+MRl$^V1>~Gbpz&SI(wwm&9X;?Htvb9z*N?^ZW`8ukq5?Ym?z-W&117nOqqS@fz$*FT(&VP#85j1Y zu-`U%urt|QGt27&(-n|n06D);M`Z=fXERfBOxCnh-5Dn|uyL3|OBN0_lP%V=n9t0&M6)1nPs z2`i!yBL<+@+N0&pZT+y^kXq3Z$7AVW^gNHzW_B2>Nj9TU*6Pv`({n;Hf|74(jheSd z=Sl;q1tK;-Y%}+_F5TZqcLRqrmb7?dD?mX)+R_&L^cHI&*3*1{3y#mUF5lYPaxB zRJ(NL+~|rPdWXj63C4;rB2=vdD;a9k7v0)Js2j}b#lXE>$o^Vzk0@H2^x_;;n&cTS zlsIiv3mmd#DBSI$Cn%SHP>`@O{dq$wRE!)*N8==gI+g-$3dizY1eEn>%=#yN{c{Pf{&oTrD6Y;@b`$2$!8; za|%KKsd%7a1;eQD|En}f`hlIG9NK*y4ob6}M>6yupP&sP)!QeL(T&+VK3t6d6`aHfvO<9oz56?Zd6NA|z|_jW*TDqc z2g*osy%sTBg`?;b?$6b#hRJEo-cXFMFB0n$&wa!Pd#D%Vo!pC=`;W}LoVmXup2PMo z2#V>xZGim*&sf1{H*4a>vAZZv`rN-!tb5SJzn1+6eFr?jh&R9k48x(J{}0+? zEQUrw8LMn9^!cu*7^3C%pQ0#cL}_48jH&USKRgP--$iqZGAB0&&JA>pSx`VwuW3ZH z!#{Nxl@Ks-8oE!dwf2tG-!3|e&T-hEU`>r$;oB*s%$n4EheYHI%B`upGBw{w-PI|X z2RiJa8m6+`j%;&1vJClI$8QGJ<^6UKcUk2Td-d2JoCh+@G9}jrMIkPQ?2$)_;yE$j z9BE{{o0%ipT{-O!%sPD-^p7q+JYa!}q?$V*&|GC(^R9_5#3sNTDmoIkj^B9mDC4f| zZ1KB62TG&Z9&;iSBw1`NY7M-2LII`Fhpo}MEH|M;9<%P36oM^_Dpg^sYBgjbXoUEN zG;UZR1@o+QT*B%R*sijRa4*J0rHrL}up0tR;NQz~Ebfr-65}M%&LW8>(PoK)14&e6 zstVQAK_p|zyGIi-Ldq?#yKU>y;60FC%H;my>F zT`SXq*a*zKI^+>fW6sPcwi7l;ilTunRw~`8@+%=X19yY>z9nFg&9b=&gCtDq*JS?M zEG8$4a8&`t3?Z-JWM$1l*SfKwpvLo+QUQX}~Dpl5)T(z_@F|I7ZpuG0_#p^t>egLu{Ud z5T{q0IQuk`q{rsj7~r3d@vZxHY{$G4!^#AC%pt zfH60bRKPNj4@NN9%&}g`)?ma0)aNmoT!rD>O5FFDusK*OxhsAG3htDSl|PDLYpmQe zTCVftq%*8J)0#7sue5T8b!XZ*SC+Hik!#0B=U3z}>XG%oR4{)jScpBf<;0>}S+t*r z{P?9Yj~T+1vA$|#_yexN4@a91nGb_UXl%;@Bx4d?5&i?SQtFOn{1B6u=7KBw{b+PHOYE-%yHh(N71AT!;y)C+~DyQn0 zX@y-1M?OMDi1#O74bMc9hrtB0+Ft;~It0N5pl5!m=(WOoHx|sM!qX-k-WvAlMwaqb zcJdD81uiTv2Y`K{Uod@a>4w^|r<#E#R-$V#iO0aP3;Kb$O!L@saA6OKT!6z~cPTox zR!-_u%`fR=!6x;Td(0zMJIg#k7hYiG(bSppXaz}<5}*3s=rfe&xw)!Hj7vk z?aW%5`Z>6|&IYQ6NF{+UCAhNcj*bVa0~Hn?mm!l3gFnNa10YTYjf&M2eI^z5u8>Fq zKlJKp2WS-CHg*mbHoU)cdd;)M29qaZ!$5D&V?*MB9z1S4ND>vIF`Le~V*#^PKr|Sg zU8DNaG$7GdKQQ=+dUB!Wdp8mWeU+U>Pn~Lp0%n;SJyb74L-H1RZ%#D0(Sq!1kZ6v*i+)YO=fbA$+wFxl?sX0cN9aeIAIo? zO@#<111%ul)DuJu)G~Dxo${I%tvnJ&1+~QlfKAgI{lGs~_QD!T-^N4(w;;NS)s_|J z`kJ}6X0E9vH`WTd5qA^g&D5*PdKiqmSsUyu8HWhU$WldZNrWfIyjF^v8*M;XpkLhMdg9Hl>ab8g%va=kNspj>$zkV7b6ONK~%rpYBFbs}RZFtWr%a1PtD1op?8 zcXPtb!4?-3Ej(l5Y4BAnZ^f1nl55O-UP2;js1+t(d)Rjb4l=&Lrs&YanuJGPkn$W9 z-PxLql99P=*4NCsnz@S@2xPG=$Ald|n{|fypRy=VCjP|lYv$>iiPP`5nhmY?2ij*M zK&g=02_b{oRgSJgW`$k-08XUjN>TM^xp%7av`Yw)K$+NM!^jBy#6;lC?CJ;cmKwpdNJ8v{wb{Ocl0VM-j8bOK!ZZh1_Q4YP%tq# z5yZsMv-F3&i4`>$(v(?>7>D=Y*_5-XayJ<*XKNJy zQjH0riT=fUa%$auv2IVU5w zwzEj+MX!L}!=&%(0wy%Qz1dE)d#V;Ez8P?@GjnKuhz)83A)iF6Av71z$j6QO6|V`~ zQb&o#$Z5>{XJO(Lgr>?Yn!~92#wP!c)i$}rmM=vWDhA}gzMm0&CfVTZ3&xJvbb;)g z@9@NRF_$tOyuk+kr{3Hf0yUoF6-s)oH>7o2>9H0yPoNs|b|>(D26FOo5d~)rcR_>m zp{V}3fD8wzyd(%=EdS;P*9KOQN@Be!u9LxgHSD(w`<>S@hO6xqR%#UbXWCNp(@d*voK2g>KOL_m@>4^<>KL?rG`{B%iINQB%(#Vf%D z=v_hAPIeCp)tEN{JZ4X190vnXqB{$s9alOcRJar>IT-df?6=vn+B-LEn{l$7&_SAo z?~2BRR9J;T@zg$RK?2;1fM=(e2}vZmikpMb;j^I)XYwdKKpR09iIV$rqZuH^ycr1j zS$%E1nA#4(sFsls$&4$*S8==%9V}mDb8j?2iH+$P$gOwLgfUYZm0)?du=io#C*k#K zJMdbS-z)mFIyzJyZLC6A)L=CFu?PtDeN6SG3y|}pi?i;2#zY+-2s5n6)%o!}z+-Bo zrm_W&Lv0&Mk}kUq$Zr}1!K*5~7ZpZVV?rSBF1X;;Hs`$KOKkm8%RZk3_EKHviob*~ zFj$g2f}02bM-p>V60d-QBJ%EIf)bgr_;iMbHGIs3BRWq7{QQFm`|z zz^)E3{5!#!9}NB6;byX?1MZ+<6g41Ac!@bPuqzFf1)sCfn4}#;Dew+Z{c zuyd+j0$SCoqvh-0h1R0JNOjL8~=~q z0$>lj#Ae~$9FOz$2PrPO)c(^Y7D%p#bFOrUhgvVSQ^R!^J~=5mn;;QTDOH#}C~?WI zh$Hg}{~7Zqn=NjsoiMOJ z9I)v(n39|Kn`7i|WW>M_Kt?zg(L&K&EjxQrj`kYot_9|Cw1>L(J}b9om8^I^4?><0 zjgD&ni#PWJY_GaPUyF{KhEW}AT-1WQv}DAQL9A6LV*|g*e^~P!a68JR{x}3AlZO^+ zM)IFe6vX~=4wXrYc=VP8to}}@qr9>B>-ST54R2CYC@7^x`P5xw_MfiG!Lx>lTM<3J zEYkO>X0Y*LSQt`hTm_#otfT*DO!Wd=WsRNM@Q#}TNFnhW-{hpceDX|fc6U)D@J=3-9LUC zm+ZzZXsD^sPyKAuwxFdFXsNZ9FdUyj7?k0l&ce)+CFvz^5{rwum7fzE7>1eiV!RIx zj~yAq8}#1iMDKl?^^7Yi8NB$G!W~rD`qK;+l> z#SLAfF9A)48UckQ9*r*@p)VZ*Th5i#zZ;^|N7r^s=rLlyVibvZ-?>bUHw1JLtVJ0B zWI)k9H6{2&Bw+n5G_jGDfH1!&778nfAjjej9ZO6jC6g2_Qa~+g$ud3u?DgJUR)|*@ z%;g0i0$0c?`%8uR+=BUX!JjSZ{Tg5V5q_kNy24>1s}OK!o?LNUmvsyVX>KNIL&Pbt ztl=sd%TkQQhkO;@R+Pzm#N-~B?g*{9I9a0Y&Cx^eO1`;NEZhBunJ*letUS4iq66!zjl0~K)y9Oq zJxB!Sg7h#QFpvrti|n_$kY0{Ra2xdvc!n%{=pz_V(Kui|;Kv(HnyCn|I7j zsh*i<{(T<(0gRZ(=9#M-m!FttejP5`Kh6tG<|N21^6k0S}r)Z>vX7QC_1IKVo)2A&&aem4PBh3Jpoa7N=DZ7Qx0F*VE`B zLDN}iK-||8LkP{YjXBHs^8f)mMahDyGi2`dS?)r0NHW#W@`C(TDi|7sNel}Opb?W! z)t0MyGehXdKm*1ERGKyz{TwQk%1KO+LtKnT-=bLrmbjAnJmv{TAW*r`w}oh0_PlZb zVc6UMV0o$5TcUHZT{XXt-5+C){~p^vi@5r}uWkSjqFNCHRyTt>5D|wt>60o^E?5=7 z3N=DRftL#rt$f%e52S_!vv(T%J(Ju8x&sD57NI#P?Iond^kkZs>o+qvI=hEarM`z` zml|?DlfF2;1dYYT?R4H(O7_N*`4*CD(7{b5$haNEN=pu_stBnfDG&f}heP@yyF?d~ zdWM-TH4=Ry48lW%DJHQ6v-q(RAD<32SCs~tXOy{wp98e55RJ6dqeEs!HzLvFF`Hp1 z>e>P-?E;k^QhJN#!ER}ONTOR?=m%q-6^(hOq-vN&eb&8P$FW#?5~Y*l1e%zZhu94m zTiw8Ou2bpWz>HJ&Oct5wkh#(674BChT&RnB9smqe{0|DzAt;HHO7t>@@<S45V+clp=5&0kFs-H*+uJl4k!5YtEg~H7+pH=0D?xLV#FLCDtPLh71%E-fh-MMb!h%07 z{CZlyUe5eqnV>#;Nx%M>`9FkTr)oSN%lt3HFHuP5!OTApeqEtocV+(j;nxlNbyMa+ zBb0K7eyz>?RpHlt`gL*UFABeIWON?o3f&X^j-xQ`i;d&S0swxKDkB_MH;&gejzY4_ zniC_Xy~jnjx%AEqBksZ-ng3p9?gq>pwod*>nYkAaMOHrgul_Hjy`T)Rg}Mzgk6cb6 zNL(+RTw5}Y=yM^cKgi40;*MmWFsI=<^?p0sAOT!RRUc~gMC163OV7^C8Cl`X%%7E+ z^O~Q&ATt+EeEO2t`Sj^@fZBRt%IN5cjxh_ ziSA_&sn3|I@&Q%v;x{-Gtrn{4|yr3V|fsmY2f&J-j1_(Rg-w@-Y2i)8SmYFWwV66f* z`t2QI^=fqE0udo3cth=rpuUHsn|b|j#K2)K=b9Y?SI}q_w9$0V-CS2EVR0XhPjIA} z(VrW~<-!`=KbxbjU)uQnb&jBx=$6Ls4UOYNjpL1&?LE#p-;^*${TSF)8$HKW^(w>g zAGPeV4h5?k$M7~X@mD>++Cw_s0$=>foi9iL(VuS7wAwA!v#NFWOW!_NyM5Ngc4 z9W$EGS3YHqH`|lbB5dh=zk^-Ol~0)^b}?>b3*aF@t{*^wxLB9W5~Is(apTrbc7A)b zhJ};v72>z{2!ui(fJV8a!>;Qv>v7;nzT4ri+tHq~zi_&!+@w z8swg}L$diCG0HLX`LxkhZhMwiG6tsO9YwD!aG!F=C(#`UtTFOdj`t15-i{G16wrO0 z2~OV^A&5k^=T03~M_iOhA>*ac$CFB*W{cd!++ z3%E8K|5Ge(2?H3UmhR)g3%+Xz#f1{;q-J4B{*!mdxlh15OlO2S5M`6~o&M23T-hBL ztsgvWz(*c^ra#FnB#7htOGmosh-5#1KjQVq-^+3N+mQI_44^s0$c}caN6SFglSyUK zgD_61!z2vSiWX$zoM;r)TEz#{$2g@79z>}oT1<~ZT(JCEMB!~G_-ME8=%Mf^oKg|< z2w8Bs1lk179m=Q}-5|?+rpROMin%PJ9!(rJC}4|CsD>E)T*?YF#YM=>#zmy!RPDJA zAB}W+&a>#$PTcrPar6ydUEzr84s{>A7-ATzmtdOnvU&}U;&}UDmhoreIym!n(4YIQ zH!n-;2)pCY236O{1Y-PCt1U;$Aus`wnoXqSw2Q4V`8aOaq&-aCI8F!wPMc{gl5~UiDolF!I(vb-%Z5d)9>@WfLQUT-6 z81h>&4sF|Xx@1u&)2_0oIwA{A-Ll#F`9QQ9fU#>$&gd~Bj&Zq2Q4_HzQDl9HM*bjT z6c-G|m8k77Q<1Rbip>Gar~8Cw!@i?=o_BYCo%1w$-kXgU8;mEUH9=xz{{%*|*$djk z8-9WL%_KSAe8POveh87&$0e1s9}1a>=vCUyUR@@Hs_7>@L{~H%D2Ok_tQus&8entC z#L1%FtPIs?59j4DxWal$gNMP+^j1!^;V9v@U?HmbXwGDw^smU0X$Z^a`rHXpH1 zdPCSiYwoax+qLKEABDj|G6lkul#? zhC1^dXKq7IYW`sB%fW64wl1>C?Plv+)yAz0=xLszg~8fC__j9Af2DLhk5RlRBq)Y$ zV+j|^Xn}W6CX4W8Ns<3pkc_iXVW%VPKv}Gwl&Nxoqq^*`s?A?jJV#~*Anu5+vrIiL z06fVF-Yn6246s;_nwNk^mMX!i4q6rPnJq?l%U2kDGyW>bCpxekttXWYEf0A6UFzgk z?fRkvYm3bi!5@s5IS?SrPB%u5e|VloFD(M-U|iwBWlU_$_ZFJF6xR8~J?uk!_=6d| zv-Ys(WAXr35MUBTD>#-;L1sqBd-p`I{dF(zUcb=Yvd|4;%fN@A0%*kJxxFlL5ZE(1o}p zxb!<&HCjdRruD=lC35kld(#72&AvQ8K5ss{FYLbg4#<@#Ei_guTK5U+EST(Kv_X%{ z=;!kJ$(s2%G0XHv3)+EX*CS%>OM8<96!oA@-lO2I>p_+A-^0Ze-O(}xN5ER{YEWb6l>SYXZvpNjsF8Tx1aRhl^R<|!a^WEx3#58go(wWj$T&d8tj7ZA!M zU~Y1FfhYmNcR}ntZT7?Tc`*7TX$+wP!3C6COyx6HMHoOVeIlNq56JT;dU50GXY2N% ztQ_8t6fwS^?-BM*{ZX7V*n^bZ9^HiOn_@XnFyyF2cNLO<#riH0yh^Tz9N@vmBab(Z zwDuiH_ntP{PGA_3*$D4hqR*Ar0Gg1Oq&3Ch?gJte{Sd>k)6~%V}VHV^E^}HhiW{0xq zkA>t11$#G9g@I$y>EQq)5$#)#cF8{}wr9~K%3QjqgcgIpF^)C9nd+5hTy~Pt(UF zeYb3$M!W=+o&(0_5kUj-w$NZO3ZNySa2)5EcItUZ`yeBPbk3;+*eyRyalxdbL^#MR z=#Sg5nxLqxg}7sJvRnofve~8_<_Q3&4#MzD2@m_2)=5Ohm}m`V_>i`YPY7Px)?AEU zMsK6hjg>I!qgp_SS#INx#qXmV73LN>vV@c(2C;hy-TRaVEgx?)W(P*$oXjebP~KqOD(h`1gN0s(Xn0!{%#aJ*7j!V;45Xcb=!G>49_^%oFjc7luW zP!Vks{^+%{ZS-Q81Mp6-^v?JU^UY_rJhHwtp3a|{c(VCa z^ZM)k&ab~#Da|*V$5)onyuS7EKYQwx_qYD7U(Np6y4=_M^`AYxb@?jg)mL8s>cm%H z`>of%zxDI{BJUA&Jl~)AYdnL}3RmFfb*4}tx|pcqG1t4=I>&xebgrVdG>gs8v{%t` zzn=JOc8Tq@T@L*E>ZCjYQDB{DdQ5A9ig^gZ-# zVum(GSDM0!KT*Jn#L&DVtDF2hC~x`oioqLyQZqqvBt4B+F^!+W65&;uc)&&@bO()& z2;rFjMYe4)j_%uX0yQBaf1vr{<_mx%Wnn49s*}TCxG;_QnIOu>rABr0ck_J^y+PJY zl&-UhUybscQ0by;xBT+Nb6a%XcsEYmRVf7cCH4t#+h|Oxn!owyqYeLsXY3jiDXJa4 z|3CNx1_han5o_rGoh@IF7Y*;}nHjgGP_g>{EH?Cg-r-Th zz7XA^-%Q?N*4{BDz@7Q)ScmgEi?0j~u+3#A&lvT7jPS;HHJ{K-9_A^?jRBqt^F5m} zn)$ITjW(!UCiINax*w~j(cSs)!5O22erzy}?$K{1^zi5+Kei}~?oAhNIiaUZE=Jj! z(4f01Xx^xW=Jhc1+H))s#CefkY0m2{U!h8P)=A~3={=k2%`2FZ+@J2f4rV zSO%d~aa{?mCY>n$LIDwM2O{8QUyUA2mu~qoCY^9_7~En`B2pq8Rm3ZbgKC|D9v|MF zx?~hb2aVvq_)w#`fJDMnN@}VF1*z4dz$l7Ope?ghrZhHE=WV)k1V!w_DH?il&q6`} z+1q$F4O0b>HH8dP2xBlZ*n;ftkZ@@cml%eTMJ>_K8<$25*FsN^Q1wTfSFNt9Ge>Mo zw5fU3>#BNb#J5C`HLt3zp|K-bOZ2#|mU*JSJy+F;k$Nq9f~#tU#6@by-|SL7Lw`V! z(WNt?n6a={iGwOpEgBiDMNc-rvq)FfsF6jr=&9z_5u?j_yU2PN{cik*4L3s5M(FOR z$8Y#>BeV|p7Z|oiLq@W2L!(JEYtb{@cu~>^hOB{xn#Y`?@LpQc*650W9bf;U`*ZA> zKb}O7`}4vc(|oS13i~x- ze?!pZ5CioezozPWYnCu*UyW=-=2Bj4`^UGUm}6Kk#B6%q96wojDbXeBGG z=GyUW6#=3#(RE!D#J#HMqKDDh|D0_T!VGo8la1pa8^`Ax#}RChRx3D@iJ#rF2F}U&>Bzwtw+Zpi$xbk z7X@E*2N4t0WR)Bo>x!amg1AAV$1Hj#Zni}UVe&GP=wy1gd4BHrdGiZNw5D;*Mc0kr zCFRTb)eYlk_iu6k(JjuO8b254JwN{Zaz)1ve_U_k-muo22AkC$<0 zNToONW@sQIF>$2)tSmac`8D$$6HewiS1 znM9(>657lKt{ggXg(XT72RjfW39`la_;;K4#B3Q`^6vJ?7yoShpD^Sx@e9Tv#@Vbr zi`y6Q{)D}NXE4KJX2}At1XG#cP9k@)6R{wUEfI6%ajwiigFL6$uzT*H_=koOPFOi_E5?M%kU_(UsY)VlPl!qE1$VXF#3xd?FI{Nj3pi=Ku1rP5 zqfN-=i`_yTp19V;*W~p8i-qR$iTrB>p4Q_;nd1|r7c!(tjh8j_oH4pVI9`lNaeSo} z)q!k~PZw`6$@MC@cn@re|53`v6-Fq;-ZILRsCuj2SlcJ?;EivU)KyqA=3T{0n1pB- z&=|?eAcP5P!7w$N%FS4LwaSW27kkcdjF+N`n7=UaRGbWat|B;A5J3tjktjEKIziFV zE`ajO4nrev-xvA!;TMVXo4h+3?@lEr5QTK3)l>{)QtD7dyB$D@MFB-OB>hA~6Wqf? zp}1}pH!bqhrLh@?B8w`wDQn*1-h_z}OCg9r z#o(c>-szw)uHb2ec1$l|Omz<%FkRYWW-@|pKs6Zs2MN%o0%{Zh#1V%jpO1vDQ5_1@ z!R{F^YSdPdJ{b=M^A(VUD2-{j&2-Nzi7X`qWbnm1Cu(ZG6}#)=_?wC+rLXnm=w%0nZL|F$zda{WQ$Mk``C#dZ(q_HI5A+;N6 zo^QrVlo+vy*Fdu zhMK;}VzR+mej(N*^v478_77-Kz*$vViW5!HP0i4Q*AQ28B!T}0Khv}(2hzgRx zNldNDZLP^5a!Lw#*K|lz8MIq4B0SlIODz7~~lHPLg}>JVRm z2_O;J0=t4KVaXNIH(6|Fm_6 zeXr7n_zy%Q_<&->7u?{w{iF`yQ*-6;@DeESU@f^c!!A>2zBP1ODe??-g7=`t2>6uc zDIgCp0sTCi9|e4LmLB05?0`rm#HprBY^OLymei--lTVO$5;i-0>irWRN=e6vkp@8W zKl(y*U3pKwT@ay*1lNOVr*`M&5vOQC_w?JlfKny{ta0&P!88c3K zd@WQvpyKAaRXSpQVM;z$kXO`~x@*LQLRe=AO#^UGrw^)Zy?Yj-;t|nZ5Gj5D!@{Jf zTzn*gMnNUf(NDa&DI}=O8+4m@-}mk*nyumCADL)$aQm2H-w$=Ej~~Jp!Ct#l-F7yv z%1Vd6k_|tQ=dv;zYaCsY(pj=ZwCQ?(@H$Vv`tGnlKI{(&`$E_!&3$WBE-T(ux9hsY zMxP|koi*<@?^Bi7-s<)yR*)(e>c=PWoMhZs0(>?}e4}ziO{0761K%_U&Bx zhY-St>7VRn4=0X}hd8HJ;@p{lt(ft@op`4n|C9av+vv_8$k%`fEP07Orm_-tU zDOI8}30Zq~YR*dWs#~3!GsGgCo|@ALI-}pGq_&6PVUz5kxJKh%UwOZKzd0tUq>Gad z)L1eupg4Ohu=kLWJ!TXw!Jfa*?q%l{(yYbrO2FhKD=A<|$_s=Ov`5;T6~?Vw)=hK) zODA@5d02=TgG|{;@1vosttH}9S5)3$q793aw+4M!hF#CbCm6<`>Tf3CVIb{Dj2 znmfa0yLelERX_=tW&7!zyV|z+%|q{qhydKx2?~7=;^rN)-Ki(c6^Z#OESbG2F_$Y$ z+%9GcX1TlAoy{)Q#hnukEX~2F8fiBNOLHchq0ngR! z`>_J=IXeg~G(gjURJi!d8yfzu^;z-Nv zZ8LqD^5sd$gFlPCBR03kF_jka?3j_29m@qcOiiTYvFM~m1O9MKRH8TX8TIz2-mZfE8VgLTHPs84ZeQ(%zZ|to^33MHG-M>MR+in>8Er3X;evZ<(N&7TYxh$>M-?!F9k%n@gr>@xC zvQCmeI1J7O24`rkTYj1yGTr2$APRKKP1W^l+?X5cY7At7=F{#Q5%!ed7OhDOBAyr$ zK&EVoWgL@ZijRg)MaU_3(!1#mxz8S8EJ+OfRNNN0hH1JzC^Y`tHne`nQDC}!93N9? zKCwURX%9WA82t~W8F9S8_K~@f!jFiZ9 z#I4&F6h>l3!X(hA&EK{nx`{qJEi-3k_`;=NYjH-DML*(NdT|Eqq^uf%4`)PWUW?x_ zR_}qqM-l*LK$a#9LF{|1DhXm|LCn_9^}8o-SDHZGpg9;JHcGrS z7?;*_GBXGwWW{jrXduC-WzY)H?B%C3tLE8DNjd_>L5DC87^dy~ecXMWp0l!b8P%$H zY}ij7g_Q1IZKBywKyta#fXRnV-8tDl@6#WExD!E%=;UgAUuu4wI`)Jgmpz7-X7#kF zL7XYnDqhV%DjASq!GsUN7YV!z-(#i2+iGWgw8gz{&!aoosWg|^l)1F1!+spLnb2`5 z^F$D1+(Kw41=?M2vUP%i_lNytaRA*Y>u#jduc&pG{hdp{135BLYky~Azn8c>6B1D7 zwWj}Hqt-xSv(|SD*{Rlehp5(jj0?NY5Xz#56*G7HM*SPou6BDI1T?Dl&tS(yx{w28KR>l z6_CUh>Lxz?$AO|8AH&idFiEN$?dS=?-*|z~N}1 z^|OK&e(fT7f)F54y1|1D?sm2JzoK#Q57vEz%4v3LVyU}v$xzqQ33W{HwZY5dP2NL?7s;yRz~ z7bGXnp34U{j-5CTbR@$}qRbtT^u%*%1COMBTe}aF93W#rN!LJC6<>3AX8N+Eh6y*J zY^iUx5agT3Aw6AqWG#9$PEU1ZT&7gD5DMj1p)iaV+rx6m=BOdu__)>$Pr zVIfOF-HQJOatAgffW)+2cnxVR-~c?N&}!raZ%7pmq)sG4wX@miFb(leget~+#m!*A zVoB6h(9PVC{Rb!q&PRP_V`e-sDY?Q&+3I_?MBQTsXKl&5sM6km=Jw#rgDjyG=npL) zefTw$SqEDQ#}P)UG1qy6>Oozrro^`3OBG9SaT*cEk_=FU{P+~|7Xc&wLUq;jL<7#^ zTH-GZRq3S~F`L5bbT7dAN)rH*hV);=#$X=u%fqTx;Q5>Jb7rb%P-gI9m=eX|n@X#& z?^F0zvn)ZFeICeM<$$}GT(s;Y=U$?|ffgd^AQ){(C5}tef*?BtVUgJ0nOT%LV)}EY z8_qj9p%C>gQv5}~H*iZj)#85S6}0gZCdYmaj%fj%!HPczVmEM0inS)17v#elx88nW zoi*!iOW3a@5pQeMHyN;a0Ye&^gwL;LL)k4t1Zm%It~d5h4S$7k% zoSgB2DnUyhrgP~tFrwhemFW7(^bYtuf3{SBB}cMKU4TP~F=8?cr?6%ROacODG+BC% zaPK0rE>W11_mUb{L&vxV(9!o$F$IR>oe;SM(XwY5aTu9@BOeC0FkdJHu%SU}?$`2M z!+xD@i~8Xy78O8iFinU#=_f&jR$K#h+@l3sM=n*Fe2khFkwAHpK3c(Rh-E}*714L8g^3|4G|;Lth^iZ&^?eYVlYL8&l{@=QNhYZ-=`Ns)lB7b! z{%*U}mP$OJz`!Y7$|`~9dNXGobWXq0Rq!luc0A+6C;aJ|fl!b`nKh>ZqRAH-624Mt z5IXbdsX*w&inNHZHwdJV(VK1Z>=$`)>ZTb19%hIA^sxVN-f{0(hx)D``ZqIw!Xj5a zK%WFT-y7}jH1dtaThm9|NYi*afvA$(jroCAx{$9kxZdD9E+~ZiVuWFYm$==*t;BPo zm+-W&)G7p#1W(uKTIf?H6!G!bQcLDxp)Gng@E6P@<;Y`j#ecxowN+AviMYV!x$&?_ zM;0r-p>KgH+O+a)aV4Wprv~zhonpcfkLxR$Juh?XjQ@QS`pnt+0<;9}Na(t5s*B4a z^hKMzfgrd!C)W3D25)=Db!TD|mXO_Nt{ZTq2x^SXeUfeE!d%E>l2S(V=^o>lzFB++ zmjpx3JvXX^rXjQL~&LrOVz+if}Lxp>0a! z3FIF=uWot|KHmj$1_9^xM5U?YkuTDOFmv?4>8AcAeH)X7^*QtQek7kTyuum**gBg}Uj6 zVatd+QdjJ0ut?Q(vQl}{@z#)8N(-ls88iPF2+nvEHjqGdLMX^0To)bKPo^l1#?0s$ zlbs~i0+FGj2U^4`3;|ERxr6k>*8I>yAzC|_Uxng0UMb;@Tu{Z# z))=?p267iiB(=RPiY2-lf^0SO}~fAXWJ8y!d|Oo3}&X4ni4vh303`x zb&uHE3##5x_7O|%Aw-$*gmAFE_&iRcoBDB$>t>Kk4Hcedt4t7@z0#ptCt_jR030bS zs+{BMrZoaOD5zGtpxD(<)kIO>Ncj?Xx>j=PfG}|c3)<{R{IwU5QE-b9J?ApiAk`qc%aa(2tkc{H`N#+Wz z0|Hz({=F6Q=>68l%Nbj9k+YYAj9K+ib)=IUf?9+du+Amh#mILv;!uBWAZ6wI8P+Ig zz+KhOlQf)f(7tJ5{Tc%e^I_yvu+XjI8|Zj$^Sh4$EwO;&SnPL-R*;s}T^-wxg`xU- zOkWiV4%YfaY)F5ztJ&Xj=FK;gaQ_zF7hbwLao0jpncq9}yuy1WNF*yL zUJ)~*2@xRn2o1sYmO+Ce5?{)Uqw@e~)OgG_#ppo2NCQRVKroU3i0FLW2fURNND=G@ zG+nc@?J7Wl7GMeF8Ga=Lr3x`LM2&2P`V>_G#t4JegReB9U&*0VuXNN4wQdG!*=&%e z1z8sRfOV)6n76yMq%$W>vGlXV{5&x~OWdPs95f5~AtwS=9RYzPSsDYdICPS9=lx32 zJW-mBH`#4AN;)%jqfH`m<$wyX)@QZ-edt89TscyTG-=>^#;cv6>C+2Bv@M96yS8GM5I*Hyh$x<3G^dM7HGx*yKT{Pic~HV_sgk8 zPHS3-LngM%ai!lM*bJ2VRX7Etll;Pjw-E` znTa3_>?ozZW|v7inmLfffdd`mQ*hV(qeFa!9FU5Wh^#~MbwZvCzw~gntJEiLdNIJ& z!l>GfsRSZ(Z*h79 zI|*ALsG&a+tw@XoKS1(Y6NJFw_z_wLtW_poyYow_-DLTVizdH_0k1M(%Q&AD-4K#k z3?7QNW$Q9@0YpO%xB!6`_Im&u7#`$_ zlt*}A)T1?$-AJ;PmmmqCRZq`{v=ynV&BMaCFO60SC<)$c1~u6Uk*gpystV&+2@(se zP`U`x?0u7=N1D+<3tG%*;9^EJaL~pq<}+jFz$Oui1k(wTwl9kwV`(%;nxpwh-MpU< z9Al0(AFL4+k1mx)T4W4dwWKv7L+IT(NxPc@@>j(w41-YG5I1BOMbj4esVov&9OxVY zIPGwFJNXf_ujWClokIuTegtuZ`TAE4lxO(tEn7*l zdqU>o#<$Uwhi?x8zlvMOx3?#hF7rl_GMZn1V`%#OL({DUw(b9bVUf5%r0uB6z(JmL zozt>1fe^F=LOyVp3W@uLWm;_ZCdy)I+^(ksHc!@bcr-HYYcxC9`Ct=C(vVK@oG%1p zBIiCTs}+kji_9ziiN+|yzS}HQT>-^*n3T^z)U|_buQZk}?ILquhXQ8^6Y$OCWjD!n=JK75JrNnMDAGN@%6Wq?sU zQo@XCw6q1CQniddPPrCcjMmMZ(Dq5-*Hu5m2>es&^Gt=R8`^5cY|?u2SWy*`=Y?fh zq&Xd~)oPH>vDhRSN&x4odsu7;KjO&)DXZBL!to+xQ%^`$(cMyOErB1Cy7{fC{M?wI z36UdglT-=zM%aOJ;hII2^2s?3;N7yndK(o|r5Kw&+(uDaz}feygN;Sg1^4rgjp|y-sv7V%mnU$cKCmz)h9*&A~YJ zZw{S@-7ikJn4q33;MEie45u3^Y(r?V{Ow@OO{wY*>Pk{4Sq74a6^x|;SZ7X%F)qw* z120E?NorQ@Zq`mUD+fRQu;2T#-iAeIAK9Y2JaUV zgOD27Nt}McC8)yKl_^glQAh`z;X|5{sFs2*OKmC*`(H}|B0W3rV@p`n-A#Q^U`(oJJb=dh} zK9KX!Q?!nv1d;r0TWE0Mrx#7oII6{L?bpFqdB^@5Z)PG3OWM#oCuAr!j}`n?Ww(K* zf&Imbr^yWlscIGQFPGf|(p~hJ^S!wu^WR1N0u{A;Xb6&dCO{XQ`xK7za=7cXgLVfj z3oYr%0^c;s0FT!*&;S%sa9NF2qd#p?fff9(AtjCvG=yvJ3$%|pA}x`Cs0CK+;OHJG zD!3=#@!~A=!Ys%B*;%r_Fr+si50!naV1HjSr#Bh{{H4ih*dyC|*q6%KEz%t4rZaog zcWS}TY(vx@4ABWfDp9*hel9DVP#YbR#huA96OGVfM_6czHc1^eP+K)t7>f12Em-Yj zVZR{k-4^>aoNu|WgeyH;JQIiWMO*CmU&rhPx+UC_F&2Qr`N15YP`~too3efE{&W&U zlbz|z1unbQB##>N3*#SEEJ4evyVg`#g|9G`%cKO?Di527^12PSKFx;BA)bJBm$>Xe z32p@nm{KVu={&aoZ)fV%E?on&TY@YSHG>QwjN7sKkg|qA-B!>=XVWP`Au=qkc078{PR%mcc zrZZB`DF7;;MQAG6uKOXWe1q1CXjwFMF)f+|a-~&o(sB;ObC-l2-1Ba!ryl7@da~V| zn34253XB~2A+QHeLbK*^nbaaWTV$n~!PKF5>C{%xgdqcgDZG_yUBIrGFAaH>bL5jc zmnOq+OKF2F?k6WL-7Ix-Mq~78#@ZR#$Ns}MHYW8GY@$4oHx&kN#iDWIIBJ-&7m&zn`ct{LP{0&!Ls?JnMPk?VK!#q z*S1a*@;&sdsd*qx`pu20`4+7-lNbVPu8HF<3tvN*BYm?|ZcOdB(n1@k&zg;KeN#*a z{UY`YK+*++tJhDN65P5huCLN938F4(-o7<)4^5*XSIw|%W`NddvU*cmPbekpZk}Oo zdgb+B&S;<*3e);#eV z%6*e3%|?sV)nA{CNJ(+M3e~|nZd1OLq2|!|45{QV{s3UbK99d;a#_}j;234aQ z(&VB9%Nqr@c3(=!NO~cOzr(W3QU01Q&FRHHl6Qr!rZ9%~$44=-yN=n-NCOR3U0`R?IBubE|1=J(rphY4w;YEf>_SIqM3V)CR-IjP8 z?Vs9WdZj-L0#zKbj zg`tZ(B;Jsp6Vg`-2`LI~U^9~_n-<-g!6u2xq*mijLm6}PiL|&ydtr5 znChj1whz3Fc-A<=)=lG}d#}HV`WB26>EFhr!vF=5`mW8qU@VfB1!lS-Ubi689B2-} z^N2{76sN(Hi1JYLc7i#WAI9;0F?&R@9rkXrW+&f|-TEf8LKa~NjX*T+LH!{bX&rx( zJHCF!@=EiuoXO_Irlb%e%PqNav+n5BQu3X|+?JTJK{Gm-j19WWh^`c-oZcu2p=y~RuSKXZOBxz% zAq!0~KY!GlF<%`eR25M@jomXkr&PP#s@?aXDH@JL1jgokp(YSVF&KcEDm}oCAwHwu zKL~&5i#_ws>x&*MB}Cw*l#7Y4?VF|K&QHK+6)p|<%sWtephiycl3+bZ3gQ#eC~F1a z`=TeyXiOvtv&q$EdmX7*SW}xmXv28}+aNhm?8>H7WsUF7(fKvy z2jB{d^P43dNfq*la=)~>7BJ8JfJ z?d$CCsuf?D9{+F3&I7=%s?PuSlw01ruTFi_GLuPWGAX2x5IRJP1(CI&t0=;vYgrrX z+Fc}o(xi#l5J)JCG$UP+k^rG2pdw9{L=aTKhKdSk{-5u;Z<0yCm47C;yj#va<#&GP z*MC1U=AxN4>BF>4)1VZ0lqtgaS#E~^a@`(RuY9p?jzoDqWi8UkV&(_=T3|zAMWN?@ z8oVuBrlzpuZW{fm&)|Bib!w)6h3x~d5t3s*WGXqhvTP^7NF}>13(!DkSg|_XVb+fo zXbwc})bs)2N&1m|(RsNBvZ#L?ONR>P7Cm6RXw^K-a5S{^7A4bmO>bS%D369w?hpG5 zZ5ZsoV8qHh0Am^R;)ccPfMi!aW(G)nuG<B_6S@b(ofdt{5w=-0?PcChu>{`}53>p@gQ#4A#vvTWu-_D`+5Z z)9;rocOFLewKm9ojzt8EaQp9UL+$e*YLq3QuyyK25Pfx^AMK^Fi^F;GyD8~8W~fe1 ztuk(WrK(9sce47=1np84_#+A1%M2VZfp5p4t;VFp3R3KqW+aHu5=CrB+;6hk(eJ1Q zZ@v%NA?yO`xlyu-i7@D6Ldn`0)-7I?)ERE{{*;d81Bvc~JWGV_SfG~Yudqfv@&a*+nQ+)+#zyDW`YTr z+A25UaWql@E|Zt{XKU*D_iS*6aC~9!Hz0+rRb_9#&~y$A>>WKT;kq@Cnm7bmhpBFe z?Y5|-nLaH3j4wZ%2!a%iHtEBPps0#2cf+7i(=a`nbniStgIb#c{0m99P7zY51Zj{R zaC-+-7o;IA zRzZ#}fE*iRn}HIjR!L=^E8m1o8+AhY{?gaCjsEVlyPf$FG{3!RiZk$5nEPtET5Oim zP!f5v-_`8KeouRgwYN$Jg|M(RWUrd?*7mr5=&kmX=G8p^TC)%PH`uGKy#^K}jpO^B zc@}$rw108Z8JIk|EP?8y=$#62%YX(B4IxWtE@~~2*}(JEO`@JU)LD>JOIp2g14Tmw z8#AF!w+95V&5j%J5~O=gcGWh7oLQeE51AcdAp0E}h9pX}RB}spqncsxR9z{>#e~-wkWvakbZkfM)>SP2q%p$$5ZLBPARi+$p&gJW z$7($|#+c3+ZI|n<;B@8&_7&{+-{>~ zvJYLW;&*Jb@#t63H|w^!693;VHC6dg6K(b{Nl_Q?oj4=fhl++PPSf zKVLO3Kq;EPRRe>~DlI-Uex_=EUzJTGI*lnTV)ZY2_CL(KAWSF74Cvj8nz6I6b## zNG<(a@1KzYco&u!s953-_eHuNWQ1i1Di|3V%1kB2q_70xIXf_-zaT*b&!Q6q(CiUt zr()8vTr3{frcWaW2Jgut!kQ1d510?y517xGzhYq*r|!rS5SP2faRZ}IYp!?ZPRVm* zy>KI>mAf%DYvJ*j(3d0n@O3$NJ!t%&Ni$(lRy52As>e=uSy9@}S-ijv$In;k?-C|0 zs8%h6^5s;W}8^$sfeEr z*=GGTn6hoSB@MQ;)w{CA5)5$^rruFcu@HY&(2E@<;-oe2Imat4SvBe0t{P^WAIRi&t<`@sn^WJf%J5A zD}N)uZGZ0|et4ze=h@<3nbnX`BN(Um&9pPzIKO6nZjPDV3rPZPI5*|IG%ue!15b*K znD<;;)Zo0db-t+D!p;V6bsT)P(hP^S7t=2U9kar|JFLT+UBX}eYycS8&twaulNI~j zn8%vtN$fc3=9Bx(iG5fr>;mb75(UORAZoLsY0qjh+QlX z%jUi!&dhCPvlct&+%bk*aHWsoop&P*oF_NMzy9iyJGNYE6G4=1<0HY|cJ%BV8pwjNw;zyP zBg0QSER{0n)F0$`K<#aj5Xxp5 z=P}zfbYHbX>|(N7dt#LT0lkBX8~w70HqyDSEsh@T&o1k;SN1W?>XOV{)rAAFEgWUx z8T)XaOYF6qT|A+WX>>_z3Y*_;ZbXSd|9-FAT+vOhU)pWHqvJ*0=6oH`?Y5V-?By*R zo)cbN(`{}l-uZsF`L3S1yxUx&cx_5GH*AAL%2f1?1AfN^^Ow;(5!T6fNjg_2a zIMBKD$dXwK`mhAihx}3NZkR2F7+Oy13Fb`;0Y+_JbnI~Q-2wCc0dv)Wy=K5&jW>Po zl>>pB!R!tg6FDLQ_b^2|q0H$jt3+9jtp@geWLR?=Fkr%MoWtTXnWQ!B#ues9 zYTM8nu)vb&w2|z#L38Jzxnt1YGwAQ8%X)7eY|nmTl+c=>{%wK*#I0~glUA+qw5BL< zD-{@Y%{85cozvMgu|zXzqgDe93tdlp;I@u#m<~!?j{davjh*ai2rhAKfP^#j?d<~y zzBW$KGjz}U=ZEdn!)`9VkKHUo8uJ8u^I7(ifyoiqf`9mkpYY!qi7y|iZ5uy7ocw&a zJ&~l0MTmoZXMehb$+L_Z)xah$%%)F?5Z5A#1QZf4Od}<^%X=i#(WI(owYaK?Ihr18 z%)hLLV=yzqet0$7`I=~Ob=UT+ciTmGj+ZOu{4sOs7){a=q3%)zmzdsoob{WebojqQ zxAE`!5wm8@oH%Un>@OvGX1_4*K0i)haJ+R4+`5g$#|tX!iI58G{C;ymKk~9X{>hkG zHCEdxUYzu{7mx+W4Kz42X~S3{?w*cFuZ$RdAPvijwRjoB$)Ck6r?Cz_qy(bB2uX8ucZRa zsve2^%$VeXnSXsz6RFb;cELPVnoo_^m_=cfUD$Voy$}1&Dc7e>o-?VwZla5qZ#)n}d#D-W~sirjrKH<#q*(wz2OmHXRsdt>g`=1DKM>52bw?w`o*y4VEq{guE*xHiz{t&i2}0IKPMxh^G5O#V8|HU*1K6cE%JfEgVNT?bII zBuF>P*1(1U;=44C*$tdpE;O>nY`+@Zgh_D5vm!~gNnX8Ma+c37t(r@!icOt+LL$Nm+8RUF^1)Vod-^9B?W2zzP#V@%4~z3wWd};MpqO%IZ)C zODL$`1;jk+GdK1J@0}tN8l!~GKmQcmD$t%PMWOgK)nuf`QFY_p^NsnD9L9d!Zy)G4 z_xHE!CmS+~kzWtGVR;Y$*wg`+P?g!;t{IC;QKkmeQE^#s8R zixPssT-In>uGAZ{3HF(h#4b}Ks@p?eh$AF2)_#m@?@2P5<0#h`Kp>{);aXBtW| z+`OrnTnfX4>+sXyLMI@p2&v`!h_?|p!)QOkwA$B2x6(J&&&x|b_;tO_EU{YiYJTfMfqJ*o}3xZr6 z%lz*w^T;g9etg^!Pi(yDx%p8eH>E@1R}bYYpEHM~6`o$%XIAvlBE)KTFH44T zKo0uhC)PY&`rxn0LQy3JiW{-E1k*$s%k z+~@BQXCVqO^~`$3Z?X2033ItH!4(r`m9ANP)r7f5SFW8fYjnJR!mQQt{t3rh%0c)4 z_ulmr8^3xAN^19qPV+1_x%QGSOC*0lV&j$bI|wClS)kXux1MI1gkiu2yvgkA-ZX8VY;%xdXphTs*y^KN!X@qSY)V6`x1ZTqFYED$OMr>!Eku{-EMRDOFnj4w>fRoV;6#c zs4w<|FHz#P-4bj}mUu<+=$h`iHx<#hti@~#1$-3!r=Kkk`LbtyV=up!&;Uqv5t1lJ zSp6FSLW&-N<|CWHjs-irU4!N@4g0;ro?t+9!Nr6DNHR3MsNm+x?GO5`g-rl}1t9^M zlO*W?HjOiho!QKm-~=s^C{7uWy9!9tjjb7)U}{0_q32|fA`jP|6v9iy7YtaBU*H!| zYt5ezNkkn?5JerC{GAjHIUmPa~Ekm z>?==+QU#re{hx`@CY2R8CF?``g%71+-xv0I*b^}(j~WD{!15TuPkb<*UG!lUQE@-i zO=kKVV|Y?CS93%msukQ}T&ZW6(}8)CN?z(~6W+bl0%5J~q(;;w7;V0~Xt|>q9aW<>?l=ssNtqXi{SQ$Y4@CWyj%srmO#itqI=I|mJYEYEj;@4p*~#{m z`YU+GDNZn-(`ZU6E4Ea+5CUe2=|@38fG~HViC6JR@;k&+T#=5(tS6!(=ji*bxhrJ& z#wwgrbnknpqo8KOIGl&c4e%~ni?NYGJ&oZP)U~Kx^GBl)G@xPgq|%NmE+96*#O({u zpNjs#+6Rog-=O`5H2%IZthi7HOo@Zddy|#Mu$)r6yN$WWn00#09B<7Lux-?s851Ap zNbu7+-U|!bF~=TPt@i{ZR_P=y;?8ZyVu~urFJqKS%(xyD zW>pAy5|W}0`f!Bt8x&c|o zAgPHipj%Q|pGb_a-4ti%?E^E~Y1|8u`XxZ4W*@(O~P5B4=3zB|67k4?vF``EE0Tb#1VgtCWCN1OoT zPvP6!5uJ*?3Ke5RFQO8xo3E_K)?Q@rAM@v_Ban-k{oI>?*EhOdlOJ-^VgYrB@pl=f z9#)QSQG#uUwE!y$O`LV+>naw8{RC!D;v;N!q)oqIv*n6$MmT_nZCnx3WfAzbb$`@q z4uQ%37uG##OHF`>prF=0V3Qe`c6TSxM9HV9h2k7GgX1vgK%xj7(2uPUHn^*Vy%th9 zsoaw6Hd{WL6)l=1#jeJKM98NP&K-R(K$ewil`QY7Rq-CLB75vG)BOaBwMJa>^IcXA zt7qA+VW0`MMwfWg7cd<@yGVV3thgfsFv?j87q`4e3LixL*pW3q1*Zv0)Qaj49BdO3 zmSc)ccyyG zS>C}*D%d*%$npnVV_IRQjW^$yqb2zEDWNx*p0D7n2JVufV>OY2RZ!oywo8G8La;m@ z$|zRxqP%1^=0ID&I(lP9+*v3AmVp}nfLWe2u#cEcL6Q{K&=JR!%1AUBi3EAf))U|( zF~C}j^nC!Bfg>PN@olIMQ4$pv6C^_l3tkBjG*Taqqpe%f4Xj8QykTFpb+eO92Sh6^ zHs949{hXVKN}ahv1mG$Ylg#>36B7gNN)vx8Ol0n2r!d)dcs0-i0o%3riaXEuYjkEe zQHQ7%Jcn>#d-H97$)HXsqkNe*lUzQaG%b9PMR}Fgzmp{?q18df+XCb#!`Q?~uBUxU z3CvYXutqM&@cbPu}`a;~;FKhhn&CE<(I`zVnfU)x=wecO+-f82zt-Z&_*IR!> zpe;0FZP*M>3@;inz+YmHZdOB{Q@F9IBPM0;ax?GHEZU{EMGYF!X~bh@QvFun|GABS zVeKz%{FJp%+xUMmkOr~FrM4a|q$%9&+nBosXl37vSr^YqG&uF!!LM{481F@&?jj&v z`1B-43`JC!4;1q8!ls-0wBA0GPC}?jf?uuoF2!_Z3uxSpPCqMx? zg-KQ!y66XzAKVbfH^uhmIL1OB>-?)@e~s2TjSh5Y=!G;ym18)6r57HFyg6 zrSHn@?)wdMS;Jo`{*?fp%$L*a)ak4B_#1V5YCS%^ZqKO4C)WK*BpDHANvp|s8~)-( zdrYRiXiWNq{k3RlOkyG|20IFk2`Z<;ND5c6EyjePUsPF>Y4M>|dT)y=_e4*0fP>1R zf;W=d)?U+yS2ygMMtoz#u5H9ugeDXyrMF!*!WV4;E~M#I)llvRl)`fg#W{6S^+XSJ zwebdmyP7?#BmSQbdu~U3euurFBmQQGKdoaDbCt*d9!Bx0E}mT96+hNxf8G`UqRalW zD}J!cKh#x>;*tFutNs`cw)WxPcwMhu-y1*HYk%Gw|D@O72cI9XAywDRB9BLBv`fbp zoiG?Z)Q``RM&ZI1<($)sztytmwc-m~_M%pNddr{DnygzO&9J|Fi7p6qngq+jX*}1l zMHdW4f8jGg`W^bnnpS*c%dTz3x3ui7t@x^z|9-1IH3Xb5g*{lVLM!G=CAv#vi&k_* zj}EYw0{eXwe?edT?LNDzFTSMDUfPE(h(8A^Fy3fB^P>9KnDO9bMHvw6gOeLu)L&HL zdb4yLZQG@_#mD=jQwKE|M5g(xKL4A(`1gJGnZEc>efHVD_!oWtm->8n5Hea@WJjL5 zh}U2W`Mknl>GM37`aO%FkyF8_KRS14U{4!}R}9#d1M!yz{K*3alnHKjoW#WiUd}gR`;9CkUe22-Z1Ew4-v6o5=o=d+j5Q6bQ&2OM)1--BGRTdBZ^`ES*}l%k+83>7dz$TX z9$(A$Fx%5?e`GrvQt~*qQ`jzNyM}EI+gi3;+3sY!hwWar^=v<9`y(5KRb>Sj+z!!iYoH&!;ctxnwXwfJngFj1%}Y#=_R;-Wx!{Ux<>ztl4J||t1Du4& z`GLYCf_^w6V+qF|#*Kk$`CSlq1^ZG*P8A4cxd33Q2WYh9D(ny37CSY+M^UO`AAwMp zg3T4*Vc827V!X7)*2(Xjt&6S9*3&-fT+b?@&D3M1eP8cvS(bkHvgzLB7IS`_VK+vM z5`R(}JwsnGK|f~x%RFM-?w~;;#2T1qWk_@RSmmJdd|Lh?7Rd%%R^EqeioR;|r5oS+cu?0`H2Y-;dYjK= zJ2?3WLo!3`CUOsFKZS*L@wb@kA0T`yq3n}=;KGA^4H87W3SyR3B@LJRw)7J;TY&Nm zf-q};ikBsFIkyf8du3(GURAPlCkss#a3_G!7i22LXhZFMz>WHua)3+yF%U^tg9OYN z1_JltOB)lR5xWaQ{W1S%BX3-9x2E9rcIU8vbJ(ZrY&8N+M=J>sP4@zs@X!@f&awAa zf=yKsMGMzsJ0TNusvUeP+s9zc(qNsE_qT+TtOJN}84JYV4X(fqiv_HgC6>c4b2sp< z0<|I5#8+W2zN-FF2Ao}kJ&{wyDn!L15FBAd-wcwV85ocB&;l$*Vkc1^{}GL;R8;J8Wsa8 zAM~t6r`9F5dakCkPIh}UYHfGo6W32OLCpW%Hnbmw?O*qpg1ltHm@HqN9oUr73 zP(dIyD*i*v)zp35j zmoD_{N}cOVo`z<#p0?R<`8!H%QKwA2`MIZhA=TLI8)YO*CbR=zkuB~?yoj?_c#i;No4qFk z?WuL$@^|s>WPcFXVvFZdziljA!8VKU;9#)Db6fVomgQ{TCrP{Ci#n5aYvVVddp4d= zz5dVY*||l1w*3C)V<5F&L+bhVw+JRS<-9>Z4{uQ(p@TMiKK65_{Enx*PwpIIq%r0H zNg3#B!*eN_v`#LU)>`*1^pA*SR|?}EV@v1h3OE_1in-Si*=bPL70|NgC~LX-S&+ai zJVOS^PL$&SB+|&5bF4d?BPwbfXQ85akhFhi5cR>L9Unvx{_k4#F|uIkL_ai*YkLv% zoWiyax8LS|%)CP0D8dU#{ZEX4t=oqPgZD@Z+d#2re!Tf5Ou|z0apHEXF4GB-v?B!# zm=`bwwYxgZZ>8q$G5Y#9tY1Y8N(w@4_IK-^xBf>4tMB+Z2?H^9(UOT?>cN+M;Ydfs z`}PY*vml~@$HXmQJA~`#<$v~)ui+8)oyphGKjC4IDaka@Fu@EkXb93YA=V@-`?9ZX zc*#PhR5rQSxdrGdY;sgtI2u6|L-&6-kazqr4;}L|9&{LsBXkcs@bqgh`NGZ4-8k8# zo7EFog-bVo`b)kvr3vv}>IeA^uo}wsD>?h0y`ok-^O&)}zR?;0Kmov_D^2>GCo64IIQ6Taa%qhJl-;2nF5($(gG@vgL+He^)d>) zk+nH_@5^{_H6rWeZ7<_NJRugCx0-)N*R?hF3je|pqx6^Y;;)U_E&1%rco5?%IEC_u zHa&Wl?AkRoH+I0OK{8(c&rQ!d2`=ctj_bAdjrL76ODt)U z9{+M?+6qupa_Gw_{#(Y7ez>vC%Xkz9AvW?Hf)*;kAgDdeH;D|f1(w>_6^{T5<)9ZK z=J7v%>`@zkio)Lx0t`yF^0mfZXAG75hb2F$lCL-R24fhLfB4vMZ2ZAcGNxDdOk?n| zO^7S`Pw|dB6xh7*fd`N6g8$h_)LDx0lI zB2j8KJL-fwpFw4PvFf`x`T zmg!S*T*TVP>LKokmc=1x+5h$X9h*ImOO;qp#nPTqN&*SA`S1SCe#cC*srO@ymZ$zk z#DU5OxmQJWJ2C*gxT_F1)T?eAab0HVo9dVlNU|w|O(;&DZJM5@t;n`Aq;oQTFm;$H|7`i4&HIZi zha1ZxyUUdGp(*E6um7`pk|$=fdT;st&BrG()m8(2$YgusuB3ZY>-4LEIGyC*y~A6S z>pMD|o4-da0fJ*U5Fl+V4JF*B^9G|#Of+yX*QzfnuiUA;%^UkTM)uhxBs620A0~CwX zIY12S;1`&2tQLw8_l|_(NE2Y>Ye+F>S>)D9lNU%wQ`)DT<){cTT_KHIXx7(@X1!_! zSqCbwAm ziu0bhlD)M^AC=l)Ax?V*Sckc2M#Gn9GJ1lxMMyqIQf!?{i12Z?5#27K9%G52O3~d7SDJZ}Sk|_SRw0qWf)NahD<&;eco4Bcz8jGxeGNYryvv!2^r7rZ9ENe2 z3sK5OpS()65+fE_VB*h5;I_7I5hpi|ih^g0IcAI{{Zh!OX4GgzucsOGP`idj#tT)g z8l*?0SyPvfxQaUJ};Au!v4GSb6d4alL*|7!MS0Ce^)7P^CV7Ju4& zLL;mRnSYkzIRbeHh2#6pd(5lC^H|u~*Hb_0uHX5GfO5R761g2~RxJ9M7fSV`Hn!NHRU~?^3OEDVurLf;A?EU1Ga#SWi<~ghye2XFBQ*;Qf zH4`wFbC@{bSRCLnd*X{*mHY8qB}Ar{6U{@rHFnfVasbZO3Zq1SFbgvhln6u>O^6tI zF<~zlM012t>1 z1G#gS!dh*`v@gZ|z!`B%JxLPjc4WwH47EMYVLW!=Hdp9js+4ODLZi_i6dDV|ew7J_ zYS@>oS}Mm73Gs6%}b z6!Ehc*t3NGr}y}5j6bTq(9!DC{07;ROWW( z?`6=Z(MzmQLDz*^j?vWe3m)cr10AU>E^>7ID;q1}QdV{jgrBhT~BbXBO9eq*`oT z(0?ICSU4H%ulKvH^Jcx@E9`s1zCY}%VgK&1KPc>ryKfKYd#>|jmU!4l7i0R&1ac5f zKK`)%kpD#daS1WwcP9JC?~%{OUP#^#tu3G0S0Rx|7}wXCo#>%m%`1~V&0FF(7hP{- zGIjtUP1Tguyfdv$FsUX-QqD_N9EC754`qDP{70(gxSW238IT+*x)ufM8xyU#6~CYP zx7tCIFLT@zs8e{1NznR$d1t!6*^k%XWj>bt7jI|rtL+;C&AVUxFD9;my93@-tT6&O z*7lw(&AtMh^~TLg`!`DW$(zi6$=l-ph~J;=mmVT)E#q}c`sl_tw`>GrtIwn&ILb8O zB$J$I5^P_{`C0&q=J8$dIa=}F3|F@&Jci1ukmzsktT%mExxX|7Jd9L&^64~<*TC0y zf-z5td%K@DhbdF&9)7yY6$~-Ldw2Kwwa9NSOo4m;7 z1Cch=;HYI-0~yJ&$yz|Zp6F55ZTb&khV=x*&MHvi)Q|$<>Oi`>!#;zRP@39OvZgxi z+N#?tkwF4UqRj27c{J|(S!~Z&;Jf@gsVk?4S4$UG%|+Gb2IwOM$Mg!5=iD@XDs7vh z{ZiZ$o&6a2Q$DbXf0kbdLL`uKg~+!eoyZcLmFR_Ln)7y(7OgaO#a!zjjP@4Y-d^aM zf}bLii87On90-LH4<}Lo!O>TVUM8&qPA=WH(!oMQH>4KzI&@yR)|5r8V(z05VzmxQ zj>vt79HmX{r93ZNcQS|aZbsdhMXGR}*YJ&Iue4rrn?k4+@H+j)z+pO!^WYJ@%;$dS*P!=Om>Po#$h zZr2?b+_@?QHU}zby2g}k9u1h4b!OG##3;9yOqd>%B3nIB(fE&2kKW7c16&1LPo*?HJyn5)8D?n=vi**lCy*P3HNvw{#HI55&fNGU+EhuFVMJ-RCz&MJPydoZRw{&cVr z`bRoMQLerKI1cbM?NQE<-Q#$5O&jWze$gK8%wMg2j%(!a&^@=E+0j8{8o=o#P+I8DO!1bm1K0g?53i!bObRZT$RXD>t7`!;UGa7b#XkBA{}X$TX^; zhvS?Wjeux3!i+`kD5i~jb9awjZh^%UtvMO{NIfAWIOYIQj=H%Gc^os}Nk5_|jmr@02fDR+}WOxgd!0z#QR-W#MB zHNaajQAF^;>N#W<*vLp&Ao`<%n|cc*Z^|{ox-x8)gsqaZRKj*ws+QcPFn4T~dfb5n zTt}tpx`>Y7Rp}&gG5Xy~w`pa_gDbr?$^6K_@EXO(o|c8uJ!Y5K9E=v<0vnFEzdD1V zno*yK@wfN0dPmG~hDIOncW`*|W-@yo0W(iR3%*sxR-fO;e6Mb`!vwC*ni-RSGwp&z zc?7m@7rdYhvnRi?fWcuInvxLpFNq$;c&!kNu%41)2(ryWhlA1zgkFMq=Dl=f{FW6& z=ZJR?`*PS{Xu{#t;?N8~Cc?fm?B}k)=%~M0f|j8x$2uEbOW3|;*nLsExoihS=Oj&( zAb8-$@`ZQ?W*5f+qKT$E+MS5yc3a%IJ?_}q?U$=tk6EI-< zRML1l=}0=7>AIw`KIv$6Ap}-c>^8U=OpZ0j>PM!qTstvac4WgZxnxh)ZfmwTszH)( z^`qla-1=_hG@Rk$(wBau)=kRg?zGOeG~S^jZZ^9rgq(|O-PQ3%cl|YrepZ5&{4HQ1 z{RMT9vIDtF1Gh?01*VFYL|CM~C%5lth@EKaxi}%L3?0b}J!`uXGkeTpT?@k

^F@ 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 z z zdHiY(hL>^$#{qUO<^fUjh>w|Yt9rcIa88r(qsiO%Jh_$1+_SSr1#FJ=i+LZikNGR; zb=5T7+ulB}jnPxSzb!AiH4vu#) z5=i=a**N<}mbhyUw|Mt}b~16+u3lWQM>TdJA*zp$JA+x>C$C}BLrrgSvRC4qm1!6dXLu7}^?488 z8CLrbe0bcKTJ$IdeOf`^+N>1~zs7&yVQFa->!)gcqXrfPbWMl{0zpJb1h8G<0eqeU!}xr{Yl5RO%U@n?c%Q&+-@MG;nqrtk1_zx;Ysf%I|G0 zW@XNgsrQ2m2^{LfWNrVI!>;kSSn;q+wWKJ{^ACrxoS5vY`e|=POo&fR`{Q+AjZQT=)Zcr{pj$=`OXt^OvO=LSM!Y~ zpO-sNp6<+Nexp7gWxaI>L0-h44@X5k>vx_!X=5BRnWUptad5*cBzYcrQS(wh&=~u3 z^ULQfc$5*LygY6{vq~BSEX~R|T*vkoV0!YRW27-MvdYt>xVZOQ+O1ZQ6@I zmY>NOV)3MJMCJuiit?JScpOa5)`dP2%~R7Vp$wbQ^hic$$kwD!YcQqvp(9S7=8(~r zu4Sm8SE=G8t3*=mruc39cwL|sNnWnm-ooCcVD@P=aUmJ7I}k@Tv|&FqF&_%!%~;3j zDb{Yl=ATft5KNn+n_QxeUul#IO6v!`vVvx;k=pyS5L6JgHz?$NGN&FF?@0 zhNntseFiFP3RY(f^;yFcg#aEvPElKySJU@1an8{W!xN%6%FMw{VfP;h0t*&U#Z%$8 zKl&EfoEk&-^$5ZeGHRx~Mc)vlzbYn)F{Vq?hm}e9Mm!kL{@!B?uqLe$JG|iDqMl)j z^l^gj#OH@#&1AY$D^ia~Mtn2i05E34gtH~U-)(R>Fm07Gt7Kj(@sgg7cw7zXH^+2i zPnNgPJ(2B!nz3$kIF?s|=E89r0RtRE2aPMwK?Aa?0tPcB|M4*BKQN>L!(fuj0}*jB zC}e7f3`)5%ZN`fbILnHENvp1F=_tBR>smU%>!C%rbmV1%!sh~qy#KnXInk8TOB8J0 zC^IJ<>5IQ6?UG4{w*>gjJE@oEi@?PMZ!2W|M2uk%q_4!;))T(YJ=_c|F!xZ_yA zZAH-CdqL)hjKBnr5z_@W9SkL_$!2I_7SQX!{O2%`3jZ%P2j9kc;kP!M4nn;aTVewo zP9~FZ#RQ~1>3F|eQM(4%{51L;2-w%Ay*^`{=2bMph-!4$OzId)dmI+QJ-n|zv`^sf z{uLDoPb#L{6xCpwiTb@gp+`GC2D z4WqVW&Kw;*cZgvG@rZ}+)r>NX`7N!@bI`>&!@w#P7!D~6K^&)tu~$UkVTLg(DpSE; zpxp>2dT(e<>+TOSj0-xN+eKSB)X+;D{VBs}XiC>FLZ^wQRC~h$De?&!emGEHU7pj= zlbaJhg!2=j57x6WiCV!k0;Lkr;^~u+6%a5{+DD6QD&09bldhI1f zm=k_)V(=?P8FaW;ok^E>+a#eK&^H`te9ELBkrzXMS9JFSSUO<0GHILX%~EI5mEBOi z{${4tnF3Fn%`|3+hBR2>QkkuxWAoGW#bI`!m93-gXz&kRS*9LHry_>p%a4E-2$O!0 z+?Wh05aub;enH%{RInh4gHGV^@^T z6EOkbAl?l%5z~=l^Nt9W0CCiTNuvdu)iJagY8~g4Nw-Dd9Z|>7lRZ%I1|uGu4ZGOk zTiM|-uxiqeLs;JTVd+KS2Gc6hP;=@GU>iy_)88nq&S1KtOOQ#PI)kq0iYt@kH`DjJ zYz#!a0w7YEN0VNrA$0~_CAD6bT32=1voYU5<=+UiTg{1OY68>MU5L~`9nV_DGZ6wd zPWu!#-55f;QoLL2tZ-Mja8RJrZJ>J@nIGM|^e18YwJ48uC@2P9(&Ei7G?xI!UjvR$ z0gk64LbS(b^XOf`@!b)@@Dd-xpa8d;o#C2M$PB`uej0Xpi*z}_F2Z)0p6`Jr0n>65 z0tDz~EH-7*_mzYTyxNJtJd?f$62KG%gWi#E@ihg0FalFWCFmZ5)-hBFY`M2{Gn!}m zwc5@J^XT^k9pDZU8Drgs^=}cJYA8O?iI4`9=_wRvOR$GPi3nn{9JYF)yP=MG7QLZE zWG;`SnO=v-h1Lpf(JMXubY;XdC($cV?5+~SfCK#W*RY_I&4%}q61@aP+>u}>{Bwsi z^Qhk&Lb(9yR;V=WFoL$WKwXS%$8hBj6hlY;l94&<*#(c$%?d6M7EB!oVz6ilxQIpI z1OZR+S&Kzo{R|wKC(tdO2pct-Hfk)07Z-yEJ00DZ3u5@p`v7WA77T~Rc+?IXj>Cia z)J(MbvnI$UXKh zn}eR6tm9eW+W@};=zyvZT;exS2L0cO(ZWziopMLm=Q~2Ix*hsbR^}nf4t>5aM)wMf zbaa%C9v+%<*`a$fai#}g?fO+FE0c&yzcKpg?w}F^pfCeH@c<1=e-?K8cX5yoa2;30 z_!(iB4zGm2af?5K5-?=G?RLz?Lrk5cjcyYH63w2@$k#(PY2 z-;kZ<=pYCmf#xE;VN9 zQ3Lh|%oP6Qs$nd1ncnWsWA;L`kMti|>lV#Njx*b);bn`;+orK={w*XL&#(RDA?KqWSIoHs*G|jUa zcG5Q&2o7jN+4erBL>AMP6B)}q`aKMyh8=Sj9k9C(RDlJP1pJlwVZ)m(q4k88`~N-xLbpnYXM1y*sF zYzhfw`)4u`y1I@gx5Qemi^cR$(%OcykGLRuBJ>qxnTkk*+1#xgYKKk>TM+<9@0EAp* z1o0JY(T6?#Xf9AdCO=kK)^d0xh-bfV)E8Ki9Yp$JXE9IKa#%8O zJh@01#Xe?3SfxJ7Jf-b9#q3u5Il|mtJdUBLSx*U_&8G8ic|;CdriXt+VC@CglGD3j!!M8Q#t9SErWMP{?s&+-1cOjap)SLx>& z(Kw+%&_jktzY?Vt0@5Hv^@oh@97B!op(TcQO3Sc_O?c4g6Q7YoW6}`lSa>rXfWS8F z(bAPvq*oD@ZzF_GUS6IVR*GJSF@vkQvRYNJMQbuR+3}{~L2F8}0uo!Czb>@1RdO7CmBYuTm9sm9+3Oglug?!L9(g9)<$l5H?V02<~RO zCZnaG5C{K8Lw^Fsul|=CdQlFwRnQ1dz%Wn&)US~dylHrTS@0 zw)tR!d@Q1!Uc!Mtd5NY0hBOWBI48oa!w`co>kcpDYV$<;tFfEuO2EqWhB1QQ*%&SC zuVPRQCxC)oaD(G;&B}-e9I!)gVqD+Nfat>c`#avP@zD-=goa-=wkr$@B>#?)_Q#}0 z1#wan$CVj-Ic01z`{bYBfwmE4JTUsb*|(f&ix6%UgSkc^5EB9Y(MbCt43JkU816}d z8d1&;J}svgjJ{iE(w&+3a!$}^Jkys6HeDVr7flX$@+OXUW z`Esv!$JL>}WT#*&$zojFPk6GNI6!a@NA~4^^z}&dL#-#|+3ySAU#1gI4WO%ZnhXcFDbB zc>5+E(w|1f8X(t%?4pqZhgk4C5v{D%Ndh8<(b1G@Y?#|rFX#3B;Dh8zp+lKN`}xv+ zUVg0{!}+ZFF+9fp9$!TIDlS7UZYma|<;zgTT4`$6`J3P$fa`Ey>C>;Q^Ed7LS+=NR z00Nee!hUVud4Xt-#^xs3h4H(2eoLw~ctQpz?c+eo2g%+c;f*bgsk)#{5WqzRAznzD zP#^52h`!2;OK=g@x3}w7mG;P_8t3{Ot@uj{d?h8m3nfn|1v@qy#@yCa%lQp;s4afG zxtd1y<9R88>#L)weRKyJi)f-WbXZxwlS^JJ9niS+f^gk@UKX10G@J~J_Vx;Ew0e0N zC!)ccpVAsucu3-5dKm#^62Hij7eLl&j*f--n+Ib!y_MhuC19*e(9!8&jaRgVE$Oqc zz3dyV^yV-dd{7uIPLIYk`&em0Jb=H*q<6aGs)G7V1WLZwJ*+CI7r&Wy;RDmk;3=yr z{PULLJorbq9YtCP879-0pnfMPmJWuPZ1(}vF-|aCyX>rzap6>knTF=eF|OiRjr?>d zf@8GUO&nosz3j|(XKNRayx71FK?#JTy}{2AicmhmB5(?s@Tqh zTtyieYP4Vji%q9ZIIIbW0E^L`5!>oSt*xt|MC+&LX3pjTY6{IDlNN`d+zMY5=QtH( zhdltl5oyUpndfIgF=8&PvBA{Yp^j{n>0nq8Q5JZF5`9~De3Y9A(S^PwI)7x7_X^C<1L8pHH`+KwuJ9qqM30F@d;mlJF^34$Sm6SO!U+61~o#BK8t zhm*EW%8f$yF^}FA6}fYeoo83#U^eVJ`rNpMIaS-K(}vXW9IQToGI26--RO3z1Z2mU!>9XYP&M& z_nmPy#+*(+R=cUoc4J(lOnS6)f9NoerS)oeOquj#Cs2EbN|Si|p2j27pb{dMkBqN? zQp?@I^K%~s&}|A!Y)faH&B-B&zX2$jF6)HhUmUZ*;#<0#OFFg9EywcqZwhgL^X!1T zPFWrz_Qz$K@701s;E$)#ST@87sBp0H!5!hU6WhQ@TA;;l`qWUtYb2Io>@s;@6xKCm zvh-+RQf9it@|LqhpY5YkXoH{-v`Z|3zfdzAc4ozxu3QLHEOs$^)xsW@8lpw8xk52^ zkk@9I%F?s&uFR`+;o7JHg+oc%iXYPX5;UTLqOn*!3$hmV#P?7-PL@~6v;=Gq3%Aq* zBi@Ma*@@RM4dns&od$rG^t+@yIR|fg)HzIJ($p4rX^dy9gXpmZnDh;09#`up9en-s z@LaVexjF!#X1@Ev^-oSWdfDhATt zzCvPH-|xBYqsp}IFU6l<8B$Ut9~fj7$b5*2X+Ve|%D~3w$1Wj^DafN%Vi^8GT+=Z8 z_FaP-g ze5PeMmx)uFgoDj!+@gyjBXEVw$;xGcB)R7Nu;C}=@WBA*T&0*U%ph-;!-xohJoKT_ zrxab3>4%7|OnP77w;;Vjr^ZA`gtTM|u@c(BpR?$KFeA(4?}S}#2auc_L^_zH$kM>f zHi>q*83M!d6+93Xo`NiA^TLWxNyRPs~QLA^hoa6x2Bsph(ahJCC(FHamV4GU(6hgdfs2zKi3riC6tIW2NY#!?e z-vjnLdc^yDcO+e18Jk(llAxx;W^05Nhk`*%Q#g?CY8#5Q=*ouW@a90E+ZmJ-KTW}C zr!@NwL=I9+t0SI@(7Qdhq!lpA%w+y^If4|z6j}F;`rzlm9SHE7EDW_nmOO2-3tHWj z|13vu%}OaCwHw5I@Uwr3<7=*1gzJKD7kTZQQTG2O&(hl#et&q>wE9)R49jU96vg6xmM zp;;Ieg4_*c81;+V>sx~|{$9d`XSv{*!60h=d=I46_?=($Y09L#gad#mqnrkNf^8Z! z50(qwA*T{7Xm}YLd0RvlqA}ZLiS>%r58_Z*6lX_JA8Zb7f%lFsU?I2QN_Hp(hd;PY zLT7`4D1^A6s21^%H9>@uL3XIthRlx03@~N=2SRBzJF6?K4N92J2{jf@bU9z<`Ngae?3E})ec1ForuM8v&@jDa4ACW-ED!)B4m`w0ncasqB3booy!*F$AJRlc~&bK)S7VW2!+4PMNQ-AX@g}pXO{{iJ2 zKP{wq+audbjock?khR%^VF4kulV zN8C?1H0I^|1ie?VL)T>bmvN4sG`t||rZJ-oEE6Z9|E@%xi!rtqOj|EIQJ2kA^f74k z;4(Z)bPG;rRw14x!A_FCW;2}#oll<5wV4i;Z!Sarr0X-tR#z6hdeYFZplv50uh4Ub zCm5j5gpEu^QkC!tKBv>AKDzq`n)}3vUm0#o^gtz200J;vefSp?r(IZdbl6r3LWLA{ znI7?Bu|!hW@Xvy?F(~kqUw}>t8<=i09p*o|5{Wieo?J#gOQx$bn_=*Dm`=u`jmF?2 zfxb)EWkj#TD+#rVPWTj%e^5g3Z}d~$#1@9e>nReAF0Rfum5h1R8HtgxFxf>()5Fq zH_Z+g$}dX_&MWN5zkd(0r@e}38>|D$G*71+OK>Lpd4xsMjU~{X#F3<1bMfanhK?iBj1l#$QTU6MC*z=V+(RKr9WruI_;8qWVL4J{jztQ=!O39F!K z-^wvLFNv-tv2rBXT^^jTS(^WPEi^sa8G)D98UU-kv?nVB^ds@k=8TWw&TQS=I}7EZ zm}|DKxv8yPP$T|8JS6fK8aM)*;LdAns0#}D!oBZ_T{p_*E+Jaw%nsKghRssZEB-5&P=`5 zfs+>re21l+D$>;1k1`b=EwS@vYEn@2EK&2Io>7}vstAf;U_E4K0+N%Lu?*a|mdu4DhLW85Wer>%TL%9XEDxrUf^;(|Tfn{-6 z6h$Z<=CQl*&qtWA?Ps+4da@CTTqXOSl_0pmL4-8)5tvDdBm;W3P%m%*eH{dD4r9=h-n@ zAliEs9J&xiV=hN~C4Yq~VRHgqn~@`Yw8Q9gT~!j+9YXFE-Ovuhi`lVCgmIV9HIfMi zl3F$9dKEj_XQ?MXOFX54sxkQ#11N&3FrV4QEu~Tf*(Xh9L?XYI zjqShwJ=*kxSbS<}6HFi}P0&+>jv42=Zp?MvYB&EMp5;YMzR9EhFZ}8Mh~eMhkH~69 znYrWB{y-vh$T-=>Z;(NJ`QIG`mWpQh;ShG_`#5}D3?Rr~7)T6I$722f{MRzPSP0^} z&x9bB0|Tyr`NIDRn0oo{1?GMEevb0N1hz)~S1m~P{}VX%e+32Qr_{u71XiQW-1*sX z5GCUh>35Z<}fXaUuV+ zEX{u?%YW#U0iE+N4aj$GwiT82L>7Wj7YMg=S$=9)#Q;vdz#lYOXPBP3&@@b=e9Xre z$BT%l;a*!@ODZbI@2kh{Q%px(7AYC_SJ%9tzBM(seqw8TU30NJPc&cq^pC7h3e{Nmd zLO{E- z%t{uFpw0Yi-SXV}!XeGCJHNhe-uzT+aA0P>bR9reSKrj$nraLl+geghZS{ddK7UTb zqQcUtwp3G)Ia`xoqNQ1;&97fKSF|SxhI4VtYS6C#6nJj@?*J^Qcz#M;KM})d+b7pw zb8v5Ntizx2~~az781GkAC_2bL)^hH+WiDTiX%LXkc={jHTw*OLGMi z-jZqxWmrk5)Yv??;B&fuP5@d$^Gto;YCt;vW0Rad6w+F;t*U~YkF{Sgfptk=w3e38ejv$o^#^2gJ zCy$uA*7{U?ePT{w@}h{Lk$^6P-?#^~@Y%m04l;k!g8Z2zJi|ic7p-5^(0+b%bAX_{ z>n~y$b5e2-XRw-s$3n(Er?FXQl8G3``Kh+^qjHxd9_mvq>5lMLz|g%2#JA6z)0)q3 zm-kxYTj;{XQMb@ni3S_m+MDOLrsn&AH_j<+6Z4#CtDherJ`S`!C&YCytTd^XB9_3CFWhw zQQr|33D5YAx{*?^e0^2mC`xT^lXG@B8`#*;)DghsS14S1A+Ol`ZBug-PR`Zpi#ieW zq}%kt^!E_|sin2Pett`^O#LS`vDeAOAbl?Gam?Rl=`W_nRBe5L1+b}rbG8a6@q22m zZ*N^3{MP%}>7ySLwav)1EIv-)Awwu!9iLW<#r z+c3XA(bPOAH7}qEyumR1UfLT+(XQ+q1^ZiIU&bD_xTStxLsKwO`YsB;mB3;cF^mQ2 zw&p}b6F?8X%4M*L`qqGLLjFRW9Ix zhsm}t{F@X*J=hy@xZ$D*Qzfit;I0ykQYgw9Ht|2%f>|!+R=mL$Ja$XIdSW-Q)eTVz^UdceEvN; zR3_66lC=O$p;_F;jwxjNOAnCweHgG@RQQXu_x*_H;$)%2l3mOKRMrShw}aS-2{j=; z9w@w?eNz7YL-O9o-<16OM+@J#&efB zkVsDCB1Jaki~L<$sdm-n5gk;Bd*l#kg5#95NE51qiRlR=E7yHK>|u{zUF!c>=K1## z+@q!IFGhWTV!OlT((;9{{zk+l;tJ3NyF%*{9+{v;vfkyID+IxWf2dU-i!{p2$&>w7 zn0^Z=u%5`;PKyvZ>EO_+9mMty=8L{5j%$`vMp?wzB86+H4hv9^O;}DjmkB3s_V`wqJShV_Il7!G#;s&W zoyzn!!j9C@v|6rcTxq89a%YdNj%KInIZneLQ(#~ir!L*M(FGkw61qu+r2 z$|XTy27YB)ycy@LFdqn>;$AS1fsCz=W7=eR;;l!zA36k?2LTYmZJ*~#IH(*(R_kAv zcy!MaMA4K2IwXVwf6AdSCZ!IOlEA1EtmlR@@nCOEekFjfoK{7~^|HgsfTY%h-}I%c zy@;rCn7)dz3Soa$eG&~qXQTld)n=KF#a#BPdGv6PtuBek-ID4!+J?Y0#Nr?kk*%gO zz1S1i1aKS;2venvDorbIAIJ8Z9Znawj;Bho98mq!C;SUGkMiF`>RQnt< zNU7u4Je_V)yRoF{SDiR40;tDejk;>8-19mHM0OnAkB(Qf3l4)3$WbCRialZwoI8b_ zL$v~ld~g7kgF{|Xrhmvbi42o_kf`uN<++lo3$+~{6i}I#b;W5HdH!2H0Iab~JLBp& z+HH8M9QPM8og=f3V7dek2;vyYEYWcSAWE~d^_iz6J1Y?aFYoXfL&WaG^u=rqU5_L9 zvf`1l^Ej3?^_X1zNn-A>+?Hni<#rt1157Yd?IS*2TKhZ@Ce(xongl|xk*ey;wwj8d zw*ZGXMI^e4X2b)&Kl!YHrsxT9EgrypBO`>5_S+&}K!0oUW!HgE;z+^)$dZnnlw&b* zg}Bd&Ys+7Dh-K2O2&;P@)28kMietJNIl!j$dFWIkRZH_O>?v2sf2gs z8$R48(q#yiKn}R%^1!}5;hX-~m5#)d%xMpYx0Q%U$q4NZr|B zvzv5w*y|52d6UPJx+;!v;cwvh!4z-nU5*lHeq*fnZ`mtuq|`U@cZ zK>*>O{|yL_)etiEb@!{O^cz9^R|JcD%rwV<>vkJNlcSde`u-_4UjB8W2i5`dx_U~S zzLHf_>HV-aJ!tBsfrFczm=*BV);ABojR4K#QhaR?hv9o9g3#)5nwO^T8Jyq()~=I30U{#g?OfGaqbv5 z1)uKGH-&ZI+!eC!KNI#G`Y@9A@7=9YQ|b3O2`UJr9r7K3iLiB+NaXnGb9dZ!$}##g zLcR0+ih32C-xo#by-t~imBI5aJmV3%myUV^hC-HhSHA0u6hOmKK5+e?=Rf4|;r1e2 zALKR|<%HnH!ctsW$bIA!Z9rx-6s6zv#Bqs8QKtWJPn5 zN*O?qN&(B)16+v!0c=mwD<=g&e51wvct=B#|C1f^gKk`L$Ch4acjlw3cbw~!>2Y+4 z#1ab|-z0O7#X)b77qIb3=Y?folCnC@a}CY`9O}g&hcKmW92!Nu%&NVn`_IbLlaJYD z`U_@zqsUl@!3icf7Q+swPX*wVwUE_5yTG!}QB2}pw53j@H9bN|Z$&^@C$fK8o`qfD z?TAM+vq7+cG1DJP(bYLQ_<9_zhM0|;U>vSf<#bJ#jZ2D!8GK)PYAW5|8E%rpAUSNW zfmA%0Z)X7QV2sZN>WwkW2jMunUw=e|h{MkXyGAl7P)*i2=oRd6%Cxk(V`=cQMxR9F z+%}G>6X@>|5BCON(G$nf4=pjhfirrl2KON^%M7b>x!e;k5W$RAEf?01OCpR@38?-@ z!-H6NZ6@wNfh|_6a(V`##&~yYCQB_LI(N?Y$5K;H%Oc}AhlC9P=MfFgT|MziNJCHI zMnnzCEtz4D6G+J@`=xorE>%vC8)-DYQG%|wA(ON!r!zcNBdn<_%ZXt8laq!4SE{NB zuV0U`lT5ON{2xh!A&k>)r{4LKHN2qK!%tnr!Jq-Jy zn@V6|`2y4SB`~^x&avy@_!IsWcw#g|$C@I7W^Mp{Iijd~Ifm8x)CnNiFEITq9>?<| zCwRDO6{jlyF;m2!4aa+ojZZ|Nb+c>~z8`uont1= zbwBUvCrOCL^rMJ;`+biM{^oEED!itPT#>P<2@0G;?eRbqUDpu8^BV}*00F%Q@*Osc zYBb_{>I?MWwo+6jU3}f9@qOTR2$?m?%n9EK8>$fbAnZ(<=Xdc%x%>x3kx4(v31AQilSRIV<<2q$9=F)hm9ufG0(!6B z;xQnrnw?u&q}7=LqikvP8~+lGM`qRmK?80_OXG$j=$uG4#*WKQl2b_>!Gii=cHpE9 z^-))xXb6WdfIa}T1q6%%;|E@Dsm7XnjuVJ{ggFx*aCFr{oHP=;hQ{B?%^@^88IMMb zwIW!U>+%Jj_UQ;+St|m~siGxlf$6WtxV+#uA^boCI8ivr&g@<>P@)Cm5lNhaLqUU9 z6+}|3^8A#{bYoT(E?OGfSAA~ zP8x?ygfAOIbX6uxFB@qyMz~7q0vlNy#CC=otFss=j@4lBAJs-&+W1_)4K%S_4q|6% zX`~Oqmfi8?oQnpVf3hQ(0N6{*kuV1G%_)8ayBGEINFouyUhR z9zUw!9C>#@(4auwD(|dOk$T{;n!$=S2B^lpd1#IXW7) zBlDE^=)6!~GnR&s_2Vj%4eVgQd`G0qFHv7-Tzxmfv>7U?up1sxU!noXxxz{$`!w(d zavI>-7G;KOw7`K({V*qnMYgaLWy!@2PGtT#LYZM%-&@$B9(#}etWX)JJe`1jrUxxqz0Vo6~Vq9uCuQ)eIiY#Al1Qz zW||$mc&gjB>C^g^r@l%rciS}2hUPa9Rd9tvP;_&*O{aNG7sQ#)&mu>Z)Y#N*(`WJ8 zW~#Rd3`%Q~9k@l}t2+CwZ4KJKDR@NQeDNr)k~iCe z0zU~J>2QcVCi?}R4+`8U1)lG==@Y_*=h!t!&X1kUV{B!x9BNQm!+Nxo0}l@N{T(a9 zY5cV@PMJvC#t97LALs^GV}L2UQ6AtVEw-uLqXl*l7n#h3wI7t)YfQiPTe>zDs$aLq zrZSHfhIMxYbI z_YAL&va=Ps!{d=5PDlf{_w@4$&IRL~u+oS0Y`P+%R{~CHr!=vWT+E9O6Gt4 z56aJD7I59KXCMA z1aFktNM9eu%^T{n2)!VetlpTh;mB!(Yc_#3?dR5-aB&Fy9}I-Y(>+p>eq+D_?2_a} zBFm#ivM|?Y0Q9qlCkzXMd?kmJwI<)#yAW~ELS2%b=VT7cL5affv~;-z0KcG)Cggbq zdQd!p@xNwx;wAwz#l;X19$GOWI3W>mqfM8DkY5u4VOujU1^q1I!Z~_zuFC3+4?T^?XMEDcasWo+c=83vM> zmg%Qg_0#wCQ!XNBHs0@%k{9ZyJ^JZSy5u#wBr*e+Fz|skU)0}zq`zIP>%9%FrV7j4 zl>t50gZUW3fU3aeX`$_=$OPl1-^sU)5wC`~xk&Fotyx_0aan|J#x#lo#8{={Jf>6} z6wA(Rq@y^@W2&`b*+%K}@ylTxDAAnjvIz1+##IU3Z=@j!LE5pA$wkB%M<2THg)&_g zhe4D`4(JLa);&~B&) zNpvXRpwE@ilSWz*?S|N_qAC;crj3SJ2< zeSMF=M$e*4#MJ|eN4rmA3K;Shw)7X&RPq0d$+LvE;W~s&7KS<}3YVh8@qkfmx;*S> zDa`$1Crhw-=AK|RE?pazSmBpQxiK96${}Nbxw|STIr)mPb|@L@o$xO#WWj$v;p7pIuJO5>Ht#JJ|lU669m@zI=rd zRDcrXav}-|1lbsnsq(!72T046VFxQ=(&ho-x6r8Jc0zyV5%1w-v>(kg;i|C0_fSDR zs^F0;0f^k#wme`E>+)sSNm(#dzbtia=4v2y!aoCyCchsx-H+m&^OJzaVWAOSlpX1DbqZX@_g&)yFomLG@&enHULsD zOtQ8L50^Av&a433HP`xWO_hz4d({}mrZ|;KJ$=2sQD$z+7n*=Ex!7JYlhtwobJsAq ziU{1J}Fo(%5$h|OMvUv&w`V>3r1g0w?PqKK}UhGD42v4h${<5KrO=Z}IFazc( z?}J;_#F(1p-kVmN>4-G!ya{$@2BX+M)Xm^Yqk5gbj*fHC~8WleZ zYg~sKz3eV`xd!cYhk){Xbcbwm7tds8!>wjHK@%u!}$08wcHRi zUQTyK#sPbfMkHMj7z9WZcV}M!%RJMwu*rbGK7u`qlag9phAVwyo5GC3;SAeQLaU+> zU;&^bOh-)8KM5LoK^g-7@P`&*9|QX6z&`X3Uy&&ZTfid#8t{dGG5%#h6`W`e@{|A% zP!|%sJ}*aB{3IA4T?(cK>~R{Ep}0u{Gs9J#FZ+XnvH%Q)#W(|1SqRAIX_IgA+n+@L zFvbBe{2AoLY(0$3W=`08!yj9Vd7-)*mj`rwR|ebTvj^ z%ZNoh+Vd@JG&YS-fDj=Zj=t2(ahE4WJW%B{+zDlDJkxU3M~{h~KO6IcwFZXnvk2iA zqaIE#{GuPU5GTU5Gb<3f*8J2*z<7FD=XceSF!y4kRpaS_h{wxC-@3cU1|Sc>^)6Cm z0#YQgXTz!rW9N}{Tc?zH1xgH}oK|GAYCKG^*db!__g8FodSME5cx#fBr_Q4dNb`Zl z9CYwR2~K%)uR51@F0s{k`fiCA;{>(D=@75RrunwS>BJw4B59=F`i{*Aa7c)f51vooM9Sq)c``8_*%eGnWSQaKJ1l0%G7|I! zOA}s9#-tp{^h77FZyS#Qnm#-~-f2sSnTvN%sx;G=Ff%C^%y3yPSF2K*jv<}uv9k<1 z1=37I!A0txTQWAa+Bkx%j-(wLlh?t_!7y1tVLp%PCJ+QW=&jOI<7utJ?OUQY5>PSE&1XtrOs#ruVc zygDauew3O9YC{YSfTs!h{k031UyWzFl7_Hgs?>S(_F|w{sAdg&-0Q0I z=#AhVt%Xs9wUKT)+Uo2N;zV|A2s?e+?^Jq=^r@-zP!J$Do*sbuDN8x2#?XC>v9W-R z0mp|WX*HED3IgZG(_P4yV1frb!se3I>RfttF%WeXdo(W_aP7g3Vec20VqaxvMUt(9 z!PYit!oUQHh__OId>*O1HGr0-tixK#p276oR&1gOD~xeK*-t6077E<#s`2zwvDty)*0Q6@nAR+|V;~oYtJHXUgVV5TwG69; zv`r6n2$mKJ71p~29f3@xLLaNJFwn^^rDF!=?b6`wQX~z!C_;OLrCd}3C5`DrJTWaR z0lqiL4v|y~>9PRezmo@mzuTp+FGl#|c&69MTSdPHgOqIy2*n@SY3P@cAw=LoeUq1} zl!i6%%K*G+i-Jacb(l<#PV?v-*w5f0L!yEnFgg07&Gbz%M8N+D{b^mqqf0Oq=fS{+ zsM6QKIRVlY7=gU{+Y+SD#X7+&scTiJQhK{nYzT-$EoEd=MVU)9d%0QcF(5wxg+F>M znIWOQpr{$=_=_CQgu5PVk3^aF58`m6G=f_q`6u&deiAbL}^N6j{! z;?de3n{aE*f;g3VRGpUgkMQV3k19MG=h68-&gm@!w<}hQF%?%G(UBg_u^HBu+adq@ zd`~5(APk*8=~ZKS&=gSxu~B-QaB0#I3YK}W=cT}aQ9NzyvJ0^@W4nUz ziGLGvIp=(_;FSlBx7l&X$Z8>75)k#986`51}K6p|Rn2Z6z22(*>b}Z%w}DrSSImB0mO- z)_^?%4AT=`4Sh4F3BKwF772g+b!i{Z#9-S(r^2LrLP&1Z?Kx~k1OB`;|8*$%3Y1`h zY-A{jjtG(tTX3Z&s3(;6C*2!1`~a$|GWz9$YynfduPjaFka=lQ)EZ=gVUVG4M1~H6DDcNJSa{TbF>UCu)tAM=m}JL| z;cxK1zZf1~e;=w~63hRUa@@@LWu~f zrhn*QO}^A1N^wpWO)`w*+>tNvOBCp<25CVwkX@55u$exYRtxD*iy&W(XIfh-`^9Ve z_ISLxLPQr##7Z@l9&7i_MB|z6AJd01KE4nm`JIJ*=Sj>zU0&*8Q3-Q=0*UZZdZRS} zbwG;01bY`29B3TgPXyb|2f@-Ov4?}ZV6O^b=`Z!@2}9P~g&H2c9nf&8$FvbRmC)Wd z1g5VDezV_s@16D4SjUk|miy~}#bl<{Z7P#)W`nXyxq-O>6TS`4J%TAkV z0U(28(5X^WX=w)rj!x*_F@5mZ1Zxh(#8Nv+i&r}y29Z>T%^mcC`+^Bg4?QdnSRi2t8&Vj@I{=9v^O7g53BR& z+gO-6VEeKIJmeS!gVw&)WdV4T9`wPR=9~X=z$(+MEZ}?qdykq%zrvN@CkZZQ$N;ej zMTiEd7JauTtEP#Nn}7!ei{Uy8PMm4K+y@)NUf?WdQqwh9IJ`&s+bgkhanLHvD0+h^j+?wov;^|gE*LezE7*PG2*4!CAofu zX(v_))1|U9=^u;Z)sWg2+Gr3%X2;qZ(+v>>TGuhH?*?i4%ZIKfOm!XO9u#)eG`47yDa_z8!~gP9SMcQtvrpC0 z5E@X^m>x6X4#gyX!7utw7iNvAk31CkqTds7ni_3bn=yQiur_391&DevCpbnWX?^>) zwq$8vi!kgff*$XUq~-Gciz2kP+eR1nMm!7m&|nSI+^njjfo}Ul9#PZix26}c*TKg_ zG>L^%&a~0OI7}@F#%vLkF)X!iG#htp%aMw}8%cXVMHJO+d@U0CAL$Pzmi11tmb z7vD`lYXX%sxGJnHZCQIM4{0SbPtQ81uU z@HmFWt`0`0$BPX7ew5GyclI;zcSUXs2mYKP~(BJGFHT12zEaG1R z*174aaO`)(a)YR8f(e+Rq~YdJSiLMiCpoYIR{SWm0#Mx@+Qy+*C=b*i2t7$tvs_~% zj2zZ0x`sUZkUU_9v4rWbU2(daz!+#lCrIfD1zE;n#F1;K*ptEx2O=H{;)^-NNH|Tu zC68{$)HB^lAX#vZfNea~6{q_pVjcD~y0Z&0E^u2pVy<~r7G*$bdOz5pr?3GVf=qR; zYcqWyFRR7)!Sv%!*bJu8^J=IP*O*fZ8c4T|oM*5)!>Bw5%bl(rJvFyQ{HZzL76e@0 zW!o#DER6Nw;i0o_MYIK6N=;+x*Q;iw&xbGT>=!mfe^+T5D{4ssBrYVqdkN6C%-27M z22Un-!PA4S26nY5+Nv` zDS{_5JyeoLI&TLu%pyd~#L*1>Eiyz`gNS&DUX8%;hZ{oaiXNNpg<{Y2vr-R@gF#=p z7=#mWryoM-dFY&7J{W93SK#hL~!-rG(d^G2;giC_2?{eCu+n3n%J3)bnWRDm_ z@IBBsZ5X%chZ5-x&XA0z=rHJcDTMGcy|g$^KNPE4uxoyZ%^%dUK{)i|Fh$|w7-Y^q z2YW8I)(_wo0BAY5JaMAdqhG>SxWu=_TGa@3INzqIN3AxU6Q^U+v?yK)k)*>HBrF`K zq@xkiB9o6@N|5ByUoaG!pQTN@VaiBLXWFw^^xg^&-lp~Uub9|Z(Ofy{o zP>JcPE(m6?;LM>I{a2)?Fjgf6w8|WO|`s%Rj(#4t37n%HhNSW7IX2%sdJ1O?@Y@VP2t0T~I%#DEqBXScqiRu72kgk<-;m_Cd z4@6-AZuQXuQC_JbZU!r8M+oOTfD@+-K@A*(-4WLqd-McoNYlD-n`#~NfLyS04lzZY zp|Du-QrO<=vT@}Dy_C{tTTaBL#I$T7n3P^6qAb!$p36{0U;yxYI?$u5OFcRX!-h!@ zG&;OMWU*ys5HT-`&~E*_Jb3;1yy!dZh#}!M(m|)9GpYmW?ylHvJAqM?};YZ{=1NR&WKj8Z`a45|0y6*P^~f*e~}) zJT;AWmWab*F5X-!t?w*JGm5w_eW;a)3m4fmQtHvtMK)asMUDcSOz}v zrf}Px)ale{Im+K>bxa(9Ay)N&r z@>|*qYH2JgH;utjFpaM8>q?eiNKPO2*aE^d0pU@=NLQ4lqXaFB5wE9*a}&NWZ3Wr+ zuYRImZ7cI=UYseR*JfQj*s+bjhHL3VnB#hJv0fei!iESJ9qkc6FR=67g}}XDSWLHr zgnx(a=T5nrj{{zpKvgY&I{H9HikiZhmYqS5=MbC=L+nV9p~!u@5}6*@I~vq~d_f-M zbftJ6J#`M#pL&1}riHdTN1P(~e!u0ZbLj4czBqqD9$-}2-V+D;{U{<0yol|mG0q88 z{AEP6MSt00%SMG4MF9F~M2PGzY}4u-iOqsV7xq6aweJ9c!@x*@^=V9B7*glZWF7E! zK6aIJm=5=-EV<`p07=g`D)<^L)U-ZaweXdJB0XdIjk5KadLPGh=SaPXG^2VWbF zgJl`P!EQqaxE#DEz`Tr*UXelz{X|VeVg}Y2gAttw03hMdj3mQT?4wn|k#edyo)2A>Ol(qxq1AAXJ zw2Nu5ubzWwZLJi168F*LMcU>%pyG9(%)c8+#~?CrE#AJY-!ii52!`mdJvOTSK$e2T z)nFD5Cw(VCVpg#IPkAGp<-fqT!#RxULj=nemjKi`^iL69s?{`l19BbY0Cf)aimaC^ z5CwMT+un(T0TB7$De+*aJcsFW5yP3T>&BF5z6F5*-_|a%UBH3;X&0Gps^1Bmss zmjv()Og$L-3SFD&0~jvYRnzFt!K-Ub?DrxBP>=0K=@_wv4a!J=wgh`Dbh)kU(4lGS z0L4+GU5#*GQDd>=0-kUi#_`Sn!EuB9{`>a;#LGlyDD^6y7(Y7u@_D{&8ZvnBJ1;&?`*m%4sLhqvr?KaarG=0>rG`;w)G@T1~rRj_NTG`(O~n!fk0G`(`K%3zbj4W{H`?pqjx1x`2KgL={iZ&$KREv@4YKc#|~DwD@~_jyVCT% zcBSe3zwb&r-V0}W141%Cp6u}lC?aTo-NHCHh%hO!oQ{$`+OT(c;3W_@FDu2*zvm^7 z&bXRREHdSTJs{Cv=si?;@`J+cr!)N;4liHs_>;7DC3Z#Z1JB4&jlAs?#rqdyllud# zG9q_OXS!ywSWrtm4&;t|g2tbTK<=1_&P8%9DtF*i#B>~yC^p9%gQk8Lfg|W+NgiK| z1FWd0C6BMcv49sa^sYwS{)LYT z!{Ic)oEJWZKSKDJPJ4i65k6iEg^%g9Y9Ha_zI@wn2g1i&TKJgGbcHW`T)VgMF`emq zzVPu1rY3Lw&^8G*9p4Lt54eb?Grb1U0b{>hw&>~fy1bZ1e<(qnALWIQzHY(uJM#Ua z2yzRtqo&ilc!8-_)94`}knW6lxH3@85H~~k&{yX<5I&X`5k7Q{K=@eh12PQZ;|y%} z*rmn%@UZOc)0uv@xA5^_fCa+GGF_W#I21nq7`*!7-onQTB7EE|BfWE!@NqyIO8ALd z_?TyZeBtBu0K~NrKCn&c_3K>Jf+7gM1L&@NP=e?m0*Y#MQs2kQaFr!oCp>kYxn!_%z2C*(qvDbTe4>}#1b z7zQetu`_KogODr_4Xv>}HG_5rTIM~XWN8^2buQIv<{u4FFJ>SU8t6t%BOJ22DD>lK zp>_t&TxqU=>^kt*9=A|2Yo{tJs*W}ZU@ zSiz96WE#`&jO}U$-JS{Hp{}fi)DFVVE@r_6sB(}e{GnM|s}M9a1FJKbDm;W_BHdc0 zrm8g*(Ro^CAlHH1gY6YD#S|f{=QS1s3i_)dOLMEnbntc;lxA_uk&Bz{3kXYiuLqzy zfG>tW9Rwn*eHzn-QV`aYi+mH#AH)QcC#)thUyx5$!jwT(6*42EG^H7O^wV%=4$~FD zb`zK$%#ut?L`>W&w1U?%|ND^CSV5(xs9W{=*^DYox9KJJwCr5+3@+#s6%vfhpj~2@ z^(S&pznVcuh+X$^$rUDA(FUI*0E-dl&XL_dF^h*9@jR_7=H53vMpT_inG&lsw0FOTh zdI|-w8B7n00QQ?u0Gq+|3oU@57OaHR7>p**`{2VyG1)rxYVj?ID>5LI-9RKA?|Dpd zc$D5A}vAIsZ9 z`_QBV!nXSet|B#!wrCM;2Gf8qqGk6M(Pl6W`XbsBMMbn3_+B8Q?e3DXF2~M~v40@4 z#SB^@FQ(CNO91sz?D8huYX*s}z&+A&J+ zS4b203FJ|+8r`oa=q^Do$dlk7X8On(~;>TN3c z_B>L!!Ar7dQ4JRhqPf+#=|W+^-=aN6T0g08u|<0fIVxjqRNrRVXa-C_Ro#w* z^ANon8Ml(FE18af6wqLc5n32?RJ_SJ!kWBY`a}pTQ%4pIvLVa)WXp%-n;S5Z&Upo# z#yI}wuIsK;N%4mB0xwWyDXAcV{{1Bla*u-&kxkZ(?)4M%39K#M>g^dch2Ehzqh&-Z82PE9o?X?(tq z`)M2^<`MJ(N!!%~um~r_(O{CDVEs)xB46uDC2QP=uF@;O=s$XZ(aR&FF#2ba>&}8j z6y~A;(eGei2Wq!<_3wk{+rerv_^-#+SgHgy!U~S`QFIhSZWR5k+r}hbVR|lz0>aIy z^e)cEftc~>S7-zeK54)abt+gM^p~+r_fQ|6f87Oo`~{_}T^r92b!GAOPVy)+R8?K6 zPNm;=*;RP=8}ihtbVpZ~qb{C*C4M>>`5n~!t#InSTfUppmH7H#S3kb}0&3N%^gx$g ziN|XZVgpo*c92wO(eg|-z|jZ55#ugw3=!%>auxDfCGs;f;i&w~yco`mEk`OHrRW}w zre6b1wmOw=!03S#bpBVtkiZW=2B5qW-|_8Ljh*iac3$zvaJ3%8pUE4lQm4`ny5fSD z*T^HCrYT^n6OPV<^??G1TLtM_(T_DeFPL5>-GzAm2b7n>%F%~$Vsr;yKB_#O1F(i2 zT9SpL0t~q7RHWl&0dS>C1K?eqHYWk_3gx*7DvL3W6g6S6D+KtQ@=);oPApb1p|Om@ zIA^0yr9F6!R~PB_KI{ZJT&N#L@W3=o(sV3r_`A~ZQsud5S(*r19ub^kMA(*M!3tV) zOdcUWEg9F#QH)K_nAFHk41R6|MX#W3obL3Z?4~d~2t1SF(+5jz%9VJrm)8-j9>oWWGjwq@^fTqe~gAPz*?sa2)4wkNB`;^2d%#;D5o@|q~4 z2^YZ^{uZ_4*bvSu5X^`TlT;cb7RL!HZ$#Hj4@Ero2pT1sXHvq6SWR@m2rr{WaatIMFqEU#@N(uI zCx&CZwRBwhfIixUbQgc<>93}r!~XEw9=jR`MKQtjSx++W&{&xXR}N+GL3GO6h)3;l z96I={2dq*nx&}0{s11#qb_$=&v4i6+)r6F?NgS45V%L3n<4JdC;D`vLsETE ztGt!85P^MQfdImav11X^QQPdSw)Md2eS|vD>Qb)?%48`#>x}#s`aHUW1VhNa{{-|C zcIYsV{<1L34*jmwW1Mq>5rp2=Fe07|>0RTfJ#2^-1RAKrgg~@aIBlSYU~uiUCG5G= zW;)lVlRZYT0nV|&*CN?6yKVO9r5;-xJq~Zt`}b;r_I&{}Yz-oVZ`qPG@-9bdj2D;n zj2)&X8pX{pxb~gW5|k^_08x6`Y@tf@7_Fs)`VhQ#kcZ3ye!%bmJCGn8x-Me}>g?dD z;pA`kqaCrlpov&p*_kaTrZlB*)EPG_XLF(|wDz7BR^O$oQ)wTW9@#ir3LVI$`xn}D zx8=F98nhz|kSh8(huN0Xrij#Hy2}brThZov31hWjw{S(p@5}G3Y7FTl>U9-@p zKkFbujGJB-0*Lwm(9>leuXK@MrxKlQfZl@G*1m-{y{X&PA#lAy>T*Du9s0x&(|n{$ z$C4Q1Auu!nt2{Cb(iDu$g^Zp;JO@x711ITarL?6RY-dBPqc z6b#%vVpj~-_+C{`KZcD@m9a&??-`a74i7@C%488y#0kyQF<3zc)HG2`dg**o^<|HT zHHNVhr22y9Fd z$q<9%agx&o3D#dkXss&4Y04WjaOGNuvZIb*i=GjKa~V^Aq)(O72hbkzn8SX}$)qHZ z(0PIoJTD0ceRJECXbA3y02kM~fN)}r?2L4L8WuskkUxo8E~Y>f;+kGnN&_;IGDhZ4 zNGyGniF*KhwVrZJzo7if0GJ|(?>uybkq=Z7kkPz;It~^WIv!_M!Lqz+tTOZHT`p|K z2^S%PoGZw9J?MrYZ-inkM_#Mq%W<0iqJ34-bT2z8rNE zXk(^bt;*?9p@jq4qB}Cft~!G0+&I1-k2Yt5YxOcswdu2cj1`pguNsjnN61M-q=49f zJ`u?;k`|A^z_Hje;-e(Dr&nS+tVWi`(V_E_WdVe^uB9d!MK2}EuHca``w z-q6d@Dr_ZM<(diAtCZ<_6O*pjnby9$An#?m1??YB6ULRxy>ZA^2*VAw!xV%Y zhZb&jMexc&fTbmIq(YT1oWucX*vuj3p2fh?yhd|i~(1ji(td^C}jt`&W?iGuNkNgY8X`Iv_p8joH$?CgA?ap!UD{x zbLsP5P`l+ngT84umNUAAkvyT!Wed4%)p>L$__EY{*zlH_zJa&m%&_Ka5TZJdZWEHv z0Z1%pys*`|^pw#TW;fCh`iqslsb<-2mfnm2#tznym}e-0iFI& zHi|Iq{?0G^FvXDpZ~%waBm)J?pYj1GdU1}6MVwtU3<(K}0JhWwo3mg@)cg+REwBTN z2u%8BZ5l_+KW)L?I9=#=0D2OYZ)Zo2SYy(n?9lH~pd(-4U=;X4K?{FDfu?+c@hEV4 zK>$j_j_9#Pu#C@zG?H7#GD z5(OYN1ua09()mer3pFUPv!I1b(ZZSe7Jg%(#H$4*zK0Tbi&UW7ctnc)v7pGcDDty{ zBAcYh3k5}fj3NUCMYc#0NDTq3{U~yCL6P4}5u8a5iflxY>kEqfMT$IF(9thYG78JP;MJ_KW@{Sa_v!KXBDAHF@WVaOAP*CIv6v5$wgpZdCk)D!%T2SO!6oHl- z6uDT6{IHofuN(Cq{y;@j)qZW zYe6gPrO1a7FKp!^=;OG{Gic=wDYC1e$VwD>G~WswGkS@^lB9pp!`Ph&*7N|rYf$ay z`D*l}w7k8b^q5gYNv4T`Wa@SWx686nVR#$XY3KWkHcwP~^3OB3DZhwM^a>EK`XmZ1ZhTtBDYA9iwcT-h$7DwbTlYMAW;S#ErYW7WI>UiOObcs zSA&57=N@|5p;gc-;2sTnyGP2sVdQD(GBow;f~I~eMG%4!^!9xe`DH>s=y5Ct3=gQI@iydGn4*e z^uY;}i{Nrs$&{yNGJVi946`G3#(9re=8=%U896K*>WT;9EJo5F=1lql_IOoJNB408 z4Wy9>=eHv8&Sdjs`ekO=T}hen*zUS~)$37}dy$RxuHZJ%nY1jD23$z22>7?Kz;%^q zfM~~$3!Iz^LHKC|x23>Mgv<8c?7$L);}blWDtw#Ex5-4)!2hP@Tr&>!W(P#Nkg;s@k}}JL0^uOHH6cBAbSh)CzXxB_=-RU z84i&LB_rlRc&?AbYFO$aiVty=5(MosMbZp2j~L+(Mm=ajwV-N<;t*X4S=yPNf-H;~ z^jR?whCc(q1Hx!NAzJGqoR3F`W*YWlSXQ;oz@joCr^7~3(>zGD76eWUV(v^fPoQo{ zWoR0+3n-#use*q2CI*R`lWQ+HK@D~w!5eeJ>E45AV;+!20Y3&D1W>mm4B!MF{DGt#}A;5b;J#BRxVC zOCuhh5Un8J1Nl7H7FLBlf{8<8T~ z4oy+b)bKF>n9tJBX{B|>$&dw?lf3VPB`OyV3cneRy|f9C{s;i=${h zs9FF1r+EAwHctjMTO?YigEhD!gN)-*S+*6v4-JbJ92x(v2XVg-{s;#r2+e^dAc4EP z9k!mqFX{|WC{Jk&>Hb9>9wy%4Rbo32Q<>kFFLkS5%4LV$Xd10dd3u2b>2K6+~2=XT=E>)O^4HI>SY4=zibt`|(T2IcJY+uf6t~H)+gk zj*XhxLw;fgIzP1PaFVbW`!(ritS73AYY2vY_bTM~+6XVoBQ%jWZICKR)U3 zjT%l?^gPwmb!z;1j9hESiczD#LVYpDya#;TBYd4KCnn0=&DA=0Q-{-5|h?!mFA zPdoGBlK~Q7&L>$rD7OOSnXx^F$w4P1UESzxS?zM~3QUh1qZR_;!zB0`s*X5VpRtV1 zV^pqpC{3&bW6lw|p`%$PU2CXV!Gq6N3&o#Nc3IilSq?ueKoP1kGs(rY zKG%k~i=U$>QW|nBxiL7Q+MnvXF)}J}ZJLpzneXoWjY!OdNtZtca?qwSZ7F3Hy3odk zw*p*&HAZD;b22Z?vt60NL$t$e@&)a4W29{MY&IS^T_6t+TTT8ta2+a-%_>Lb&UNnbOM&$`}_mETtO|#E0*f!ja&g;xm)k0i~R69MTvc)n;j8Rg5=ZdyXsY8zG zW|tKlCRyV2UUHUj!9a#X9a@@GX)USz%9D%f+D^$#k-L)R8*@-7%BdZBOlqtkAPtYF zF)CN5EZ5}o=5XZm=33(lGO|<2b;t@3M+>fvkdg5FO<@gWCzg#&B4ZS9bq-wDD1?NJ zk$$PT4!JI>K1SBNfLw!+&rri7|Co>2x&vk=X!Ito1d(D006;eYt7aw@bz-K$riQVj zUuGnGdUShI|8nf)x`4HQ*a&SOgS)#nkjG3YDX1T~4!PRCv394{!laDXjP#NjjMAZE zQRVzus1+s6L~gSRAlSpT0R!{74XXez;yUCh`$}_twfGcsVQoJy&@{JJORO+51>}Da zha2e{OTde*Dzzmzv;|y$*Gh9|CCz0nZmpmL>bH!gTkQwQ_EWigmTg0o)ov5LPu_vTP3=q?xeg<~E?2qB9E_1gGFTSw zt0~dD%2zHZGR@a!kec^u+df8pN`}g>M6XMlb7Ml9)iXR=zBhcj zGkkiWuEOa;8w=e8nKL7j55`DO25QmUix_Bc4`x<#?JeqLKX3=iigr)n3bPof3+_M& z8ep(>7zx%Ms2Ta~c300W>HmfCWQ?3&S910821ApJ>rC8QIFoKa)j$o>L96u*pJnuO zilEt_4nRqT>r0>CUf|OUOM9Yt)Oth>ewH%FV?MVco1ehYdI`>u14F$#vie zPfI5%Y=*DtfBF*MAU*Oc9`@eOi3eA@0kgCE&mU&wccaT%0$cWGMpk43u5f$I99PDu z^qG;FRm@D{zE*?|Nue`fO`ccZO;fqOEp(=EW90r!5WWe|E(F9Oku`XXe3q%W z3E2KafpLrs*wXiFk7huM2io`oQmA~HsYLR8kNU2t^187KOVZ$Eae?cQ-Wf4X__EFp zwVoMVEVu*7e$^R~C)*#RjY#%eJ{WBXReDbl&syaQu2wC$@ua_wc#8M{JC5_q4Crktt2mF8{l@aUkpEP9Iumel z^9`($$}_f`!d$NC!f?YjTJSRucQQY`&4S%#A{pnI8Idx^x6AF_`It>@I3ros`*7#b z9u-;X8ck_ygaU5D)VZeoP#FRP!3>!yo#K+h|6y#oNhRnu3fk``$ipYIMT~&mo2|G; z`R0d#Y!RExEx+_!qpbUzK;=`SC_;X>d6M*WK#BU@7&+xo)H`#g(+K-a?#i;CV6`A0 zIXMPK(U+OYO=?RPB@_BRX}o*2FcE1q6(}d{;UuXxBtM*2J=mBa^76xhFtJS!Y&`Mp zU3vbaIFntVKF9Lw({WQCqjJe0Vr;qc4xMTtN>zuot5+tL0Zn?`)(B)_v^c9W-?T)@ za&UjEuX5;i3}6QhK&?(mVev0uUZq%9vQSITN#=DbnX(sXVJvPOZh~BJ65ufye>#}S z^tyU^>SUCCoVN`3mTbjkW!dy-lRQ0$V(A07x~zF#8Bu*^5Lf!V8<#n65XA2ZYa7t3 zd_1^No0-;h{V=u$1+Xh!~Npcfp>xs!=&mF=j>}V%l z`m&_FEE-ag<5}5xh=maIz#T|VwEx~oJ4QBSgPcsJ1wWrqu=5iL-WfqK0^r8#n3jiQ zauej-lZ@=VGdOUARW_Vhc4Oo^Cf942pE-D)8r7f;&vHatPtqGBpUO+@*=7d zc_76``9A=EUsU8@cWuYPud56JXVClv=G=f|bOHQ|wBAcDP1^dDwjxh6%QL#KS|}yy za3~G9~QShesR+JrKm1s-uFg&NB4FB zPQ{$9+u%;%MtMyS&OUR*D^oC#gT1eUu;1x zi=oKvi{_FKH=3n2Ba`xOUt&i%b1U68o6l;j#0`{i`)Wp>MG1>bVwcA`*JEyS`>LGV zndkZ4bifl<>q7XvQhm2CpV2JH-#}Kt1la{qx|dwgeolr5atxBqmUPMOD|g#1(fDGj zFF!6x!9xp9EpROdz?)=rcnKBLHqwropLYe%e9C!d9>AsG_RYxIsR1JA=>_|`!Rqo( zo5V|zp_Ze1UzLkHIk$ZIk0ilp|K$n5E9ntNj+NWo!B;38Hm0)>fhtZeq1vE1jQ1s+wXJ~bl9J?Ew`hnUDzZ)#iSC#crI~L z(1g9@+nQ~1o1xF-vGQ~5*nxdSnvG>0U-)H2b^nlA+PB;3_$QS7WV#nOdv;Zdn$Ftv7^vmE}FyJ zaV|)c3*1Ec7ns!5p#b{%OpkGrrOx&stZ#Y(?qxo9fhd$^_R^#WNOd2#hTsBsh)Ow) zyIlE?G z;P(TfCr(_alcMi6V`18Ht+OO8!KfX_sgfmG1UU=6QG zv2s#5_B32wZR0Z9fbCV8-4(HJ6J=qzIbqUnx3>p_eCvNwaT8_vF9|TPK>`P}o1yD) zj;Qd7q>@HL{IxCq=s;?@|L^_Ir0vVlM1U|49Z&(Ou-#2mx%roQH$kq6dz&cdrz_m% z5-BX#u1KbRC$?QN4ajCI<7+W=BT_}Q-OKd z+<}Mqp6qkk7sB&-3MU4a#U6mCPa(V)Zz3UtSxy>z$KlrcJHHjce#o3Fw{X(fqHHq zk{PS7eKftg&6B+=v7)3v39uAK-Pb}c2QdLYrUYhdz8OOAqEtoxAumsIeoo`gISTzM zk3Hu}Q*ZRSiL#>2lm7`m@%qB#_1kTpT+vuFf$SeHyQlq|0@4BfbVIEz`Ig*Mb><&3T}3ZGXy^B};bFsqmB>|4+YZB)dYT!^y*4`=1COg``AMbdCd#%6Wh0Q=?90I{(*4fDb|PVW>YYhL?^PSR z$%=D+%k!?Hg^~%UMb{_~?H_Qfn3FZ=qf}NM0L$m({_ye61B|ZT8$R8AKm{th`j^I4 z-rE&!7+Gmhfvgt!yfB2{=jou?O^{92wT<*u2Qn{kjZ)#*)%9+oWeW6Fjw`zftezVj z7JbT!5-kiM=Tvl!a?Ae2AeWS{2rU3{!zsqdo>3^~_DrD{oO|q!naw?!lFQ|Mm3qATol|?S#`J<2)oaHJ-SCIJ~HYi3l zQRPbsT5=S6uHC5J4YdJJPlr#WviZ4kb(79_6U`CcC&VX59z)+G17FEvXyT|V5I)a9 ziaF?FZ_fQ(eqUz?c_utjFq*9$UQt_{+|Q*f;BgtD#@Ozn z`?;J-vNq_i%GXT7{aiD0O7-QpybSYx<=js46s>9x?GC`0kQ5tWGWKu-yt)H2UAg0u zxJKeZT$beuJ2Y1YP5-^E*r74Qu=#;hnEY;{EW(Pzra)mPUF$G$1ER)C7>;c*!;%h~ z;0FmkZbiY-6a~tn)fhC;#DXrAgS}jI-m~tkl=f*LgR!l(s1UMe$8-iz(+NM#@;@qa zLOEjFnwy$)%{1DPCnJ~2$@!LXO?VEG!!QmVX?Qpp{ybuYk=)ocNX8Lczz9T2$OAr- ztNb%jN=N0%fv6VqAjjvWp+qR{{|?kb7<{`1XK;WD{x&0G4`?8J6Co}`0{JEQX9wdW zGjNAxFWTzQ$7Uo4lrT+jO)fs8`*9$$+27QFEc6Eia-wG~FPaG$b+QfA>OW$D$mMda zz^_y-E>pc$weWqDqc{aGnZdyeDSfAIK+PVGUm^)J%jCQ-;M9f{fKvh>`06)d-kjmN z{bbS1vYRN|)dnN^yzCv!mBYO19FO&6STL@|rXjoY7ZJ(`aAsGuj=!lJ$eCMLGqapW zlPW8i1I{(_zi3?k(}PzH!L{ML;M%UGkQ7DC?%~inZb%fL4&`Sa9<}Cb7Kyr3A5Yf% z%V@ouV6g#C5z`c$?K5rYjvlTF=$nzsd?;iF7qGCw9OHd;2CH&WT_F2Xl2>oc`2LDq zR0nG2a=DhAN?SfGDno*RO@J2;EL6y1!`kE2mz| zVYUq*7QD$6bs|CLY{Q&4R=SBc%}FX~f*8y6e4LZwpr?{PU&ZQLadq-0XSSl~a}(v< z+Q8MxOS3StGMmd?3GIR*{BTaEI+fXwUOClfSI3dh>_U!(&^j`<5sX+N?(V5rp1w*+ zaI~36Do%0}?V5OQ@GqfVl|cA|#7DS?c9cz2+ZEj`vjoBWluNUQtQ6v9`^g17s620?DzYgfqTx-m@GYMx=eQt7;MMCA0N)$hKjp76#1(L$unsx4)z=md zAOe?>p+agIdVLo-K;<|uMxo8?y-axvrC*#f^;WDLTzTel6f>xTidphW_dQcF9{)q1ul)vSo z@b8Ut?*Iby8)&>Qzs{#~p_^p?vk6cZhc;A`0&MwunsM}xSklqYB?Ygi;C$}?CDoG6 z__lC16J_Bn5Ac8HY_g|K<;32eHAy!G`o8Z>Ie0cXa8!CoxeT$nW4lP5@ z-aNVN>f`|j(|&(#Ma8mRr2i2Xpoe3@jORtrH4I_&4^97n!X-K2`2^Ch0%`35B3oxH zjT3!MR9UY0)UTge^{JnzvIO#Pw9vu|Fz?ivD{eYd6L7&&qj2Na4pcUTyQ_4?_Z# zXHWD%jrTgeaBJ16JXa6Dw{?~W=Kxqhr@!|2$$8%0U2hn4+SI(P#+c~p{uH7-SO=m! zFf&4w+kl{}lLt9Z8rp z(-Yy-ity?2@aaaLq`#Y)t*zlgH8ywMz_?cRm%@NsXiY&UsZYSpUI9vBj{kyg$j#M) z{Kk{kAo5e8Fk23NRe>kwdahx9QRO4LQdtysyajDo0oUHHJYUa9Rb;sYvaSQhlMQfu zD6#q`ck^Gl8#+|9ND(_nqKqDvVj+D>O48e8MRz&nODpk*Bf;q}70K7^Toer`qbP?F~>H9{Y>E3M26VFhHO$tDJ6<@Q-{fJLry z;9QmzR_|NmwjM$WOZT^gOU|<#$Em+>fYm*^TyalkhFdH4bg3w?yUCu)WjMC61@vsBgO7L4ifgf7;~%IQhCJa78(t89`cHQMRN4GCIWP&Z5^7 zaIM9m9aikhbVXk3^w^3_39&A#^1ex~MU}Hn8k50Tm4Q>d(n~?-yfH!s@lA1s--i`O zRl@go#P9EMc$T6K1AL^!3pc_w;EJrLIpW=NN{rWkda^HEB;>50a>QI)snwW` z0;$<*V2;d^Y7M3XIj3_wYgq=oU_iL0@1w`p^b~w|&WdO8AzE!s&%~lOP34+dk%MCq zhwkvrA3Hb}Wo~UnmUSnWzZKt3zCq$%;xV()mmr)u)xe6A< zvu>6rzx6_9djo-Bq@{uf2U_=8129q+Uk9!0%A2aQAhWz?YULKFc^}H}s;MR3Nk;W7 zqY8sFT`7lFaz%TD$Y0e4ZVcYmu85zv%W}(-Vl~BR9)j*^XO<72>?cX#jqT>=b5$*e z_!Xo?a${6p%xntlJlpQM@v;_wZr+DJdraoZcC@PEDsDV(=PamcZN}q_jTD-5m6RnB z<5j_vk%9cyL(^E)bfc`U-NqdbGd#whRe8L9sVka#B&+gJyKV7XX;52TR@PbnMY*zeO`S5~f_}7Aa;e`-zF3}@rF}e4h%ImYN{Yz{;e7BFh!V9@9 z%(v$wqR5TiOu|1bJtibko8M2Cp&!@vUIse9!;`bRJoz9M@W1khE6Nwp9hKgY@O;UW z-8xd_QZtv8p0FCnS*@K&+=o^)htI6cr54#88JWtHHnbaA?|sb8*Vh48lpAJx9FUP5 zy5xgoaQ8E~`OsWEJR|hT$fjDh?eC-K^q%r!ty$b%RxXcTX5{5sy!v=|S@Q0c+Lf)Q zjKaw<%2c%F!=$@)bk|FjQ_w-VeKaFCc5in@S?fwVR!eRlxta5YQL8*N)2<)G6|sd% zUm(nZ5qnC-ZEKbj$}zkfwj_O=f+mP;NG>b=@os#Y6_?Q!l_G|t>*MzuoSnnh05+9R zT_8t!D!T-zSau0QIZA%BG|`k+yScG$gpnw8#XGA!n6^V9CNZ;XgJ!g|--3K<0U7eY zph;PkCuihY5;zT&r)L;)-BcGewJM}FWBSib4$EG5o&>I-Bnfek_cU?8SoCo+-#bwy zU_XT-_!`QNI6e4ESS|j#7zM}LiL*oSB}yXs5%4A^$ZuuCvXKs`SXOm_hGM?h2MPC;b;1D7ls9+PjbvUBtXy zRx|Sc3~0p{nxv80QXSS8s3uUm!5`qCkTs1S|(l#kR-#$b(IZQuG=5!Sza8kKf z{dszLu9e`k3~$YqZ1<2H6hDt^W#x|Si20~Cjd&JS7G?q{5rm0}Z6iCmD{4j-qHD3v z)ki1vS(~BCS*U{)e-NVhBiXXJHSR!OW?1y_blk(Tum_}>tjeY~%rJCtU1q>e@kiRq zu1G0Uw?r-DO&igR;ulHdpT>>f6*qogCLZ}iNyB$Ca%pGKtHVLx9}YUS3e$8%CyQSu zO)o@JbM>;y;`6>WV{AQ%aKiVF~nBlwC+5pkDOW2K67!F z%u2VjY2~fNMIB4g*THx+xGW-O_^_YK_Xciyzh&rOAKSWMI! zzD~NnG-0PFp!^RbIRKLcy24J0M#xY>d)#mt7Faup7u=F+JIi)x=aY`O9k~#b0MNd& zEANKOi}0)}S9E#wu{l*j)OC$=``-pR4&KTy?ZZl@;0DVp9rn0HaN)hQlU5J*+;9>a z$<)M{bp#$JUXwOj@LAx(mIcs+_qg9!@4%X>PI+snn z;_>&6%ncO^q8ax9`xzn@JNY zSGhn}uwt{=T@zHAORVs#63AYGIRF%7FV12lLK(sdC$%d<@8e|&Sf$9D5y<-n%jJuqkC}O5c(#(}nGevFc z*G$9Qc%+-FMQ)0UEO0x^PhrQ0tNa}z*v^VGso~B=#5G;x0=F~1n#1Ly4v$AHSI9(7 zD2B!%Zj61QtU|1$UB3*nKtnKtYzpJL=Eh>raN-^jd*=QLv1hnkjqa@-F}A~twfjqI zlX*R77ULe3VHF{)$hyL7tWaX*Z)(p+R79S$t6;)HBz@&*^VARIV7TDjm6EXoR`M`a(G5=l>s|af332t z-E+So$r<*};j*F+4J;j)MTA2~M3^W8rvS?OC~-ld^px4J`l*a^OhY*J70ALF5Rlc#f8|8YFQ zx~bG{!hwR9rf*akWKp^iCJYWA?5<7OX{F`HmQn2f48EoCl!e6aW%S@=INvfH+t(pY z1m|d92AL171&sr|H-&4zR4z1QW6ha1xmD^adgCdDaB{+SV$lm-xo zrt?g{yCfx_8Ld7|10FtMdUR0%gdo1VB&G7nOx9_U;{0_m|EK&*>!L5MBb|29CS)3mPFE^V~ zsi>`DRV4KDJIXSR`0C3~m*Tz|s-H42I6g}l{&i?#q^?gOenp1V3@$5I&G6iiFvLO0 zbOj2(RTIF2UuB-(Ll6&Z2HbFY-tRT9g48LSfS00AFLFF>)$?KR&YXdjLqSJ@Vg?0SBbp}IT z2$SI&5Y%_u=7!4)2tO+I6*olIT8Rt0JvZdftX-`vpEFH9SGKg|0+4&RuRsQbJjKNZj zf&l!`&5H00dZVq(LSK{#l&GHXcl@LR`Cc2u7j>qQxw8#qdpN^~M*+AR8Vy&jy>mn4 zu^FDWq9yW3vTIo4hRYp>sH?2*19Wy$c^tFJMW{L=na$!srfg98LmL?WoOMK$eYKoT9LKSx+R4%gWGcI${rO{bMK{82c_f}vZY@yZjzIDtsUKqc znwm<}_u=&!3pJOCjSeTac9&#gHzj=z{xf|NKdG{%rb37ERZSqaXYk?$OT&)2_4JSW zJ*6%v>jF~x_B6#^uiiE3`bk7tRvrPMXnNKn(>ny#UB(59`6#;>|SnZpe? z3+~F{6RviydO6DMkN7B{rFDQ zfq=%XY7t)H7~)u}o+FD!CEdJ3H_;KFDQH1^a}Y_~ggU(42{MkolCVK$0Z#8>OGQf79enIkM`!8?cB*}Gp>izO{CCt)zFWVu2aF- zW{ZiyA(4sELr!G?o|L4Nj6gceXh3XNG-;2_N}@Fm*fZ()Mmp}*@CK}Y#ZVY$oZzrG zUpB?&2@b0Ng7!#P;w?Y=ucCJ9<;5LBb1aZIv^H5TL{22BKDTjkcBq0AQ z1kRCU*in+4XXI~6%`IFbiC_fR0dDLY$bWdeK@7{`|9X( z&|qlU)XVT0nx6TEbd?Rtgn5{=RjhU1E9vhQ`m>vEV9AM+mQvnjVHT~e18t@fXrWki zBjwI6k3R29t#l*pGy*zuQwl@b;X2lhl)Jj}u3qjz5>fKP-xb!lH?>j=0N_pzF4}l3 zRhn-}-ut`CJl|$H6n!}%iIf@r!(^BX!G;*yH@XSf2trArUgfJ)#g3^03X(5?i>`O| zIrKx_MFHc2p(iI zr+t};L`vuSH5i96c~TN@zh&=a7LPLv%Cl3+(-3YTy+M7&s1n&p_70DN&5cRLMD3-r zvJ2JW-XT)Rp&pFoBh1-wgv9y8JIabKPaY@GBHT5Y1SMU8LGAs1uuOd;nrt*KiOp)44T~7<+*H=p-D5N7;WD*BZcj91M4q)lz1tJu?{`ZJ-oyU z1~u4wH(cNc#F3z6x8g;fb<7b>Rgdju>GT+~QRkkV+nY<u^w z)ys;LJi2_4P^bLl!x1GNhz9q*k=3M9O>f}Ed``pfGHnOza!!1L@NcWGsJbYDg zzFBWYmg4`W@(d3uH(;=qZf~MwjSsK`n%*BBWEp5)IN6hpHO#r2t{xtQn;>rY^_u>f z+%kQ;7I65vv=bh`UgZsFIBzcO;I_k?h6cEn)k{Bv?o~WNFw0k5om^w{+rS4pyk>BT z26)aCRa#0a>uLho5-!%av!dyF@{>TWHunwd=RF(TCEZ*UE`7EYc9J{OC36qDE{o&Z zb0>SYhFxX&2J?I(fQsJE>gE%1k&LR8%ej4URd@BWKtLEZ;{vr8u-LZ8Acr>TEc7? zl}cgm`}1`m)W95*T6ml?K9 zAy>q<9~n;%%Kg8T-W->%m&YP~dW+>yOTptj+3rOwmE2K_uTiL_C56p=GhiGHkZ!82 zK!+?}Nn~JM)Eo_>UT%sNk9bY(r0JsE8dHpia5DgPZf?hUH6g5L<9OT4hu6#`Qm=9e zMHQ_B^x>{>7v4kY7U#8*&5Yb)epL1HkXsq5#4Mi*jue$Ot|B{u z8qHkoCOZY0hOsz!T+L_M7?!=I5S?n5EZCcK7u5&9>iB8%&tTN}hS;nneI_LG-(knoB*#AwZ-)r_{t=>Hv!dp~(E zDme+WJTR~|>}5fbBt5&eJU=%sFVXNKV0AkN4u%wmfp;nrk15HVD>hS~z zJRnsaK+QiS?S0OyddaN7@tD&BW7TGAO=_m$9B~(3=xaSG^!g&!qkvh*s<^COno)53 zX-1Z&2AX9`5?_7L|0n6l(j{9*2uP@UizY7k8jO|B7zPA=@p`_TR8CBV4gZ+5@<=RY zg_&p)TmIB)k+pxO$l7X=jTD(5Cfa+{j=%j>?y@CoMpT9@-qIOS%>Cqx`MkA$22?#Yuf52n4hOz2(h2MZp+Z?CdjMbuh;HLZAr2A_{7$%B!@oS zTMb@@i*V5hLx#X6>GGO&vS((Kg8FW}UG{}z$e(c_+z$uBzVx=HW@4@MFs!`Mw%PL2 z1fZV+3c}vakHXht0`>7fOA4KZ9A-$zE}0W675l3tF8R|X8vZG1<0?wH@lx(YZISzn zqyCangM#xxCRKFZ*j3T}3?4Kv2xZA4rVhVhv zBU#`-VEkiK!w3#4$=)TmpS*Q4Sq0Bc)=aJwxQR=%9G^|{?|J#3Bx_{PSne4Vt_79M zfZI>jom@tDWF81nj*LbBoDAX#8$?etqj;)1irX0l49Q!ASpN&A=fT5DbpR`b4Gl~( z1+Kq`fPuN!O!p}HjWu2Y)5|-!h|E4D8A6!t02Q2{>n&<4TB!m<4s~b! zTyclne?zFQIN%pi%{uv9MpWY!4ywLC-65-ER_t18yV%sKV-YYi=%_GL`mksQFrV<@ zVMe(oY5~W9ocarjuytzJSfW?Y>AZQw?*T_Sxq5fWFO$JMT{{By4BsOh5@fHE{5A<} zQIdz+eX_W35?v%`Ac3n%=5=;9@qJ0xIzksf?NCaHmuyM3qjw{gDu)hX*|KHJDk|Nm zb%>?Z^&sJTZPjOhpFLE6*~AyxtS7pWW;3r-dCKGsyX8ZBa`L;xk7w$HWOk>+K)|zR zWwFU0btH4cao3vg%Y`PFXtDB~b$KeN-MZ$^QaZGQxrQ(*pmnqJvCj zZxdLh@)8NRG&2d!FGm^e-xGJZT1wp0i;m;94#TYr1iR8(_K=ZFWs_;r#oqoQs+N&W zvXVpgBsdA~>913HMnX3haj>Ls%#8M5oys3HFe`&OCb03*Ic-YXx>i=w|3!2uPYCg7 zuFc{E>g1agYwohL0*I(QF5EfcvNFd?pJ9ESW9;w29>7}cO!M-90p=k*hTD_`s?cD@ za$4G8`blT#3s2UzI+ca#Kn^O$*3{AemMqdnC38TJQIC4LrJbStB{dZ>LbWAVj~Un1 z$s^_*(#u6GGI)RuK`cN{evRmFbOkd_k0EEl(jIb{qf9!spz;xg7D=EtYMDc%XKc*( z6@Qa-{1pvy1j~Mb5;XEF5AI7gb(G}_LAd2y=r>&;j?2F66W{bLJFleMX=P(l3Yy;Y zOR6q}tg1}(=rEeWl6=zPQ)bPkAhso$KjH7s5~MB(4s?==Fc1yZky#&XPHyVV1~*!oEL6al`p45-xiW!KgT(_eR||iRVQZ* zf^qM66Xce*DpD^PRN@9AsV(K?Y-623$H^dXl(dq;L6UwL$g9{Rxw}t}Stl2!R>}?C z9u`-b!kPchbed&A7Aot@t2HIN`W0wc2qu5{IS$>~$q?i&0yWL`h@6w$`u?N9lV5vi z@(mX9DDB+bO)jlZtPl2x%7=qWvQID>61M>3o7)#Tw`|DJm#;F0%xv%UBgyD*xE_W=OvM>~MTF8|^S|U&7XfBtpg`)S)$kV{5 zbrrle-#wYNK95jM9^W~+OgERBj%Z(UWm6x#nn(kCvx%}ouIxJ5!VolrUE$Mcuo*e0 zZh&@P##fGRE{|J&iH=mR;2HU%KtDGb9O^Q%ZV>U0zOH9Ai-6JnTINrO%J!r&O4Ma! zOWgq8X!ED%-EYiSg1A>}us~*J-?$DKT)zbtKJ-eLdE3B9#Jq3vGr|DBczkN6C;jY|kXr&UHzE+ypY~eo z--OYur#F;v#X`=aV%;X$YSFlsR*>#KO_yXzU4YtFUbGB&J48gw!y3r_L_@2rs;#Im zYude>+*TXN1MQyNR$I~x-XoYOEm=Yx^td;(jq>efIlZ>j6q=u-7{;|z5_qk^@!d#T zT~M^Fl5bij_BuH~6Z(0*ZO-;}a$%-|QuNKXr40D25R>svf?+^QY#?8$1vz=CWJ|5O z9Pp?2+`2&h%!no#Rbpo&-2eiVpXNq(N83_05ZsrkxSff>u&8i(P$TElTkYb2I+cew zu`PWMHKyZnBpmy;K?!VSkKae)@I!(fOOqo8I;qxBU)AlguS z*@oIH*+$jB_6#@F1zafgRwmE|a)oW?1RXyyPNZ3VnxhL}FZi7oI=i(#0iaeoaf@E+iOW1GEF%y+lZQIqin2hwXTls9t7-_GH7RM!^oxjtF zW|S=WM&z2=pzoXrMLd59c70dU#)))*{zua+B@LG2ID9G`|w;& zWm>st@C2r~u%wT)ENJ;S1ZBzb$$(bJ4VrP83an=ft{ZYv8Hj26?`&3w#nAm57f@WC*!Is;znAXgN_Wfz`NvyJ=zQml0 z>Z4dS6#Z!F4YI4cW$5R2zOwa8hPt5PNZI46zAfytJ+U`$H=sgOO=)6XcRV zQT>vz`fGo(`kO~Bw?x}LeSa76ilPrhbQXW&4OBb@osTlNweToFqNC0g;gp%-n#UB^ebR3~d2Dl#RH za^3|pE8nWJYYBUdA904VON9(LWap~DU9?J`(l@G%CRu#7++SCugqSX)Dsg60`P+(+ z%Rd^)k1CNMFZ)zNvw;cJ1tsI-^EM=#`Wp?fR>zmk11!f5eY^VcIs150*?_yX`u-u_ zN7`e2&e*E3znQ)uR`ibVO5k_-FmT5-p99Awu&4|JDNW~%DjK6OKOr_X0q@EvidL4Ia_9Y0y=8dMI>6S@Pi2>m12wfChOpX*%9w3|!sr+hy+IpDGJdD*=wp zMtz-|5wwH|DwHelq(>A-SI9WD#7N;T!=OUz58^lUH7yv}vGjJ%f);N4&rIWjT> z>d(u`^gJ&!XwgAsbEd!#Wk}F;nEY~`eB70n`KgM^1^DMO@QhrIlTC)%%?_QJoa#3eq-b@Gltp-w>@?{x7cnZj>^x+LE7j>?a*V92x z)^=fx`L-sA5937(lJ&bWO3Tu#%_=u`!Z*AURQxbIBXHZM!V^&8_@5;;8)PVL=ll3m>xcO4) z@)*)fc0C22Fb#4=x}@vnxl|Cd4Qo$Jz`V&3ztqZ}^wlg((;)+}&>AZ6h;uAxF;~$7 ziB-(qI^w4nou0HayB3{YpB81mposG!i9I=nhgCQ&TLbx*JT^@>z}gzzj@UZnTdc4_ zG5j^DX{0mQrVA=dXK^vWl!1O~y#a&;9Ln$(6G~1?6f&zc9omL2s@SYXDy|P zwHz9uV058%dj71uyzNTz8g8G9jQ|zZm(6Tbuv+B`hO{|l$ZIK(hL^~yv`*zyutViq zMzoO;5g6)o8Q+$6kFMm*u5z(Sa)JD7dBIru8zWLJMpY?sVQnBQQr|5le-#iS_yexQ zV4JZEg;cSlf?~6L*zQqlVa}72%a#~T?q(X+-L~unqzzfu<;nF7W*vjMB^Ag6n9${pa5VQZn!5qrYF@J~_+nSad-$h*z))_O^x~lC#_M@}+@dfqXU7lX-??hU(l89q;s4dPiT~jnhQ*q$l+H&EW1%HbE^GX-Xxda_12D{h;akM2s6JHsR6v6)^p$A?@XPtNp+#+4_4 zOi|_cY(|LZ5Qwqw8st$HCe+!<{WI4^bvL*`pJN8svW8ZHX;I<9umT?+p6Ow`%;jV` z#Z=Dh@TWLR||Xhu4?m!@vw$ zI5%CffOdJ&FeT@P$t|-y`8Ym}Hko#-N5?H6hvSvJXan?_jwg3$AeV=OySgh{eU(=z zB8z9`>1D_!*C0a*qpQmg|7U$=dW_7SbM|sdBQ>Gu`-womy%-!XJd)^)E@f!#l0d_)mYH+17n>q}Y)-sG@!b z*4r`-(keL~z&Ueoz-ltdhO#_u9#_`?cKF9UgCeORPVKv>tYewgM*+T=1C@7+Y}0Z! z$-kF#GA2+zy|)~{U4{p_iHh$8N8Us&rbo*$+Z7uvRdJ7ohDqo`ENIDmL#x@5p`yIA7MQ>(BB)T~KH7I!0v?V|EpO^_R>^K|{#WG`Hu zw0m0$kvi0=a@T#<5;?M!d%Fk#`62~;KMZ38&g4NYJoeO-tWPC_SjNduw{UOtxs;P> z5Mk?hK`cm>c!@v}w3>A0%MrBxdm5BYT}$P!gQoC9&KM4J7xQsY$)l${6n+c@8p4HZ zJFfit8e2_S#(gFicPA^lA$os9w+E1Fz=IpQzl#XZhh>y=G)9~7-LF+%XUcyW6`0er zH5OtZz05?puLMk#KXjJ?<*VR0#lGzFz@O_FjYfmZ%G|KhHh2&>M6UT>rR`y*tEogC zH$*PyD7?Ii%NT)eXUa6QyUXu5s}gKGAjG!u*Cp%yd9>baYxb9s2(uMRSCSsF<_}T% zUFEM~yD?ct%pv@HPW_4evIb}b?_`-p&o{)Z`|4^F-Uv5Lo=697S6KlafLuSBE{O&$ zG9BF$>{r-4R`Y8+JvU6AHcv*u?!(K)RJ1-hq;pM(!x%pqPEq~XI6r%7GVq7kFun3i z!dYOFjbqBWhVW>@^5(l;<+pjo1tbmsTjWerEMq1R(yiq#k#B7khiP~is+^k+cuEe! zU1eC%>W0ZtW$M_ijcCUji2Mt9HDD@>{}IqI&pj+S(ys|kdz5(3aFj2uLB6yOca@&5 zrG&mpCgA1;*N`;9z?czsLnC}+N^V#A56@T_Zc)%8-G7j(xMAU_?Evm^yUJ&sNhX-t zHzd&d*q~)<$<#{MAjf)cSF?{9;}M>e*;3Ip$O(MeIRKJm7XCiJu&Q&Z+f`0U840;7 zWq{f}2-lCPm%~?IcX>RWn!-qm3ds$V_d000oC=6ZE`XWL;kb2f*H+gc&qgpI<5UBh z(vU|{xuk2I+clKpSixb6>x8_5c(u6GdikUVt$l+EY9^ynw}mTcJrbZEz>l2XZKcnI zpXLw?%Usay$(=NIFOA8|H6@V>5)xBSp$pBJ%;tvCfHYQ^R}0*5pSDQtN=59If5u!e zOb%WrzsXbJ18f1|@;?nkWR>w*_opjvSGgAN8kw2!?+5iq>oiPukG3OQlHS8TF&X|N zVh&89u9>1>*Ra4@z=@i;u7U{!&*e<7N=KQCSF8CKW-m`Vxz~^(RQCP3z0d2YJNtd0sn$!Pm9bmQN+RNJ`$}YIoA))F-1j z^u0(Ix#lL#smv(1$cZ7{gaf8ntj2D*Ii7kLf6pQc{zrbqKGMv5p12tbE;WQ>H4gLo zm`7M!ZR(8l2wd`FC=y-*7O`$djcM<7_Lv!Pi3W?jm5h9=km4jvkVAg@VRBk30D7o4 z*(dT=P3ezL0+sXO_F^~I{#%lX-E5=bCQmx%XA(=tXy&u9&p}*)FM1GC98@=nrTBR) z{=PC*ioeIhL6L1OR*#fLwE606YHotL#R5L(D3sl{t?y^uwz>1~H?Lm0g~W(-!O_k5PsTMLpih;l*h7Cy58~u-Gq*lIlUZ? ztb3jMT7hNB$U%RxNsbEj<+g6GNptc*P04zFrIYzw25&;fQMJuys7G8^7UlbZT8ChI zRu-hV&V6f_hi}U{_V7M@rOMens4>lYq-sMLKal+D<7Qx&B1 zt=L^*v50w5`Bhnc`RB6yq@r?+1?zKJ>(9bvUvgK1DQ}uFs8>;UyDXH;7S*Bye}qHY zftrzj-;Tx*?3Ks6)}d*OPMIb*K~}~vK2T+Snw!-#a${#XG^QLV8`1#=z$D1zKv|o{ zQu+baR1U^T=|FiZ9l$l3!q$sfxXpJb!~BwA&R7311%;`t+a&aaqi>2Aq>T z`3M$-+Y|k9&6+9Z)SIjse5)s@Z0}eaPaZeeP*Cr86XYhQ9PWeD1^SZdYav@?%E=e(36;5qo`>5&8QPoGpWZ$uQo=IT^?t-aF?z6n1m9%qNs_ zjdB<%F2dXO4pdnItI$O70M=STh%=?wfwEeIkPxUm(e6?99?J5A6Uj{-2#W`*JSXNK zbX^CR8y(2S6GXmSRN;Y|-cPR6Z4j61XA3O}!EZl0Ov@ey4K`8_o8@tgfn0+QdOCv%N*y-g{Z?`t-Gt`;!I z*aHbDzq4*zvlb46`82UXGlgcLs6~dO8DilSg%Tl#=2>9ckmy9(@^I4U?ewWVX1yGs zZd|7LNKz*ByY90E2WKo$1w^nnlkjLqwH67#2RxcoTujC)Q+71zd=|`WC7Goh>*bo8 z)lWCePTSNshcB6uc;b(KENS4{uz{Smn))SEfm~#yD-SPT%(*jD*dak-cc5%%A8HO3 zi4%vPOioTN$1^(M@uc1R!*Z%}yqF?C@b&^)IP!BUXkpOmp8n~-_V zOsTv~!b$C6P4T6dcCVRb&#Vu3CoMpd=fu9=2g>b(DspUfmQN<5c`6)@_A;N>KvK>$ zxm1FLB2BH9elaXvgw))(!`L6%VeIMsw@wO2!z|*ld}gI>b3QVtBGVJEmN&xI z!?8S>jAi)_W7%9S{ehJ>Fy3g5hhW^W!%&{5cd&;4fyi4{&_=O-Pz9fm$kTtxQ_(1f z$Q~oI97MX&f+Y@(?TQUgCncJ=cmDaBid@s}p{wElP|?F*%)K9WQTn5Zc;0c;lI23;R zau#tMn?u(n!!C2g3d}@rR4Lpc39E+;Enx1#bGfD6L^v-@XQw=g6nxu@phB{Hh{!f9yd$G%tD^k`Z z>4jlEpI83|?=a#%q9e5b*`!^Iu$70p%85o$9_H*O-&kF!v){=Y%gDWU>xkS*_8Q}S z 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 z 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

(7t! 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

!?LVD~*~j)BJ1)mK>LLdtHuXSo>ihLuJ|i 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
OH)J^fxJ`ovnu+yaAa>nxo3?_O9%3D0+0Q@$ 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%0DHUT+>BHN}1S3j4i7lB;#Ao;0|t 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

    JfBXGD;yJ{PEf0+On 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 #OOiDNV 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 Qg?%;5*0`gU^iC-9KlePM?f?J) literal 0 HcmV?d00001 diff --git a/vendor/github.com/99designs/gqlgen/CHANGELOG.md b/vendor/github.com/99designs/gqlgen/CHANGELOG.md index 662377f1..03976bab 100644 --- a/vendor/github.com/99designs/gqlgen/CHANGELOG.md +++ b/vendor/github.com/99designs/gqlgen/CHANGELOG.md @@ -5,10 +5,484 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/99designs/gqlgen/compare/v0.17.35...HEAD) +## [Unreleased](https://github.com/99designs/gqlgen/compare/v0.17.41...HEAD) + +## [v0.17.41](https://github.com/99designs/gqlgen/compare/v0.17.40...v0.17.41) - 2023-12-03 +- fe60938c release v0.17.41 + +

    5e98a16a fix fieldset.New bug when prefix slice has len < cap (#2851) + +* fix fieldset.New bug when prefix slice has len < cap + +* ignore gocritic warning + +
    + +
    bd9657f3 Improve ResolverImplementer.Implment (#2850) + +* improve resolver implement render + +* add error when multiple implementors + +* add initial test + +
    + +
    cb3c1c89 Updated apollo sandbox (#2849) + +Added all supported options to new window.EmbeddedSandbox object + +
    + +
    eb5cea72 Small template fix to save space in the generated file (#2841) + +* Small template fix to save space in the generated file + +* Re-generate + + +--------- + +
    + +- c0ca5091 Omittable can now be serialized as json (#2839) + +- dcb76191 fix: sample program indentation (#2840) + +
    132ec1ce Updated GraphiQL 3.0.1 => 3.0.6 (#2837) + +* Updated GraphiQL 3.0.1 => 3.0.6 + +* Added unit tests to cover integrity of playgrounds + +* Updated vulnerable dependency + +* Close response body + +
    + +- 91740700 v0.17.40 postrelease bump + + + + + + +## [v0.17.40](https://github.com/99designs/gqlgen/compare/v0.17.39...v0.17.40) - 2023-10-24 +- c5ad14bf release v0.17.40 + +
    74e918f9 Map based input types fields are now coerced to the right type (#2830) + +* Input maps now unmarshals and checks nested fields + +* Added unit tests + +* Tested required fields in input maps + +* Docs updated with disclaimer + +* Added test for nested inputs + +
    + +
    1e5fa72a Bump [@babel](https://github.com/babel)/traverse from 7.22.5 to 7.23.2 in /integration (#2831) + +- [Release notes](https://github.com/babel/babel/releases) +- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) +- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) + +--- +updated-dependencies: + dependency-type: indirect +... + +
    + +
    e5c17d63 resolver: fix case-insensitive file name collision (#2829) + +for compatibility with Windows/Mac OS X, Go does not allow files with +identical case-insensitive names. +this commit changes the key of the 'files' map to use the lower case +file name, keeping the original file name as a property on the File +object. + +
    + +- 9c5fc302 v0.17.39 postrelease bump + + + + + + +## [v0.17.39](https://github.com/99designs/gqlgen/compare/v0.17.38...v0.17.39) - 2023-10-05 +- eed94e8c release v0.17.39 + +
    a863d645 Add [@interfaceObject](https://github.com/interfaceObject) and [@composeDirective](https://github.com/composeDirective) at Federation 2 directive lists. (#2821) + +This commit just adding those directives into the list. + +
    + +
    3ff523ba Bump postcss from 8.4.24 to 8.4.31 in /integration (#2819) + +Bumps [postcss](https://github.com/postcss/postcss) from 8.4.24 to 8.4.31. +- [Release notes](https://github.com/postcss/postcss/releases) +- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) +- [Commits](https://github.com/postcss/postcss/compare/8.4.24...8.4.31) + +--- +updated-dependencies: +- dependency-name: postcss + dependency-type: indirect +... + +
    + +
    59258642 Adding duration scalar conforming to ISO8601 standard (#2800) + +* Adding duration scalar + +* simple Duration scalar docs + +* using MarshalString, to add proper double quotes + +* adding deps and running go mod tidy on _examples + +* Re-organize imports + + +* Fix test now that imports are sorted + + +--------- + +
    + +
    37f8e4eb Add ability to not fail when pong is not received. (#2815) + +I also changed how the read deadline set works a little, the reason for +this is that the protocol allows for pong to be sent without a ping. + +So setting a read deadline on receiving pong isn't great. Instead we +should always set the read deadline on sending ping. Though to do this +we need to know whether we have received a pong or not. Because if we +set the read deadline when the previous ping still hasn't received the +pong. Then it will never hit the deadline. + +
    + +
    89ac736f Store parsed Schema on ExecutableSchema rather than use global variable (#2811) + +* codegen: executableSchema schema configurable + +* feat + +* feat + +* codegen: add schema property on Config and executableSchema + +* fix: fmt + +* regenerate + + +--------- + +
    + +
    919aded6 Add a pong only keep alive for the new protcol (#2814) + +The protocol allows for this and this eliminates the potential for +over-agressive triggers of the read deadline set for using the ping/pong +flow. + +https://github.com/enisdenjo/graphql-ws/blob/50d5a512d0d7252d41c079e6716b884a191b1ddc/PROTOCOL.md#pong + +
    + +- 001c296a Update auto-generated files with latest results. (#2813) + +
    f6fa3aae Consider go type name when autobinding (#2812) + +Currently, generated schema type names are normalized, for instance - SomeTYPE in the schema will be generated as SomeType in the model. + +When autobinding, however, we only consider the schema type name when searching for it in the relevant package(s), +thus type names that differ post normalizations aren't auto-bound properly and are instead re-generated. + +This commit suggests a fix where we'd try to autobind for both the schema type name (first, to maintain back compat), or the go type name if the former isn't found. + +
    + +
    4e8d8c70 Feature: Support Apollo Federation Auth Directives (#2809) + +* local version working + +* gofmt + +* tabs + +
    + +- 66709d89 feat: update getting-started CreateTodo mutationResolver (#2810) + +
    2c9f9c5f fix: CodeGen for omit_slice_element_pointers and GetMany Entity Resolvers (#2802) + +* remove ! from reps definition + +* adding tests + +* fixing tests + +* adding documentation + +* addressing lint + +* commit after go gonerate + +* gofmt + + +--------- + +
    + +
    3e2393f3 add close flag into wsConnection to avoid duplicate calls of CloseFunc (#2803) + +* add close flag into wsConnection to avoid duplicate calls of CloseFunc + +* add test + +* Fix linter error + +
    + +
    af4d3943 Allow WebsocketInitFunc to add payload to Ack (#4) (#2791) + +* Allow WebsocketInitFunc to add payload to Ack + +The connection ACK message in the protocol for both +graphql-ws and graphql-transport-ws allows for a payload in the +connection ack message. + +We really wanted to use this to establish better telemetry in our use of +websockets in graphql. + +* Fix lint error in test + +* Switch argument ordering. + +--------- + +
    + +- f3b86033 v0.17.38 postrelease bump + + + + + + +## [v0.17.38](https://github.com/99designs/gqlgen/compare/v0.17.37...v0.17.38) - 2023-09-19 +- d9077fac release v0.17.38 + +- 5f452ce2 Update gqlparser to 2.5.10 (#2798) + +- c89860bd refactor: return `null` instead of zero value uuid (#2794) + +- 625ca2e5 Make it possible to pass UI headers (#2793) + +- fceb3311 Fix rand int docs link in Getting Started (#2789) + +- f01d5805 Add new changelog (#2787) + +
    9930e574 Ability to use forceGenerate and extraFields together (#2788) + +* Ability to user forceGenerate and extraFields together + +* Some docs for forceGenerate added + +--------- + +
    + +- f90ac05e v0.17.37 postrelease bump + + + + + + +## [v0.17.37](https://github.com/99designs/gqlgen/compare/v0.17.36...v0.17.37) - 2023-09-08 +- ccae370e release v0.17.37 + +- 6505f8be Update gqlparser (#2785) + +
    153ec470 add uuid type (#2751) (closes #2749) + +* add uuid type + +* add uuid example + +* add uuid scalar doc + +* strconv.Quote + +* Apply suggestions from code review + +* fix + + + +--------- + +
    + +
    fa471180 ForceGenerate parameter to [@goModel](https://github.com/goModel) added. (#2780) + +* forceGenerate to docs added + +--------- + +
    + +
    11bb9b18 codegen: add support for `go_build_tags` option in gqlgen.yaml (#2784) + +* codegen: support go_build_tags option in gqlgen.yaml + +* chore: added test + +* docs/content: update config example + +* chore: more comment + +
    + +
    bee47dcf fix flaky test TestSubscriptions (#2779) + +* fix flaky test TestSubscriptions + +* update other copy of the test + +
    + +- a41f4daa docs: short-lived loader (#2778) + +- cc4e0ba2 ensure HasOperationContext checks for nil (#2776) + +
    a1ca2204 fix typo in TESTING.md server path (#2774) + +following TESTING.md instructions, I got an error: +"stat ./server/server.go: no such file or directory" + +server.go path is: integration/server/cmd/integration/server.go + +
    + +
    1cde8c3f return internal types in schema introspection (#2773) + +according to graphql spec: +``` +types: return the set of all named types contained within this schema. +Any named type which can be found through a field of any introspection type must be included in this set. +``` +source: https://github.com/graphql/graphql-spec/blob/main/spec/Section%204%20--%20Introspection.md#the-__schema-type + +some clients libs (like HotChocolate for C#) depends on this behavior. + +
    + +- 065aea3e Fix gqlgen truncates tag value with colon (#2759) + +- d6270e4f Update subsciptions documentation to correctly close channel (#2753) + +- 2d8673a6 Add Model references to Interface (#2738) + +- 790d7a75 Allow GraphiQL headers to be set when creating the playground handler (#2740) (closes #2739) + +- 0eb95dc4 v0.17.36 postrelease bump + + + + + + +## [v0.17.36](https://github.com/99designs/gqlgen/compare/v0.17.35...v0.17.36) - 2023-07-27 +- bd6cfd31 release v0.17.36 + +
    60ec0d86 Fix plugin template resolution (#2733) (closes #2262) + +- According to the documentation comment for [templates.Options], if the + `Template` and `TemplateFS` fields are empty, it `Render` should find + the `.gotpl` files from the calling plugin. However, it looks like + helper function. This results in broken behavior in consumers such as + [infiotinc/gqlgenc](https://github.com/infiotinc/gqlgenc) when they + use the latest version of `gqlgen` as instead of finding the template + from the plugin, the test template from this package is used which + outputs only: `this is my test package`. +- The cause for this is that `runtime.Caller` was still only skipping + one stack level which means that it was finding the `Render` function + instead of its caller. + +
    + +- 76d444c1 Make models configurable via template (#2730) + +- abe3ffde Don't set the package variable for the new Resolver Template (#2725) + +
    febf9566 Make the resolver implementation configurable via a new template resolver.gotpl (#2720) + +* Make an optional resolver.gotpl ResolverTemplate to implement a custom resolver + +* Add test + +* Add documetation for the new resolver option + +* Change the tab to spaces + +* remove unecessary test assertion :/ + +
    + +
    bda30260 Fixed Data Loader docs (#2723) + +Also updated to v7 + +
    + +
    16c9eb64 Fix docs (#2722) + +* docs: fix variable names in dataloader sample + +* fix: request-scoped middleware + +
    + +
    b233a01b docs: update dataloader docs (#2719) + +* docs: update example + +* docs: update example + +* fix: import + +
    + +- cccc7389 Added go mod tidy to quick start guide (#2718) (closes #2717, #2651, #2641, #2614, #2576) + +- 9adc7b81 Update gqlparser to v2.5.8 (#2716) + +- b442fbf4 Post v0.17.35 changelog update + +- 57c12199 v0.17.35 postrelease bump + + + + + ## [v0.17.35](https://github.com/99designs/gqlgen/compare/v0.17.34...v0.17.35) - 2023-07-15 - 05006bf1 release v0.17.35 diff --git a/vendor/github.com/99designs/gqlgen/TESTING.md b/vendor/github.com/99designs/gqlgen/TESTING.md index b8adadd6..2677b33e 100644 --- a/vendor/github.com/99designs/gqlgen/TESTING.md +++ b/vendor/github.com/99designs/gqlgen/TESTING.md @@ -25,7 +25,7 @@ Setting up the integration environment is a little tricky: ```bash cd integration go generate ./... -go run ./server/server.go +go run ./server/cmd/integration/server.go ``` in another terminal ```bash diff --git a/vendor/github.com/99designs/gqlgen/codegen/args.go b/vendor/github.com/99designs/gqlgen/codegen/args.go index c4cecea9..2f174332 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/args.go +++ b/vendor/github.com/99designs/gqlgen/codegen/args.go @@ -5,9 +5,10 @@ import ( "go/types" "strings" + "github.com/vektah/gqlparser/v2/ast" + "github.com/99designs/gqlgen/codegen/config" "github.com/99designs/gqlgen/codegen/templates" - "github.com/vektah/gqlparser/v2/ast" ) type ArgSet struct { diff --git a/vendor/github.com/99designs/gqlgen/codegen/config/binder.go b/vendor/github.com/99designs/gqlgen/codegen/config/binder.go index 0483afdb..a50de90a 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/config/binder.go +++ b/vendor/github.com/99designs/gqlgen/codegen/config/binder.go @@ -5,12 +5,12 @@ import ( "fmt" "go/token" "go/types" - "strings" + "github.com/vektah/gqlparser/v2/ast" "golang.org/x/tools/go/packages" + "github.com/99designs/gqlgen/codegen/templates" "github.com/99designs/gqlgen/internal/code" - "github.com/vektah/gqlparser/v2/ast" ) var ErrTypeNotFound = errors.New("unable to find type") @@ -203,6 +203,7 @@ type TypeReference struct { IsOmittable bool // Is the type wrapped with Omittable IsContext bool // Is the Marshaler/Unmarshaller the context version; applies to either the method or interface variety. PointersInUmarshalInput bool // Inverse values and pointers in return. + IsRoot bool // Is the type a root level definition such as Query, Mutation or Subscription } func (ref *TypeReference) Elem() *TypeReference { @@ -274,6 +275,10 @@ func (ref *TypeReference) IsScalar() bool { return ref.Definition.Kind == ast.Scalar } +func (ref *TypeReference) IsMap() bool { + return ref.GO == MapType +} + func (ref *TypeReference) UniquenessKey() string { nullability := "O" if ref.GQL.NonNull { @@ -285,7 +290,7 @@ func (ref *TypeReference) UniquenessKey() string { // Fix for #896 elemNullability = "ᚄ" } - return nullability + ref.Definition.Name + "2" + TypeIdentifier(ref.GO) + elemNullability + return nullability + ref.Definition.Name + "2" + templates.TypeIdentifier(ref.GO) + elemNullability } func (ref *TypeReference) MarshalFunc() string { @@ -391,6 +396,7 @@ func (b *Binder) TypeReference(schemaType *ast.Type, bindTarget types.Type) (ret Definition: def, GQL: schemaType, GO: MapType, + IsRoot: b.cfg.IsRoot(def), }, nil } @@ -402,6 +408,7 @@ func (b *Binder) TypeReference(schemaType *ast.Type, bindTarget types.Type) (ret Definition: def, GQL: schemaType, GO: InterfaceType, + IsRoot: b.cfg.IsRoot(def), }, nil } @@ -413,6 +420,7 @@ func (b *Binder) TypeReference(schemaType *ast.Type, bindTarget types.Type) (ret ref := &TypeReference{ Definition: def, GQL: schemaType, + IsRoot: b.cfg.IsRoot(def), } obj, err := b.FindObject(pkgName, typeName) @@ -540,41 +548,3 @@ func basicUnderlying(it types.Type) *types.Basic { return nil } - -var pkgReplacer = strings.NewReplacer( - "/", "ᚋ", - ".", "ᚗ", - "-", "ᚑ", - "~", "א", -) - -func TypeIdentifier(t types.Type) string { - res := "" - for { - switch it := t.(type) { - case *types.Pointer: - t.Underlying() - res += "ᚖ" - t = it.Elem() - case *types.Slice: - res += "ᚕ" - t = it.Elem() - case *types.Named: - res += pkgReplacer.Replace(it.Obj().Pkg().Path()) - res += "ᚐ" - res += it.Obj().Name() - return res - case *types.Basic: - res += it.Name() - return res - case *types.Map: - res += "map" - return res - case *types.Interface: - res += "interface" - return res - default: - panic(fmt.Errorf("unexpected type %T", it)) - } - } -} diff --git a/vendor/github.com/99designs/gqlgen/codegen/config/config.go b/vendor/github.com/99designs/gqlgen/codegen/config/config.go index 8a7205f0..6238b770 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/config/config.go +++ b/vendor/github.com/99designs/gqlgen/codegen/config/config.go @@ -3,6 +3,7 @@ package config import ( "bytes" "fmt" + "go/types" "io" "os" "path/filepath" @@ -10,10 +11,13 @@ import ( "sort" "strings" - "github.com/99designs/gqlgen/internal/code" "github.com/vektah/gqlparser/v2" "github.com/vektah/gqlparser/v2/ast" + "golang.org/x/tools/go/packages" "gopkg.in/yaml.v3" + + "github.com/99designs/gqlgen/codegen/templates" + "github.com/99designs/gqlgen/internal/code" ) type Config struct { @@ -26,6 +30,7 @@ type Config struct { Models TypeMap `yaml:"models,omitempty"` StructTag string `yaml:"struct_tag,omitempty"` Directives map[string]DirectiveConfig `yaml:"directives,omitempty"` + GoBuildTags StringList `yaml:"go_build_tags,omitempty"` GoInitialisms GoInitialismsConfig `yaml:"go_initialisms,omitempty"` OmitSliceElementPointers bool `yaml:"omit_slice_element_pointers,omitempty"` OmitGetters bool `yaml:"omit_getters,omitempty"` @@ -211,7 +216,9 @@ func CompleteConfig(config *Config) error { func (c *Config) Init() error { if c.Packages == nil { - c.Packages = &code.Packages{} + c.Packages = code.NewPackages( + code.WithBuildTags(c.GoBuildTags...), + ) } if c.Schema == nil { @@ -257,6 +264,10 @@ func (c *Config) ReloadAllPackages() { c.Packages.ReloadAll(c.packageList()...) } +func (c *Config) IsRoot(def *ast.Definition) bool { + return def == c.Schema.Query || def == c.Schema.Mutation || def == c.Schema.Subscription +} + func (c *Config) injectTypesFromSchema() error { c.Directives["goModel"] = DirectiveConfig{ SkipRuntime: true, @@ -271,7 +282,7 @@ func (c *Config) injectTypesFromSchema() error { } for _, schemaType := range c.Schema.Types { - if schemaType == c.Schema.Query || schemaType == c.Schema.Mutation || schemaType == c.Schema.Subscription { + if c.IsRoot(schemaType) { continue } @@ -281,6 +292,7 @@ func (c *Config) injectTypesFromSchema() error { c.Models.Add(schemaType.Name, mv.(string)) } } + if ma := bd.Arguments.ForName("models"); ma != nil { if mvs, err := ma.Value.Value(nil); err == nil { for _, mv := range mvs.([]interface{}) { @@ -288,6 +300,12 @@ func (c *Config) injectTypesFromSchema() error { } } } + + if fg := bd.Arguments.ForName("forceGenerate"); fg != nil { + if mv, err := fg.Value.Value(nil); err == nil { + c.Models.ForceGenerate(schemaType.Name, mv.(bool)) + } + } } if schemaType.Kind == ast.Object || schemaType.Kind == ast.InputObject { @@ -329,8 +347,9 @@ func (c *Config) injectTypesFromSchema() error { } type TypeMapEntry struct { - Model StringList `yaml:"model"` - Fields map[string]TypeMapField `yaml:"fields,omitempty"` + Model StringList `yaml:"model,omitempty"` + ForceGenerate bool `yaml:"forceGenerate,omitempty"` + Fields map[string]TypeMapField `yaml:"fields,omitempty"` // Key is the Go name of the field. ExtraFields map[string]ModelExtraField `yaml:"extraFields,omitempty"` @@ -529,6 +548,12 @@ func (tm TypeMap) Add(name string, goType string) { tm[name] = modelCfg } +func (tm TypeMap) ForceGenerate(name string, forceGenerate bool) { + modelCfg := tm[name] + modelCfg.ForceGenerate = forceGenerate + tm[name] = modelCfg +} + type DirectiveConfig struct { SkipRuntime bool `yaml:"skip_runtime"` } @@ -583,7 +608,7 @@ func (c *Config) autobind() error { ps := c.Packages.LoadAll(c.AutoBind...) for _, t := range c.Schema.Types { - if c.Models.UserDefined(t.Name) { + if c.Models.UserDefined(t.Name) || c.Models[t.Name].ForceGenerate { continue } @@ -591,14 +616,20 @@ func (c *Config) autobind() error { if p == nil || p.Module == nil { return fmt.Errorf("unable to load %s - make sure you're using an import path to a package that exists", c.AutoBind[i]) } - if t := p.Types.Scope().Lookup(t.Name); t != nil { - c.Models.Add(t.Name(), t.Pkg().Path()+"."+t.Name()) + + autobindType := c.lookupAutobindType(p, t) + if autobindType != nil { + c.Models.Add(t.Name, autobindType.Pkg().Path()+"."+autobindType.Name()) break } } } for i, t := range c.Models { + if t.ForceGenerate { + continue + } + for j, m := range t.Model { pkg, typename := code.PkgAndType(m) @@ -622,6 +653,17 @@ func (c *Config) autobind() error { return nil } +func (c *Config) lookupAutobindType(p *packages.Package, schemaType *ast.Definition) types.Object { + // Try binding to either the original schema type name, or the normalized go type name + for _, lookupName := range []string{schemaType.Name, templates.ToGo(schemaType.Name)} { + if t := p.Types.Scope().Lookup(lookupName); t != nil { + return t + } + } + + return nil +} + func (c *Config) injectBuiltins() { builtins := TypeMap{ "__Directive": {Model: StringList{"github.com/99designs/gqlgen/graphql/introspection.Directive"}}, @@ -671,7 +713,9 @@ func (c *Config) injectBuiltins() { func (c *Config) LoadSchema() error { if c.Packages != nil { - c.Packages = &code.Packages{} + c.Packages = code.NewPackages( + code.WithBuildTags(c.GoBuildTags...), + ) } if err := c.check(); err != nil { diff --git a/vendor/github.com/99designs/gqlgen/codegen/config/initialisms.go b/vendor/github.com/99designs/gqlgen/codegen/config/initialisms.go index 5c169c89..25e7331f 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/config/initialisms.go +++ b/vendor/github.com/99designs/gqlgen/codegen/config/initialisms.go @@ -1,62 +1,10 @@ package config -import "strings" +import ( + "strings" -// commonInitialisms is a set of common initialisms. -// Only add entries that are highly unlikely to be non-initialisms. -// For instance, "ID" is fine (Freudian code is rare), but "AND" is not. -var commonInitialisms = map[string]bool{ - "ACL": true, - "API": true, - "ASCII": true, - "CPU": true, - "CSS": true, - "CSV": true, - "DNS": true, - "EOF": true, - "GUID": true, - "HTML": true, - "HTTP": true, - "HTTPS": true, - "ICMP": true, - "ID": true, - "IP": true, - "JSON": true, - "KVK": true, - "LHS": true, - "PDF": true, - "PGP": true, - "QPS": true, - "QR": true, - "RAM": true, - "RHS": true, - "RPC": true, - "SLA": true, - "SMTP": true, - "SQL": true, - "SSH": true, - "SVG": true, - "TCP": true, - "TLS": true, - "TTL": true, - "UDP": true, - "UI": true, - "UID": true, - "URI": true, - "URL": true, - "UTF8": true, - "UUID": true, - "VM": true, - "XML": true, - "XMPP": true, - "XSRF": true, - "XSS": true, -} - -// GetInitialisms returns the initialisms to capitalize in Go names. If unchanged, default initialisms will be returned -var GetInitialisms = func() map[string]bool { - return commonInitialisms -} + "github.com/99designs/gqlgen/codegen/templates" +) // GoInitialismsConfig allows to modify the default behavior of naming Go methods, types and properties type GoInitialismsConfig struct { @@ -69,7 +17,7 @@ type GoInitialismsConfig struct { // setInitialisms adjustes GetInitialisms based on its settings. func (i GoInitialismsConfig) setInitialisms() { toUse := i.determineGoInitialisms() - GetInitialisms = func() map[string]bool { + templates.GetInitialisms = func() map[string]bool { return toUse } } @@ -82,8 +30,8 @@ func (i GoInitialismsConfig) determineGoInitialisms() (initialismsToUse map[stri initialismsToUse[strings.ToUpper(initialism)] = true } } else { - initialismsToUse = make(map[string]bool, len(commonInitialisms)+len(i.Initialisms)) - for initialism, value := range commonInitialisms { + initialismsToUse = make(map[string]bool, len(templates.CommonInitialisms)+len(i.Initialisms)) + for initialism, value := range templates.CommonInitialisms { initialismsToUse[strings.ToUpper(initialism)] = value } for _, initialism := range i.Initialisms { diff --git a/vendor/github.com/99designs/gqlgen/codegen/directive.go b/vendor/github.com/99designs/gqlgen/codegen/directive.go index 97306112..f955665b 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/directive.go +++ b/vendor/github.com/99designs/gqlgen/codegen/directive.go @@ -5,8 +5,9 @@ import ( "strconv" "strings" - "github.com/99designs/gqlgen/codegen/templates" "github.com/vektah/gqlparser/v2/ast" + + "github.com/99designs/gqlgen/codegen/templates" ) type DirectiveList map[string]*Directive diff --git a/vendor/github.com/99designs/gqlgen/codegen/field.go b/vendor/github.com/99designs/gqlgen/codegen/field.go index a7e1fb2b..1af2d836 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/field.go +++ b/vendor/github.com/99designs/gqlgen/codegen/field.go @@ -10,11 +10,12 @@ import ( "strconv" "strings" - "github.com/99designs/gqlgen/codegen/config" - "github.com/99designs/gqlgen/codegen/templates" "github.com/vektah/gqlparser/v2/ast" "golang.org/x/text/cases" "golang.org/x/text/language" + + "github.com/99designs/gqlgen/codegen/config" + "github.com/99designs/gqlgen/codegen/templates" ) type Field struct { @@ -152,6 +153,11 @@ func (b *builder) bindField(obj *Object, f *Field) (errret error) { switch target := target.(type) { case nil: + // Skips creating a resolver for any root types + if b.Config.IsRoot(b.Schema.Types[f.Type.Name()]) { + return nil + } + objPos := b.Binder.TypePosition(obj.Type) return fmt.Errorf( "%s:%d adding resolver method for %s.%s, nothing matched", diff --git a/vendor/github.com/99designs/gqlgen/codegen/field.gotpl b/vendor/github.com/99designs/gqlgen/codegen/field.gotpl index f974b597..de031769 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/field.gotpl +++ b/vendor/github.com/99designs/gqlgen/codegen/field.gotpl @@ -16,49 +16,59 @@ func (ec *executionContext) _{{$object.Name}}_{{$field.Name}}(ctx context.Contex ret = {{ $null }} } }() - {{- if $.AllDirectives.LocationDirectives "FIELD" }} - resTmp := ec._fieldMiddleware(ctx, {{if $object.Root}}nil{{else}}obj{{end}}, func(rctx context.Context) (interface{}, error) { - {{ template "field" $field }} - }) - {{ else }} - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { - {{ template "field" $field }} - }) - if err != nil { - ec.Error(ctx, err) - return {{ $null }} - } - {{- end }} - if resTmp == nil { - {{- if $field.TypeReference.GQL.NonNull }} - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - {{- end }} - return {{ $null }} - } - {{- if $object.Stream }} - return func(ctx context.Context) graphql.Marshaler { - select { - case res, ok := <-resTmp.(<-chan {{$field.TypeReference.GO | ref}}): - if !ok { - return nil - } - return graphql.WriterFunc(func(w io.Writer) { - w.Write([]byte{'{'}) - graphql.MarshalString(field.Alias).MarshalGQL(w) - w.Write([]byte{':'}) - ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res).MarshalGQL(w) - w.Write([]byte{'}'}) - }) - case <-ctx.Done(): - return nil - } - } - {{- else }} - res := resTmp.({{$field.TypeReference.GO | ref}}) + {{- if $field.TypeReference.IsRoot }} + {{- if $field.TypeReference.IsPtr }} + res := &{{ $field.TypeReference.Elem.GO | ref }}{} + {{- else }} + res := {{ $field.TypeReference.GO | ref }}{} + {{- end }} fc.Result = res return ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res) + {{- else}} + {{- if $.AllDirectives.LocationDirectives "FIELD" }} + resTmp := ec._fieldMiddleware(ctx, {{if $object.Root}}nil{{else}}obj{{end}}, func(rctx context.Context) (interface{}, error) { + {{ template "field" $field }} + }) + {{ else }} + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + {{ template "field" $field }} + }) + if err != nil { + ec.Error(ctx, err) + return {{ $null }} + } + {{- end }} + if resTmp == nil { + {{- if $field.TypeReference.GQL.NonNull }} + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + {{- end }} + return {{ $null }} + } + {{- if $object.Stream }} + return func(ctx context.Context) graphql.Marshaler { + select { + case res, ok := <-resTmp.(<-chan {{$field.TypeReference.GO | ref}}): + if !ok { + return nil + } + return graphql.WriterFunc(func(w io.Writer) { + w.Write([]byte{'{'}) + graphql.MarshalString(field.Alias).MarshalGQL(w) + w.Write([]byte{':'}) + ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res).MarshalGQL(w) + w.Write([]byte{'}'}) + }) + case <-ctx.Done(): + return nil + } + } + {{- else }} + res := resTmp.({{$field.TypeReference.GO | ref}}) + fc.Result = res + return ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res) + {{- end }} {{- end }} } diff --git a/vendor/github.com/99designs/gqlgen/codegen/generate.go b/vendor/github.com/99designs/gqlgen/codegen/generate.go index 1ce8c329..d63758ab 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/generate.go +++ b/vendor/github.com/99designs/gqlgen/codegen/generate.go @@ -9,9 +9,10 @@ import ( "runtime" "strings" + "github.com/vektah/gqlparser/v2/ast" + "github.com/99designs/gqlgen/codegen/config" "github.com/99designs/gqlgen/codegen/templates" - "github.com/vektah/gqlparser/v2/ast" ) //go:embed *.gotpl diff --git a/vendor/github.com/99designs/gqlgen/codegen/generated!.gotpl b/vendor/github.com/99designs/gqlgen/codegen/generated!.gotpl index 42e84b65..b343e626 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/generated!.gotpl +++ b/vendor/github.com/99designs/gqlgen/codegen/generated!.gotpl @@ -18,6 +18,7 @@ // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { return &executableSchema{ + schema: cfg.Schema, resolvers: cfg.Resolvers, directives: cfg.Directives, complexity: cfg.Complexity, @@ -25,6 +26,7 @@ } type Config struct { + Schema *ast.Schema Resolvers ResolverRoot Directives DirectiveRoot Complexity ComplexityRoot @@ -93,12 +95,16 @@ {{ if eq .Config.Exec.Layout "single-file" }} type executableSchema struct { + schema *ast.Schema resolvers ResolverRoot directives DirectiveRoot complexity ComplexityRoot } func (e *executableSchema) Schema() *ast.Schema { + if e.schema != nil { + return e.schema + } return parsedSchema } @@ -268,14 +274,14 @@ if ec.DisableIntrospection { return nil, errors.New("introspection disabled") } - return introspection.WrapSchema(parsedSchema), nil + return introspection.WrapSchema(ec.Schema()), nil } func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { if ec.DisableIntrospection { return nil, errors.New("introspection disabled") } - return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]), nil + return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil } {{if .HasEmbeddableSources }} diff --git a/vendor/github.com/99designs/gqlgen/codegen/input.gotpl b/vendor/github.com/99designs/gqlgen/codegen/input.gotpl index 126ff661..9240b56c 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/input.gotpl +++ b/vendor/github.com/99designs/gqlgen/codegen/input.gotpl @@ -5,7 +5,11 @@ {{- $it = "&it" }} {{- end }} func (ec *executionContext) unmarshalInput{{ .Name }}(ctx context.Context, obj interface{}) ({{ if .PointersInUmarshalInput }}*{{ end }}{{.Type | ref}}, error) { - var it {{.Type | ref}} + {{- if $input.IsMap }} + it := make(map[string]interface{}, len(obj.(map[string]interface{}))) + {{- else }} + var it {{.Type | ref}} + {{- end }} asMap := map[string]interface{}{} for k, v := range obj.(map[string]interface{}) { asMap[k] = v @@ -27,8 +31,10 @@ switch k { {{- range $field := .Fields }} case {{$field.Name|quote}}: - var err error - + {{- $lhs := (printf "it.%s" $field.GoFieldName) }} + {{- if $input.IsMap }} + {{- $lhs = (printf "it[%q]" $field.Name) }} + {{- end }} ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField({{$field.Name|quote}})) {{- if $field.ImplDirectives }} directive0 := func(ctx context.Context) (interface{}, error) { return ec.{{ $field.TypeReference.UnmarshalFunc }}(ctx, v) } @@ -44,18 +50,18 @@ } {{- else }} {{- if $field.TypeReference.IsOmittable }} - it.{{$field.GoFieldName}} = graphql.OmittableOf(data) + {{ $lhs }} = graphql.OmittableOf(data) {{- else }} - it.{{$field.GoFieldName}} = data + {{ $lhs }} = data {{- end }} {{- end }} {{- if $field.TypeReference.IsNilable }} {{- if not $field.IsResolver }} } else if tmp == nil { {{- if $field.TypeReference.IsOmittable }} - it.{{$field.GoFieldName}} = graphql.OmittableOf[{{ $field.TypeReference.GO | ref }}](nil) + {{ $lhs }} = graphql.OmittableOf[{{ $field.TypeReference.GO | ref }}](nil) {{- else }} - it.{{$field.GoFieldName}} = nil + {{ $lhs }} = nil {{- end }} {{- end }} {{- end }} @@ -78,9 +84,9 @@ return {{$it}}, err } {{- if $field.TypeReference.IsOmittable }} - it.{{$field.GoFieldName}} = graphql.OmittableOf(data) + {{ $lhs }} = graphql.OmittableOf(data) {{- else }} - it.{{$field.GoFieldName}} = data + {{ $lhs }} = data {{- end }} {{- end }} {{- end }} diff --git a/vendor/github.com/99designs/gqlgen/codegen/interface.go b/vendor/github.com/99designs/gqlgen/codegen/interface.go index cdc4d4d3..1ddcf408 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/interface.go +++ b/vendor/github.com/99designs/gqlgen/codegen/interface.go @@ -3,6 +3,7 @@ package codegen import ( "fmt" "go/types" + "sort" "github.com/vektah/gqlparser/v2/ast" @@ -40,7 +41,13 @@ func (b *builder) buildInterface(typ *ast.Definition) (*Interface, error) { return nil, fmt.Errorf("%s is not an interface", i.Type) } - for _, implementor := range b.Schema.GetPossibleTypes(typ) { + // Sort so that more specific types are evaluated first. + implementors := b.Schema.GetPossibleTypes(typ) + sort.Slice(implementors, func(i, j int) bool { + return len(implementors[i].Interfaces) > len(implementors[j].Interfaces) + }) + + for _, implementor := range implementors { obj, err := b.Binder.DefaultUserObject(implementor.Name) if err != nil { return nil, fmt.Errorf("%s has no backing go type", implementor.Name) diff --git a/vendor/github.com/99designs/gqlgen/codegen/object.go b/vendor/github.com/99designs/gqlgen/codegen/object.go index 86092327..eee43849 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/object.go +++ b/vendor/github.com/99designs/gqlgen/codegen/object.go @@ -7,10 +7,11 @@ import ( "strings" "unicode" - "github.com/99designs/gqlgen/codegen/config" "github.com/vektah/gqlparser/v2/ast" "golang.org/x/text/cases" "golang.org/x/text/language" + + "github.com/99designs/gqlgen/codegen/config" ) type GoFieldType int @@ -44,7 +45,7 @@ func (b *builder) buildObject(typ *ast.Definition) (*Object, error) { caser := cases.Title(language.English, cases.NoLower) obj := &Object{ Definition: typ, - Root: b.Schema.Query == typ || b.Schema.Mutation == typ || b.Schema.Subscription == typ, + Root: b.Config.IsRoot(typ), DisableConcurrency: typ == b.Schema.Mutation, Stream: typ == b.Schema.Subscription, Directives: dirs, @@ -112,8 +113,8 @@ func (o *Object) HasResolvers() bool { } func (o *Object) HasUnmarshal() bool { - if o.Type == config.MapType { - return true + if o.IsMap() { + return false } for i := 0; i < o.Type.(*types.Named).NumMethods(); i++ { if o.Type.(*types.Named).Method(i).Name() == "UnmarshalGQL" { @@ -149,6 +150,10 @@ func (o *Object) IsReserved() bool { return strings.HasPrefix(o.Definition.Name, "__") } +func (o *Object) IsMap() bool { + return o.Type == config.MapType +} + func (o *Object) Description() string { return o.Definition.Description } diff --git a/vendor/github.com/99designs/gqlgen/codegen/root_.gotpl b/vendor/github.com/99designs/gqlgen/codegen/root_.gotpl index dcfc84d0..0b90ad53 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/root_.gotpl +++ b/vendor/github.com/99designs/gqlgen/codegen/root_.gotpl @@ -17,6 +17,7 @@ // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { return &executableSchema{ + schema: cfg.Schema, resolvers: cfg.Resolvers, directives: cfg.Directives, complexity: cfg.Complexity, @@ -24,6 +25,7 @@ func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { } type Config struct { + Schema *ast.Schema Resolvers ResolverRoot Directives DirectiveRoot Complexity ComplexityRoot @@ -66,12 +68,16 @@ type ComplexityRoot struct { } type executableSchema struct { + schema *ast.Schema resolvers ResolverRoot directives DirectiveRoot complexity ComplexityRoot } func (e *executableSchema) Schema() *ast.Schema { + if e.schema != nil { + return e.schema + } return parsedSchema } @@ -241,14 +247,14 @@ func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { if ec.DisableIntrospection { return nil, errors.New("introspection disabled") } - return introspection.WrapSchema(parsedSchema), nil + return introspection.WrapSchema(ec.Schema()), nil } func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { if ec.DisableIntrospection { return nil, errors.New("introspection disabled") } - return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]), nil + return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil } diff --git a/vendor/github.com/99designs/gqlgen/codegen/templates/templates.go b/vendor/github.com/99designs/gqlgen/codegen/templates/templates.go index 97652757..4a4e9159 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/templates/templates.go +++ b/vendor/github.com/99designs/gqlgen/codegen/templates/templates.go @@ -17,7 +17,6 @@ import ( "text/template" "unicode" - "github.com/99designs/gqlgen/codegen/config" "github.com/99designs/gqlgen/internal/code" "github.com/99designs/gqlgen/internal/imports" ) @@ -202,7 +201,7 @@ func Funcs() template.FuncMap { "rawQuote": rawQuote, "dump": Dump, "ref": ref, - "ts": config.TypeIdentifier, + "ts": TypeIdentifier, "call": Call, "prefixLines": prefixLines, "notNil": notNil, @@ -465,7 +464,7 @@ func wordWalker(str string, f func(*wordInfo)) { } i++ - initialisms := config.GetInitialisms() + initialisms := GetInitialisms() // [w,i) is a word. word := string(runes[w:i]) if !eow && initialisms[word] && !unicode.IsLower(runes[i]) { @@ -668,3 +667,97 @@ func write(filename string, b []byte, packages *code.Packages) error { return nil } + +var pkgReplacer = strings.NewReplacer( + "/", "ᚋ", + ".", "ᚗ", + "-", "ᚑ", + "~", "א", +) + +func TypeIdentifier(t types.Type) string { + res := "" + for { + switch it := t.(type) { + case *types.Pointer: + t.Underlying() + res += "ᚖ" + t = it.Elem() + case *types.Slice: + res += "ᚕ" + t = it.Elem() + case *types.Named: + res += pkgReplacer.Replace(it.Obj().Pkg().Path()) + res += "ᚐ" + res += it.Obj().Name() + return res + case *types.Basic: + res += it.Name() + return res + case *types.Map: + res += "map" + return res + case *types.Interface: + res += "interface" + return res + default: + panic(fmt.Errorf("unexpected type %T", it)) + } + } +} + +// CommonInitialisms is a set of common initialisms. +// Only add entries that are highly unlikely to be non-initialisms. +// For instance, "ID" is fine (Freudian code is rare), but "AND" is not. +var CommonInitialisms = map[string]bool{ + "ACL": true, + "API": true, + "ASCII": true, + "CPU": true, + "CSS": true, + "CSV": true, + "DNS": true, + "EOF": true, + "GUID": true, + "HTML": true, + "HTTP": true, + "HTTPS": true, + "ICMP": true, + "ID": true, + "IP": true, + "JSON": true, + "KVK": true, + "LHS": true, + "PDF": true, + "PGP": true, + "QPS": true, + "QR": true, + "RAM": true, + "RHS": true, + "RPC": true, + "SLA": true, + "SMTP": true, + "SQL": true, + "SSH": true, + "SVG": true, + "TCP": true, + "TLS": true, + "TTL": true, + "UDP": true, + "UI": true, + "UID": true, + "URI": true, + "URL": true, + "UTF8": true, + "UUID": true, + "VM": true, + "XML": true, + "XMPP": true, + "XSRF": true, + "XSS": true, +} + +// GetInitialisms returns the initialisms to capitalize in Go names. If unchanged, default initialisms will be returned +var GetInitialisms = func() map[string]bool { + return CommonInitialisms +} diff --git a/vendor/github.com/99designs/gqlgen/codegen/type.gotpl b/vendor/github.com/99designs/gqlgen/codegen/type.gotpl index 5cbd737c..272f3db3 100644 --- a/vendor/github.com/99designs/gqlgen/codegen/type.gotpl +++ b/vendor/github.com/99designs/gqlgen/codegen/type.gotpl @@ -59,8 +59,6 @@ {{- else}} return res, graphql.ErrorOnPath(ctx, err) {{- end }} - {{- else if eq ($type.GO | ref) "map[string]interface{}" }} - return v.(map[string]interface{}), nil {{- else if $type.IsMarshaler }} {{- if and $type.IsNilable $type.Elem }} var res = new({{ $type.Elem.GO | ref }}) @@ -75,7 +73,7 @@ return res, graphql.ErrorOnPath(ctx, err) {{- else }} res, err := ec.unmarshalInput{{ $type.GQL.Name }}(ctx, v) - {{- if and $type.IsNilable (not $type.PointersInUmarshalInput) }} + {{- if and $type.IsNilable (not $type.IsMap) (not $type.PointersInUmarshalInput) }} return &res, graphql.ErrorOnPath(ctx, err) {{- else if and (not $type.IsNilable) $type.PointersInUmarshalInput }} return *res, graphql.ErrorOnPath(ctx, err) @@ -185,6 +183,13 @@ {{- else }} return res {{- end }} + {{- else if $type.IsRoot }} + {{- if eq $type.Definition.Name "Subscription" }} + res := ec._{{$type.Definition.Name}}(ctx, sel) + return res(ctx) + {{- else }} + return ec._{{$type.Definition.Name}}(ctx, sel) + {{- end }} {{- else }} return ec._{{$type.Definition.Name}}(ctx, sel, {{ if not $type.IsNilable}}&{{end}} v) {{- end }} diff --git a/vendor/github.com/99designs/gqlgen/complexity/complexity.go b/vendor/github.com/99designs/gqlgen/complexity/complexity.go index e3ecf761..aa0f8643 100644 --- a/vendor/github.com/99designs/gqlgen/complexity/complexity.go +++ b/vendor/github.com/99designs/gqlgen/complexity/complexity.go @@ -1,8 +1,9 @@ package complexity import ( - "github.com/99designs/gqlgen/graphql" "github.com/vektah/gqlparser/v2/ast" + + "github.com/99designs/gqlgen/graphql" ) func Calculate(es graphql.ExecutableSchema, op *ast.OperationDefinition, vars map[string]interface{}) int { diff --git a/vendor/github.com/99designs/gqlgen/graphql/context_operation.go b/vendor/github.com/99designs/gqlgen/graphql/context_operation.go index 77a42b84..3e6a221b 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/context_operation.go +++ b/vendor/github.com/99designs/gqlgen/graphql/context_operation.go @@ -73,8 +73,8 @@ func WithOperationContext(ctx context.Context, rc *OperationContext) context.Con // // Some errors can happen outside of an operation, eg json unmarshal errors. func HasOperationContext(ctx context.Context) bool { - _, ok := ctx.Value(operationCtx).(*OperationContext) - return ok + val, ok := ctx.Value(operationCtx).(*OperationContext) + return ok && val != nil } // This is just a convenient wrapper method for CollectFields diff --git a/vendor/github.com/99designs/gqlgen/graphql/duration.go b/vendor/github.com/99designs/gqlgen/graphql/duration.go new file mode 100644 index 00000000..3eb392db --- /dev/null +++ b/vendor/github.com/99designs/gqlgen/graphql/duration.go @@ -0,0 +1,27 @@ +package graphql + +import ( + "fmt" + "time" + + dur "github.com/sosodev/duration" +) + +// UnmarshalDuration returns the duration from a string in ISO8601 format +func UnmarshalDuration(v interface{}) (time.Duration, error) { + input, ok := v.(string) + if !ok { + return 0, fmt.Errorf("input must be a string") + } + + d2, err := dur.Parse(input) + if err != nil { + return 0, err + } + return d2.ToTimeDuration(), nil +} + +// MarshalDuration returns the duration on ISO8601 format +func MarshalDuration(d time.Duration) Marshaler { + return MarshalString(dur.Format(d)) +} diff --git a/vendor/github.com/99designs/gqlgen/graphql/executor/executor.go b/vendor/github.com/99designs/gqlgen/graphql/executor/executor.go index c46a007b..ef0603ea 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/executor/executor.go +++ b/vendor/github.com/99designs/gqlgen/graphql/executor/executor.go @@ -3,12 +3,13 @@ package executor import ( "context" - "github.com/99designs/gqlgen/graphql" - "github.com/99designs/gqlgen/graphql/errcode" "github.com/vektah/gqlparser/v2/ast" "github.com/vektah/gqlparser/v2/gqlerror" "github.com/vektah/gqlparser/v2/parser" "github.com/vektah/gqlparser/v2/validator" + + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/errcode" ) // Executor executes graphql queries against a schema. diff --git a/vendor/github.com/99designs/gqlgen/graphql/fieldset.go b/vendor/github.com/99designs/gqlgen/graphql/fieldset.go index 3ba28582..2c9e3dc9 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/fieldset.go +++ b/vendor/github.com/99designs/gqlgen/graphql/fieldset.go @@ -46,8 +46,8 @@ func (m *FieldSet) Dispatch(ctx context.Context) { for _, d := range m.delayed[1:] { wg.Add(1) go func(d delayedResult) { + defer wg.Done() m.Values[d.i] = d.f(ctx) - wg.Done() }(d) } diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/extension/apq.go b/vendor/github.com/99designs/gqlgen/graphql/handler/extension/apq.go index 866276ee..465c2ada 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/extension/apq.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/extension/apq.go @@ -6,12 +6,11 @@ import ( "encoding/hex" "fmt" - "github.com/99designs/gqlgen/graphql/errcode" - + "github.com/mitchellh/mapstructure" "github.com/vektah/gqlparser/v2/gqlerror" "github.com/99designs/gqlgen/graphql" - "github.com/mitchellh/mapstructure" + "github.com/99designs/gqlgen/graphql/errcode" ) const ( diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/extension/complexity.go b/vendor/github.com/99designs/gqlgen/graphql/handler/extension/complexity.go index e88848d1..a5b6a604 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/extension/complexity.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/extension/complexity.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/vektah/gqlparser/v2/gqlerror" + "github.com/99designs/gqlgen/complexity" "github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/graphql/errcode" - "github.com/vektah/gqlparser/v2/gqlerror" ) const errComplexityLimit = "COMPLEXITY_LIMIT_EXCEEDED" diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/extension/introspection.go b/vendor/github.com/99designs/gqlgen/graphql/handler/extension/introspection.go index acc5db2f..8e391265 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/extension/introspection.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/extension/introspection.go @@ -3,8 +3,9 @@ package extension import ( "context" - "github.com/99designs/gqlgen/graphql" "github.com/vektah/gqlparser/v2/gqlerror" + + "github.com/99designs/gqlgen/graphql" ) // EnableIntrospection enables clients to reflect all of the types available on the graph. diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/lru/lru.go b/vendor/github.com/99designs/gqlgen/graphql/handler/lru/lru.go index 68241aba..6ae8a38e 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/lru/lru.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/lru/lru.go @@ -3,8 +3,9 @@ package lru import ( "context" - "github.com/99designs/gqlgen/graphql" lru "github.com/hashicorp/golang-lru/v2" + + "github.com/99designs/gqlgen/graphql" ) type LRU struct { diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/server.go b/vendor/github.com/99designs/gqlgen/graphql/handler/server.go index b6524d8d..fd365ccb 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/server.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/server.go @@ -7,12 +7,13 @@ import ( "net/http" "time" + "github.com/vektah/gqlparser/v2/gqlerror" + "github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/graphql/executor" "github.com/99designs/gqlgen/graphql/handler/extension" "github.com/99designs/gqlgen/graphql/handler/lru" "github.com/99designs/gqlgen/graphql/handler/transport" - "github.com/vektah/gqlparser/v2/gqlerror" ) type ( diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/error.go b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/error.go index b1aeaf14..18f09f55 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/error.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/error.go @@ -5,8 +5,9 @@ import ( "fmt" "net/http" - "github.com/99designs/gqlgen/graphql" "github.com/vektah/gqlparser/v2/gqlerror" + + "github.com/99designs/gqlgen/graphql" ) // SendError sends a best effort error to a raw response writer. It assumes the client can understand the standard diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/http_get.go b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/http_get.go index 324fd986..9a47bfbe 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/http_get.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/http_get.go @@ -7,10 +7,11 @@ import ( "net/url" "strings" - "github.com/99designs/gqlgen/graphql" - "github.com/99designs/gqlgen/graphql/errcode" "github.com/vektah/gqlparser/v2/ast" "github.com/vektah/gqlparser/v2/gqlerror" + + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/errcode" ) // GET implements the GET side of the default HTTP transport diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/util.go b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/util.go index ce845c19..19b7521c 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/util.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/util.go @@ -5,8 +5,9 @@ import ( "fmt" "io" - "github.com/99designs/gqlgen/graphql" "github.com/vektah/gqlparser/v2/gqlerror" + + "github.com/99designs/gqlgen/graphql" ) func writeJson(w io.Writer, response *graphql.Response) { diff --git a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/websocket.go b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/websocket.go index acd124fe..e1334b92 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/handler/transport/websocket.go +++ b/vendor/github.com/99designs/gqlgen/graphql/handler/transport/websocket.go @@ -12,10 +12,11 @@ import ( "sync" "time" - "github.com/99designs/gqlgen/graphql" - "github.com/99designs/gqlgen/graphql/errcode" "github.com/gorilla/websocket" "github.com/vektah/gqlparser/v2/gqlerror" + + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/errcode" ) type ( @@ -26,7 +27,17 @@ type ( ErrorFunc WebsocketErrorFunc CloseFunc WebsocketCloseFunc KeepAlivePingInterval time.Duration + PongOnlyInterval time.Duration PingPongInterval time.Duration + /* If PingPongInterval has a non-0 duration, then when the server sends a ping + * it sets a ReadDeadline of PingPongInterval*2 and if the client doesn't respond + * with pong before that deadline is reached then the connection will die with a + * 1006 error code. + * + * MissingPongOk if true, tells the server to not use a ReadDeadline such that a + * missing/slow pong response from the client doesn't kill the connection. + */ + MissingPongOk bool didInjectSubprotocols bool } @@ -38,13 +49,16 @@ type ( active map[string]context.CancelFunc mu sync.Mutex keepAliveTicker *time.Ticker + pongOnlyTicker *time.Ticker pingPongTicker *time.Ticker + receivedPong bool exec graphql.GraphExecutor + closed bool initPayload InitPayload } - WebsocketInitFunc func(ctx context.Context, initPayload InitPayload) (context.Context, error) + WebsocketInitFunc func(ctx context.Context, initPayload InitPayload) (context.Context, *InitPayload, error) WebsocketErrorFunc func(ctx context.Context, err error) // Callback called when websocket is closed. @@ -179,8 +193,10 @@ func (c *wsConnection) init() bool { } } + var initAckPayload *InitPayload = nil if c.InitFunc != nil { - ctx, err := c.InitFunc(c.ctx, c.initPayload) + var ctx context.Context + ctx, initAckPayload, err = c.InitFunc(c.ctx, c.initPayload) if err != nil { c.sendConnectionError(err.Error()) c.close(websocket.CloseNormalClosure, "terminated") @@ -189,7 +205,15 @@ func (c *wsConnection) init() bool { c.ctx = ctx } - c.write(&message{t: connectionAckMessageType}) + if initAckPayload != nil { + initJsonAckPayload, err := json.Marshal(*initAckPayload) + if err != nil { + panic(err) + } + c.write(&message{t: connectionAckMessageType, payload: initJsonAckPayload}) + } else { + c.write(&message{t: connectionAckMessageType}) + } c.write(&message{t: keepAliveMessageType}) case connectionCloseMessageType: c.close(websocket.CloseNormalClosure, "terminated") @@ -228,16 +252,28 @@ func (c *wsConnection) run() { go c.keepAlive(ctx) } + // If we're running in graphql-transport-ws mode, create a timer that will trigger a + // just a pong message every interval + if c.conn.Subprotocol() == graphqltransportwsSubprotocol && c.PongOnlyInterval != 0 { + c.mu.Lock() + c.pongOnlyTicker = time.NewTicker(c.PongOnlyInterval) + c.mu.Unlock() + + go c.keepAlivePongOnly(ctx) + } + // If we're running in graphql-transport-ws mode, create a timer that will - // trigger a ping message every interval + // trigger a ping message every interval and expect a pong! if c.conn.Subprotocol() == graphqltransportwsSubprotocol && c.PingPongInterval != 0 { c.mu.Lock() c.pingPongTicker = time.NewTicker(c.PingPongInterval) c.mu.Unlock() - // Note: when the connection is closed by this deadline, the client - // will receive an "invalid close code" - c.conn.SetReadDeadline(time.Now().UTC().Add(2 * c.PingPongInterval)) + if !c.MissingPongOk { + // Note: when the connection is closed by this deadline, the client + // will receive an "invalid close code" + c.conn.SetReadDeadline(time.Now().UTC().Add(2 * c.PingPongInterval)) + } go c.ping(ctx) } @@ -272,7 +308,11 @@ func (c *wsConnection) run() { case pingMessageType: c.write(&message{t: pongMessageType, payload: m.payload}) case pongMessageType: - c.conn.SetReadDeadline(time.Now().UTC().Add(2 * c.PingPongInterval)) + c.mu.Lock() + c.receivedPong = true + c.mu.Unlock() + // Clear ReadTimeout -- 0 time val clears. + c.conn.SetReadDeadline(time.Time{}) default: c.sendConnectionError("unexpected message %s", m.t) c.close(websocket.CloseProtocolError, "unexpected message") @@ -281,6 +321,18 @@ func (c *wsConnection) run() { } } +func (c *wsConnection) keepAlivePongOnly(ctx context.Context) { + for { + select { + case <-ctx.Done(): + c.pongOnlyTicker.Stop() + return + case <-c.pongOnlyTicker.C: + c.write(&message{t: pongMessageType, payload: json.RawMessage{}}) + } + } +} + func (c *wsConnection) keepAlive(ctx context.Context) { for { select { @@ -301,6 +353,14 @@ func (c *wsConnection) ping(ctx context.Context) { return case <-c.pingPongTicker.C: c.write(&message{t: pingMessageType, payload: json.RawMessage{}}) + // The initial deadline for this method is set in run() + // if we have not yet received a pong, don't reset the deadline. + c.mu.Lock() + if !c.MissingPongOk && c.receivedPong { + c.conn.SetReadDeadline(time.Now().UTC().Add(2 * c.PingPongInterval)) + } + c.receivedPong = false + c.mu.Unlock() } } } @@ -431,10 +491,15 @@ func (c *wsConnection) sendConnectionError(format string, args ...interface{}) { func (c *wsConnection) close(closeCode int, message string) { c.mu.Lock() + if c.closed { + c.mu.Unlock() + return + } _ = c.conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(closeCode, message)) for _, closer := range c.active { closer() } + c.closed = true c.mu.Unlock() _ = c.conn.Close() diff --git a/vendor/github.com/99designs/gqlgen/graphql/introspection/schema.go b/vendor/github.com/99designs/gqlgen/graphql/introspection/schema.go index b7b0ad94..897b1a09 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/introspection/schema.go +++ b/vendor/github.com/99designs/gqlgen/graphql/introspection/schema.go @@ -2,7 +2,6 @@ package introspection import ( "sort" - "strings" "github.com/vektah/gqlparser/v2/ast" ) @@ -22,9 +21,6 @@ func (s *Schema) Types() []Type { typeIndex := map[string]Type{} typeNames := make([]string, 0, len(s.schema.Types)) for _, typ := range s.schema.Types { - if strings.HasPrefix(typ.Name, "__") { - continue - } typeNames = append(typeNames, typ.Name) typeIndex[typ.Name] = *WrapTypeFromDef(s.schema, typ) } diff --git a/vendor/github.com/99designs/gqlgen/graphql/omittable.go b/vendor/github.com/99designs/gqlgen/graphql/omittable.go index 3d1e3279..89716400 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/omittable.go +++ b/vendor/github.com/99designs/gqlgen/graphql/omittable.go @@ -1,5 +1,7 @@ package graphql +import "encoding/json" + // Omittable is a wrapper around a value that also stores whether it is set // or not. type Omittable[T any] struct { @@ -7,6 +9,11 @@ type Omittable[T any] struct { set bool } +var ( + _ json.Marshaler = Omittable[struct{}]{} + _ json.Unmarshaler = (*Omittable[struct{}])(nil) +) + func OmittableOf[T any](value T) Omittable[T] { return Omittable[T]{ value: value, @@ -33,3 +40,19 @@ func (o Omittable[T]) ValueOK() (T, bool) { func (o Omittable[T]) IsSet() bool { return o.set } + +func (o Omittable[T]) MarshalJSON() ([]byte, error) { + if !o.set { + return []byte("null"), nil + } + return json.Marshal(o.value) +} + +func (o *Omittable[T]) UnmarshalJSON(bytes []byte) error { + err := json.Unmarshal(bytes, &o.value) + if err != nil { + return err + } + o.set = true + return nil +} diff --git a/vendor/github.com/99designs/gqlgen/graphql/playground/apollo_sandbox_playground.go b/vendor/github.com/99designs/gqlgen/graphql/playground/apollo_sandbox_playground.go index 63b60743..750420b4 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/playground/apollo_sandbox_playground.go +++ b/vendor/github.com/99designs/gqlgen/graphql/playground/apollo_sandbox_playground.go @@ -1,10 +1,13 @@ package playground import ( + "encoding/json" + "fmt" "html/template" "net/http" ) +// NOTE: New version available at https://embeddable-sandbox.cdn.apollographql.com/ --> var apolloSandboxPage = template.Must(template.New("ApolloSandbox").Parse(` @@ -23,40 +26,161 @@ var apolloSandboxPage = template.Must(template.New("ApolloSandbox").Parse(`
    - - + - `)) -// ApolloSandboxHandler responsible for setting up the altair playground -func ApolloSandboxHandler(title, endpoint string) http.HandlerFunc { +// ApolloSandboxHandler responsible for setting up the apollo sandbox playground +func ApolloSandboxHandler(title, endpoint string, opts ...ApolloSandboxOption) http.HandlerFunc { + options := &apolloSandboxOptions{ + HideCookieToggle: true, + InitialState: apolloSandboxInitialState{ + IncludeCookies: true, + PollForSchemaUpdates: false, + }, + } + + for _, opt := range opts { + opt(options) + } + + optionsBytes, err := json.Marshal(options) + if err != nil { + panic(fmt.Errorf("failed to marshal apollo sandbox options: %w", err)) + } + return func(w http.ResponseWriter, r *http.Request) { err := apolloSandboxPage.Execute(w, map[string]interface{}{ "title": title, "endpoint": endpoint, "endpointIsAbsolute": endpointHasScheme(endpoint), - "mainSRI": "sha256-ldbSJ7EovavF815TfCN50qKB9AMvzskb9xiG71bmg2I=", + "mainSRI": "sha256-pYhw/8TGkZxk960PMMpDtjhw9YtKXUzGv6XQQaMJSh8=", + "options": string(optionsBytes), }) if err != nil { panic(err) } } } + +// See https://www.apollographql.com/docs/graphos/explorer/sandbox/#options --> +type apolloSandboxOptions struct { + HideCookieToggle bool `json:"hideCookieToggle"` + EndpointIsEditable bool `json:"endpointIsEditable"` + InitialState apolloSandboxInitialState `json:"initialState,omitempty"` +} + +type apolloSandboxInitialState struct { + IncludeCookies bool `json:"includeCookies"` + Document string `json:"document,omitempty"` + Variables map[string]any `json:"variables,omitempty"` + Headers map[string]any `json:"headers,omitempty"` + CollectionId string `json:"collectionId,omitempty"` + OperationId string `json:"operationId,omitempty"` + PollForSchemaUpdates bool `json:"pollForSchemaUpdates"` + SharedHeaders map[string]any `json:"sharedHeaders,omitempty"` +} + +type ApolloSandboxOption func(options *apolloSandboxOptions) + +// WithApolloSandboxHideCookieToggle By default, the embedded Sandbox does not show the Include cookies toggle in its connection settings. +// +// Set hideCookieToggle to false to enable users of your embedded Sandbox instance to toggle the Include cookies setting. +func WithApolloSandboxHideCookieToggle(hideCookieToggle bool) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.HideCookieToggle = hideCookieToggle + } +} + +// WithApolloSandboxEndpointIsEditable By default, the embedded Sandbox has a URL input box that is editable by users. +// +// Set endpointIsEditable to false to prevent users of your embedded Sandbox instance from changing the endpoint URL. +func WithApolloSandboxEndpointIsEditable(endpointIsEditable bool) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.EndpointIsEditable = endpointIsEditable + } +} + +// WithApolloSandboxInitialStateIncludeCookies Set this value to true if you want the Sandbox to pass { credentials: 'include' } for its requests by default. +// +// If you set hideCookieToggle to false, users can override this default setting with the Include cookies toggle. (By default, the embedded Sandbox does not show the Include cookies toggle in its connection settings.) +// +// If you also pass the handleRequest option, this option is ignored. +// +// Read more about the fetch API and credentials here https://developer.mozilla.org/en-US/docs/Web/API/fetch#credentials +func WithApolloSandboxInitialStateIncludeCookies(includeCookies bool) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.IncludeCookies = includeCookies + } +} + +// WithApolloSandboxInitialStateDocument Document operation to populate in the Sandbox's editor on load. +// +// If you omit this, the Sandbox initially loads an example query based on your schema. +func WithApolloSandboxInitialStateDocument(document string) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.Document = document + } +} + +// WithApolloSandboxInitialStateVariables Variables containing initial variable values to populate in the Sandbox on load. +// +// If provided, these variables should apply to the initial query you provide for document. +func WithApolloSandboxInitialStateVariables(variables map[string]any) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.Variables = variables + } +} + +// WithApolloSandboxInitialStateHeaders Headers containing initial variable values to populate in the Sandbox on load. +// +// If provided, these variables should apply to the initial query you provide for document. +func WithApolloSandboxInitialStateHeaders(headers map[string]any) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.Headers = headers + } +} + +// WithApolloSandboxInitialStateCollectionIdAndOperationId The ID of a collection, paired with an operation ID to populate in the Sandbox on load. +// +// You can find these values from a registered graph in Studio by clicking the ... menu next to an operation in the Explorer of that graph and selecting View operation details. +func WithApolloSandboxInitialStateCollectionIdAndOperationId(collectionId, operationId string) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.CollectionId = collectionId + options.InitialState.OperationId = operationId + } +} + +// WithApolloSandboxInitialStatePollForSchemaUpdates If true, the embedded Sandbox periodically polls your initialEndpoint for schema updates. +// +// The default value is false. +func WithApolloSandboxInitialStatePollForSchemaUpdates(pollForSchemaUpdates bool) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.PollForSchemaUpdates = pollForSchemaUpdates + } +} + +// WithApolloSandboxInitialStateSharedHeaders Headers that are applied by default to every operation executed by the embedded Sandbox. +// +// Users can disable the application of these headers, but they can't modify their values. +// +// The embedded Sandbox always includes these headers in its introspection queries to your initialEndpoint. +func WithApolloSandboxInitialStateSharedHeaders(sharedHeaders map[string]any) ApolloSandboxOption { + return func(options *apolloSandboxOptions) { + options.InitialState.SharedHeaders = sharedHeaders + } +} diff --git a/vendor/github.com/99designs/gqlgen/graphql/playground/playground.go b/vendor/github.com/99designs/gqlgen/graphql/playground/playground.go index da17ca62..05ad0233 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/playground/playground.go +++ b/vendor/github.com/99designs/gqlgen/graphql/playground/playground.go @@ -58,13 +58,24 @@ var page = template.Must(template.New("graphiql").Parse(` const wsProto = location.protocol == 'https:' ? 'wss:' : 'ws:'; const subscriptionUrl = wsProto + '//' + location.host + {{.endpoint}}; {{- end}} +{{- if .fetcherHeaders}} + const fetcherHeaders = {{.fetcherHeaders}}; +{{- else}} + const fetcherHeaders = undefined; +{{- end}} +{{- if .uiHeaders}} + const uiHeaders = {{.uiHeaders}}; +{{- else}} + const uiHeaders = undefined; +{{- end}} - const fetcher = GraphiQL.createFetcher({ url, subscriptionUrl }); + const fetcher = GraphiQL.createFetcher({ url, subscriptionUrl, headers: fetcherHeaders }); ReactDOM.render( React.createElement(GraphiQL, { fetcher: fetcher, isHeadersEditorEnabled: true, - shouldPersistHeaders: true + shouldPersistHeaders: true, + headers: JSON.stringify(uiHeaders, null, 2) }), document.getElementById('graphiql'), ); @@ -75,16 +86,25 @@ var page = template.Must(template.New("graphiql").Parse(` // Handler responsible for setting up the playground func Handler(title string, endpoint string) http.HandlerFunc { + return HandlerWithHeaders(title, endpoint, nil, nil) +} + +// HandlerWithHeaders sets up the playground. +// fetcherHeaders are used by the playground's fetcher instance and will not be visible in the UI. +// uiHeaders are default headers that will show up in the UI headers editor. +func HandlerWithHeaders(title string, endpoint string, fetcherHeaders map[string]string, uiHeaders map[string]string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "text/html; charset=UTF-8") err := page.Execute(w, map[string]interface{}{ "title": title, "endpoint": endpoint, + "fetcherHeaders": fetcherHeaders, + "uiHeaders": uiHeaders, "endpointIsAbsolute": endpointHasScheme(endpoint), "subscriptionEndpoint": getSubscriptionEndpoint(endpoint), - "version": "3.0.1", + "version": "3.0.6", "cssSRI": "sha256-wTzfn13a+pLMB5rMeysPPR1hO7x0SwSeQI+cnw7VdbE=", - "jsSRI": "sha256-dLnxjV+d2rFUCtYKjbPy413/8O+Ahy7QqAhaPNlL8fk=", + "jsSRI": "sha256-eNxH+Ah7Z9up9aJYTQycgyNuy953zYZwE9Rqf5rH+r4=", "reactSRI": "sha256-S0lp+k7zWUMk2ixteM6HZvu8L9Eh//OVrt+ZfbCpmgY=", "reactDOMSRI": "sha256-IXWO0ITNDjfnNXIu5POVfqlgYoop36bDzhodR6LW5Pc=", }) diff --git a/vendor/github.com/99designs/gqlgen/graphql/uuid.go b/vendor/github.com/99designs/gqlgen/graphql/uuid.go new file mode 100644 index 00000000..e9f22dcc --- /dev/null +++ b/vendor/github.com/99designs/gqlgen/graphql/uuid.go @@ -0,0 +1,25 @@ +package graphql + +import ( + "fmt" + + "github.com/google/uuid" +) + +func MarshalUUID(id uuid.UUID) Marshaler { + if id == uuid.Nil { + return Null + } + return MarshalString(id.String()) +} + +func UnmarshalUUID(v any) (uuid.UUID, error) { + switch v := v.(type) { + case string: + return uuid.Parse(v) + case []byte: + return uuid.ParseBytes(v) + default: + return uuid.Nil, fmt.Errorf("%T is not a uuid", v) + } +} diff --git a/vendor/github.com/99designs/gqlgen/graphql/version.go b/vendor/github.com/99designs/gqlgen/graphql/version.go index be565643..b987f6ed 100644 --- a/vendor/github.com/99designs/gqlgen/graphql/version.go +++ b/vendor/github.com/99designs/gqlgen/graphql/version.go @@ -1,3 +1,3 @@ package graphql -const Version = "v0.17.36" +const Version = "v0.17.42" diff --git a/vendor/github.com/99designs/gqlgen/internal/code/packages.go b/vendor/github.com/99designs/gqlgen/internal/code/packages.go index 6cb6ef23..e7f8655a 100644 --- a/vendor/github.com/99designs/gqlgen/internal/code/packages.go +++ b/vendor/github.com/99designs/gqlgen/internal/code/packages.go @@ -28,15 +28,37 @@ var mode = packages.NeedName | packages.NeedModule | packages.NeedDeps -// Packages is a wrapper around x/tools/go/packages that maintains a (hopefully prewarmed) cache of packages -// that can be invalidated as writes are made and packages are known to change. -type Packages struct { - packages map[string]*packages.Package - importToName map[string]string - loadErrors []error +type ( + // Packages is a wrapper around x/tools/go/packages that maintains a (hopefully prewarmed) cache of packages + // that can be invalidated as writes are made and packages are known to change. + Packages struct { + packages map[string]*packages.Package + importToName map[string]string + loadErrors []error + buildFlags []string - numLoadCalls int // stupid test steam. ignore. - numNameCalls int // stupid test steam. ignore. + numLoadCalls int // stupid test steam. ignore. + numNameCalls int // stupid test steam. ignore. + } + // Option is a function that can be passed to NewPackages to configure the package loader + Option func(p *Packages) +) + +// WithBuildTags adds build tags to the packages.Load call +func WithBuildTags(tags ...string) func(p *Packages) { + return func(p *Packages) { + p.buildFlags = append(p.buildFlags, "-tags", strings.Join(tags, ",")) + } +} + +// NewPackages creates a new packages cache +// It will load all packages in the current module, and any packages that are passed to Load or LoadAll +func NewPackages(opts ...Option) *Packages { + p := &Packages{} + for _, opt := range opts { + opt(p) + } + return p } func (p *Packages) CleanupUserPackages() { @@ -47,8 +69,8 @@ func (p *Packages) CleanupUserPackages() { modInfo = nil } }) - - // Don't cleanup github.com/99designs/gqlgen prefixed packages, they haven't changed and do not need to be reloaded + // Don't cleanup github.com/99designs/gqlgen prefixed packages, + // they haven't changed and do not need to be reloaded if modInfo != nil { var toRemove []string for k := range p.packages { @@ -56,7 +78,6 @@ func (p *Packages) CleanupUserPackages() { toRemove = append(toRemove, k) } } - for _, k := range toRemove { delete(p.packages, k) } @@ -91,7 +112,10 @@ func (p *Packages) LoadAll(importPaths ...string) []*packages.Package { if len(missing) > 0 { p.numLoadCalls++ - pkgs, err := packages.Load(&packages.Config{Mode: mode}, missing...) + pkgs, err := packages.Load(&packages.Config{ + Mode: mode, + BuildFlags: p.buildFlags, + }, missing...) if err != nil { p.loadErrors = append(p.loadErrors, err) } @@ -140,7 +164,10 @@ func (p *Packages) LoadWithTypes(importPath string) *packages.Package { pkg := p.Load(importPath) if pkg == nil || pkg.TypesInfo == nil { p.numLoadCalls++ - pkgs, err := packages.Load(&packages.Config{Mode: mode}, importPath) + pkgs, err := packages.Load(&packages.Config{ + Mode: mode, + BuildFlags: p.buildFlags, + }, importPath) if err != nil { p.loadErrors = append(p.loadErrors, err) return nil @@ -173,7 +200,10 @@ func (p *Packages) NameForPackage(importPath string) string { if pkg == nil { // otherwise do a name only lookup for it but don't put it in the package cache. p.numNameCalls++ - pkgs, err := packages.Load(&packages.Config{Mode: packages.NeedName}, importPath) + pkgs, err := packages.Load(&packages.Config{ + Mode: packages.NeedName, + BuildFlags: p.buildFlags, + }, importPath) if err != nil { p.loadErrors = append(p.loadErrors, err) } else { diff --git a/vendor/github.com/99designs/gqlgen/internal/imports/prune.go b/vendor/github.com/99designs/gqlgen/internal/imports/prune.go index d42a4157..f5fc71c6 100644 --- a/vendor/github.com/99designs/gqlgen/internal/imports/prune.go +++ b/vendor/github.com/99designs/gqlgen/internal/imports/prune.go @@ -10,10 +10,10 @@ import ( "go/token" "strings" - "github.com/99designs/gqlgen/internal/code" - "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/imports" + + "github.com/99designs/gqlgen/internal/code" ) type visitFn func(node ast.Node) diff --git a/vendor/github.com/99designs/gqlgen/internal/rewrite/rewriter.go b/vendor/github.com/99designs/gqlgen/internal/rewrite/rewriter.go index 1ca722dc..7e68e55d 100644 --- a/vendor/github.com/99designs/gqlgen/internal/rewrite/rewriter.go +++ b/vendor/github.com/99designs/gqlgen/internal/rewrite/rewriter.go @@ -10,8 +10,9 @@ import ( "strconv" "strings" - "github.com/99designs/gqlgen/internal/code" "golang.org/x/tools/go/packages" + + "github.com/99designs/gqlgen/internal/code" ) type Rewriter struct { diff --git a/vendor/github.com/99designs/gqlgen/main.go b/vendor/github.com/99designs/gqlgen/main.go index af365bfe..f3b9f440 100644 --- a/vendor/github.com/99designs/gqlgen/main.go +++ b/vendor/github.com/99designs/gqlgen/main.go @@ -1,5 +1,7 @@ package main +//go:generate go generate ./_examples/... + import ( "bytes" _ "embed" @@ -12,12 +14,13 @@ import ( "os" "path/filepath" + "github.com/urfave/cli/v2" + "github.com/99designs/gqlgen/api" "github.com/99designs/gqlgen/codegen/config" "github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/internal/code" "github.com/99designs/gqlgen/plugin/servergen" - "github.com/urfave/cli/v2" ) //go:embed init-templates/schema.graphqls diff --git a/vendor/github.com/99designs/gqlgen/plugin/federation/entity.go b/vendor/github.com/99designs/gqlgen/plugin/federation/entity.go index 04a3c033..042dd59a 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/federation/entity.go +++ b/vendor/github.com/99designs/gqlgen/plugin/federation/entity.go @@ -3,10 +3,11 @@ package federation import ( "go/types" + "github.com/vektah/gqlparser/v2/ast" + "github.com/99designs/gqlgen/codegen/config" "github.com/99designs/gqlgen/codegen/templates" "github.com/99designs/gqlgen/plugin/federation/fieldset" - "github.com/vektah/gqlparser/v2/ast" ) // Entity represents a federated type diff --git a/vendor/github.com/99designs/gqlgen/plugin/federation/federation.go b/vendor/github.com/99designs/gqlgen/plugin/federation/federation.go index d0ee8435..7d988503 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/federation/federation.go +++ b/vendor/github.com/99designs/gqlgen/plugin/federation/federation.go @@ -59,6 +59,9 @@ func (f *federation) MutateConfig(cfg *config.Config) error { "_Any": { Model: config.StringList{"github.com/99designs/gqlgen/graphql.Map"}, }, + "federation__Scope": { + Model: config.StringList{"github.com/99designs/gqlgen/graphql.String"}, + }, } for typeName, entry := range builtins { @@ -80,6 +83,10 @@ func (f *federation) MutateConfig(cfg *config.Config) error { cfg.Directives["tag"] = config.DirectiveConfig{SkipRuntime: true} cfg.Directives["override"] = config.DirectiveConfig{SkipRuntime: true} cfg.Directives["inaccessible"] = config.DirectiveConfig{SkipRuntime: true} + cfg.Directives["authenticated"] = config.DirectiveConfig{SkipRuntime: true} + cfg.Directives["requiresScopes"] = config.DirectiveConfig{SkipRuntime: true} + cfg.Directives["interfaceObject"] = config.DirectiveConfig{SkipRuntime: true} + cfg.Directives["composeDirective"] = config.DirectiveConfig{SkipRuntime: true} } return nil @@ -101,6 +108,7 @@ func (f *federation) InjectSourceEarly() *ast.Source { ` } else if f.Version == 2 { input += ` + directive @authenticated on FIELD_DEFINITION | OBJECT | INTERFACE | SCALAR | ENUM directive @composeDirective(name: String!) repeatable on SCHEMA directive @extends on OBJECT | INTERFACE directive @external on OBJECT | FIELD_DEFINITION @@ -121,6 +129,12 @@ func (f *federation) InjectSourceEarly() *ast.Source { directive @override(from: String!) on FIELD_DEFINITION directive @provides(fields: FieldSet!) on FIELD_DEFINITION directive @requires(fields: FieldSet!) on FIELD_DEFINITION + directive @requiresScopes(scopes: [[federation__Scope!]!]!) on + | FIELD_DEFINITION + | OBJECT + | INTERFACE + | SCALAR + | ENUM directive @shareable repeatable on FIELD_DEFINITION | OBJECT directive @tag(name: String!) repeatable on | ARGUMENT_DEFINITION @@ -135,6 +149,7 @@ func (f *federation) InjectSourceEarly() *ast.Source { | UNION scalar _Any scalar FieldSet + scalar federation__Scope ` } return &ast.Source{ @@ -170,10 +185,14 @@ func (f *federation) InjectSourceLate(schema *ast.Schema) *ast.Source { } entityResolverInputDefinitions += "input " + r.InputTypeName + " {\n" for _, keyField := range r.KeyFields { - entityResolverInputDefinitions += fmt.Sprintf("\t%s: %s\n", keyField.Field.ToGo(), keyField.Definition.Type.String()) + entityResolverInputDefinitions += fmt.Sprintf( + "\t%s: %s\n", + keyField.Field.ToGo(), + keyField.Definition.Type.String(), + ) } entityResolverInputDefinitions += "}" - resolvers += fmt.Sprintf("\t%s(reps: [%s!]!): [%s]\n", r.ResolverName, r.InputTypeName, e.Name) + resolvers += fmt.Sprintf("\t%s(reps: [%s]!): [%s]\n", r.ResolverName, r.InputTypeName, e.Name) } else { resolverArgs := "" for _, keyField := range r.KeyFields { diff --git a/vendor/github.com/99designs/gqlgen/plugin/federation/fieldset/fieldset.go b/vendor/github.com/99designs/gqlgen/plugin/federation/fieldset/fieldset.go index 059a3c83..306f0472 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/federation/fieldset/fieldset.go +++ b/vendor/github.com/99designs/gqlgen/plugin/federation/fieldset/fieldset.go @@ -4,9 +4,10 @@ import ( "fmt" "strings" + "github.com/vektah/gqlparser/v2/ast" + "github.com/99designs/gqlgen/codegen" "github.com/99designs/gqlgen/codegen/templates" - "github.com/vektah/gqlparser/v2/ast" ) // Set represents a FieldSet that is used in federation directives @key and @requires. @@ -133,7 +134,7 @@ func parseUnnestedKeyFieldSet(raw string, prefix []string) Set { ret := Set{} for _, s := range strings.Fields(raw) { - next := append(prefix[:], s) //nolint:gocritic // slicing out on purpose + next := append(prefix[0:len(prefix):len(prefix)], s) //nolint:gocritic // set cap=len in order to force slice reallocation ret = append(ret, next) } return ret diff --git a/vendor/github.com/99designs/gqlgen/plugin/federation/readme.md b/vendor/github.com/99designs/gqlgen/plugin/federation/readme.md index 4333ed47..d5dd0628 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/federation/readme.md +++ b/vendor/github.com/99designs/gqlgen/plugin/federation/readme.md @@ -37,3 +37,6 @@ func (r *entityResolver) FindManyMultiHellosByName(ctx context.Context, reps []* /// } ``` + +**Note:** +If you are using `omit_slice_element_pointers: true` option in your config yaml, your `GetMany` resolver will still generate in the example above the same signature `FindManyMultiHellosByName(ctx context.Context, reps []*generated.ManyMultiHellosByNameInput) ([]*generated.MultiHello, error)`. But all other instances will continue to honor `omit_slice_element_pointers: true` \ No newline at end of file diff --git a/vendor/github.com/99designs/gqlgen/plugin/modelgen/models.go b/vendor/github.com/99designs/gqlgen/plugin/modelgen/models.go index 23c2e334..c7a27988 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/modelgen/models.go +++ b/vendor/github.com/99designs/gqlgen/plugin/modelgen/models.go @@ -9,10 +9,11 @@ import ( "strings" "text/template" + "github.com/vektah/gqlparser/v2/ast" + "github.com/99designs/gqlgen/codegen/config" "github.com/99designs/gqlgen/codegen/templates" "github.com/99designs/gqlgen/plugin" - "github.com/vektah/gqlparser/v2/ast" ) //go:embed models.gotpl @@ -52,6 +53,7 @@ type Interface struct { Fields []*Field Implements []string OmitCheck bool + Models []*Object } type Object struct { @@ -129,9 +131,18 @@ func (m *Plugin) MutateConfig(cfg *config.Config) error { OmitCheck: cfg.OmitInterfaceChecks, } + // if the interface has a key directive as an entity interface, allow it to implement _Entity + if schemaType.Directives.ForName("key") != nil { + it.Implements = append(it.Implements, "_Entity") + } + b.Interfaces = append(b.Interfaces, it) case ast.Object, ast.InputObject: - if schemaType == cfg.Schema.Query || schemaType == cfg.Schema.Mutation || schemaType == cfg.Schema.Subscription { + if cfg.IsRoot(schemaType) { + b.Models = append(b.Models, &Object{ + Description: schemaType.Description, + Name: schemaType.Name, + }) continue } @@ -162,6 +173,7 @@ func (m *Plugin) MutateConfig(cfg *config.Config) error { uniqueMap[iface] = true } } + } b.Models = append(b.Models, it) @@ -200,6 +212,18 @@ func (m *Plugin) MutateConfig(cfg *config.Config) error { cfg.Models.Add(it.Name, cfg.Model.ImportPath()+"."+templates.ToGo(it.Name)) } for _, it := range b.Interfaces { + // On a given interface we want to keep a reference to all the models that implement it + for _, model := range b.Models { + for _, impl := range model.Implements { + if impl == it.Name { + // check if this isn't an implementation of an entity interface + if impl != "_Entity" { + // If this model has an implementation, add it to the Interface's Models + it.Models = append(it.Models, model) + } + } + } + } cfg.Models.Add(it.Name, cfg.Model.ImportPath()+"."+templates.ToGo(it.Name)) } for _, it := range b.Scalars { @@ -558,17 +582,19 @@ func removeDuplicateTags(t string) string { continue } - processed[kv[0]] = true + key := kv[0] + value := strings.Join(kv[1:], ":") + processed[key] = true if len(returnTags) > 0 { returnTags = " " + returnTags } - isContained := containsInvalidSpace(kv[1]) + isContained := containsInvalidSpace(value) if isContained { - panic(fmt.Errorf("tag value should not contain any leading or trailing spaces: %s", kv[1])) + panic(fmt.Errorf("tag value should not contain any leading or trailing spaces: %s", value)) } - returnTags = kv[0] + ":" + kv[1] + returnTags + returnTags = key + ":" + value + returnTags } return returnTags diff --git a/vendor/github.com/99designs/gqlgen/plugin/plugin.go b/vendor/github.com/99designs/gqlgen/plugin/plugin.go index 69801c88..ccb8f8b9 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/plugin.go +++ b/vendor/github.com/99designs/gqlgen/plugin/plugin.go @@ -3,9 +3,10 @@ package plugin import ( + "github.com/vektah/gqlparser/v2/ast" + "github.com/99designs/gqlgen/codegen" "github.com/99designs/gqlgen/codegen/config" - "github.com/vektah/gqlparser/v2/ast" ) type Plugin interface { @@ -30,7 +31,7 @@ type LateSourceInjector interface { InjectSourceLate(schema *ast.Schema) *ast.Source } -// Implementer is used to generate code inside resolvers +// ResolverImplementer is used to generate code inside resolvers type ResolverImplementer interface { Implement(field *codegen.Field) string } diff --git a/vendor/github.com/99designs/gqlgen/plugin/resolvergen/resolver.go b/vendor/github.com/99designs/gqlgen/plugin/resolvergen/resolver.go index d5515da3..085c2958 100644 --- a/vendor/github.com/99designs/gqlgen/plugin/resolvergen/resolver.go +++ b/vendor/github.com/99designs/gqlgen/plugin/resolvergen/resolver.go @@ -68,7 +68,7 @@ func (m *Plugin) generateSingleFile(data *codegen.Data) error { continue } - resolver := Resolver{o, f, nil, "", `panic("not implemented")`} + resolver := Resolver{o, f, nil, "", `panic("not implemented")`, nil} file.Resolvers = append(file.Resolvers, &resolver) } } @@ -110,9 +110,12 @@ func (m *Plugin) generatePerSchema(data *codegen.Data) error { for _, o := range objects { if o.HasResolvers() { - fn := gqlToResolverName(data.Config.Resolver.Dir(), o.Position.Src.Name, data.Config.Resolver.FilenameTemplate) + fnCase := gqlToResolverName(data.Config.Resolver.Dir(), o.Position.Src.Name, data.Config.Resolver.FilenameTemplate) + fn := strings.ToLower(fnCase) if files[fn] == nil { - files[fn] = &File{} + files[fn] = &File{ + name: fnCase, + } } caser := cases.Title(language.English, cases.NoLower) @@ -127,48 +130,46 @@ func (m *Plugin) generatePerSchema(data *codegen.Data) error { structName := templates.LcFirst(o.Name) + templates.UcFirst(data.Config.Resolver.Type) comment := strings.TrimSpace(strings.TrimLeft(rewriter.GetMethodComment(structName, f.GoFieldName), `\`)) - implementation := strings.TrimSpace(rewriter.GetMethodBody(structName, f.GoFieldName)) if implementation == "" { - // Check for Implementer Plugin - var resolver_implementer plugin.ResolverImplementer - var exists bool - for _, p := range data.Plugins { - if p_cast, ok := p.(plugin.ResolverImplementer); ok { - resolver_implementer = p_cast - exists = true - break - } - } - - if exists { - implementation = resolver_implementer.Implement(f) - } else { - implementation = fmt.Sprintf("panic(fmt.Errorf(\"not implemented: %v - %v\"))", f.GoFieldName, f.Name) - } - + // use default implementation, if no implementation was previously used + implementation = fmt.Sprintf("panic(fmt.Errorf(\"not implemented: %v - %v\"))", f.GoFieldName, f.Name) } - - resolver := Resolver{o, f, rewriter.GetPrevDecl(structName, f.GoFieldName), comment, implementation} - fn := gqlToResolverName(data.Config.Resolver.Dir(), f.Position.Src.Name, data.Config.Resolver.FilenameTemplate) + resolver := Resolver{o, f, rewriter.GetPrevDecl(structName, f.GoFieldName), comment, implementation, nil} + var implExists bool + for _, p := range data.Plugins { + rImpl, ok := p.(plugin.ResolverImplementer) + if !ok { + continue + } + if implExists { + return fmt.Errorf("multiple plugins implement ResolverImplementer") + } + implExists = true + resolver.ImplementationRender = rImpl.Implement + } + fnCase := gqlToResolverName(data.Config.Resolver.Dir(), f.Position.Src.Name, data.Config.Resolver.FilenameTemplate) + fn := strings.ToLower(fnCase) if files[fn] == nil { - files[fn] = &File{} + files[fn] = &File{ + name: fnCase, + } } files[fn].Resolvers = append(files[fn].Resolvers, &resolver) } } - for filename, file := range files { - file.imports = rewriter.ExistingImports(filename) - file.RemainingSource = rewriter.RemainingSource(filename) + for _, file := range files { + file.imports = rewriter.ExistingImports(file.name) + file.RemainingSource = rewriter.RemainingSource(file.name) } newResolverTemplate := resolverTemplate if data.Config.Resolver.ResolverTemplate != "" { newResolverTemplate = readResolverTemplate(data.Config.Resolver.ResolverTemplate) } - for filename, file := range files { + for _, file := range files { resolverBuild := &ResolverBuild{ File: file, PackageName: data.Config.Resolver.Package, @@ -192,7 +193,7 @@ func (m *Plugin) generatePerSchema(data *codegen.Data) error { err := templates.Render(templates.Options{ PackageName: data.Config.Resolver.Package, FileNotice: fileNotice.String(), - Filename: filename, + Filename: file.name, Data: resolverBuild, Packages: data.Config.Packages, Template: newResolverTemplate, @@ -230,6 +231,7 @@ type ResolverBuild struct { } type File struct { + name string // These are separated because the type definition of the resolver object may live in a different file from the // resolver method implementations, for example when extending a type in a different graphql schema file Objects []*codegen.Object @@ -250,11 +252,19 @@ func (f *File) Imports() string { } type Resolver struct { - Object *codegen.Object - Field *codegen.Field - PrevDecl *ast.FuncDecl - Comment string - Implementation string + Object *codegen.Object + Field *codegen.Field + PrevDecl *ast.FuncDecl + Comment string + ImplementationStr string + ImplementationRender func(r *codegen.Field) string +} + +func (r *Resolver) Implementation() string { + if r.ImplementationRender != nil { + return r.ImplementationRender(r.Field) + } + return r.ImplementationStr } func gqlToResolverName(base string, gqlname, filenameTmpl string) string { diff --git a/vendor/github.com/caddyserver/certmagic/README.md b/vendor/github.com/caddyserver/certmagic/README.md index aba3ad14..8e3b145d 100644 --- a/vendor/github.com/caddyserver/certmagic/README.md +++ b/vendor/github.com/caddyserver/certmagic/README.md @@ -233,6 +233,9 @@ tlsConfig, err := certmagic.TLS([]string{"example.com"}) if err != nil { return err } +// be sure to customize NextProtos if serving a specific +// application protocol after the TLS handshake, for example: +tlsConfig.NextProtos = append([]string{"h2", "http/1.1"}, tlsConfig.NextProtos...) ``` diff --git a/vendor/github.com/caddyserver/certmagic/async.go b/vendor/github.com/caddyserver/certmagic/async.go index 584a9c2e..e61343c8 100644 --- a/vendor/github.com/caddyserver/certmagic/async.go +++ b/vendor/github.com/caddyserver/certmagic/async.go @@ -155,8 +155,8 @@ var AttemptsCtxKey retryStateCtxKey // front. We figure that intermittent errors would be // resolved after the first retry, but any errors after // that would probably require at least a few minutes -// to clear up: either for DNS to propagate, for the -// administrator to fix their DNS or network properties, +// or hours to clear up: either for DNS to propagate, for +// the administrator to fix their DNS or network config, // or some other external factor needs to change. We // chose intervals that we think will be most useful // without introducing unnecessary delay. The last @@ -168,13 +168,26 @@ var retryIntervals = []time.Duration{ 2 * time.Minute, 5 * time.Minute, // elapsed: 10 min 10 * time.Minute, - 20 * time.Minute, + 10 * time.Minute, + 10 * time.Minute, 20 * time.Minute, // elapsed: 1 hr + 20 * time.Minute, + 20 * time.Minute, + 20 * time.Minute, // elapsed: 2 hr 30 * time.Minute, - 30 * time.Minute, // elapsed: 2 hr + 30 * time.Minute, // elapsed: 3 hr + 30 * time.Minute, + 30 * time.Minute, // elapsed: 4 hr + 30 * time.Minute, + 30 * time.Minute, // elapsed: 5 hr + 1 * time.Hour, // elapsed: 6 hr 1 * time.Hour, - 3 * time.Hour, // elapsed: 6 hr - 6 * time.Hour, // for up to maxRetryDuration + 1 * time.Hour, // elapsed: 8 hr + 2 * time.Hour, + 2 * time.Hour, // elapsed: 12 hr + 3 * time.Hour, + 3 * time.Hour, // elapsed: 18 hr + 6 * time.Hour, // repeat for up to maxRetryDuration } // maxRetryDuration is the maximum duration to try diff --git a/vendor/github.com/caddyserver/certmagic/certificates.go b/vendor/github.com/caddyserver/certmagic/certificates.go index 16e51aaf..dbee2aaf 100644 --- a/vendor/github.com/caddyserver/certmagic/certificates.go +++ b/vendor/github.com/caddyserver/certmagic/certificates.go @@ -410,7 +410,8 @@ func SubjectIsIP(subj string) bool { func SubjectIsInternal(subj string) bool { return subj == "localhost" || strings.HasSuffix(subj, ".localhost") || - strings.HasSuffix(subj, ".local") + strings.HasSuffix(subj, ".local") || + strings.HasSuffix(subj, ".home.arpa") } // MatchWildcard returns true if subject (a candidate DNS name) diff --git a/vendor/github.com/caddyserver/certmagic/certmagic.go b/vendor/github.com/caddyserver/certmagic/certmagic.go index 6bc33d58..860f5e76 100644 --- a/vendor/github.com/caddyserver/certmagic/certmagic.go +++ b/vendor/github.com/caddyserver/certmagic/certmagic.go @@ -268,7 +268,7 @@ type OnDemandConfig struct { // whether a certificate can be obtained or renewed // for the given name. If an error is returned, the // request will be denied. - DecisionFunc func(name string) error + DecisionFunc func(ctx context.Context, name string) error // Sources for getting new, unmanaged certificates. // They will be invoked only during TLS handshakes diff --git a/vendor/github.com/caddyserver/certmagic/handshake.go b/vendor/github.com/caddyserver/certmagic/handshake.go index 1e9928ba..9c923f69 100644 --- a/vendor/github.com/caddyserver/certmagic/handshake.go +++ b/vendor/github.com/caddyserver/certmagic/handshake.go @@ -50,7 +50,7 @@ func (cfg *Config) GetCertificate(clientHello *tls.ClientHelloInfo) (*tls.Certif } func (cfg *Config) GetCertificateWithContext(ctx context.Context, clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) { - if err := cfg.emit(ctx, "tls_get_certificate", map[string]any{"client_hello": clientHello}); err != nil { + if err := cfg.emit(ctx, "tls_get_certificate", map[string]any{"client_hello": clientHelloWithoutConn(clientHello)}); err != nil { cfg.Logger.Error("TLS handshake aborted by event handler", zap.String("server_name", clientHello.ServerName), zap.String("remote", clientHello.Conn.RemoteAddr().String()), @@ -58,6 +58,12 @@ func (cfg *Config) GetCertificateWithContext(ctx context.Context, clientHello *t return nil, fmt.Errorf("handshake aborted by event handler: %w", err) } + if ctx == nil { + // tests can't set context on a tls.ClientHelloInfo because it's unexported :( + ctx = context.Background() + } + ctx = context.WithValue(ctx, ClientHelloInfoCtxKey, clientHello) + // special case: serve up the certificate for a TLS-ALPN ACME challenge // (https://tools.ietf.org/html/draft-ietf-acme-tls-alpn-05) for _, proto := range clientHello.SupportedProtos { @@ -313,8 +319,8 @@ func (cfg *Config) getCertDuringHandshake(ctx context.Context, hello *tls.Client // Make sure a certificate is allowed for the given name. If not, it doesn't // make sense to try loading one from storage (issue #185), getting it from a // certificate manager, or obtaining one from an issuer. - if err := cfg.checkIfCertShouldBeObtained(name, false); err != nil { - return Certificate{}, fmt.Errorf("certificate is not allowed for server name %s: %v", name, err) + if err := cfg.checkIfCertShouldBeObtained(ctx, name, false); err != nil { + return Certificate{}, fmt.Errorf("certificate is not allowed for server name %s: %w", name, err) } // If an external Manager is configured, try to get it from them. @@ -438,7 +444,7 @@ func (cfg *Config) optionalMaintenance(ctx context.Context, log *zap.Logger, cer // checkIfCertShouldBeObtained checks to see if an on-demand TLS certificate // should be obtained for a given domain based upon the config settings. If // a non-nil error is returned, do not issue a new certificate for name. -func (cfg *Config) checkIfCertShouldBeObtained(name string, requireOnDemand bool) error { +func (cfg *Config) checkIfCertShouldBeObtained(ctx context.Context, name string, requireOnDemand bool) error { if requireOnDemand && cfg.OnDemand == nil { return fmt.Errorf("not configured for on-demand certificate issuance") } @@ -447,7 +453,7 @@ func (cfg *Config) checkIfCertShouldBeObtained(name string, requireOnDemand bool } if cfg.OnDemand != nil { if cfg.OnDemand.DecisionFunc != nil { - if err := cfg.OnDemand.DecisionFunc(name); err != nil { + if err := cfg.OnDemand.DecisionFunc(ctx, name); err != nil { return fmt.Errorf("decision func: %w", err) } return nil @@ -685,7 +691,7 @@ func (cfg *Config) renewDynamicCertificate(ctx context.Context, hello *tls.Clien defer cancel() // Make sure a certificate for this name should be renewed on-demand - err := cfg.checkIfCertShouldBeObtained(name, true) + err := cfg.checkIfCertShouldBeObtained(ctx, name, true) if err != nil { // if not, remove from cache (it will be deleted from storage later) cfg.certCache.mu.Lock() @@ -875,3 +881,52 @@ var ( certLoadWaitChans = make(map[string]chan struct{}) certLoadWaitChansMu sync.Mutex ) + +type serializableClientHello struct { + CipherSuites []uint16 + ServerName string + SupportedCurves []tls.CurveID + SupportedPoints []uint8 + SignatureSchemes []tls.SignatureScheme + SupportedProtos []string + SupportedVersions []uint16 + + RemoteAddr, LocalAddr net.Addr // values copied from the Conn as they are still useful/needed + conn net.Conn // unexported so it's not serialized +} + +// clientHelloWithoutConn returns the data from the ClientHelloInfo without the +// pesky exported Conn field, which often causes an error when serializing because +// the underlying type may be unserializable. +func clientHelloWithoutConn(hello *tls.ClientHelloInfo) serializableClientHello { + if hello == nil { + return serializableClientHello{} + } + var remote, local net.Addr + if hello.Conn != nil { + remote = hello.Conn.RemoteAddr() + local = hello.Conn.LocalAddr() + } + return serializableClientHello{ + CipherSuites: hello.CipherSuites, + ServerName: hello.ServerName, + SupportedCurves: hello.SupportedCurves, + SupportedPoints: hello.SupportedPoints, + SignatureSchemes: hello.SignatureSchemes, + SupportedProtos: hello.SupportedProtos, + SupportedVersions: hello.SupportedVersions, + RemoteAddr: remote, + LocalAddr: local, + conn: hello.Conn, + } +} + +type helloInfoCtxKey string + +// ClientHelloInfoCtxKey is the key by which the ClientHelloInfo can be extracted from +// a context.Context within a DecisionFunc. However, be advised that it is best practice +// that the decision whether to obtain a certificate is be based solely on the name, +// not other properties of the specific connection/client requesting the connection. +// For example, it is not adviseable to use a client's IP address to decide whether to +// allow a certificate. Instead, the ClientHello can be useful for logging, etc. +const ClientHelloInfoCtxKey helloInfoCtxKey = "certmagic:ClientHelloInfo" diff --git a/vendor/github.com/caddyserver/certmagic/maintain.go b/vendor/github.com/caddyserver/certmagic/maintain.go index 475bb6df..9ffb7310 100644 --- a/vendor/github.com/caddyserver/certmagic/maintain.go +++ b/vendor/github.com/caddyserver/certmagic/maintain.go @@ -17,9 +17,11 @@ package certmagic import ( "context" "crypto/x509" + "encoding/json" "encoding/pem" + "errors" "fmt" - "log" + "io/fs" "path" "runtime" "strings" @@ -390,30 +392,117 @@ func (certCache *Cache) updateOCSPStaples(ctx context.Context) { // CleanStorageOptions specifies how to clean up a storage unit. type CleanStorageOptions struct { - OCSPStaples bool + // Optional custom logger. + Logger *zap.Logger + + // Optional ID of the instance initiating the cleaning. + InstanceID string + + // If set, cleaning will be skipped if it was performed + // more recently than this interval. + Interval time.Duration + + // Whether to clean cached OCSP staples. + OCSPStaples bool + + // Whether to cleanup expired certificates, and if so, + // how long to let them stay after they've expired. ExpiredCerts bool ExpiredCertGracePeriod time.Duration } // CleanStorage removes assets which are no longer useful, // according to opts. -func CleanStorage(ctx context.Context, storage Storage, opts CleanStorageOptions) { +func CleanStorage(ctx context.Context, storage Storage, opts CleanStorageOptions) error { + const ( + lockName = "storage_clean" + storageKey = "last_clean.json" + ) + + if opts.Logger == nil { + opts.Logger = defaultLogger.Named("clean_storage") + } + opts.Logger = opts.Logger.With(zap.Any("storage", storage)) + + // storage cleaning should be globally exclusive + if err := storage.Lock(ctx, lockName); err != nil { + return fmt.Errorf("unable to acquire %s lock: %v", lockName, err) + } + defer func() { + if err := storage.Unlock(ctx, lockName); err != nil { + opts.Logger.Error("unable to release lock", zap.Error(err)) + return + } + }() + + // cleaning should not happen more often than the interval + if opts.Interval > 0 { + lastCleanBytes, err := storage.Load(ctx, storageKey) + if !errors.Is(err, fs.ErrNotExist) { + if err != nil { + return fmt.Errorf("loading last clean timestamp: %v", err) + } + + var lastClean lastCleanPayload + err = json.Unmarshal(lastCleanBytes, &lastClean) + if err != nil { + return fmt.Errorf("decoding last clean data: %v", err) + } + + lastTLSClean := lastClean["tls"] + if time.Since(lastTLSClean.Timestamp) < opts.Interval { + nextTime := time.Now().Add(opts.Interval) + opts.Logger.Warn("storage cleaning happened too recently; skipping for now", + zap.String("instance", lastTLSClean.InstanceID), + zap.Time("try_again", nextTime), + zap.Duration("try_again_in", time.Until(nextTime)), + ) + return nil + } + } + } + + opts.Logger.Info("cleaning storage unit") + if opts.OCSPStaples { - err := deleteOldOCSPStaples(ctx, storage) + err := deleteOldOCSPStaples(ctx, storage, opts.Logger) if err != nil { - log.Printf("[ERROR] Deleting old OCSP staples: %v", err) + opts.Logger.Error("deleting old OCSP staples", zap.Error(err)) } } if opts.ExpiredCerts { - err := deleteExpiredCerts(ctx, storage, opts.ExpiredCertGracePeriod) + err := deleteExpiredCerts(ctx, storage, opts.Logger, opts.ExpiredCertGracePeriod) if err != nil { - log.Printf("[ERROR] Deleting expired certificates: %v", err) + opts.Logger.Error("deleting expired certificates staples", zap.Error(err)) } } // TODO: delete stale locks? + + // update the last-clean time + lastCleanBytes, err := json.Marshal(lastCleanPayload{ + "tls": lastCleaned{ + Timestamp: time.Now(), + InstanceID: opts.InstanceID, + }, + }) + if err != nil { + return fmt.Errorf("encoding last cleaned info: %v", err) + } + if err := storage.Store(ctx, storageKey, lastCleanBytes); err != nil { + return fmt.Errorf("storing last clean info: %v", err) + } + + return nil } -func deleteOldOCSPStaples(ctx context.Context, storage Storage) error { +type lastCleanPayload map[string]lastCleaned + +type lastCleaned struct { + Timestamp time.Time `json:"timestamp"` + InstanceID string `json:"instance_id,omitempty"` +} + +func deleteOldOCSPStaples(ctx context.Context, storage Storage, logger *zap.Logger) error { ocspKeys, err := storage.List(ctx, prefixOCSP, false) if err != nil { // maybe just hasn't been created yet; no big deal @@ -428,7 +517,7 @@ func deleteOldOCSPStaples(ctx context.Context, storage Storage) error { } ocspBytes, err := storage.Load(ctx, key) if err != nil { - log.Printf("[ERROR] While deleting old OCSP staples, unable to load staple file: %v", err) + logger.Error("while deleting old OCSP staples, unable to load staple file", zap.Error(err)) continue } resp, err := ocsp.ParseResponse(ocspBytes, nil) @@ -436,7 +525,7 @@ func deleteOldOCSPStaples(ctx context.Context, storage Storage) error { // contents are invalid; delete it err = storage.Delete(ctx, key) if err != nil { - log.Printf("[ERROR] Purging corrupt staple file %s: %v", key, err) + logger.Error("purging corrupt staple file", zap.String("storage_key", key), zap.Error(err)) } continue } @@ -444,14 +533,14 @@ func deleteOldOCSPStaples(ctx context.Context, storage Storage) error { // response has expired; delete it err = storage.Delete(ctx, key) if err != nil { - log.Printf("[ERROR] Purging expired staple file %s: %v", key, err) + logger.Error("purging expired staple file", zap.String("storage_key", key), zap.Error(err)) } } } return nil } -func deleteExpiredCerts(ctx context.Context, storage Storage, gracePeriod time.Duration) error { +func deleteExpiredCerts(ctx context.Context, storage Storage, logger *zap.Logger, gracePeriod time.Duration) error { issuerKeys, err := storage.List(ctx, prefixCerts, false) if err != nil { // maybe just hasn't been created yet; no big deal @@ -461,7 +550,7 @@ func deleteExpiredCerts(ctx context.Context, storage Storage, gracePeriod time.D for _, issuerKey := range issuerKeys { siteKeys, err := storage.List(ctx, issuerKey, false) if err != nil { - log.Printf("[ERROR] Listing contents of %s: %v", issuerKey, err) + logger.Error("listing contents", zap.String("issuer_key", issuerKey), zap.Error(err)) continue } @@ -475,7 +564,7 @@ func deleteExpiredCerts(ctx context.Context, storage Storage, gracePeriod time.D siteAssets, err := storage.List(ctx, siteKey, false) if err != nil { - log.Printf("[ERROR] Listing contents of %s: %v", siteKey, err) + logger.Error("listing site contents", zap.String("site_key", siteKey), zap.Error(err)) continue } @@ -498,18 +587,23 @@ func deleteExpiredCerts(ctx context.Context, storage Storage, gracePeriod time.D } if expiredTime := time.Since(expiresAt(cert)); expiredTime >= gracePeriod { - log.Printf("[INFO] Certificate %s expired %s ago; cleaning up", assetKey, expiredTime) + logger.Info("certificate expired beyond grace period; cleaning up", + zap.String("asset_key", assetKey), + zap.Duration("expired_for", expiredTime), + zap.Duration("grace_period", gracePeriod)) baseName := strings.TrimSuffix(assetKey, ".crt") for _, relatedAsset := range []string{ assetKey, baseName + ".key", baseName + ".json", } { - log.Printf("[INFO] Deleting %s because resource expired", relatedAsset) + logger.Info("deleting asset because resource expired", zap.String("asset_key", relatedAsset)) err := storage.Delete(ctx, relatedAsset) if err != nil { - log.Printf("[ERROR] Cleaning up asset related to expired certificate for %s: %s: %v", - baseName, relatedAsset, err) + logger.Error("could not clean up asset related to expired certificate", + zap.String("base_name", baseName), + zap.String("related_asset", relatedAsset), + zap.Error(err)) } } } @@ -521,7 +615,7 @@ func deleteExpiredCerts(ctx context.Context, storage Storage, gracePeriod time.D continue } if len(siteAssets) == 0 { - log.Printf("[INFO] Deleting %s because key is empty", siteKey) + logger.Info("deleting site folder because key is empty", zap.String("site_key", siteKey)) err := storage.Delete(ctx, siteKey) if err != nil { return fmt.Errorf("deleting empty site folder %s: %v", siteKey, err) diff --git a/vendor/github.com/caddyserver/certmagic/solvers.go b/vendor/github.com/caddyserver/certmagic/solvers.go index a7132ee3..51ef096b 100644 --- a/vendor/github.com/caddyserver/certmagic/solvers.go +++ b/vendor/github.com/caddyserver/certmagic/solvers.go @@ -629,21 +629,23 @@ func robustTryListen(addr string) (net.Listener, error) { return nil, nil } - // hmm, we couldn't connect to the socket, so something else must - // be wrong, right? wrong!! we've had reports across multiple OSes - // now that sometimes connections fail even though the OS told us - // that the address was already in use; either the listener is - // fluctuating between open and closed very, very quickly, or the - // OS is inconsistent and contradicting itself; I have been unable - // to reproduce this, so I'm now resorting to hard-coding substring - // matching in error messages as a really hacky and unreliable - // safeguard against this, until we can idenify exactly what was - // happening; see the following threads for more info: + // Hmm, we couldn't connect to the socket, so something else must + // be wrong, right? wrong!! Apparently if a port is bound by another + // listener with a specific host, i.e. 'x:1234', we cannot bind to + // ':1234' -- it is considered a conflict, but 'y:1234' is not. + // I guess we need to assume the conflicting listener is properly + // configured and continue. But we should tell the user to specify + // the correct ListenHost to avoid conflict or at least so we can + // know that the user is intentional about that port and hopefully + // has an ACME solver on it. + // + // History: // https://caddy.community/t/caddy-retry-error/7317 // https://caddy.community/t/v2-upgrade-to-caddy2-failing-with-errors/7423 + // https://github.com/caddyserver/certmagic/issues/250 if strings.Contains(listenErr.Error(), "address already in use") || strings.Contains(listenErr.Error(), "one usage of each socket address") { - log.Printf("[WARNING] OS reports a contradiction: %v - but we cannot connect to it, with this error: %v; continuing anyway 🤞 (I don't know what causes this... if you do, please help?)", listenErr, connectErr) + log.Printf("[WARNING] %v - be sure to set the ACMEIssuer.ListenHost field; assuming conflicting listener is correctly configured and continuing", listenErr) return nil, nil } } diff --git a/vendor/github.com/caddyserver/certmagic/storage.go b/vendor/github.com/caddyserver/certmagic/storage.go index 6089bb9b..3d88f2e0 100644 --- a/vendor/github.com/caddyserver/certmagic/storage.go +++ b/vendor/github.com/caddyserver/certmagic/storage.go @@ -133,7 +133,7 @@ type Locker interface { // is released or becomes stale. // // If the named lock represents an idempotent operation, callers - // should awlays check to make sure the work still needs to be + // should always check to make sure the work still needs to be // completed after acquiring the lock. You never know if another // process already completed the task while you were waiting to // acquire it. diff --git a/vendor/github.com/datarhei/joy4/av/av.go b/vendor/github.com/datarhei/joy4/av/av.go index df997262..5c038230 100644 --- a/vendor/github.com/datarhei/joy4/av/av.go +++ b/vendor/github.com/datarhei/joy4/av/av.go @@ -116,6 +116,9 @@ type CodecType uint32 var ( H264 = MakeVideoCodecType(avCodecTypeMagic + 1) + HEVC = MakeVideoCodecType(avCodecTypeMagic + 2) + VP9 = MakeVideoCodecType(avCodecTypeMagic + 3) + AV1 = MakeVideoCodecType(avCodecTypeMagic + 4) AAC = MakeAudioCodecType(avCodecTypeMagic + 1) PCM_MULAW = MakeAudioCodecType(avCodecTypeMagic + 2) PCM_ALAW = MakeAudioCodecType(avCodecTypeMagic + 3) @@ -126,10 +129,16 @@ var ( const codecTypeAudioBit = 0x1 const codecTypeOtherBits = 1 -func (self CodecType) String() string { - switch self { +func (c CodecType) String() string { + switch c { case H264: return "H264" + case HEVC: + return "HEVC" + case VP9: + return "VP9" + case AV1: + return "AV1" case AAC: return "AAC" case PCM_MULAW: @@ -144,12 +153,12 @@ func (self CodecType) String() string { return "" } -func (self CodecType) IsAudio() bool { - return self&codecTypeAudioBit != 0 +func (c CodecType) IsAudio() bool { + return c&codecTypeAudioBit != 0 } -func (self CodecType) IsVideo() bool { - return self&codecTypeAudioBit == 0 +func (c CodecType) IsVideo() bool { + return c&codecTypeAudioBit == 0 } // Make a new audio codec type. @@ -169,7 +178,7 @@ const avCodecTypeMagic = 233333 // CodecData is some important bytes for initializing audio/video decoder, // can be converted to VideoCodecData or AudioCodecData using: // -// codecdata.(AudioCodecData) or codecdata.(VideoCodecData) +// codecdata.(AudioCodecData) or codecdata.(VideoCodecData) // // for H264, CodecData is AVCDecoderConfigure bytes, includes SPS/PPS. type CodecData interface { diff --git a/vendor/github.com/datarhei/joy4/av/pktque/filters.go b/vendor/github.com/datarhei/joy4/av/pktque/filters.go index ff54d3f0..4d10e422 100644 --- a/vendor/github.com/datarhei/joy4/av/pktque/filters.go +++ b/vendor/github.com/datarhei/joy4/av/pktque/filters.go @@ -2,8 +2,9 @@ package pktque import ( - "github.com/datarhei/joy4/av" "time" + + "github.com/datarhei/joy4/av" ) type Filter interface { diff --git a/vendor/github.com/datarhei/joy4/codec/aacparser/parser.go b/vendor/github.com/datarhei/joy4/codec/aacparser/parser.go index a2209935..a94c086c 100644 --- a/vendor/github.com/datarhei/joy4/codec/aacparser/parser.go +++ b/vendor/github.com/datarhei/joy4/codec/aacparser/parser.go @@ -3,10 +3,11 @@ package aacparser import ( "bytes" "fmt" - "github.com/datarhei/joy4/av" - "github.com/datarhei/joy4/utils/bits" "io" "time" + + "github.com/datarhei/joy4/av" + "github.com/datarhei/joy4/utils/bits" ) // copied from libavcodec/mpeg4audio.h diff --git a/vendor/github.com/datarhei/joy4/codec/av1parser/parser.go b/vendor/github.com/datarhei/joy4/codec/av1parser/parser.go new file mode 100644 index 00000000..50ec01a1 --- /dev/null +++ b/vendor/github.com/datarhei/joy4/codec/av1parser/parser.go @@ -0,0 +1,44 @@ +package av1parser + +import ( + "github.com/datarhei/joy4/av" +) + +type CodecData struct { + Record []byte + IsMpeg2TS bool +} + +func (codec CodecData) Type() av.CodecType { + return av.AV1 +} + +func (codec CodecData) AV1DecoderConfRecordBytes() []byte { + return codec.Record +} + +func (codec CodecData) AV1VideoDescriptorBytes() []byte { + return codec.Record +} + +func (codec CodecData) Width() int { + return 0 +} + +func (codec CodecData) Height() int { + return 0 +} + +func NewCodecDataFromAV1DecoderConfRecord(record []byte) (data CodecData, err error) { + data.Record = record + data.IsMpeg2TS = false + + return +} + +func NewCodecDataFromAV1VideoDescriptor(record []byte) (data CodecData, err error) { + data.Record = record + data.IsMpeg2TS = true + + return +} diff --git a/vendor/github.com/datarhei/joy4/codec/h264parser/parser.go b/vendor/github.com/datarhei/joy4/codec/h264parser/parser.go index 61a33399..e38364f0 100644 --- a/vendor/github.com/datarhei/joy4/codec/h264parser/parser.go +++ b/vendor/github.com/datarhei/joy4/codec/h264parser/parser.go @@ -3,6 +3,7 @@ package h264parser import ( "bytes" "fmt" + "github.com/datarhei/joy4/av" "github.com/datarhei/joy4/utils/bits" "github.com/datarhei/joy4/utils/bits/pio" diff --git a/vendor/github.com/datarhei/joy4/codec/hevcparser/parser.go b/vendor/github.com/datarhei/joy4/codec/hevcparser/parser.go new file mode 100644 index 00000000..8ec02382 --- /dev/null +++ b/vendor/github.com/datarhei/joy4/codec/hevcparser/parser.go @@ -0,0 +1,695 @@ +package hevcparser + +// based on https://github.com/deepch/vdk/blob/v0.0.21/codec/h265parser/parser.go + +import ( + "bytes" + "errors" + "fmt" + + "github.com/datarhei/joy4/av" + "github.com/datarhei/joy4/utils/bits" + "github.com/datarhei/joy4/utils/bits/pio" +) + +type SPSInfo struct { + ProfileIdc uint + LevelIdc uint + CropLeft uint + CropRight uint + CropTop uint + CropBottom uint + Width uint + Height uint + PicWidthInLumaSamples uint + PicHeightInLumaSamples uint + generalProfileSpace uint + generalTierFlag uint + generalProfileIDC uint + generalProfileCompatibilityFlags uint32 + generalConstraintIndicatorFlags uint64 + generalLevelIDC uint +} + +const ( + NAL_UNIT_CODED_SLICE_TRAIL_N = 0 + NAL_UNIT_CODED_SLICE_TRAIL_R = 1 + NAL_UNIT_CODED_SLICE_TSA_N = 2 + NAL_UNIT_CODED_SLICE_TSA_R = 3 + NAL_UNIT_CODED_SLICE_STSA_N = 4 + NAL_UNIT_CODED_SLICE_STSA_R = 5 + NAL_UNIT_CODED_SLICE_RADL_N = 6 + NAL_UNIT_CODED_SLICE_RADL_R = 7 + NAL_UNIT_CODED_SLICE_RASL_N = 8 + NAL_UNIT_CODED_SLICE_RASL_R = 9 + NAL_UNIT_RESERVED_VCL_N10 = 10 + NAL_UNIT_RESERVED_VCL_R11 = 11 + NAL_UNIT_RESERVED_VCL_N12 = 12 + NAL_UNIT_RESERVED_VCL_R13 = 13 + NAL_UNIT_RESERVED_VCL_N14 = 14 + NAL_UNIT_RESERVED_VCL_R15 = 15 + NAL_UNIT_CODED_SLICE_BLA_W_LP = 16 + NAL_UNIT_CODED_SLICE_BLA_W_RADL = 17 + NAL_UNIT_CODED_SLICE_BLA_N_LP = 18 + NAL_UNIT_CODED_SLICE_IDR_W_RADL = 19 + NAL_UNIT_CODED_SLICE_IDR_N_LP = 20 + NAL_UNIT_CODED_SLICE_CRA = 21 + NAL_UNIT_RESERVED_IRAP_VCL22 = 22 + NAL_UNIT_RESERVED_IRAP_VCL23 = 23 + NAL_UNIT_RESERVED_VCL24 = 24 + NAL_UNIT_RESERVED_VCL25 = 25 + NAL_UNIT_RESERVED_VCL26 = 26 + NAL_UNIT_RESERVED_VCL27 = 27 + NAL_UNIT_RESERVED_VCL28 = 28 + NAL_UNIT_RESERVED_VCL29 = 29 + NAL_UNIT_RESERVED_VCL30 = 30 + NAL_UNIT_RESERVED_VCL31 = 31 + NAL_UNIT_VPS = 32 + NAL_UNIT_SPS = 33 + NAL_UNIT_PPS = 34 + NAL_UNIT_ACCESS_UNIT_DELIMITER = 35 + NAL_UNIT_EOS = 36 + NAL_UNIT_EOB = 37 + NAL_UNIT_FILLER_DATA = 38 + NAL_UNIT_PREFIX_SEI = 39 + NAL_UNIT_SUFFIX_SEI = 40 + NAL_UNIT_RESERVED_NVCL41 = 41 + NAL_UNIT_RESERVED_NVCL42 = 42 + NAL_UNIT_RESERVED_NVCL43 = 43 + NAL_UNIT_RESERVED_NVCL44 = 44 + NAL_UNIT_RESERVED_NVCL45 = 45 + NAL_UNIT_RESERVED_NVCL46 = 46 + NAL_UNIT_RESERVED_NVCL47 = 47 + NAL_UNIT_UNSPECIFIED_48 = 48 + NAL_UNIT_UNSPECIFIED_49 = 49 + NAL_UNIT_UNSPECIFIED_50 = 50 + NAL_UNIT_UNSPECIFIED_51 = 51 + NAL_UNIT_UNSPECIFIED_52 = 52 + NAL_UNIT_UNSPECIFIED_53 = 53 + NAL_UNIT_UNSPECIFIED_54 = 54 + NAL_UNIT_UNSPECIFIED_55 = 55 + NAL_UNIT_UNSPECIFIED_56 = 56 + NAL_UNIT_UNSPECIFIED_57 = 57 + NAL_UNIT_UNSPECIFIED_58 = 58 + NAL_UNIT_UNSPECIFIED_59 = 59 + NAL_UNIT_UNSPECIFIED_60 = 60 + NAL_UNIT_UNSPECIFIED_61 = 61 + NAL_UNIT_UNSPECIFIED_62 = 62 + NAL_UNIT_UNSPECIFIED_63 = 63 + NAL_UNIT_INVALID = 64 +) + +const ( + MAX_VPS_COUNT = 16 + MAX_SUB_LAYERS = 7 + MAX_SPS_COUNT = 32 +) + +var ( + ErrorHEVCIncorectUnitSize = errors.New("incorrect unit size") + ErrorHECVIncorectUnitType = errors.New("incorrect unit type") +) + +var StartCodeBytes = []byte{0, 0, 1} +var AUDBytes = []byte{0, 0, 0, 1, 0x9, 0xf0, 0, 0, 0, 1} // AUD + +const ( + NALU_RAW = iota + NALU_AVCC + NALU_ANNEXB +) + +func SplitNALUs(b []byte) (nalus [][]byte, typ int) { + if len(b) < 4 { + return [][]byte{b}, NALU_RAW + } + val3 := pio.U24BE(b) + val4 := pio.U32BE(b) + if val4 <= uint32(len(b)) { + _val4 := val4 + _b := b[4:] + nalus := [][]byte{} + for { + nalus = append(nalus, _b[:_val4]) + _b = _b[_val4:] + if len(_b) < 4 { + break + } + _val4 = pio.U32BE(_b) + _b = _b[4:] + if _val4 > uint32(len(_b)) { + break + } + } + if len(_b) == 0 { + return nalus, NALU_AVCC + } + } + if val3 == 1 || val4 == 1 { + _val3 := val3 + _val4 := val4 + start := 0 + pos := 0 + for { + if start != pos { + nalus = append(nalus, b[start:pos]) + } + if _val3 == 1 { + pos += 3 + } else if _val4 == 1 { + pos += 4 + } + start = pos + if start == len(b) { + break + } + _val3 = 0 + _val4 = 0 + for pos < len(b) { + if pos+2 < len(b) && b[pos] == 0 { + _val3 = pio.U24BE(b[pos:]) + if _val3 == 0 { + if pos+3 < len(b) { + _val4 = uint32(b[pos+3]) + if _val4 == 1 { + break + } + } + } else if _val3 == 1 { + break + } + pos++ + } else { + pos++ + } + } + } + typ = NALU_ANNEXB + return + } + + return [][]byte{b}, NALU_RAW +} + +func ParseSPS(sps []byte) (ctx SPSInfo, err error) { + if len(sps) < 2 { + err = ErrorHEVCIncorectUnitSize + return + } + rbsp := nal2rbsp(sps[2:]) + br := &bits.GolombBitReader{R: bytes.NewReader(rbsp)} + + // sps_video_parameter_set_id + if _, err = br.ReadBits(4); err != nil { + return + } + + // sps_max_sub_layers_minus1 + spsMaxSubLayersMinus1, err := br.ReadBits(3) + if err != nil { + return + } + + // sps_temporal_id_nesting_flag + if _, err = br.ReadBit(); err != nil { + return + } + + // profile_tier_level( 1, sps_max_sub_layers_minus1 ) + if err = parsePTL(br, &ctx, spsMaxSubLayersMinus1); err != nil { + return + } + + // sps_seq_parameter_set_id + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + + // chroma_format_idc + var chroma_format_idc uint + if chroma_format_idc, err = br.ReadExponentialGolombCode(); err != nil { + return + } + if chroma_format_idc == 3 { + // separate_colour_plane_flag + if _, err = br.ReadBit(); err != nil { + return + } + } + + // Table 6-1, Section 6.2 + var subWidthC uint + var subHeightC uint + + switch chroma_format_idc { + case 0: + subWidthC, subHeightC = 1, 1 + case 1: + subWidthC, subHeightC = 2, 2 + case 2: + subWidthC, subHeightC = 2, 1 + case 3: + subWidthC, subHeightC = 1, 1 + } + + // pic_width_in_luma_samples + if ctx.PicWidthInLumaSamples, err = br.ReadExponentialGolombCode(); err != nil { + return + } + + // pic_height_in_luma_samples + if ctx.PicHeightInLumaSamples, err = br.ReadExponentialGolombCode(); err != nil { + return + } + + // conformance_window_flag + conformanceWindowFlag, err := br.ReadBit() + if err != nil { + return + } + + var conf_win_left_offset uint + var conf_win_right_offset uint + var conf_win_top_offset uint + var conf_win_bottom_offset uint + + if conformanceWindowFlag != 0 { + // conf_win_left_offset + conf_win_left_offset, err = br.ReadExponentialGolombCode() + if err != nil { + return + } + ctx.CropLeft = subWidthC * conf_win_left_offset + + // conf_win_right_offset + conf_win_right_offset, err = br.ReadExponentialGolombCode() + if err != nil { + return + } + ctx.CropRight = subWidthC * conf_win_right_offset + + // conf_win_top_offset + conf_win_top_offset, err = br.ReadExponentialGolombCode() + if err != nil { + return + } + ctx.CropTop = subHeightC * conf_win_top_offset + + // conf_win_bottom_offset + conf_win_bottom_offset, err = br.ReadExponentialGolombCode() + if err != nil { + return + } + ctx.CropBottom = subHeightC * conf_win_bottom_offset + } + + ctx.Width = ctx.PicWidthInLumaSamples - ctx.CropLeft - ctx.CropRight + ctx.Height = ctx.PicHeightInLumaSamples - ctx.CropTop - ctx.CropBottom + + // bit_depth_luma_minus8 + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + + // bit_depth_chroma_minus8 + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + + // log2_max_pic_order_cnt_lsb_minus4 + _, err = br.ReadExponentialGolombCode() + if err != nil { + return + } + + // sps_sub_layer_ordering_info_present_flag + spsSubLayerOrderingInfoPresentFlag, err := br.ReadBit() + if err != nil { + return + } + var i uint + if spsSubLayerOrderingInfoPresentFlag != 0 { + i = 0 + } else { + i = spsMaxSubLayersMinus1 + } + for ; i <= spsMaxSubLayersMinus1; i++ { + // sps_max_dec_pic_buffering_minus1[ i ] + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // sps_max_num_reorder_pics[ i ] + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // sps_max_latency_increase_plus1[ i ] + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + } + + // log2_min_luma_coding_block_size_minus3 + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // log2_diff_max_min_luma_coding_block_size + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // log2_min_luma_transform_block_size_minus2 + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // log2_diff_max_min_luma_transform_block_size + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // max_transform_hierarchy_depth_inter + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + // max_transform_hierarchy_depth_intra + if _, err = br.ReadExponentialGolombCode(); err != nil { + return + } + return +} + +func parsePTL(br *bits.GolombBitReader, ctx *SPSInfo, maxSubLayersMinus1 uint) error { + var err error + var ptl SPSInfo + if ptl.generalProfileSpace, err = br.ReadBits(2); err != nil { + return err + } + if ptl.generalTierFlag, err = br.ReadBit(); err != nil { + return err + } + if ptl.generalProfileIDC, err = br.ReadBits(5); err != nil { + return err + } + if ptl.generalProfileCompatibilityFlags, err = br.ReadBits32(32); err != nil { + return err + } + if ptl.generalConstraintIndicatorFlags, err = br.ReadBits64(48); err != nil { + return err + } + if ptl.generalLevelIDC, err = br.ReadBits(8); err != nil { + return err + } + updatePTL(ctx, &ptl) + if maxSubLayersMinus1 == 0 { + return nil + } + subLayerProfilePresentFlag := make([]uint, maxSubLayersMinus1) + subLayerLevelPresentFlag := make([]uint, maxSubLayersMinus1) + for i := uint(0); i < maxSubLayersMinus1; i++ { + if subLayerProfilePresentFlag[i], err = br.ReadBit(); err != nil { + return err + } + if subLayerLevelPresentFlag[i], err = br.ReadBit(); err != nil { + return err + } + } + if maxSubLayersMinus1 > 0 { + for i := maxSubLayersMinus1; i < 8; i++ { + if _, err = br.ReadBits(2); err != nil { + return err + } + } + } + for i := uint(0); i < maxSubLayersMinus1; i++ { + if subLayerProfilePresentFlag[i] != 0 { + if _, err = br.ReadBits32(32); err != nil { + return err + } + if _, err = br.ReadBits32(32); err != nil { + return err + } + if _, err = br.ReadBits32(24); err != nil { + return err + } + } + + if subLayerLevelPresentFlag[i] != 0 { + if _, err = br.ReadBits(8); err != nil { + return err + } + } + } + return nil +} + +func updatePTL(ctx, ptl *SPSInfo) { + ctx.generalProfileSpace = ptl.generalProfileSpace + + if ptl.generalTierFlag > ctx.generalTierFlag { + ctx.generalLevelIDC = ptl.generalLevelIDC + + ctx.generalTierFlag = ptl.generalTierFlag + } else { + if ptl.generalLevelIDC > ctx.generalLevelIDC { + ctx.generalLevelIDC = ptl.generalLevelIDC + } + } + + if ptl.generalProfileIDC > ctx.generalProfileIDC { + ctx.generalProfileIDC = ptl.generalProfileIDC + } + + ctx.generalProfileCompatibilityFlags &= ptl.generalProfileCompatibilityFlags + + ctx.generalConstraintIndicatorFlags &= ptl.generalConstraintIndicatorFlags +} + +func nal2rbsp(nal []byte) []byte { + return bytes.Replace(nal, []byte{0x0, 0x0, 0x3}, []byte{0x0, 0x0}, -1) +} + +type CodecData struct { + Record []byte + RecordInfo HEVCDecoderConfRecord + SPSInfo SPSInfo +} + +func (codec CodecData) Type() av.CodecType { + return av.HEVC +} + +func (codec CodecData) HEVCDecoderConfRecordBytes() []byte { + return codec.Record +} + +func (codec CodecData) SPS() []byte { + return codec.RecordInfo.SPS[0] +} + +func (codec CodecData) PPS() []byte { + return codec.RecordInfo.PPS[0] +} + +func (codec CodecData) VPS() []byte { + return codec.RecordInfo.VPS[0] +} + +func (codec CodecData) Width() int { + return int(codec.SPSInfo.Width) +} + +func (codec CodecData) Height() int { + return int(codec.SPSInfo.Height) +} + +func NewCodecDataFromHEVCDecoderConfRecord(record []byte) (self CodecData, err error) { + self.Record = record + if _, err = (&self.RecordInfo).Unmarshal(record); err != nil { + return + } + if len(self.RecordInfo.SPS) == 0 { + err = fmt.Errorf("hevcparser: no SPS found in HEVCDecoderConfRecord") + return + } + if len(self.RecordInfo.PPS) == 0 { + err = fmt.Errorf("hevcparser: no PPS found in HEVCDecoderConfRecord") + return + } + if len(self.RecordInfo.VPS) == 0 { + err = fmt.Errorf("hevcparser: no VPS found in HEVCDecoderConfRecord") + return + } + if self.SPSInfo, err = ParseSPS(self.RecordInfo.SPS[0]); err != nil { + err = fmt.Errorf("hevcparser: parse SPS failed(%s)", err) + return + } + return +} + +func NewCodecDataFromVPSAndSPSAndPPS(vps, sps, pps []byte) (self CodecData, err error) { + recordinfo := HEVCDecoderConfRecord{} + recordinfo.HEVCProfileIndication = sps[3] + recordinfo.ProfileCompatibility = sps[4] + recordinfo.HEVCLevelIndication = sps[5] + recordinfo.SPS = [][]byte{sps} + recordinfo.PPS = [][]byte{pps} + recordinfo.VPS = [][]byte{vps} + recordinfo.LengthSizeMinusOne = 3 + if self.SPSInfo, err = ParseSPS(sps); err != nil { + return + } + buf := make([]byte, recordinfo.Len()) + recordinfo.Marshal(buf, self.SPSInfo) + self.RecordInfo = recordinfo + self.Record = buf + return +} + +type HEVCDecoderConfRecord struct { + HEVCProfileIndication uint8 + ProfileCompatibility uint8 + HEVCLevelIndication uint8 + LengthSizeMinusOne uint8 + VPS [][]byte + SPS [][]byte + PPS [][]byte +} + +var ErrDecconfInvalid = fmt.Errorf("hevcparser: HEVCDecoderConfRecord invalid") + +func (record *HEVCDecoderConfRecord) Unmarshal(b []byte) (n int, err error) { + if len(b) < 30 { + err = ErrDecconfInvalid + return + } + record.HEVCProfileIndication = b[1] + record.ProfileCompatibility = b[2] + record.HEVCLevelIndication = b[3] + record.LengthSizeMinusOne = b[4] & 0x03 + + vpscount := int(b[25] & 0x1f) + n += 26 + for i := 0; i < vpscount; i++ { + if len(b) < n+2 { + err = ErrDecconfInvalid + return + } + vpslen := int(pio.U16BE(b[n:])) + n += 2 + + if len(b) < n+vpslen { + err = ErrDecconfInvalid + return + } + record.VPS = append(record.VPS, b[n:n+vpslen]) + n += vpslen + } + + if len(b) < n+1 { + err = ErrDecconfInvalid + return + } + + n++ + n++ + + spscount := int(b[n]) + n++ + + for i := 0; i < spscount; i++ { + if len(b) < n+2 { + err = ErrDecconfInvalid + return + } + spslen := int(pio.U16BE(b[n:])) + n += 2 + + if len(b) < n+spslen { + err = ErrDecconfInvalid + return + } + record.SPS = append(record.SPS, b[n:n+spslen]) + n += spslen + } + + n++ + n++ + + ppscount := int(b[n]) + n++ + + for i := 0; i < ppscount; i++ { + if len(b) < n+2 { + err = ErrDecconfInvalid + return + } + ppslen := int(pio.U16BE(b[n:])) + n += 2 + + if len(b) < n+ppslen { + err = ErrDecconfInvalid + return + } + record.PPS = append(record.PPS, b[n:n+ppslen]) + n += ppslen + } + return +} + +func (record HEVCDecoderConfRecord) Len() (n int) { + n = 23 + for _, sps := range record.SPS { + n += 5 + len(sps) + } + for _, pps := range record.PPS { + n += 5 + len(pps) + } + for _, vps := range record.VPS { + n += 5 + len(vps) + } + return +} + +func (record HEVCDecoderConfRecord) Marshal(b []byte, si SPSInfo) (n int) { + b[0] = 1 + b[1] = record.HEVCProfileIndication + b[2] = record.ProfileCompatibility + b[3] = record.HEVCLevelIndication + b[21] = 3 + b[22] = 3 + n += 23 + b[n] = (record.VPS[0][0] >> 1) & 0x3f + n++ + b[n] = byte(len(record.VPS) >> 8) + n++ + b[n] = byte(len(record.VPS)) + n++ + for _, vps := range record.VPS { + pio.PutU16BE(b[n:], uint16(len(vps))) + n += 2 + copy(b[n:], vps) + n += len(vps) + } + b[n] = (record.SPS[0][0] >> 1) & 0x3f + n++ + b[n] = byte(len(record.SPS) >> 8) + n++ + b[n] = byte(len(record.SPS)) + n++ + for _, sps := range record.SPS { + pio.PutU16BE(b[n:], uint16(len(sps))) + n += 2 + copy(b[n:], sps) + n += len(sps) + } + b[n] = (record.PPS[0][0] >> 1) & 0x3f + n++ + b[n] = byte(len(record.PPS) >> 8) + n++ + b[n] = byte(len(record.PPS)) + n++ + for _, pps := range record.PPS { + pio.PutU16BE(b[n:], uint16(len(pps))) + n += 2 + copy(b[n:], pps) + n += len(pps) + } + return +} diff --git a/vendor/github.com/datarhei/joy4/codec/vp9parser/parser.go b/vendor/github.com/datarhei/joy4/codec/vp9parser/parser.go new file mode 100644 index 00000000..d5bbaa61 --- /dev/null +++ b/vendor/github.com/datarhei/joy4/codec/vp9parser/parser.go @@ -0,0 +1,31 @@ +package vp9parser + +import ( + "github.com/datarhei/joy4/av" +) + +type CodecData struct { + Record []byte +} + +func (codec CodecData) Type() av.CodecType { + return av.VP9 +} + +func (codec CodecData) VPDecoderConfRecordBytes() []byte { + return codec.Record +} + +func (codec CodecData) Width() int { + return 0 +} + +func (codec CodecData) Height() int { + return 0 +} + +func NewCodecDataFromVPDecoderConfRecord(record []byte) (self CodecData, err error) { + self.Record = record + + return +} diff --git a/vendor/github.com/datarhei/joy4/format/flv/flv.go b/vendor/github.com/datarhei/joy4/format/flv/flv.go index 742811d5..3289fb53 100644 --- a/vendor/github.com/datarhei/joy4/format/flv/flv.go +++ b/vendor/github.com/datarhei/joy4/format/flv/flv.go @@ -3,15 +3,19 @@ package flv import ( "bufio" "fmt" + "io" + "github.com/datarhei/joy4/av" "github.com/datarhei/joy4/av/avutil" "github.com/datarhei/joy4/codec" "github.com/datarhei/joy4/codec/aacparser" + "github.com/datarhei/joy4/codec/av1parser" "github.com/datarhei/joy4/codec/fake" "github.com/datarhei/joy4/codec/h264parser" + "github.com/datarhei/joy4/codec/hevcparser" + "github.com/datarhei/joy4/codec/vp9parser" "github.com/datarhei/joy4/format/flv/flvio" "github.com/datarhei/joy4/utils/bits/pio" - "io" ) var MaxProbePacketCount = 20 @@ -27,16 +31,29 @@ func NewMetadataByStreams(streams []av.CodecData) (metadata flvio.AMFMap, err er switch typ { case av.H264: metadata["videocodecid"] = flvio.VIDEO_H264 + case av.HEVC: + metadata["videocodecid"] = flvio.FourCCToFloat(flvio.FOURCC_HEVC) + case av.VP9: + metadata["videocodecid"] = flvio.FourCCToFloat(flvio.FOURCC_VP9) + case av.AV1: + metadata["videocodecid"] = flvio.FourCCToFloat(flvio.FOURCC_AV1) default: err = fmt.Errorf("flv: metadata: unsupported video codecType=%v", stream.Type()) return } - metadata["width"] = stream.Width() - metadata["height"] = stream.Height() - metadata["displayWidth"] = stream.Width() - metadata["displayHeight"] = stream.Height() + width, height := stream.Width(), stream.Height() + + if width != 0 { + metadata["width"] = width + metadata["displayWidth"] = width + } + + if height != 0 { + metadata["height"] = height + metadata["displayHeight"] = height + } case typ.IsAudio(): stream := _stream.(av.AudioCodecData) @@ -68,36 +85,98 @@ type Prober struct { CachedPkts []av.Packet } -func (self *Prober) CacheTag(_tag flvio.Tag, timestamp int32) { - pkt, _ := self.TagToPacket(_tag, timestamp) - self.CachedPkts = append(self.CachedPkts, pkt) +func (prober *Prober) CacheTag(_tag flvio.Tag, timestamp int32) { + pkt, _ := prober.TagToPacket(_tag, timestamp) + prober.CachedPkts = append(prober.CachedPkts, pkt) } -func (self *Prober) PushTag(tag flvio.Tag, timestamp int32) (err error) { - self.PushedCount++ +func (prober *Prober) PushTag(tag flvio.Tag, timestamp int32) (err error) { + prober.PushedCount++ - if self.PushedCount > MaxProbePacketCount { + if prober.PushedCount > MaxProbePacketCount { err = fmt.Errorf("flv: max probe packet count reached") return } switch tag.Type { case flvio.TAG_VIDEO: - switch tag.AVCPacketType { - case flvio.AVC_SEQHDR: - if !self.GotVideo { - var stream h264parser.CodecData - if stream, err = h264parser.NewCodecDataFromAVCDecoderConfRecord(tag.Data); err != nil { - err = fmt.Errorf("flv: h264 seqhdr invalid: %s", err.Error()) - return + if tag.IsExHeader { + if tag.FourCC == flvio.FOURCC_HEVC { + if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START { + if !prober.GotVideo { + var stream hevcparser.CodecData + //fmt.Printf("got HEVC sequence start:\n%s\n", hex.Dump(tag.Data)) + if stream, err = hevcparser.NewCodecDataFromHEVCDecoderConfRecord(tag.Data); err != nil { + err = fmt.Errorf("flv: hevc seqhdr invalid: %s", err.Error()) + return + } + prober.VideoStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotVideo = true + } + } else if tag.PacketType == flvio.PKTTYPE_CODED_FRAMES || tag.PacketType == flvio.PKTTYPE_CODED_FRAMESX { + prober.CacheTag(tag, timestamp) } - self.VideoStreamIdx = len(self.Streams) - self.Streams = append(self.Streams, stream) - self.GotVideo = true - } + } else if tag.FourCC == flvio.FOURCC_VP9 { + if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START { + if !prober.GotVideo { + var stream vp9parser.CodecData + //fmt.Printf("got VP9 sequence start:\n%s\n", hex.Dump(tag.Data)) + if stream, err = vp9parser.NewCodecDataFromVPDecoderConfRecord(tag.Data); err != nil { + err = fmt.Errorf("flv: vp9 seqhdr invalid: %s", err.Error()) + return + } + prober.VideoStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotVideo = true + } + } else if tag.PacketType == flvio.PKTTYPE_CODED_FRAMES || tag.PacketType == flvio.PKTTYPE_CODED_FRAMESX { + prober.CacheTag(tag, timestamp) + } + } else if tag.FourCC == flvio.FOURCC_AV1 { + if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START || tag.PacketType == flvio.PKTTYPE_MPEG2TS_SEQUENCE_START { + if !prober.GotVideo { + var stream av1parser.CodecData - case flvio.AVC_NALU: - self.CacheTag(tag, timestamp) + if tag.PacketType == flvio.PKTTYPE_SEQUENCE_START { + //fmt.Printf("got AV1 sequence start:\n%s\n", hex.Dump(tag.Data)) + if stream, err = av1parser.NewCodecDataFromAV1DecoderConfRecord(tag.Data); err != nil { + err = fmt.Errorf("flv: av1 seqhdr invalid: %s", err.Error()) + return + } + } else { + //fmt.Printf("got AV1 video descriptor:\n%s\n", hex.Dump(tag.Data)) + if stream, err = av1parser.NewCodecDataFromAV1VideoDescriptor(tag.Data); err != nil { + err = fmt.Errorf("flv: av1 video descriptor invalid: %s", err.Error()) + return + } + } + prober.VideoStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotVideo = true + } + } else if tag.PacketType == flvio.PKTTYPE_CODED_FRAMES || tag.PacketType == flvio.PKTTYPE_CODED_FRAMESX { + prober.CacheTag(tag, timestamp) + } + } + } else { + switch tag.AVCPacketType { + case flvio.AVC_SEQHDR: + if !prober.GotVideo { + var stream h264parser.CodecData + //fmt.Printf("got H264 sequence start:\n%s\n", hex.Dump(tag.Data)) + if stream, err = h264parser.NewCodecDataFromAVCDecoderConfRecord(tag.Data); err != nil { + err = fmt.Errorf("flv: h264 seqhdr invalid: %s", err.Error()) + return + } + prober.VideoStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotVideo = true + } + + case flvio.AVC_NALU: + prober.CacheTag(tag, timestamp) + } } case flvio.TAG_AUDIO: @@ -105,42 +184,42 @@ func (self *Prober) PushTag(tag flvio.Tag, timestamp int32) (err error) { case flvio.SOUND_AAC: switch tag.AACPacketType { case flvio.AAC_SEQHDR: - if !self.GotAudio { + if !prober.GotAudio { var stream aacparser.CodecData if stream, err = aacparser.NewCodecDataFromMPEG4AudioConfigBytes(tag.Data); err != nil { err = fmt.Errorf("flv: aac seqhdr invalid") return } - self.AudioStreamIdx = len(self.Streams) - self.Streams = append(self.Streams, stream) - self.GotAudio = true + prober.AudioStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotAudio = true } case flvio.AAC_RAW: - self.CacheTag(tag, timestamp) + prober.CacheTag(tag, timestamp) } case flvio.SOUND_SPEEX: - if !self.GotAudio { + if !prober.GotAudio { stream := codec.NewSpeexCodecData(16000, tag.ChannelLayout()) - self.AudioStreamIdx = len(self.Streams) - self.Streams = append(self.Streams, stream) - self.GotAudio = true - self.CacheTag(tag, timestamp) + prober.AudioStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotAudio = true + prober.CacheTag(tag, timestamp) } case flvio.SOUND_NELLYMOSER: - if !self.GotAudio { + if !prober.GotAudio { stream := fake.CodecData{ CodecType_: av.NELLYMOSER, SampleRate_: 16000, SampleFormat_: av.S16, ChannelLayout_: tag.ChannelLayout(), } - self.AudioStreamIdx = len(self.Streams) - self.Streams = append(self.Streams, stream) - self.GotAudio = true - self.CacheTag(tag, timestamp) + prober.AudioStreamIdx = len(prober.Streams) + prober.Streams = append(prober.Streams, stream) + prober.GotAudio = true + prober.CacheTag(tag, timestamp) } } @@ -149,25 +228,25 @@ func (self *Prober) PushTag(tag flvio.Tag, timestamp int32) (err error) { return } -func (self *Prober) Probed() (ok bool) { - if self.HasAudio || self.HasVideo { - if self.HasAudio == self.GotAudio && self.HasVideo == self.GotVideo { +func (prober *Prober) Probed() (ok bool) { + if prober.HasAudio || prober.HasVideo { + if prober.HasAudio == prober.GotAudio && prober.HasVideo == prober.GotVideo { return true } } else { - if self.PushedCount == MaxProbePacketCount { + if prober.PushedCount == MaxProbePacketCount { return true } } return } -func (self *Prober) TagToPacket(tag flvio.Tag, timestamp int32) (pkt av.Packet, ok bool) { +func (prober *Prober) TagToPacket(tag flvio.Tag, timestamp int32) (pkt av.Packet, ok bool) { switch tag.Type { case flvio.TAG_VIDEO: - pkt.Idx = int8(self.VideoStreamIdx) - switch tag.AVCPacketType { - case flvio.AVC_NALU: + pkt.Idx = int8(prober.VideoStreamIdx) + switch tag.PacketType { + case flvio.PKTTYPE_CODED_FRAMES, flvio.PKTTYPE_CODED_FRAMESX: ok = true pkt.Data = tag.Data pkt.CompositionTime = flvio.TsToTime(tag.CompositionTime) @@ -175,7 +254,7 @@ func (self *Prober) TagToPacket(tag flvio.Tag, timestamp int32) (pkt av.Packet, } case flvio.TAG_AUDIO: - pkt.Idx = int8(self.AudioStreamIdx) + pkt.Idx = int8(prober.AudioStreamIdx) switch tag.SoundFormat { case flvio.SOUND_AAC: switch tag.AACPacketType { @@ -198,13 +277,13 @@ func (self *Prober) TagToPacket(tag flvio.Tag, timestamp int32) (pkt av.Packet, return } -func (self *Prober) Empty() bool { - return len(self.CachedPkts) == 0 +func (prober *Prober) Empty() bool { + return len(prober.CachedPkts) == 0 } -func (self *Prober) PopPacket() av.Packet { - pkt := self.CachedPkts[0] - self.CachedPkts = self.CachedPkts[1:] +func (prober *Prober) PopPacket() av.Packet { + pkt := prober.CachedPkts[0] + prober.CachedPkts = prober.CachedPkts[1:] return pkt } @@ -219,6 +298,55 @@ func CodecDataToTag(stream av.CodecData) (_tag flvio.Tag, ok bool, err error) { Data: h264.AVCDecoderConfRecordBytes(), FrameType: flvio.FRAME_KEY, } + //fmt.Printf("set H264 sequence start:\n%v\n", hex.Dump(tag.Data)) + ok = true + _tag = tag + + case av.HEVC: + hevc := stream.(hevcparser.CodecData) + tag := flvio.Tag{ + Type: flvio.TAG_VIDEO, + IsExHeader: true, + PacketType: flvio.PKTTYPE_SEQUENCE_START, + FourCC: flvio.FOURCC_HEVC, + Data: hevc.HEVCDecoderConfRecordBytes(), + FrameType: flvio.FRAME_KEY, + } + //fmt.Printf("set HEVC sequence start:\n%v\n", hex.Dump(tag.Data)) + ok = true + _tag = tag + + case av.VP9: + vp9 := stream.(vp9parser.CodecData) + tag := flvio.Tag{ + Type: flvio.TAG_VIDEO, + IsExHeader: true, + PacketType: flvio.PKTTYPE_SEQUENCE_START, + FourCC: flvio.FOURCC_VP9, + Data: vp9.VPDecoderConfRecordBytes(), + FrameType: flvio.FRAME_KEY, + } + //fmt.Printf("set VP9 sequence start:\n%v\n", hex.Dump(tag.Data)) + ok = true + _tag = tag + + case av.AV1: + av1 := stream.(av1parser.CodecData) + tag := flvio.Tag{ + Type: flvio.TAG_VIDEO, + IsExHeader: true, + PacketType: flvio.PKTTYPE_SEQUENCE_START, + FourCC: flvio.FOURCC_AV1, + Data: av1.AV1DecoderConfRecordBytes(), + FrameType: flvio.FRAME_KEY, + } + + if av1.IsMpeg2TS { + tag.PacketType = flvio.PKTTYPE_MPEG2TS_SEQUENCE_START + tag.Data = av1.AV1VideoDescriptorBytes() + } + + //fmt.Printf("set AV1 sequence start:\n%v\n", hex.Dump(tag.Data)) ok = true _tag = tag @@ -272,6 +400,58 @@ func PacketToTag(pkt av.Packet, stream av.CodecData) (tag flvio.Tag, timestamp i tag.FrameType = flvio.FRAME_INTER } + case av.HEVC: + tag = flvio.Tag{ + Type: flvio.TAG_VIDEO, + IsExHeader: true, + PacketType: flvio.PKTTYPE_CODED_FRAMES, + CompositionTime: flvio.TimeToTs(pkt.CompositionTime), + FourCC: flvio.FOURCC_HEVC, + Data: pkt.Data, + } + + if pkt.CompositionTime == 0 { + tag.PacketType = flvio.PKTTYPE_CODED_FRAMESX + } + + if pkt.IsKeyFrame { + tag.FrameType = flvio.FRAME_KEY + } else { + tag.FrameType = flvio.FRAME_INTER + } + + case av.VP9: + tag = flvio.Tag{ + Type: flvio.TAG_VIDEO, + IsExHeader: true, + PacketType: flvio.PKTTYPE_CODED_FRAMES, + CompositionTime: flvio.TimeToTs(pkt.CompositionTime), + FourCC: flvio.FOURCC_VP9, + Data: pkt.Data, + } + + if pkt.IsKeyFrame { + tag.FrameType = flvio.FRAME_KEY + } else { + tag.FrameType = flvio.FRAME_INTER + } + + case av.AV1: + tag = flvio.Tag{ + Type: flvio.TAG_VIDEO, + IsExHeader: true, + PacketType: flvio.PKTTYPE_CODED_FRAMES, + CompositionTime: flvio.TimeToTs(pkt.CompositionTime), + FourCC: flvio.FOURCC_AV1, + Data: pkt.Data, + } + + if pkt.IsKeyFrame { + tag.FrameType = flvio.FRAME_KEY + } else { + tag.FrameType = flvio.FRAME_INTER + } + case av.AAC: tag = flvio.Tag{ Type: flvio.TAG_AUDIO, @@ -335,9 +515,9 @@ func NewMuxer(w io.Writer) *Muxer { return NewMuxerWriteFlusher(bufio.NewWriterSize(w, pio.RecommendBufioSize)) } -var CodecTypes = []av.CodecType{av.H264, av.AAC, av.SPEEX} +var CodecTypes = []av.CodecType{av.H264, av.HEVC, av.VP9, av.AV1, av.AAC, av.SPEEX} -func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { +func (muxer *Muxer) WriteHeader(streams []av.CodecData) (err error) { var flags uint8 for _, stream := range streams { if stream.Type().IsVideo() { @@ -347,8 +527,8 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { } } - n := flvio.FillFileHeader(self.b, flags) - if _, err = self.bufw.Write(self.b[:n]); err != nil { + n := flvio.FillFileHeader(muxer.b, flags) + if _, err = muxer.bufw.Write(muxer.b[:n]); err != nil { return } @@ -359,28 +539,28 @@ func (self *Muxer) WriteHeader(streams []av.CodecData) (err error) { return } if ok { - if err = flvio.WriteTag(self.bufw, tag, 0, self.b); err != nil { + if err = flvio.WriteTag(muxer.bufw, tag, 0, muxer.b); err != nil { return } } } - self.streams = streams + muxer.streams = streams return } -func (self *Muxer) WritePacket(pkt av.Packet) (err error) { - stream := self.streams[pkt.Idx] +func (muxer *Muxer) WritePacket(pkt av.Packet) (err error) { + stream := muxer.streams[pkt.Idx] tag, timestamp := PacketToTag(pkt, stream) - if err = flvio.WriteTag(self.bufw, tag, timestamp, self.b); err != nil { + if err = flvio.WriteTag(muxer.bufw, tag, timestamp, muxer.b); err != nil { return } return } -func (self *Muxer) WriteTrailer() (err error) { - if err = self.bufw.Flush(); err != nil { +func (muxer *Muxer) WriteTrailer() (err error) { + if err = muxer.bufw.Flush(); err != nil { return } return @@ -401,78 +581,76 @@ func NewDemuxer(r io.Reader) *Demuxer { } } -func (self *Demuxer) prepare() (err error) { - for self.stage < 2 { - switch self.stage { +func (demuxer *Demuxer) prepare() (err error) { + for demuxer.stage < 2 { + switch demuxer.stage { case 0: - if _, err = io.ReadFull(self.bufr, self.b[:flvio.FileHeaderLength]); err != nil { + if _, err = io.ReadFull(demuxer.bufr, demuxer.b[:flvio.FileHeaderLength]); err != nil { return } var flags uint8 var skip int - if flags, skip, err = flvio.ParseFileHeader(self.b); err != nil { + if flags, skip, err = flvio.ParseFileHeader(demuxer.b); err != nil { return } - if _, err = self.bufr.Discard(skip); err != nil { + if _, err = demuxer.bufr.Discard(skip); err != nil { return } if flags&flvio.FILE_HAS_AUDIO != 0 { - self.prober.HasAudio = true + demuxer.prober.HasAudio = true } if flags&flvio.FILE_HAS_VIDEO != 0 { - self.prober.HasVideo = true + demuxer.prober.HasVideo = true } - self.stage++ + demuxer.stage++ case 1: - for !self.prober.Probed() { + for !demuxer.prober.Probed() { var tag flvio.Tag var timestamp int32 - if tag, timestamp, err = flvio.ReadTag(self.bufr, self.b); err != nil { + if tag, timestamp, err = flvio.ReadTag(demuxer.bufr, demuxer.b); err != nil { return } - if err = self.prober.PushTag(tag, timestamp); err != nil { + if err = demuxer.prober.PushTag(tag, timestamp); err != nil { return } } - self.stage++ + demuxer.stage++ } } return } -func (self *Demuxer) Streams() (streams []av.CodecData, err error) { - if err = self.prepare(); err != nil { +func (demuxer *Demuxer) Streams() (streams []av.CodecData, err error) { + if err = demuxer.prepare(); err != nil { return } - streams = self.prober.Streams + streams = demuxer.prober.Streams return } -func (self *Demuxer) ReadPacket() (pkt av.Packet, err error) { - if err = self.prepare(); err != nil { +func (demuxer *Demuxer) ReadPacket() (pkt av.Packet, err error) { + if err = demuxer.prepare(); err != nil { return } - if !self.prober.Empty() { - pkt = self.prober.PopPacket() + if !demuxer.prober.Empty() { + pkt = demuxer.prober.PopPacket() return } for { var tag flvio.Tag var timestamp int32 - if tag, timestamp, err = flvio.ReadTag(self.bufr, self.b); err != nil { + if tag, timestamp, err = flvio.ReadTag(demuxer.bufr, demuxer.b); err != nil { return } var ok bool - if pkt, ok = self.prober.TagToPacket(tag, timestamp); ok { + if pkt, ok = demuxer.prober.TagToPacket(tag, timestamp); ok { return } } - - return } func Handler(h *avutil.RegisterHandler) { diff --git a/vendor/github.com/datarhei/joy4/format/flv/flvio/flvio.go b/vendor/github.com/datarhei/joy4/format/flv/flvio/flvio.go index a69bdb51..8c0a57ea 100644 --- a/vendor/github.com/datarhei/joy4/format/flv/flvio/flvio.go +++ b/vendor/github.com/datarhei/joy4/format/flv/flvio/flvio.go @@ -2,10 +2,11 @@ package flvio import ( "fmt" - "github.com/datarhei/joy4/av" - "github.com/datarhei/joy4/utils/bits/pio" "io" "time" + + "github.com/datarhei/joy4/av" + "github.com/datarhei/joy4/utils/bits/pio" ) func TsToTime(ts int32) time.Duration { @@ -60,6 +61,27 @@ const ( VIDEO_H264 = 7 ) +const ( + PKTTYPE_SEQUENCE_START = 0 + PKTTYPE_CODED_FRAMES = 1 + PKTTYPE_SEQUENCE_END = 2 + PKTTYPE_CODED_FRAMESX = 3 + PKTTYPE_METADATA = 4 + PKTTYPE_MPEG2TS_SEQUENCE_START = 5 +) + +var ( + FOURCC_AV1 = [4]byte{'a', 'v', '0', '1'} + FOURCC_VP9 = [4]byte{'v', 'p', '0', '9'} + FOURCC_HEVC = [4]byte{'h', 'v', 'c', '1'} +) + +func FourCCToFloat(fourcc [4]byte) float64 { + i := int(fourcc[0])<<24 | int(fourcc[1])<<16 | int(fourcc[2])<<8 | int(fourcc[3]) + + return float64(i) +} + type Tag struct { /* 8 = Audio @@ -126,14 +148,22 @@ type Tag struct { AACPacketType uint8 /* + 0: reserved 1: keyframe (for AVC, a seekable frame) 2: inter frame (for AVC, a non- seekable frame) 3: disposable inter frame (H.263 only) 4: generated keyframe (reserved for server use only) 5: video info/command frame + 6: reserved + 7: reserved */ FrameType uint8 + /* + FrameType & 0b1000 != 0 + */ + IsExHeader bool + /* 1: JPEG (currently unused) 2: Sorenson H.263 @@ -145,6 +175,16 @@ type Tag struct { */ CodecID uint8 + /* + 0: PacketTypeSequenceStart + 1: PacketTypeCodedFrames + 2: PacketTypeSequenceEnd + 3: PacketTypeCodedFramesX + 4: PacketTypeMetadata + 5: PacketTypeMPEG2TSSequenceStart + */ + PacketType uint8 + /* 0: AVC sequence header 1: AVC NALU @@ -154,18 +194,20 @@ type Tag struct { CompositionTime int32 + FourCC [4]byte + Data []byte } -func (self Tag) ChannelLayout() av.ChannelLayout { - if self.SoundType == SOUND_MONO { +func (t Tag) ChannelLayout() av.ChannelLayout { + if t.SoundType == SOUND_MONO { return av.CH_MONO } else { return av.CH_STEREO } } -func (self *Tag) audioParseHeader(b []byte) (n int, err error) { +func (t *Tag) audioParseHeader(b []byte) (n int, err error) { if len(b) < n+1 { err = fmt.Errorf("audiodata: parse invalid") return @@ -173,97 +215,163 @@ func (self *Tag) audioParseHeader(b []byte) (n int, err error) { flags := b[n] n++ - self.SoundFormat = flags >> 4 - self.SoundRate = (flags >> 2) & 0x3 - self.SoundSize = (flags >> 1) & 0x1 - self.SoundType = flags & 0x1 + t.SoundFormat = flags >> 4 + t.SoundRate = (flags >> 2) & 0x3 + t.SoundSize = (flags >> 1) & 0x1 + t.SoundType = flags & 0x1 - switch self.SoundFormat { + switch t.SoundFormat { case SOUND_AAC: if len(b) < n+1 { err = fmt.Errorf("audiodata: parse invalid") return } - self.AACPacketType = b[n] + t.AACPacketType = b[n] n++ } return } -func (self Tag) audioFillHeader(b []byte) (n int) { +func (t Tag) audioFillHeader(b []byte) (n int) { var flags uint8 - flags |= self.SoundFormat << 4 - flags |= self.SoundRate << 2 - flags |= self.SoundSize << 1 - flags |= self.SoundType + flags |= t.SoundFormat << 4 + flags |= t.SoundRate << 2 + flags |= t.SoundSize << 1 + flags |= t.SoundType b[n] = flags n++ - switch self.SoundFormat { + switch t.SoundFormat { case SOUND_AAC: - b[n] = self.AACPacketType + b[n] = t.AACPacketType n++ } return } -func (self *Tag) videoParseHeader(b []byte) (n int, err error) { +func (t *Tag) videoParseHeader(b []byte) (n int, err error) { if len(b) < n+1 { err = fmt.Errorf("videodata: parse invalid") return } flags := b[n] - self.FrameType = flags >> 4 - self.CodecID = flags & 0xf + t.FrameType = flags >> 4 + t.CodecID = flags & 0b1111 + + //fmt.Printf("%#8b\n", flags) n++ - if self.FrameType == FRAME_INTER || self.FrameType == FRAME_KEY { + if (t.FrameType & 0b1000) != 0 { + t.IsExHeader = true + t.PacketType = t.CodecID + t.CodecID = 0 + + if t.PacketType != PKTTYPE_METADATA { + t.FrameType = t.FrameType & 0b0111 + } + } + + if !t.IsExHeader { + if t.FrameType == FRAME_INTER || t.FrameType == FRAME_KEY { + if len(b) < n+4 { + err = fmt.Errorf("videodata: parse invalid: neither interframe nor keyframe") + return + } + t.AVCPacketType = b[n] + switch t.AVCPacketType { + case AVC_SEQHDR: + t.PacketType = PKTTYPE_SEQUENCE_START + case AVC_NALU: + t.PacketType = PKTTYPE_CODED_FRAMES + case AVC_EOS: + t.PacketType = PKTTYPE_SEQUENCE_END + } + n++ + + t.CompositionTime = pio.I24BE(b[n:]) + n += 3 + } + } else { if len(b) < n+4 { - err = fmt.Errorf("videodata: parse invalid") + err = fmt.Errorf("videodata: parse invalid: not enough bytes for the fourCC value") return } - self.AVCPacketType = b[n] - n++ - self.CompositionTime = pio.I24BE(b[n:]) + t.FourCC[0] = b[n] + t.FourCC[1] = b[n+1] + t.FourCC[2] = b[n+2] + t.FourCC[3] = b[n+3] + + n += 4 + + t.CompositionTime = 0 + + if t.FourCC == FOURCC_HEVC { + if t.PacketType == PKTTYPE_CODED_FRAMES { + t.CompositionTime = pio.I24BE(b[n:]) + n += 3 + } + } + } + + //fmt.Printf("parseVideoHeader: PacketType: %d\n", t.PacketType) + + return +} + +func (t Tag) videoFillHeader(b []byte) (n int) { + if t.IsExHeader { + flags := t.FrameType<<4 | t.PacketType | 0b10000000 + b[n] = flags + n++ + b[n] = t.FourCC[0] + b[n+1] = t.FourCC[1] + b[n+2] = t.FourCC[2] + b[n+3] = t.FourCC[3] + n += 4 + + if t.FourCC == FOURCC_HEVC { + if t.PacketType == PKTTYPE_CODED_FRAMES { + pio.PutI24BE(b[n:], t.CompositionTime) + n += 3 + } + } + } else { + flags := t.FrameType<<4 | t.CodecID + b[n] = flags + n++ + b[n] = t.AVCPacketType + n++ + pio.PutI24BE(b[n:], t.CompositionTime) n += 3 } + //fmt.Printf("videoFillHeader: PacketType: %d\n%s\n", t.PacketType, hex.Dump(b[:n])) + return } -func (self Tag) videoFillHeader(b []byte) (n int) { - flags := self.FrameType<<4 | self.CodecID - b[n] = flags - n++ - b[n] = self.AVCPacketType - n++ - pio.PutI24BE(b[n:], self.CompositionTime) - n += 3 - return -} - -func (self Tag) FillHeader(b []byte) (n int) { - switch self.Type { +func (t Tag) FillHeader(b []byte) (n int) { + switch t.Type { case TAG_AUDIO: - return self.audioFillHeader(b) + return t.audioFillHeader(b) case TAG_VIDEO: - return self.videoFillHeader(b) + return t.videoFillHeader(b) } return } -func (self *Tag) ParseHeader(b []byte) (n int, err error) { - switch self.Type { +func (t *Tag) ParseHeader(b []byte) (n int, err error) { + switch t.Type { case TAG_AUDIO: - return self.audioParseHeader(b) + return t.audioParseHeader(b) case TAG_VIDEO: - return self.videoParseHeader(b) + return t.videoParseHeader(b) } return diff --git a/vendor/github.com/datarhei/joy4/format/rtmp/rtmp.go b/vendor/github.com/datarhei/joy4/format/rtmp/rtmp.go index 8d9dc745..961b2146 100644 --- a/vendor/github.com/datarhei/joy4/format/rtmp/rtmp.go +++ b/vendor/github.com/datarhei/joy4/format/rtmp/rtmp.go @@ -69,21 +69,21 @@ type Server struct { doneChan chan struct{} } -func (self *Server) handleConn(conn *Conn) (err error) { - if self.HandleConn != nil { - self.HandleConn(conn) +func (s *Server) handleConn(conn *Conn) (err error) { + if s.HandleConn != nil { + s.HandleConn(conn) } else { if err = conn.prepare(stageCommandDone, 0); err != nil { return } if conn.playing { - if self.HandlePlay != nil { - self.HandlePlay(conn) + if s.HandlePlay != nil { + s.HandlePlay(conn) } } else if conn.publishing { - if self.HandlePublish != nil { - self.HandlePublish(conn) + if s.HandlePublish != nil { + s.HandlePublish(conn) } } } @@ -91,8 +91,8 @@ func (self *Server) handleConn(conn *Conn) (err error) { return } -func (self *Server) ListenAndServe() error { - addr := self.Addr +func (s *Server) ListenAndServe() error { + addr := s.Addr if addr == "" { addr = ":1935" } @@ -102,11 +102,11 @@ func (self *Server) ListenAndServe() error { return err } - return self.Serve(listener) + return s.Serve(listener) } -func (self *Server) ListenAndServeTLS(certFile, keyFile string) error { - addr := self.Addr +func (s *Server) ListenAndServeTLS(certFile, keyFile string) error { + addr := s.Addr if addr == "" { addr = ":1935" } @@ -116,14 +116,14 @@ func (self *Server) ListenAndServeTLS(certFile, keyFile string) error { return err } - return self.ServeTLS(listener, certFile, keyFile) + return s.ServeTLS(listener, certFile, keyFile) } -func (self *Server) ServeTLS(listener net.Listener, certFile, keyFile string) error { +func (s *Server) ServeTLS(listener net.Listener, certFile, keyFile string) error { var config *tls.Config - if self.TLSConfig != nil { - config = self.TLSConfig.Clone() + if s.TLSConfig != nil { + config = s.TLSConfig.Clone() } else { config = &tls.Config{} } @@ -142,24 +142,24 @@ func (self *Server) ServeTLS(listener net.Listener, certFile, keyFile string) er listener = tls.NewListener(listener, config) - return self.Serve(listener) + return s.Serve(listener) } -func (self *Server) Serve(listener net.Listener) error { - self.doneChan = make(chan struct{}) +func (s *Server) Serve(listener net.Listener) error { + s.doneChan = make(chan struct{}) - self.listener = listener - defer self.listener.Close() + s.listener = listener + defer s.listener.Close() if Debug { - fmt.Println("rtmp: server: listening on", self.listener.Addr().String()) + fmt.Println("rtmp: server: listening on", s.listener.Addr().String()) } for { - netconn, err := self.listener.Accept() + netconn, err := s.listener.Accept() if err != nil { select { - case <-self.doneChan: + case <-s.doneChan: return ErrServerClosed default: } @@ -174,7 +174,7 @@ func (self *Server) Serve(listener net.Listener) error { conn := NewConn(netconn) conn.isserver = true go func() { - err := self.handleConn(conn) + err := s.handleConn(conn) if Debug { fmt.Println("rtmp: server: client closed err:", err) } @@ -183,15 +183,15 @@ func (self *Server) Serve(listener net.Listener) error { } } -func (self *Server) Close() { - if self.listener == nil { +func (s *Server) Close() { + if s.listener == nil { return } - close(self.doneChan) + close(s.doneChan) - self.listener.Close() - self.listener = nil + s.listener.Close() + s.listener = nil } const ( @@ -212,9 +212,6 @@ type Conn struct { prober *flv.Prober streams []av.CodecData - txbytes uint64 - rxbytes uint64 - bufr *bufio.Reader bufw *bufio.Writer ackn uint32 @@ -261,15 +258,15 @@ type txrxcount struct { rxbytes uint64 } -func (self *txrxcount) Read(p []byte) (int, error) { - n, err := self.ReadWriter.Read(p) - self.rxbytes += uint64(n) +func (t *txrxcount) Read(p []byte) (int, error) { + n, err := t.ReadWriter.Read(p) + t.rxbytes += uint64(n) return n, err } -func (self *txrxcount) Write(p []byte) (int, error) { - n, err := self.ReadWriter.Write(p) - self.txbytes += uint64(n) +func (t *txrxcount) Write(p []byte) (int, error) { + n, err := t.ReadWriter.Write(p) + t.txbytes += uint64(n) return n, err } @@ -300,9 +297,9 @@ type chunkStream struct { msgdata []byte } -func (self *chunkStream) Start() { - self.msgdataleft = self.msgdatalen - self.msgdata = make([]byte, self.msgdatalen) +func (cs *chunkStream) Start() { + cs.msgdataleft = cs.msgdatalen + cs.msgdata = make([]byte, cs.msgdatalen) } const ( @@ -327,56 +324,56 @@ const ( eventtypePingResponse = 7 ) -func (self *Conn) NetConn() net.Conn { - return self.netconn +func (conn *Conn) NetConn() net.Conn { + return conn.netconn } -func (self *Conn) TxBytes() uint64 { - return self.txrxcount.txbytes +func (conn *Conn) TxBytes() uint64 { + return conn.txrxcount.txbytes } -func (self *Conn) RxBytes() uint64 { - return self.txrxcount.rxbytes +func (conn *Conn) RxBytes() uint64 { + return conn.txrxcount.rxbytes } -func (self *Conn) Close() (err error) { - return self.netconn.Close() +func (conn *Conn) Close() (err error) { + return conn.netconn.Close() } -func (self *Conn) pollCommand() (err error) { +func (conn *Conn) pollCommand() (err error) { for { - if err = self.pollMsg(); err != nil { + if err = conn.pollMsg(); err != nil { return } - if self.gotcommand { + if conn.gotcommand { return } } } -func (self *Conn) pollAVTag() (tag flvio.Tag, err error) { +func (conn *Conn) pollAVTag() (tag flvio.Tag, err error) { for { - if err = self.pollMsg(); err != nil { + if err = conn.pollMsg(); err != nil { return } - switch self.msgtypeid { + switch conn.msgtypeid { case msgtypeidVideoMsg, msgtypeidAudioMsg: - tag = self.avtag + tag = conn.avtag return } } } -func (self *Conn) pollMsg() (err error) { - self.gotmsg = false - self.gotcommand = false - self.datamsgvals = nil - self.avtag = flvio.Tag{} +func (conn *Conn) pollMsg() (err error) { + conn.gotmsg = false + conn.gotcommand = false + conn.datamsgvals = nil + conn.avtag = flvio.Tag{} for { - if err = self.readChunk(); err != nil { + if err = conn.readChunk(); err != nil { return } - if self.gotmsg { + if conn.gotmsg { return } } @@ -431,62 +428,64 @@ func createURL(tcurl, app, play string) (*url.URL, error) { var CodecTypes = flv.CodecTypes -func (self *Conn) writeBasicConf() (err error) { +func (conn *Conn) writeBasicConf() (err error) { // > SetChunkSize - if err = self.writeSetChunkSize(1024 * 1024 * 1); err != nil { + if err = conn.writeSetChunkSize(1024 * 1024 * 1); err != nil { return } // > WindowAckSize - if err = self.writeWindowAckSize(1024 * 1024 * 3); err != nil { + if err = conn.writeWindowAckSize(1024 * 1024 * 3); err != nil { return } // > SetPeerBandwidth - if err = self.writeSetPeerBandwidth(1024*1024*3, 0); err != nil { + if err = conn.writeSetPeerBandwidth(1024*1024*3, 0); err != nil { return } return } -func (self *Conn) readConnect() (err error) { +func (conn *Conn) readConnect() (err error) { var connectpath string // < connect("app") - if err = self.pollCommand(); err != nil { + if err = conn.pollCommand(); err != nil { return } - if self.commandname != "connect" { + if conn.commandname != "connect" { err = fmt.Errorf("first command is not connect") return } - if self.commandobj == nil { + if conn.commandobj == nil { err = fmt.Errorf("connect command params invalid") return } + //fmt.Printf("readConnect: %+v\n", self.commandobj) + var ok bool var _app, _tcurl interface{} - if _app, ok = self.commandobj["app"]; !ok { + if _app, ok = conn.commandobj["app"]; !ok { err = fmt.Errorf("the `connect` params missing `app`") return } connectpath, _ = _app.(string) var tcurl string - if _tcurl, ok = self.commandobj["tcUrl"]; !ok { - _tcurl, ok = self.commandobj["tcurl"] + if _tcurl, ok = conn.commandobj["tcUrl"]; !ok { + _tcurl, ok = conn.commandobj["tcurl"] } if ok { tcurl, _ = _tcurl.(string) } - connectparams := self.commandobj + connectparams := conn.commandobj - if err = self.writeBasicConf(); err != nil { + if err = conn.writeBasicConf(); err != nil { return } // > _result("NetConnection.Connect.Success") - if err = self.writeCommandMsg(3, 0, "_result", self.commandtransid, + if err = conn.writeCommandMsg(3, 0, "_result", conn.commandtransid, flvio.AMFMap{ "fmtVer": "FMS/3,0,1,123", "capabilities": 31, @@ -501,25 +500,25 @@ func (self *Conn) readConnect() (err error) { return } - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } for { - if err = self.pollMsg(); err != nil { + if err = conn.pollMsg(); err != nil { return } - if self.gotcommand { - switch self.commandname { + if conn.gotcommand { + switch conn.commandname { // < createStream case "createStream": - self.avmsgsid = uint32(1) + conn.avmsgsid = uint32(1) // > _result(streamid) - if err = self.writeCommandMsg(3, 0, "_result", self.commandtransid, nil, self.avmsgsid); err != nil { + if err = conn.writeCommandMsg(3, 0, "_result", conn.commandtransid, nil, conn.avmsgsid); err != nil { return } - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } @@ -529,20 +528,20 @@ func (self *Conn) readConnect() (err error) { fmt.Println("rtmp: < publish") } - if len(self.commandparams) < 1 { + if len(conn.commandparams) < 1 { err = fmt.Errorf("publish params invalid") return } - publishpath, _ := self.commandparams[0].(string) + publishpath, _ := conn.commandparams[0].(string) var cberr error - if self.OnPlayOrPublish != nil { - cberr = self.OnPlayOrPublish(self.commandname, connectparams) + if conn.OnPlayOrPublish != nil { + cberr = conn.OnPlayOrPublish(conn.commandname, connectparams) } // > onStatus() - if err = self.writeCommandMsg(5, self.avmsgsid, - "onStatus", self.commandtransid, nil, + if err = conn.writeCommandMsg(5, conn.avmsgsid, + "onStatus", conn.commandtransid, nil, flvio.AMFMap{ "level": "status", "code": "NetStream.Publish.Start", @@ -551,7 +550,7 @@ func (self *Conn) readConnect() (err error) { ); err != nil { return } - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } @@ -566,10 +565,10 @@ func (self *Conn) readConnect() (err error) { return } - self.URL = u - self.publishing = true - self.reading = true - self.stage++ + conn.URL = u + conn.publishing = true + conn.reading = true + conn.stage++ return // < play("path") @@ -578,20 +577,20 @@ func (self *Conn) readConnect() (err error) { fmt.Println("rtmp: < play") } - if len(self.commandparams) < 1 { + if len(conn.commandparams) < 1 { err = fmt.Errorf("command play params invalid") return } - playpath, _ := self.commandparams[0].(string) + playpath, _ := conn.commandparams[0].(string) // > streamBegin(streamid) - if err = self.writeStreamBegin(self.avmsgsid); err != nil { + if err = conn.writeStreamBegin(conn.avmsgsid); err != nil { return } // > onStatus() - if err = self.writeCommandMsg(5, self.avmsgsid, - "onStatus", self.commandtransid, nil, + if err = conn.writeCommandMsg(5, conn.avmsgsid, + "onStatus", conn.commandtransid, nil, flvio.AMFMap{ "level": "status", "code": "NetStream.Play.Start", @@ -608,7 +607,7 @@ func (self *Conn) readConnect() (err error) { // return //} - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } @@ -618,10 +617,10 @@ func (self *Conn) readConnect() (err error) { return } - self.URL = u - self.playing = true - self.writing = true - self.stage++ + conn.URL = u + conn.playing = true + conn.writing = true + conn.stage++ return } @@ -629,19 +628,19 @@ func (self *Conn) readConnect() (err error) { } } -func (self *Conn) checkConnectResult() (ok bool, errmsg string) { - if len(self.commandparams) < 1 { +func (conn *Conn) checkConnectResult() (ok bool, errmsg string) { + if len(conn.commandparams) < 1 { errmsg = "params length < 1" return } - obj, _ := self.commandparams[0].(flvio.AMFMap) + obj, _ := conn.commandparams[0].(flvio.AMFMap) if obj == nil { errmsg = "params[0] not object" return } - _code, _ := obj["code"] + _code := obj["code"] if _code == nil { errmsg = "code invalid" return @@ -657,73 +656,76 @@ func (self *Conn) checkConnectResult() (ok bool, errmsg string) { return } -func (self *Conn) checkCreateStreamResult() (ok bool, avmsgsid uint32) { - if len(self.commandparams) < 1 { +func (conn *Conn) checkCreateStreamResult() (ok bool, avmsgsid uint32) { + if len(conn.commandparams) < 1 { return } ok = true - _avmsgsid, _ := self.commandparams[0].(float64) + _avmsgsid, _ := conn.commandparams[0].(float64) avmsgsid = uint32(_avmsgsid) return } -func (self *Conn) probe() (err error) { - for !self.prober.Probed() { +func (conn *Conn) probe() (err error) { + for !conn.prober.Probed() { var tag flvio.Tag - if tag, err = self.pollAVTag(); err != nil { + if tag, err = conn.pollAVTag(); err != nil { return } - if err = self.prober.PushTag(tag, int32(self.timestamp)); err != nil { + if err = conn.prober.PushTag(tag, int32(conn.timestamp)); err != nil { if Debug { fmt.Printf("rtmp: error probing tag: %s\n", err.Error()) } } } - self.streams = self.prober.Streams - self.stage++ + conn.streams = conn.prober.Streams + conn.stage++ return } -func (self *Conn) writeConnect(path string) (err error) { - if err = self.writeBasicConf(); err != nil { +func (conn *Conn) writeConnect(path string) (err error) { + if err = conn.writeBasicConf(); err != nil { return } + fmt.Printf("writeConnect: app: %s\n", path) + // > connect("app") if Debug { - fmt.Printf("rtmp: > connect('%s') host=%s\n", path, self.URL.Host) + fmt.Printf("rtmp: > connect('%s') host=%s\n", path, conn.URL.Host) } - if err = self.writeCommandMsg(3, 0, "connect", 1, + if err = conn.writeCommandMsg(3, 0, "connect", 1, flvio.AMFMap{ "app": path, "flashVer": "MAC 22,0,0,192", - "tcUrl": getTcUrl(self.URL), + "tcUrl": getTcUrl(conn.URL), "fpad": false, "capabilities": 15, "audioCodecs": 4071, "videoCodecs": 252, "videoFunction": 1, + "fourCcList": flvio.AMFArray{"av01", "vp09", "hvc1"}, }, ); err != nil { return } - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } for { - if err = self.pollMsg(); err != nil { + if err = conn.pollMsg(); err != nil { return } - if self.gotcommand { + if conn.gotcommand { // < _result("NetConnection.Connect.Success") - if self.commandname == "_result" { + if conn.commandname == "_result" { var ok bool var errmsg string - if ok, errmsg = self.checkConnectResult(); !ok { + if ok, errmsg = conn.checkConnectResult(); !ok { err = fmt.Errorf("command connect failed: %s", errmsg) return } @@ -733,9 +735,9 @@ func (self *Conn) writeConnect(path string) (err error) { break } } else { - if self.msgtypeid == msgtypeidWindowAckSize { - if len(self.msgdata) == 4 { - self.readAckSize = pio.U32BE(self.msgdata) + if conn.msgtypeid == msgtypeidWindowAckSize { + if len(conn.msgdata) == 4 { + conn.readAckSize = pio.U32BE(conn.msgdata) } //if err = self.writeWindowAckSize(0xffffffff); err != nil { // return @@ -747,10 +749,10 @@ func (self *Conn) writeConnect(path string) (err error) { return } -func (self *Conn) connectPublish() (err error) { - connectpath, publishpath := SplitPath(self.URL) +func (conn *Conn) connectPublish() (err error) { + connectpath, publishpath := SplitPath(conn.URL) - if err = self.writeConnect(connectpath); err != nil { + if err = conn.writeConnect(connectpath); err != nil { return } @@ -760,24 +762,24 @@ func (self *Conn) connectPublish() (err error) { if Debug { fmt.Printf("rtmp: > createStream()\n") } - if err = self.writeCommandMsg(3, 0, "createStream", transid, nil); err != nil { + if err = conn.writeCommandMsg(3, 0, "createStream", transid, nil); err != nil { return } transid++ - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } for { - if err = self.pollMsg(); err != nil { + if err = conn.pollMsg(); err != nil { return } - if self.gotcommand { + if conn.gotcommand { // < _result(avmsgsid) of createStream - if self.commandname == "_result" { + if conn.commandname == "_result" { var ok bool - if ok, self.avmsgsid = self.checkCreateStreamResult(); !ok { + if ok, conn.avmsgsid = conn.checkCreateStreamResult(); !ok { err = fmt.Errorf("createStream command failed") return } @@ -790,25 +792,25 @@ func (self *Conn) connectPublish() (err error) { if Debug { fmt.Printf("rtmp: > publish('%s')\n", publishpath) } - if err = self.writeCommandMsg(8, self.avmsgsid, "publish", transid, nil, publishpath); err != nil { + if err = conn.writeCommandMsg(8, conn.avmsgsid, "publish", transid, nil, publishpath); err != nil { return } transid++ - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } - self.writing = true - self.publishing = true - self.stage++ + conn.writing = true + conn.publishing = true + conn.stage++ return } -func (self *Conn) connectPlay() (err error) { - connectpath, playpath := SplitPath(self.URL) +func (conn *Conn) connectPlay() (err error) { + connectpath, playpath := SplitPath(conn.URL) - if err = self.writeConnect(connectpath); err != nil { + if err = conn.writeConnect(connectpath); err != nil { return } @@ -816,28 +818,28 @@ func (self *Conn) connectPlay() (err error) { if Debug { fmt.Printf("rtmp: > createStream()\n") } - if err = self.writeCommandMsg(3, 0, "createStream", 2, nil); err != nil { + if err = conn.writeCommandMsg(3, 0, "createStream", 2, nil); err != nil { return } // > SetBufferLength 0,100ms - if err = self.writeSetBufferLength(0, 100); err != nil { + if err = conn.writeSetBufferLength(0, 100); err != nil { return } - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } for { - if err = self.pollMsg(); err != nil { + if err = conn.pollMsg(); err != nil { return } - if self.gotcommand { + if conn.gotcommand { // < _result(avmsgsid) of createStream - if self.commandname == "_result" { + if conn.commandname == "_result" { var ok bool - if ok, self.avmsgsid = self.checkCreateStreamResult(); !ok { + if ok, conn.avmsgsid = conn.checkCreateStreamResult(); !ok { err = fmt.Errorf("createStream command failed") return } @@ -850,72 +852,72 @@ func (self *Conn) connectPlay() (err error) { if Debug { fmt.Printf("rtmp: > play('%s')\n", playpath) } - if err = self.writeCommandMsg(8, self.avmsgsid, "play", 0, nil, playpath); err != nil { + if err = conn.writeCommandMsg(8, conn.avmsgsid, "play", 0, nil, playpath); err != nil { return } - if err = self.flushWrite(); err != nil { + if err = conn.flushWrite(); err != nil { return } - self.reading = true - self.playing = true - self.stage++ + conn.reading = true + conn.playing = true + conn.stage++ return } -func (self *Conn) ReadPacket() (pkt av.Packet, err error) { - if err = self.prepare(stageCodecDataDone, prepareReading); err != nil { +func (conn *Conn) ReadPacket() (pkt av.Packet, err error) { + if err = conn.prepare(stageCodecDataDone, prepareReading); err != nil { return } - if !self.prober.Empty() { - pkt = self.prober.PopPacket() + if !conn.prober.Empty() { + pkt = conn.prober.PopPacket() return } for { var tag flvio.Tag - if tag, err = self.pollAVTag(); err != nil { + if tag, err = conn.pollAVTag(); err != nil { return } var ok bool - if pkt, ok = self.prober.TagToPacket(tag, int32(self.timestamp)); ok { + if pkt, ok = conn.prober.TagToPacket(tag, int32(conn.timestamp)); ok { return pkt, nil } } } -func (self *Conn) Prepare() (err error) { - return self.prepare(stageCommandDone, 0) +func (conn *Conn) Prepare() (err error) { + return conn.prepare(stageCommandDone, 0) } -func (self *Conn) prepare(stage int, flags int) (err error) { - for self.stage < stage { - switch self.stage { +func (conn *Conn) prepare(stage int, flags int) (err error) { + for conn.stage < stage { + switch conn.stage { case 0: - if self.isserver { - if err = self.handshakeServer(); err != nil { + if conn.isserver { + if err = conn.handshakeServer(); err != nil { return } } else { - if err = self.handshakeClient(); err != nil { + if err = conn.handshakeClient(); err != nil { return } } case stageHandshakeDone: - if self.isserver { - if err = self.readConnect(); err != nil { + if conn.isserver { + if err = conn.readConnect(); err != nil { return } } else { if flags == prepareReading { - if err = self.connectPlay(); err != nil { + if err = conn.connectPlay(); err != nil { return } } else { - if err = self.connectPublish(); err != nil { + if err = conn.connectPublish(); err != nil { return } } @@ -923,7 +925,7 @@ func (self *Conn) prepare(stage int, flags int) (err error) { case stageCommandDone: if flags == prepareReading { - if err = self.probe(); err != nil { + if err = conn.probe(); err != nil { return } } else { @@ -935,56 +937,56 @@ func (self *Conn) prepare(stage int, flags int) (err error) { return } -func (self *Conn) Streams() (streams []av.CodecData, err error) { - if err = self.prepare(stageCodecDataDone, prepareReading); err != nil { +func (conn *Conn) Streams() (streams []av.CodecData, err error) { + if err = conn.prepare(stageCodecDataDone, prepareReading); err != nil { return } - streams = self.streams + streams = conn.streams return } -func (self *Conn) WritePacket(pkt av.Packet) (err error) { - if err = self.prepare(stageCodecDataDone, prepareWriting); err != nil { +func (conn *Conn) WritePacket(pkt av.Packet) (err error) { + if err = conn.prepare(stageCodecDataDone, prepareWriting); err != nil { return } - stream := self.streams[pkt.Idx] + stream := conn.streams[pkt.Idx] tag, timestamp := flv.PacketToTag(pkt, stream) if Debug { fmt.Println("rtmp: WritePacket", pkt.Idx, pkt.Time, pkt.CompositionTime) } - if err = self.writeAVTag(tag, int32(timestamp)); err != nil { + if err = conn.writeAVTag(tag, int32(timestamp)); err != nil { return } return } -func (self *Conn) WriteTrailer() (err error) { - if err = self.flushWrite(); err != nil { +func (conn *Conn) WriteTrailer() (err error) { + if err = conn.flushWrite(); err != nil { return } return } -func (self *Conn) SetMetaData(data flvio.AMFMap) { - self.metadata = data +func (conn *Conn) SetMetaData(data flvio.AMFMap) { + conn.metadata = data } -func (self *Conn) GetMetaData() flvio.AMFMap { - return self.metadata +func (conn *Conn) GetMetaData() flvio.AMFMap { + return conn.metadata } -func (self *Conn) WriteHeader(streams []av.CodecData) (err error) { - if err = self.prepare(stageCommandDone, prepareWriting); err != nil { +func (conn *Conn) WriteHeader(streams []av.CodecData) (err error) { + if err = conn.prepare(stageCommandDone, prepareWriting); err != nil { return } var metadata flvio.AMFMap = nil - metadata = self.GetMetaData() + //metadata = self.GetMetaData() if metadata == nil { if metadata, err = flv.NewMetadataByStreams(streams); err != nil { @@ -993,7 +995,7 @@ func (self *Conn) WriteHeader(streams []av.CodecData) (err error) { } // > onMetaData() - if err = self.writeDataMsg(5, self.avmsgsid, "onMetaData", metadata); err != nil { + if err = conn.writeDataMsg(5, conn.avmsgsid, "onMetaData", metadata); err != nil { return } @@ -1006,88 +1008,88 @@ func (self *Conn) WriteHeader(streams []av.CodecData) (err error) { return } if ok { - if err = self.writeAVTag(tag, 0); err != nil { + if err = conn.writeAVTag(tag, 0); err != nil { return } } } - self.streams = streams - self.stage++ + conn.streams = streams + conn.stage++ return } -func (self *Conn) tmpwbuf(n int) []byte { - if len(self.writebuf) < n { - self.writebuf = make([]byte, n) +func (conn *Conn) tmpwbuf(n int) []byte { + if len(conn.writebuf) < n { + conn.writebuf = make([]byte, n) } - return self.writebuf + return conn.writebuf } -func (self *Conn) writeSetChunkSize(size int) (err error) { - self.writeMaxChunkSize = size - b := self.tmpwbuf(chunkHeaderLength + 4) - n := self.fillChunkHeader(b, 2, 0, msgtypeidSetChunkSize, 0, 4) +func (conn *Conn) writeSetChunkSize(size int) (err error) { + conn.writeMaxChunkSize = size + b := conn.tmpwbuf(chunkHeaderLength + 4) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidSetChunkSize, 0, 4) pio.PutU32BE(b[n:], uint32(size)) n += 4 - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writeAck(seqnum uint32) (err error) { - b := self.tmpwbuf(chunkHeaderLength + 4) - n := self.fillChunkHeader(b, 2, 0, msgtypeidAck, 0, 4) +func (conn *Conn) writeAck(seqnum uint32) (err error) { + b := conn.tmpwbuf(chunkHeaderLength + 4) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidAck, 0, 4) pio.PutU32BE(b[n:], seqnum) n += 4 - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writeWindowAckSize(size uint32) (err error) { - b := self.tmpwbuf(chunkHeaderLength + 4) - n := self.fillChunkHeader(b, 2, 0, msgtypeidWindowAckSize, 0, 4) +func (conn *Conn) writeWindowAckSize(size uint32) (err error) { + b := conn.tmpwbuf(chunkHeaderLength + 4) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidWindowAckSize, 0, 4) pio.PutU32BE(b[n:], size) n += 4 - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writeSetPeerBandwidth(acksize uint32, limittype uint8) (err error) { - b := self.tmpwbuf(chunkHeaderLength + 5) - n := self.fillChunkHeader(b, 2, 0, msgtypeidSetPeerBandwidth, 0, 5) +func (conn *Conn) writeSetPeerBandwidth(acksize uint32, limittype uint8) (err error) { + b := conn.tmpwbuf(chunkHeaderLength + 5) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidSetPeerBandwidth, 0, 5) pio.PutU32BE(b[n:], acksize) n += 4 b[n] = limittype n++ - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writeCommandMsg(csid, msgsid uint32, args ...interface{}) (err error) { - return self.writeAMF0Msg(msgtypeidCommandMsgAMF0, csid, msgsid, args...) +func (conn *Conn) writeCommandMsg(csid, msgsid uint32, args ...interface{}) (err error) { + return conn.writeAMF0Msg(msgtypeidCommandMsgAMF0, csid, msgsid, args...) } -func (self *Conn) writeDataMsg(csid, msgsid uint32, args ...interface{}) (err error) { - return self.writeAMF0Msg(msgtypeidDataMsgAMF0, csid, msgsid, args...) +func (conn *Conn) writeDataMsg(csid, msgsid uint32, args ...interface{}) (err error) { + return conn.writeAMF0Msg(msgtypeidDataMsgAMF0, csid, msgsid, args...) } -func (self *Conn) writeAMF0Msg(msgtypeid uint8, csid, msgsid uint32, args ...interface{}) (err error) { +func (conn *Conn) writeAMF0Msg(msgtypeid uint8, csid, msgsid uint32, args ...interface{}) (err error) { size := 0 for _, arg := range args { size += flvio.LenAMF0Val(arg) } - b := self.tmpwbuf(chunkHeaderLength + size) - n := self.fillChunkHeader(b, csid, 0, msgtypeid, msgsid, size) + b := conn.tmpwbuf(chunkHeaderLength + size) + n := conn.fillChunkHeader(b, csid, 0, msgtypeid, msgsid, size) for _, arg := range args { n += flvio.FillAMF0Val(b[n:], arg) } - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writeAVTag(tag flvio.Tag, ts int32) (err error) { +func (conn *Conn) writeAVTag(tag flvio.Tag, ts int32) (err error) { var msgtypeid uint8 var csid uint32 var data []byte @@ -1109,64 +1111,69 @@ func (self *Conn) writeAVTag(tag flvio.Tag, ts int32) (err error) { actualChunkHeaderLength += 4 } - b := self.tmpwbuf(actualChunkHeaderLength + flvio.MaxTagSubHeaderLength) + b := conn.tmpwbuf(actualChunkHeaderLength + flvio.MaxTagSubHeaderLength) hdrlen := tag.FillHeader(b[actualChunkHeaderLength:]) - self.fillChunkHeader(b, csid, ts, msgtypeid, self.avmsgsid, hdrlen+len(data)) + conn.fillChunkHeader(b, csid, ts, msgtypeid, conn.avmsgsid, hdrlen+len(data)) n := hdrlen + actualChunkHeaderLength - if n+len(data) > self.writeMaxChunkSize { - if err = self.writeSetChunkSize(n + len(data)); err != nil { + if n+len(data) > conn.writeMaxChunkSize { + if err = conn.writeSetChunkSize(n + len(data)); err != nil { return } } - if _, err = self.bufw.Write(b[:n]); err != nil { + if _, err = conn.bufw.Write(b[:n]); err != nil { return } - _, err = self.bufw.Write(data) - err = self.bufw.Flush() + + if _, err = conn.bufw.Write(data); err != nil { + return + } + + err = conn.bufw.Flush() + return } -func (self *Conn) writeStreamBegin(msgsid uint32) (err error) { - b := self.tmpwbuf(chunkHeaderLength + 6) - n := self.fillChunkHeader(b, 2, 0, msgtypeidUserControl, 0, 6) +func (conn *Conn) writeStreamBegin(msgsid uint32) (err error) { + b := conn.tmpwbuf(chunkHeaderLength + 6) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidUserControl, 0, 6) pio.PutU16BE(b[n:], eventtypeStreamBegin) n += 2 pio.PutU32BE(b[n:], msgsid) n += 4 - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writeSetBufferLength(msgsid uint32, timestamp uint32) (err error) { - b := self.tmpwbuf(chunkHeaderLength + 10) - n := self.fillChunkHeader(b, 2, 0, msgtypeidUserControl, 0, 10) +func (conn *Conn) writeSetBufferLength(msgsid uint32, timestamp uint32) (err error) { + b := conn.tmpwbuf(chunkHeaderLength + 10) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidUserControl, 0, 10) pio.PutU16BE(b[n:], eventtypeSetBufferLength) n += 2 pio.PutU32BE(b[n:], msgsid) n += 4 pio.PutU32BE(b[n:], timestamp) n += 4 - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } -func (self *Conn) writePingResponse(timestamp uint32) (err error) { - b := self.tmpwbuf(chunkHeaderLength + 10) - n := self.fillChunkHeader(b, 2, 0, msgtypeidUserControl, 0, 6) +func (conn *Conn) writePingResponse(timestamp uint32) (err error) { + b := conn.tmpwbuf(chunkHeaderLength + 10) + n := conn.fillChunkHeader(b, 2, 0, msgtypeidUserControl, 0, 6) pio.PutU16BE(b[n:], eventtypePingResponse) n += 2 pio.PutU32BE(b[n:], timestamp) n += 4 - _, err = self.bufw.Write(b[:n]) + _, err = conn.bufw.Write(b[:n]) return } const chunkHeaderLength = 12 const FlvTimestampMax = 0xFFFFFF -func (self *Conn) fillChunkHeader(b []byte, csid uint32, timestamp int32, msgtypeid uint8, msgsid uint32, msgdatalen int) (n int) { +func (conn *Conn) fillChunkHeader(b []byte, csid uint32, timestamp int32, msgtypeid uint8, msgsid uint32, msgdatalen int) (n int) { // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -1206,17 +1213,17 @@ func (self *Conn) fillChunkHeader(b []byte, csid uint32, timestamp int32, msgtyp return } -func (self *Conn) flushWrite() (err error) { - if err = self.bufw.Flush(); err != nil { +func (conn *Conn) flushWrite() (err error) { + if err = conn.bufw.Flush(); err != nil { return } return } -func (self *Conn) readChunk() (err error) { - b := self.readbuf +func (conn *Conn) readChunk() (err error) { + b := conn.readbuf n := 0 - if _, err = io.ReadFull(self.bufr, b[:1]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:1]); err != nil { return } header := b[0] @@ -1231,23 +1238,23 @@ func (self *Conn) readChunk() (err error) { switch csid { default: // Chunk basic header 1 case 0: // Chunk basic header 2 - if _, err = io.ReadFull(self.bufr, b[:1]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:1]); err != nil { return fmt.Errorf("chunk basic header 2: %w", err) } n += 1 csid = uint32(b[0]) + 64 case 1: // Chunk basic header 3 - if _, err = io.ReadFull(self.bufr, b[:2]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:2]); err != nil { return fmt.Errorf("chunk basic header 3: %w", err) } n += 2 csid = uint32(pio.U16BE(b)) + 64 } - cs := self.readcsmap[csid] + cs := conn.readcsmap[csid] if cs == nil { cs = &chunkStream{} - self.readcsmap[csid] = cs + conn.readcsmap[csid] = cs } var timestamp uint32 @@ -1270,7 +1277,7 @@ func (self *Conn) readChunk() (err error) { return } h := b[:11] - if _, err = io.ReadFull(self.bufr, h); err != nil { + if _, err = io.ReadFull(conn.bufr, h); err != nil { return } n += len(h) @@ -1280,7 +1287,7 @@ func (self *Conn) readChunk() (err error) { cs.msgtypeid = h[6] cs.msgsid = pio.U32LE(h[7:11]) if timestamp == 0xffffff { - if _, err = io.ReadFull(self.bufr, b[:4]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:4]); err != nil { return } n += 4 @@ -1307,7 +1314,7 @@ func (self *Conn) readChunk() (err error) { return } h := b[:7] - if _, err = io.ReadFull(self.bufr, h); err != nil { + if _, err = io.ReadFull(conn.bufr, h); err != nil { return } n += len(h) @@ -1316,7 +1323,7 @@ func (self *Conn) readChunk() (err error) { cs.msgdatalen = pio.U24BE(h[3:6]) cs.msgtypeid = h[6] if timestamp == 0xffffff { - if _, err = io.ReadFull(self.bufr, b[:4]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:4]); err != nil { return } n += 4 @@ -1342,14 +1349,14 @@ func (self *Conn) readChunk() (err error) { return } h := b[:3] - if _, err = io.ReadFull(self.bufr, h); err != nil { + if _, err = io.ReadFull(conn.bufr, h); err != nil { return } n += len(h) cs.msghdrtype = msghdrtype timestamp = pio.U24BE(h[0:3]) if timestamp == 0xffffff { - if _, err = io.ReadFull(self.bufr, b[:4]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:4]); err != nil { return } n += 4 @@ -1367,7 +1374,7 @@ func (self *Conn) readChunk() (err error) { switch cs.msghdrtype { case 0: if cs.hastimeext { - if _, err = io.ReadFull(self.bufr, b[:4]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:4]); err != nil { return } n += 4 @@ -1376,7 +1383,7 @@ func (self *Conn) readChunk() (err error) { } case 1, 2: if cs.hastimeext { - if _, err = io.ReadFull(self.bufr, b[:4]); err != nil { + if _, err = io.ReadFull(conn.bufr, b[:4]); err != nil { return } n += 4 @@ -1395,12 +1402,12 @@ func (self *Conn) readChunk() (err error) { } size := int(cs.msgdataleft) - if size > self.readMaxChunkSize { - size = self.readMaxChunkSize + if size > conn.readMaxChunkSize { + size = conn.readMaxChunkSize } off := cs.msgdatalen - cs.msgdataleft buf := cs.msgdata[off : int(off)+size] - if _, err = io.ReadFull(self.bufr, buf); err != nil { + if _, err = io.ReadFull(conn.bufr, buf); err != nil { return } n += len(buf) @@ -1417,25 +1424,25 @@ func (self *Conn) readChunk() (err error) { fmt.Print(hex.Dump(cs.msgdata)) } - if err = self.handleMsg(cs.timenow, cs.msgsid, cs.msgtypeid, cs.msgdata); err != nil { + if err = conn.handleMsg(cs.timenow, cs.msgsid, cs.msgtypeid, cs.msgdata); err != nil { return fmt.Errorf("handleMsg: %w", err) } } - self.ackn += uint32(n) + conn.ackn += uint32(n) - if self.readAckSize != 0 && self.ackn > self.readAckSize { - if err = self.writeAck(self.ackn); err != nil { + if conn.readAckSize != 0 && conn.ackn > conn.readAckSize { + if err = conn.writeAck(conn.ackn); err != nil { return fmt.Errorf("writeACK: %w", err) } - self.flushWrite() - self.ackn = 0 + conn.flushWrite() + conn.ackn = 0 } return } -func (self *Conn) handleCommandMsgAMF0(b []byte) (n int, err error) { +func (conn *Conn) handleCommandMsgAMF0(b []byte) (n int, err error) { var name, transid, obj interface{} var size int @@ -1453,38 +1460,38 @@ func (self *Conn) handleCommandMsgAMF0(b []byte) (n int, err error) { n += size var ok bool - if self.commandname, ok = name.(string); !ok { + if conn.commandname, ok = name.(string); !ok { err = fmt.Errorf("CommandMsgAMF0 command is not string") return } - self.commandtransid, _ = transid.(float64) - self.commandobj, _ = obj.(flvio.AMFMap) - self.commandparams = []interface{}{} + conn.commandtransid, _ = transid.(float64) + conn.commandobj, _ = obj.(flvio.AMFMap) + conn.commandparams = []interface{}{} for n < len(b) { if obj, size, err = flvio.ParseAMF0Val(b[n:]); err != nil { return } n += size - self.commandparams = append(self.commandparams, obj) + conn.commandparams = append(conn.commandparams, obj) } if n < len(b) { err = fmt.Errorf("CommandMsgAMF0 left bytes=%d", len(b)-n) return } - self.gotcommand = true + conn.gotcommand = true return } -func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, msgdata []byte) (err error) { - self.msgdata = msgdata - self.msgtypeid = msgtypeid - self.timestamp = timestamp +func (conn *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, msgdata []byte) (err error) { + conn.msgdata = msgdata + conn.msgtypeid = msgtypeid + conn.timestamp = timestamp switch msgtypeid { case msgtypeidCommandMsgAMF0: - if _, err = self.handleCommandMsgAMF0(msgdata); err != nil { + if _, err = conn.handleCommandMsgAMF0(msgdata); err != nil { return } @@ -1494,7 +1501,7 @@ func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, ms return } // skip first byte - if _, err = self.handleCommandMsgAMF0(msgdata[1:]); err != nil { + if _, err = conn.handleCommandMsgAMF0(msgdata[1:]); err != nil { return } @@ -1503,16 +1510,16 @@ func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, ms err = fmt.Errorf("short packet of UserControl") return } - self.eventtype = pio.U16BE(msgdata) + conn.eventtype = pio.U16BE(msgdata) - if self.eventtype == eventtypePingRequest { + if conn.eventtype == eventtypePingRequest { if len(msgdata) != 6 { err = fmt.Errorf("wrong length for UserControl.PingRequest") return } pingtimestamp := pio.U32BE(msgdata[2:]) - self.writePingResponse(pingtimestamp) - self.flushWrite() + conn.writePingResponse(pingtimestamp) + conn.flushWrite() } case msgtypeidDataMsgAMF0: @@ -1525,7 +1532,7 @@ func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, ms return } n += size - self.datamsgvals = append(self.datamsgvals, obj) + conn.datamsgvals = append(conn.datamsgvals, obj) } if n < len(b) { err = fmt.Errorf("DataMsgAMF0 left bytes=%d", len(b)-n) @@ -1536,33 +1543,37 @@ func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, ms metaindex := -1 - for i, x := range self.datamsgvals { - switch x.(type) { + for i, x := range conn.datamsgvals { + switch x := x.(type) { case string: - if x.(string) == "onMetaData" { + if x == "onMetaData" { metaindex = i + 1 } } } - if metaindex != -1 && metaindex < len(self.datamsgvals) { - self.metadata = self.datamsgvals[metaindex].(flvio.AMFMap) + if metaindex != -1 && metaindex < len(conn.datamsgvals) { + conn.metadata = conn.datamsgvals[metaindex].(flvio.AMFMap) + //fmt.Printf("onMetadata: %+v\n", self.metadata) + //fmt.Printf("videocodecid: %#08x (%f)\n", int64(self.metadata["videocodecid"].(float64)), self.metadata["videocodecid"].(float64)) } case msgtypeidVideoMsg: if len(msgdata) == 0 { return } + //fmt.Printf("msgdata: %#08x\n", msgdata[:5]) tag := flvio.Tag{Type: flvio.TAG_VIDEO} var n int if n, err = (&tag).ParseHeader(msgdata); err != nil { return } + //fmt.Printf("tag: %+v\n", tag) if !(tag.FrameType == flvio.FRAME_INTER || tag.FrameType == flvio.FRAME_KEY) { return } tag.Data = msgdata[n:] - self.avtag = tag + conn.avtag = tag case msgtypeidAudioMsg: if len(msgdata) == 0 { @@ -1574,20 +1585,20 @@ func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, ms return } tag.Data = msgdata[n:] - self.avtag = tag + conn.avtag = tag case msgtypeidSetChunkSize: if len(msgdata) < 4 { err = fmt.Errorf("short packet of SetChunkSize") return } - self.readMaxChunkSize = int(pio.U32BE(msgdata)) + conn.readMaxChunkSize = int(pio.U32BE(msgdata)) return case msgtypeidWindowAckSize: - if len(self.msgdata) != 4 { + if len(conn.msgdata) != 4 { return fmt.Errorf("invalid packet of WindowAckSize") } - self.readAckSize = pio.U32BE(self.msgdata) + conn.readAckSize = pio.U32BE(conn.msgdata) return default: if Debug { @@ -1595,7 +1606,7 @@ func (self *Conn) handleMsg(timestamp uint32, msgsid uint32, msgtypeid uint8, ms } } - self.gotmsg = true + conn.gotmsg = true return } @@ -1643,7 +1654,7 @@ func hsCalcDigestPos(p []byte, base int) (pos int) { func hsFindDigest(p []byte, key []byte, base int) int { gap := hsCalcDigestPos(p, base) digest := hsMakeDigest(key, p, gap) - if bytes.Compare(p[gap:gap+32], digest) != 0 { + if !bytes.Equal(p[gap:gap+32], digest) { return -1 } return gap @@ -1679,14 +1690,14 @@ func hsCreate2(p []byte, key []byte) { copy(p[gap:], digest) } -func (self *Conn) handshakeClient() (err error) { +func (conn *Conn) handshakeClient() (err error) { var random [(1 + 1536*2) * 2]byte C0C1C2 := random[:1536*2+1] C0 := C0C1C2[:1] //C1 := C0C1C2[1:1536+1] C0C1 := C0C1C2[:1536+1] - C2 := C0C1C2[1536+1:] + var C2 []byte S0S1S2 := random[1536*2+1:] //S0 := S0S1S2[:1] @@ -1698,15 +1709,15 @@ func (self *Conn) handshakeClient() (err error) { //hsCreate01(C0C1, hsClientFullKey) // > C0C1 - if _, err = self.bufw.Write(C0C1); err != nil { + if _, err = conn.bufw.Write(C0C1); err != nil { return } - if err = self.bufw.Flush(); err != nil { + if err = conn.bufw.Flush(); err != nil { return } // < S0S1S2 - if _, err = io.ReadFull(self.bufr, S0S1S2); err != nil { + if _, err = io.ReadFull(conn.bufr, S0S1S2); err != nil { return } @@ -1721,15 +1732,15 @@ func (self *Conn) handshakeClient() (err error) { } // > C2 - if _, err = self.bufw.Write(C2); err != nil { + if _, err = conn.bufw.Write(C2); err != nil { return } - self.stage++ + conn.stage++ return } -func (self *Conn) handshakeServer() (err error) { +func (conn *Conn) handshakeServer() (err error) { var random [(1 + 1536*2) * 2]byte C0C1C2 := random[:1536*2+1] @@ -1745,7 +1756,7 @@ func (self *Conn) handshakeServer() (err error) { S2 := S0S1S2[1536+1:] // < C0C1 - if _, err = io.ReadFull(self.bufr, C0C1); err != nil { + if _, err = io.ReadFull(conn.bufr, C0C1); err != nil { return } if C0[0] != 3 { @@ -1775,19 +1786,19 @@ func (self *Conn) handshakeServer() (err error) { } // > S0S1S2 - if _, err = self.bufw.Write(S0S1S2); err != nil { + if _, err = conn.bufw.Write(S0S1S2); err != nil { return } - if err = self.bufw.Flush(); err != nil { + if err = conn.bufw.Flush(); err != nil { return } // < C2 - if _, err = io.ReadFull(self.bufr, C2); err != nil { + if _, err = io.ReadFull(conn.bufr, C2); err != nil { return } - self.stage++ + conn.stage++ return } @@ -1796,8 +1807,8 @@ type closeConn struct { waitclose chan bool } -func (self closeConn) Close() error { - self.waitclose <- true +func (cc closeConn) Close() error { + cc.waitclose <- true return nil } diff --git a/vendor/github.com/datarhei/joy4/utils/bits/golomb_reader.go b/vendor/github.com/datarhei/joy4/utils/bits/golomb_reader.go index da57cb2f..b40978be 100644 --- a/vendor/github.com/datarhei/joy4/utils/bits/golomb_reader.go +++ b/vendor/github.com/datarhei/joy4/utils/bits/golomb_reader.go @@ -33,6 +33,30 @@ func (self *GolombBitReader) ReadBits(n int) (res uint, err error) { return } +func (self *GolombBitReader) ReadBits32(n uint) (r uint32, err error) { + var t uint + for i := uint(0); i < n; i++ { + t, err = self.ReadBit() + if err != nil { + return + } + r = (r << 1) | uint32(t) + } + return +} + +func (self *GolombBitReader) ReadBits64(n uint) (r uint64, err error) { + var t uint + for i := uint(0); i < n; i++ { + t, err = self.ReadBit() + if err != nil { + return + } + r = (r << 1) | uint64(t) + } + return +} + func (self *GolombBitReader) ReadExponentialGolombCode() (res uint, err error) { i := 0 for { diff --git a/vendor/github.com/gabriel-vasile/mimetype/README.md b/vendor/github.com/gabriel-vasile/mimetype/README.md index d310928d..231b2919 100644 --- a/vendor/github.com/gabriel-vasile/mimetype/README.md +++ b/vendor/github.com/gabriel-vasile/mimetype/README.md @@ -10,9 +10,6 @@

    - - Build Status - Go Reference diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go index 29bdded3..f1e94498 100644 --- a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go @@ -150,32 +150,34 @@ func Marc(raw []byte, limit uint32) bool { } // Glb matches a glTF model format file. -// GLB is the binary file format representation of 3D models save in +// GLB is the binary file format representation of 3D models saved in // the GL transmission Format (glTF). -// see more: https://docs.fileformat.com/3d/glb/ -// https://www.iana.org/assignments/media-types/model/gltf-binary -// GLB file format is based on little endian and its header structure -// show below: +// GLB uses little endian and its header structure is as follows: // -// <-- 12-byte header --> -// | magic | version | length | -// | (uint32) | (uint32) | (uint32) | -// | \x67\x6C\x54\x46 | \x01\x00\x00\x00 | ... | -// | g l T F | 1 | ... | +// <-- 12-byte header --> +// | magic | version | length | +// | (uint32) | (uint32) | (uint32) | +// | \x67\x6C\x54\x46 | \x01\x00\x00\x00 | ... | +// | g l T F | 1 | ... | +// +// Visit [glTF specification] and [IANA glTF entry] for more details. +// +// [glTF specification]: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html +// [IANA glTF entry]: https://www.iana.org/assignments/media-types/model/gltf-binary var Glb = prefix([]byte("\x67\x6C\x54\x46\x02\x00\x00\x00"), []byte("\x67\x6C\x54\x46\x01\x00\x00\x00")) // TzIf matches a Time Zone Information Format (TZif) file. // See more: https://tools.ietf.org/id/draft-murchison-tzdist-tzif-00.html#rfc.section.3 // Its header structure is shown below: -// +---------------+---+ -// | magic (4) | <-+-- version (1) -// +---------------+---+---------------------------------------+ -// | [unused - reserved for future use] (15) | -// +---------------+---------------+---------------+-----------+ -// | isutccnt (4) | isstdcnt (4) | leapcnt (4) | -// +---------------+---------------+---------------+ -// | timecnt (4) | typecnt (4) | charcnt (4) | +// +---------------+---+ +// | magic (4) | <-+-- version (1) +// +---------------+---+---------------------------------------+ +// | [unused - reserved for future use] (15) | +// +---------------+---------------+---------------+-----------+ +// | isutccnt (4) | isstdcnt (4) | leapcnt (4) | +// +---------------+---------------+---------------+ +// | timecnt (4) | typecnt (4) | charcnt (4) | func TzIf(raw []byte, limit uint32) bool { // File is at least 44 bytes (header size). if len(raw) < 44 { diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go index 466058fb..34b84f40 100644 --- a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go @@ -177,7 +177,9 @@ func newXMLSig(localName, xmlns string) xmlSig { // and, optionally, followed by the arguments for the interpreter. // // Ex: -// #! /usr/bin/env php +// +// #! /usr/bin/env php +// // /usr/bin/env is the interpreter, php is the first and only argument. func shebang(sigs ...[]byte) Detector { return func(raw []byte, limit uint32) bool { diff --git a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go index 6a156192..84ed6492 100644 --- a/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go +++ b/vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go @@ -3,6 +3,7 @@ package magic import ( "bytes" "encoding/csv" + "errors" "io" ) @@ -19,12 +20,23 @@ func Tsv(raw []byte, limit uint32) bool { func sv(in []byte, comma rune, limit uint32) bool { r := csv.NewReader(dropLastLine(in, limit)) r.Comma = comma - r.TrimLeadingSpace = true + r.ReuseRecord = true r.LazyQuotes = true r.Comment = '#' - lines, err := r.ReadAll() - return err == nil && r.FieldsPerRecord > 1 && len(lines) > 1 + lines := 0 + for { + _, err := r.Read() + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return false + } + lines++ + } + + return r.FieldsPerRecord > 1 && lines > 1 } // dropLastLine drops the last incomplete line from b. diff --git a/vendor/github.com/gabriel-vasile/mimetype/mimetype.go b/vendor/github.com/gabriel-vasile/mimetype/mimetype.go index 08e68e33..1b5909b7 100644 --- a/vendor/github.com/gabriel-vasile/mimetype/mimetype.go +++ b/vendor/github.com/gabriel-vasile/mimetype/mimetype.go @@ -39,7 +39,8 @@ func Detect(in []byte) *MIME { // // DetectReader assumes the reader offset is at the start. If the input is an // io.ReadSeeker you previously read from, it should be rewinded before detection: -// reader.Seek(0, io.SeekStart) +// +// reader.Seek(0, io.SeekStart) func DetectReader(r io.Reader) (*MIME, error) { var in []byte var err error diff --git a/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md b/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md index cdec4e67..5ec6f6b6 100644 --- a/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md +++ b/vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md @@ -1,4 +1,4 @@ -## 172 Supported MIME types +## 173 Supported MIME types This file is automatically generated when running tests. Do not edit manually. Extension | MIME type | Aliases diff --git a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml new file mode 100644 index 00000000..22f8d21c --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml @@ -0,0 +1,61 @@ +linters-settings: + govet: + check-shadowing: true + golint: + min-confidence: 0 + gocyclo: + min-complexity: 45 + maligned: + suggest-new: true + dupl: + threshold: 200 + goconst: + min-len: 2 + min-occurrences: 3 + +linters: + enable-all: true + disable: + - maligned + - unparam + - lll + - gochecknoinits + - gochecknoglobals + - funlen + - godox + - gocognit + - whitespace + - wsl + - wrapcheck + - testpackage + - nlreturn + - gomnd + - exhaustivestruct + - goerr113 + - errorlint + - nestif + - godot + - gofumpt + - paralleltest + - tparallel + - thelper + - ifshort + - exhaustruct + - varnamelen + - gci + - depguard + - errchkjson + - inamedparam + - nonamedreturns + - musttag + - ireturn + - forcetypeassert + - cyclop + # deprecated linters + - deadcode + - interfacer + - scopelint + - varcheck + - structcheck + - golint + - nosnakecase diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md index 813788af..0108f1d5 100644 --- a/vendor/github.com/go-openapi/jsonpointer/README.md +++ b/vendor/github.com/go-openapi/jsonpointer/README.md @@ -1,6 +1,10 @@ -# gojsonpointer [![Build Status](https://travis-ci.org/go-openapi/jsonpointer.svg?branch=master)](https://travis-ci.org/go-openapi/jsonpointer) [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) +# gojsonpointer [![Build Status](https://github.com/go-openapi/jsonpointer/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/jsonpointer/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) + +[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) +[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer.svg)](https://pkg.go.dev/github.com/go-openapi/jsonpointer) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/jsonpointer)](https://goreportcard.com/report/github.com/go-openapi/jsonpointer) -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonpointer?status.svg)](http://godoc.org/github.com/go-openapi/jsonpointer) An implementation of JSON Pointer - Go language ## Status diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go index de60dc7d..d975773d 100644 --- a/vendor/github.com/go-openapi/jsonpointer/pointer.go +++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -110,19 +110,39 @@ func SetForToken(document any, decodedToken string, value any) (any, error) { return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider) } +func isNil(input any) bool { + if input == nil { + return true + } + + kind := reflect.TypeOf(input).Kind() + switch kind { //nolint:exhaustive + case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Chan: + return reflect.ValueOf(input).IsNil() + default: + return false + } +} + func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvider) (any, reflect.Kind, error) { rValue := reflect.Indirect(reflect.ValueOf(node)) kind := rValue.Kind() + if isNil(node) { + return nil, kind, fmt.Errorf("nil value has not field %q", decodedToken) + } - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) + switch typed := node.(type) { + case JSONPointable: + r, err := typed.JSONLookup(decodedToken) if err != nil { return nil, kind, err } return r, kind, nil + case *any: // case of a pointer to interface, that is not resolved by reflect.Indirect + return getSingleImpl(*typed, decodedToken, nameProvider) } - switch kind { + switch kind { //nolint:exhaustive case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { @@ -170,7 +190,7 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP return node.(JSONSetable).JSONSet(decodedToken, data) } - switch rValue.Kind() { + switch rValue.Kind() { //nolint:exhaustive case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { @@ -231,8 +251,7 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K if err != nil { return nil, knd, err } - node, kind = r, knd - + node = r } rValue := reflect.ValueOf(node) @@ -284,7 +303,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error { continue } - switch kind { + switch kind { //nolint:exhaustive case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { @@ -405,11 +424,11 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) { case json.Delim: switch tk { case '{': - if err := drainSingle(dec); err != nil { + if err = drainSingle(dec); err != nil { return 0, err } case '[': - if err := drainSingle(dec); err != nil { + if err = drainSingle(dec); err != nil { return 0, err } } @@ -435,20 +454,21 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) { if err != nil { return 0, err } - switch tk := tk.(type) { - case json.Delim: - switch tk { + + if delim, isDelim := tk.(json.Delim); isDelim { + switch delim { case '{': - if err := drainSingle(dec); err != nil { + if err = drainSingle(dec); err != nil { return 0, err } case '[': - if err := drainSingle(dec); err != nil { + if err = drainSingle(dec); err != nil { return 0, err } } } } + if !dec.More() { return 0, fmt.Errorf("token reference %q not found", decodedToken) } @@ -456,27 +476,27 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) { } // drainSingle drains a single level of object or array. -// The decoder has to guarantee the begining delim (i.e. '{' or '[') has been consumed. +// The decoder has to guarantee the beginning delim (i.e. '{' or '[') has been consumed. func drainSingle(dec *json.Decoder) error { for dec.More() { tk, err := dec.Token() if err != nil { return err } - switch tk := tk.(type) { - case json.Delim: - switch tk { + if delim, isDelim := tk.(json.Delim); isDelim { + switch delim { case '{': - if err := drainSingle(dec); err != nil { + if err = drainSingle(dec); err != nil { return err } case '[': - if err := drainSingle(dec); err != nil { + if err = drainSingle(dec); err != nil { return err } } } } + // Consumes the ending delim if _, err := dec.Token(); err != nil { return err @@ -498,14 +518,14 @@ const ( // Unescape unescapes a json pointer reference token string to the original representation func Unescape(token string) string { - step1 := strings.Replace(token, encRefTok1, decRefTok1, -1) - step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1) + step1 := strings.ReplaceAll(token, encRefTok1, decRefTok1) + step2 := strings.ReplaceAll(step1, encRefTok0, decRefTok0) return step2 } // Escape escapes a pointer reference token string func Escape(token string) string { - step1 := strings.Replace(token, decRefTok0, encRefTok0, -1) - step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1) + step1 := strings.ReplaceAll(token, decRefTok0, encRefTok0) + step2 := strings.ReplaceAll(step1, decRefTok1, encRefTok1) return step2 } diff --git a/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/vendor/github.com/go-openapi/jsonreference/.golangci.yml index 013fc194..22f8d21c 100644 --- a/vendor/github.com/go-openapi/jsonreference/.golangci.yml +++ b/vendor/github.com/go-openapi/jsonreference/.golangci.yml @@ -1,50 +1,61 @@ linters-settings: govet: check-shadowing: true + golint: + min-confidence: 0 gocyclo: - min-complexity: 30 + min-complexity: 45 maligned: suggest-new: true dupl: - threshold: 100 + threshold: 200 goconst: min-len: 2 - min-occurrences: 4 - paralleltest: - ignore-missing: true + min-occurrences: 3 + linters: enable-all: true disable: - maligned + - unparam - lll + - gochecknoinits - gochecknoglobals + - funlen - godox - gocognit - whitespace - wsl - - funlen - - gochecknoglobals - - gochecknoinits - - scopelint - wrapcheck - - exhaustivestruct - - exhaustive - - nlreturn - testpackage - - gci - - gofumpt - - goerr113 + - nlreturn - gomnd - - tparallel + - exhaustivestruct + - goerr113 + - errorlint - nestif - godot - - errorlint - - varcheck - - interfacer - - deadcode - - golint + - gofumpt + - paralleltest + - tparallel + - thelper - ifshort - - structcheck - - nosnakecase - - varnamelen - exhaustruct + - varnamelen + - gci + - depguard + - errchkjson + - inamedparam + - nonamedreturns + - musttag + - ireturn + - forcetypeassert + - cyclop + # deprecated linters + - deadcode + - interfacer + - scopelint + - varcheck + - structcheck + - golint + - nosnakecase diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index b94753aa..c7fc2049 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -1,15 +1,19 @@ -# gojsonreference [![Build Status](https://travis-ci.org/go-openapi/jsonreference.svg?branch=master)](https://travis-ci.org/go-openapi/jsonreference) [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) +# gojsonreference [![Build Status](https://github.com/go-openapi/jsonreference/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/jsonreference/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) + +[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) +[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/jsonreference.svg)](https://pkg.go.dev/github.com/go-openapi/jsonreference) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/jsonreference)](https://goreportcard.com/report/github.com/go-openapi/jsonreference) -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonreference?status.svg)](http://godoc.org/github.com/go-openapi/jsonreference) An implementation of JSON Reference - Go language ## Status Feature complete. Stable API ## Dependencies -https://github.com/go-openapi/jsonpointer +* https://github.com/go-openapi/jsonpointer ## References -http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 -http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 +* http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 +* http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 diff --git a/vendor/github.com/go-openapi/spec/.gitignore b/vendor/github.com/go-openapi/spec/.gitignore index dd91ed6a..f47cb204 100644 --- a/vendor/github.com/go-openapi/spec/.gitignore +++ b/vendor/github.com/go-openapi/spec/.gitignore @@ -1,2 +1 @@ -secrets.yml -coverage.out +*.out diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml index 835d55e7..22f8d21c 100644 --- a/vendor/github.com/go-openapi/spec/.golangci.yml +++ b/vendor/github.com/go-openapi/spec/.golangci.yml @@ -11,7 +11,7 @@ linters-settings: threshold: 200 goconst: min-len: 2 - min-occurrences: 2 + min-occurrences: 3 linters: enable-all: true @@ -40,3 +40,22 @@ linters: - tparallel - thelper - ifshort + - exhaustruct + - varnamelen + - gci + - depguard + - errchkjson + - inamedparam + - nonamedreturns + - musttag + - ireturn + - forcetypeassert + - cyclop + # deprecated linters + - deadcode + - interfacer + - scopelint + - varcheck + - structcheck + - golint + - nosnakecase diff --git a/vendor/github.com/go-openapi/spec/README.md b/vendor/github.com/go-openapi/spec/README.md index 18782c6d..822172ff 100644 --- a/vendor/github.com/go-openapi/spec/README.md +++ b/vendor/github.com/go-openapi/spec/README.md @@ -1,8 +1,5 @@ -# OAI object model +# OpenAPI v2 object model [![Build Status](https://github.com/go-openapi/spec/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/spec/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/spec/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/spec) -[![Build Status](https://travis-ci.org/go-openapi/spec.svg?branch=master)](https://travis-ci.org/go-openapi/spec) - -[![codecov](https://codecov.io/gh/go-openapi/spec/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/spec) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) [![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) [![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/spec.svg)](https://pkg.go.dev/github.com/go-openapi/spec) diff --git a/vendor/github.com/go-openapi/spec/appveyor.yml b/vendor/github.com/go-openapi/spec/appveyor.yml deleted file mode 100644 index 09035939..00000000 --- a/vendor/github.com/go-openapi/spec/appveyor.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: "0.1.{build}" - -clone_folder: C:\go-openapi\spec -shallow_clone: true # for startup speed -pull_requests: - do_not_increment_build_number: true - -#skip_tags: true -#skip_branch_with_pr: true - -# appveyor.yml -build: off - -environment: - GOPATH: c:\gopath - -stack: go 1.15 - -test_script: - - go test -v -timeout 20m ./... - -deploy: off - -notifications: - - provider: Slack - incoming_webhook: https://hooks.slack.com/services/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 - auth_token: - secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4= - channel: bots - on_build_success: false - on_build_failure: true - on_build_status_changed: true diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go deleted file mode 100644 index afc83850..00000000 --- a/vendor/github.com/go-openapi/spec/bindata.go +++ /dev/null @@ -1,297 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// schemas/jsonschema-draft-04.json (4.357kB) -// schemas/v2/schema.json (40.248kB) - -package spec - -import ( - "bytes" - "compress/gzip" - "crypto/sha256" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo - digest [sha256.Size]byte -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _jsonschemaDraft04Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") - -func jsonschemaDraft04JsonBytes() ([]byte, error) { - return bindataRead( - _jsonschemaDraft04Json, - "jsonschema-draft-04.json", - ) -} - -func jsonschemaDraft04Json() (*asset, error) { - bytes, err := jsonschemaDraft04JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0640), modTime: time.Unix(1568963823, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe1, 0x48, 0x9d, 0xb, 0x47, 0x55, 0xf0, 0x27, 0x93, 0x30, 0x25, 0x91, 0xd3, 0xfc, 0xb8, 0xf0, 0x7b, 0x68, 0x93, 0xa8, 0x2a, 0x94, 0xf2, 0x48, 0x95, 0xf8, 0xe4, 0xed, 0xf1, 0x1b, 0x82, 0xe2}} - return a, nil -} - -var _v2SchemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\xe3\x08\xb5\x8b\x99\xbd\x82\xbc\x9e\xc2\xe8\x53\x46\x83\x3f\x33\x54\x2b\x5b\xad\x92\x79\xd9\x8f\x5d\x93\x98\xf2\xe6\xc6\x1c\xe6\x9a\x9e\xfc\x43\x82\x31\x66\x8e\x53\x77\xfe\x90\xe7\xf3\xf6\xe9\x62\x23\x3f\x10\x93\x18\xae\x72\x1a\x9d\xf9\x48\xcb\xcc\x5a\x65\xc7\x4a\x04\xf0\xf3\xd5\xd5\x05\x8a\x41\x08\xbc\x86\x86\x43\x51\x6c\xe0\x46\x57\xf6\x44\x40\x0d\xfb\xff\xa2\xc3\x7c\x3d\x39\x84\xdc\x09\x22\x64\x4f\x12\xd9\xba\xaa\xf6\xe3\xbd\x56\xdd\x91\x25\x6a\x14\x9c\x89\x34\x8e\x31\xdf\xee\x15\x7e\x2f\x39\x81\x15\x2a\x28\x95\x66\x51\xf5\xfd\x83\xc5\xfe\x15\x07\xcf\xf7\x08\xee\x1d\x8e\xb6\xc5\x52\xcc\x8c\x5a\x93\x66\xc5\xd8\x79\x38\x46\xd6\xa7\x88\x37\xc9\x2e\xe3\xd2\xa5\x7b\x4b\x3a\xdc\xa1\xdc\x9e\x29\xf1\x8c\x8a\x99\x16\x47\x8d\xd4\x78\x8b\xf6\x1c\xe9\x71\x54\x1b\x69\xa8\x4a\x93\x37\xe5\xb2\x2c\x4f\x0c\x92\xab\xa0\x73\x32\x72\x59\xd3\xf0\x2d\x8d\xed\xca\x37\x16\x19\x9e\xdb\x1c\xab\x17\x49\xc3\x0f\x37\xdc\x88\xb1\xb4\xd4\x42\xcb\x58\x5e\x6a\x52\x0b\x15\x10\x0a\xb0\x04\xe7\xf8\x58\x32\x16\x01\xa6\xcd\x01\xb2\xc2\x69\x24\x35\x38\x6f\x30\x6a\xae\x1b\xb4\x71\xaa\xad\x1d\xa0\xd6\x20\x2d\x8b\x3c\xc6\x82\x62\x27\x34\x6d\x15\x84\x7b\x43\xb1\x35\x78\xa6\x24\x77\x28\xc1\x6e\xfc\xe9\x48\x74\xf4\x15\xe3\xe1\x84\x42\x88\x40\x7a\x26\x49\x3b\x48\xb1\xa4\x19\x8e\x0c\xa7\xb5\x01\x6c\x0c\x97\x61\x8a\xc2\x32\xd8\x8c\x44\x69\x24\xbf\x65\x1d\x74\xd6\xe5\x44\xef\xec\x48\x5e\xb7\x8a\xa3\x29\x8e\x41\x64\xce\x1f\x88\xdc\x00\x47\x4b\x40\x98\x6e\xd1\x0d\x8e\x48\x98\x63\x5c\x21\xb1\x4c\x05\x0a\x58\x98\xc5\x6d\x4f\x0a\x77\x53\x4f\x8b\xc4\x44\x1f\xb2\xdf\x8d\x3b\xea\x9f\xfe\xf6\xf2\xc5\xff\x5d\x7f\xfe\x9f\xfb\x67\x8f\xff\xf3\xe9\x69\xd1\xfe\xb3\xc7\xfd\x3c\xf8\x3f\x71\x94\x82\x23\xd1\x72\x00\xb7\x42\x99\x6c\xc0\x60\x7b\x0f\x79\xea\xa8\x53\x4b\x56\x31\xfa\x0b\x52\x9f\x96\xdb\xcd\x2f\xd7\x67\xcd\x04\x19\x85\xfe\xdb\x02\x9a\x59\x03\xad\x63\x3c\xea\xff\x2e\x18\xfd\x00\xd9\xe2\x56\x60\x59\x93\xb9\xb6\xb2\x3e\x3c\x2c\xab\x0f\xa7\xb2\x89\x43\xc7\xf6\xd5\xce\x2e\xad\xa6\xa9\xed\xa6\xc6\x5a\xb4\xa6\x67\xdf\x8c\x26\x7b\x50\x5a\x91\x08\x2e\x6d\xd4\x3a\xc1\x9d\xf2\xdb\xde\x1e\xb2\x2c\x6c\xa5\x64\xc9\x16\xb4\x90\xaa\x4a\xb7\x0c\xde\x13\xc3\x2a\x9a\x11\x9b\x7a\x1b\x3d\x95\x97\x37\x31\x6b\x69\x7e\x34\xc0\x67\x1f\x66\x19\x49\xef\xf1\x25\xf5\xac\x0e\xea\x0a\x28\x8d\x4d\x7e\xd9\x57\x4b\x49\xe5\xc6\xb3\x25\xfd\xe6\x57\x42\x25\xac\xcd\xcf\x36\x74\x8e\xca\x24\x47\xe7\x80\xa8\x92\x72\xbd\x3d\x84\x2d\x65\xe2\x82\x1a\x9c\xc4\x44\x92\x1b\x10\x79\x8a\xc4\x4a\x2f\x60\x51\x04\x81\xaa\xf0\xa3\x95\x27\xd7\x12\x7b\xa3\x96\x03\x45\x96\xc1\x8a\x07\xc9\xb2\xb0\x95\x52\x8c\xef\x48\x9c\xc6\x7e\x94\xca\xc2\x0e\x07\x12\x44\xa9\x20\x37\xf0\xae\x0f\x49\xa3\x96\x9d\x4b\x42\x7b\x70\x59\x14\xee\xe0\xb2\x0f\x49\xa3\x96\x4b\x97\xbf\x00\x5d\x4b\x4f\xfc\xbb\x2b\xee\x92\xb9\x17\xb5\xaa\xb8\x0b\x97\x17\x9b\x43\xfd\xd6\xc2\xb2\xc2\x2e\x29\xcf\xfd\x87\x4a\x55\xda\x25\x63\x1f\x5a\x65\x69\x2b\x2d\x3d\x67\xe9\x41\xae\x5e\xc1\x6e\x2b\xd4\xdb\x3e\xa8\xd3\x26\xd2\x48\x92\x24\xca\x61\x86\x8f\x8c\xbb\xf2\x8e\x91\xdf\x1f\x06\x19\x33\xf3\x03\x4d\xba\xcd\xe2\x2d\xfb\x69\xe9\x16\x15\x13\xd5\x56\x85\x4e\x3c\x5b\x8a\xbf\x25\x72\x83\xee\x5e\x20\x22\xf2\xc8\xaa\x7b\xdb\x8e\xe4\x29\x58\xca\x38\xb7\x3f\x2e\x59\xb8\xbd\xa8\x16\x16\xf7\xdb\x79\x51\x9f\x5a\xb4\x8d\x87\x3a\x6e\xbc\x3e\xc5\xb4\xcd\x58\xf9\xf5\x3c\xb9\x6f\x49\xaf\x57\xc1\xfa\x1c\x5d\x6d\x88\x8a\x8b\xd3\x28\xcc\xb7\xef\x10\x8a\x4a\x74\xa9\x4a\xa7\x62\xbf\x0d\x76\x23\x6f\x59\xd9\x31\xee\x40\x11\xfb\x28\xec\x8d\x22\x1c\x13\x5a\x64\x94\x23\x16\x60\xbb\xd2\x7c\xa0\x98\xb2\xe5\x6e\xbc\x54\x33\xe0\x3e\xb9\x52\x17\xdb\xb7\x1b\xc8\x12\x20\x8c\x23\xca\x64\x7e\x78\xa3\x62\x5b\x75\x56\xd9\x9e\x2a\x91\x27\xb0\x70\x34\x1f\x90\x89\xb5\x86\x73\x7e\x71\xda\x1e\xfb\x3a\x72\xdc\x5e\x79\x88\xcb\x74\x79\xd9\x64\xe4\xd4\xc2\x9e\xce\xb1\xfe\x85\x5a\xc0\xe9\x0c\x34\x3d\xd0\x43\xce\xa1\x36\x39\xd5\xa1\x4e\xf5\xf8\xb1\xa9\x23\x08\x75\x84\xac\x53\x6c\x3a\xc5\xa6\x53\x6c\x3a\xc5\xa6\x7f\xc5\xd8\xf4\x51\xfd\xff\x25\x4e\xfa\x33\x05\xbe\x9d\x60\xd2\x04\x93\x6a\x5f\x33\x9b\x98\x50\xd2\xe1\x50\x52\xc6\xcc\xdb\x38\x91\xdb\xe6\xaa\xa2\x8f\xa1\x6a\xa6\xd4\xc6\x56\xd6\x8c\x40\x02\x68\x48\xe8\x1a\xe1\x9a\xd9\x2e\xb7\x05\xc3\x34\xda\x2a\xbb\xcd\x12\x36\x98\x22\x50\x4c\xa1\x1b\xc5\xd5\x84\xf0\xbe\x24\x84\xf7\x2f\x22\x37\xef\x94\xd7\x9f\xa0\xde\x04\xf5\x26\xa8\x37\x41\x3d\x64\x40\x3d\xe5\xf2\xde\x60\x89\x27\xb4\x37\xa1\xbd\xda\xd7\xd2\x2c\x26\xc0\x37\x01\x3e\x1b\xef\x5f\x06\xe0\x6b\x7c\x5c\x91\x08\x26\x10\x38\x81\xc0\x09\x04\x76\x4a\x3d\x81\xc0\xbf\x12\x08\x4c\xb0\xdc\x7c\x99\x00\xd0\x75\x70\xb4\xf8\x5a\x7c\xea\xde\x3e\x39\x08\x30\x5a\x27\x35\xed\xb4\x65\xad\x69\x74\x10\x88\x79\xe2\x30\x52\x19\xd6\x04\x21\xa7\x95\xd5\x0e\x03\xf8\xda\x20\xd7\x84\xb4\x26\xa4\x35\x21\xad\x09\x69\x21\x03\x69\x51\x46\xff\xff\x18\x9b\x54\xed\x87\x47\x06\x9d\x4e\x73\x6e\x9a\xb3\xa9\xce\x83\x5e\x4b\xc6\x71\x20\x45\xd7\x72\xf5\x40\x72\x0e\x34\x6c\xf4\x6c\xf3\xba\x5e\x4b\x97\x0e\x52\xb8\xbe\x8b\x79\xa0\x10\x86\xa1\x75\xb0\x6f\xec\xc8\xf4\x3d\x4d\x7b\x86\xc2\x02\x31\x12\x51\xbf\x07\x94\xad\x10\xd6\x2e\x79\xcf\xe9\x1c\xf5\x1e\x31\x23\x5c\x18\xfb\x9c\xfb\x70\xe0\x62\xbd\xf7\xb5\x94\xcf\xf3\xf6\xfa\xc5\x4e\x9c\x85\x76\x1d\xae\x37\xbc\xde\xa3\x41\xcb\x29\xd0\x5e\x70\x67\x50\x93\x6d\x98\xa8\xd3\x67\x0f\x68\xb1\xeb\x38\x47\x07\x10\x1b\xd2\xe2\x18\x68\x6d\x40\xbb\xa3\x40\xba\x21\xf2\x8e\x81\xfb\xf6\x92\x77\x2f\x70\xe8\xdb\xb2\x36\xbf\x30\x91\xc5\x21\xe7\x45\xcc\x34\x0c\x48\x8e\xd0\xf2\x9b\x7c\x3c\xbd\x1c\x04\x3e\x07\xe8\x7c\x2f\x84\x7a\x48\x4d\x1f\xba\xe1\x76\x45\x7b\x60\xe0\x01\xca\xee\x04\xca\x31\xbe\x73\x5f\xa3\x70\x0c\xad\x1f\xa5\xf5\x76\xd5\xbb\xd2\x7e\xfb\x30\x90\xcf\xfa\x67\x7a\xe6\xc3\x37\x42\x19\xe2\xc9\x9c\x61\x4c\xe7\xd1\x77\x55\x86\x6e\x8f\x7b\x85\x42\x33\xa3\xaa\x57\xae\xfd\xd5\xcc\x9c\x56\x68\xe2\xde\x0e\xa8\x2c\xa9\xb0\x7d\xf0\x54\x2d\x80\xf2\x48\x39\x3d\x98\x1a\x6d\x0b\x9d\xba\x53\xfb\xce\xf8\xd1\x7e\xbb\x60\x4f\x06\xf5\xce\xda\xab\xeb\xca\xcb\xd5\xac\x20\xda\x72\x3b\xa2\x4b\x38\xd7\xb5\x89\xbe\x42\xd9\xb9\x73\xc4\x0c\x6d\xb7\xd9\xf8\x8d\xbd\x3e\x9c\xf5\x53\x68\x48\x14\x36\x8f\x09\xc5\x92\xf1\x21\xd1\x09\x07\x1c\xbe\xa7\x91\xf3\x6a\xc8\xc1\x57\xb0\xdd\xc5\xc6\x1d\xad\x76\x1d\xa8\x82\x0e\x4c\x38\xfe\xa5\x8c\xc5\x0a\x40\x5d\xa1\xbb\x98\xd1\xfb\x74\x61\xed\x1a\x98\xaf\x3c\x8c\x1e\xe3\xc2\x92\x29\x74\x3e\x99\xd0\xf9\x41\x50\xd0\x38\x4b\x57\x7e\x5b\x7a\x0e\xe6\xce\x4e\xd7\x19\x35\x57\xbb\x3c\x3c\xd2\x5e\x4f\x4b\x4c\xf7\x0f\x4d\x2b\x91\x5d\x94\xa6\x95\xc8\x69\x25\x72\x5a\x89\x7c\xb8\x95\xc8\x07\x80\x8c\xda\x9c\x64\x7b\xb7\x71\xdf\x57\x12\x4b\x9a\x1f\x72\x0c\x13\x03\xad\x3c\xd5\x4e\xde\x8e\x57\x13\x6d\x34\x86\xcf\x97\xe6\xa4\x68\xc4\xb0\xf6\xc9\xc2\xeb\x8d\x0b\xd7\xcd\xfe\xba\xa6\xf5\x30\xeb\x30\x33\xbe\xc7\x56\x27\xab\x08\xd9\x6d\xbb\x09\xee\x7c\x2d\xcf\xee\x87\x38\xac\xc8\xdd\x90\x9a\x58\x4a\x4e\x96\xa9\x79\x79\xf3\xde\x20\xf0\x96\xe3\x24\x19\xeb\xba\xf2\x53\x19\xab\x12\xaf\x47\xb3\xa0\x3e\xef\x9b\x8d\x6d\x6d\x7b\xde\x3b\x3b\x1a\xc0\x3f\x95\x7e\xed\x78\xfb\x76\xb8\xaf\xb3\xdd\xc5\xeb\x95\xed\x5a\x62\x41\x82\xb3\x54\x6e\x80\x4a\x92\x6f\x36\xbd\x34\xae\xde\x6f\xa4\xc0\xbc\x08\xe3\x84\xfc\x1d\xb6\xe3\xd0\x62\x38\x95\x9b\x57\xe7\x71\x12\x91\x80\xc8\x31\x69\x5e\x60\x21\x6e\x19\x0f\xc7\xa4\x79\x96\x28\x3e\x47\x54\x65\x41\x36\x08\x40\x88\x1f\x58\x08\x56\xaa\xd5\xbf\xaf\xad\x96\xd7\xd6\xcf\x87\xf5\x34\x0f\x71\x93\x6e\x26\xed\x98\x5b\x9f\x4f\xcf\x95\x34\xc6\xd7\x11\xfa\xb0\x81\x22\x1a\xdb\xdf\x8e\xdc\xc3\xb9\xf8\xdd\x5d\x3c\x74\xe6\xea\xb7\x8b\xbf\xf5\x6e\xb3\x46\x2e\x64\xf4\xab\x3c\x4e\xcf\x36\x1d\xfe\xfa\xb8\x36\xba\x8a\xd8\xad\xf6\xc6\x41\x2a\x37\x8c\x17\x0f\xda\xfe\xda\xe7\x65\xbc\x71\x2c\x36\x57\x8a\x47\x12\x4c\xf1\xbd\x77\x6b\xa4\x50\x7e\x77\x7b\x22\x60\x89\xef\xcd\xf5\xb9\x0c\x97\x79\x0d\x2b\x35\x43\xcb\x3d\x24\xf1\x78\xfc\xf8\xcb\x1f\x15\x06\xe2\x78\xd8\x51\x21\xd9\x1f\xf0\xf5\x8f\x86\xa4\x50\xfa\xb1\x47\x43\xa5\xdd\x69\x14\xe8\xa3\xc0\x86\x91\xa7\x81\x50\xb4\x7c\xc0\x81\x80\x77\x7a\x9f\xc6\xc2\xa9\x8c\x05\x33\xb0\x3b\x31\xa4\xf4\xd7\x1b\x26\x55\x97\x7c\x65\xf8\x69\x1a\x84\x8e\x41\x78\xd9\xec\xc5\x11\x16\x1e\x74\x91\xf5\x56\xf5\x57\x49\x47\x5c\x92\xa9\x1e\x99\x36\xf4\xdb\xb1\x0e\xd3\x78\x02\xb0\x9b\x25\xcb\xe9\xe9\x1d\x0d\x44\x01\x42\x08\x91\x64\xd9\xdd\x37\x08\x17\xef\xf9\xe5\x0f\xbd\x46\x91\xf5\xf9\x89\x92\x37\xdd\x89\x59\x44\x1f\x9c\xee\x34\x1e\xbe\x47\x83\x32\x72\x8e\x37\xdf\xac\x69\x38\xef\x75\xb0\xda\xdb\xac\x83\x94\x2f\x39\xa6\x62\x05\x1c\x25\x9c\x49\x16\xb0\xa8\x3c\xc7\x7e\x76\x71\x3e\x6f\xb5\x24\xe7\xe8\xb7\xb9\xc7\x6c\x43\x92\xee\x21\xd4\x17\xa1\x7f\xba\x35\xfe\xae\x39\xbc\xde\xba\x69\xd9\x8e\xe1\x62\xde\x64\x7d\x16\x88\x1b\xed\x29\x11\xfd\x4f\xa9\xff\x99\x90\xc4\xf6\xf4\xf9\x6e\xe9\x28\x23\xd7\xca\xe5\xee\xee\x9f\x63\xb1\x5b\xfb\x10\xd7\x2f\x1d\xf2\xe3\xbf\xb9\xb5\x6f\xa4\x6d\x7d\x25\x79\xfb\x24\x31\xea\x56\xbe\x5d\x53\xcd\x2d\x36\xa3\x6d\xdf\xab\x1c\xb8\x6d\x6f\xc0\x98\xa7\xdd\xaa\x86\x8c\x1d\x39\xa3\x9d\x70\x2b\x9b\x68\xd9\xfd\x33\xfe\xa9\xb6\x4a\x2e\x63\x0f\xcf\x68\x27\xd9\x4c\xb9\x46\x6d\xcb\xbe\xa1\xa8\xd6\x5f\xc6\xd6\x9f\xf1\x4f\xf4\xd4\xb4\x78\xd0\xd6\xf4\x13\x3c\x3b\xac\xd0\xdc\x90\x34\xda\xc9\xb4\x9a\x1a\x8d\xbd\x93\x87\xd4\xe2\x21\x1b\xb3\x2b\xd1\xbe\xe7\x69\xd4\x53\x67\xd5\x40\xa0\xe3\x19\x3f\x6d\x1a\xbc\x0e\x86\x3c\x10\xb4\x3d\x2a\xcd\x78\x32\xe6\xab\xbd\x36\xc9\xf4\x3a\x58\xae\xc3\xf4\x47\xea\xbf\xfb\x47\xff\x0d\x00\x00\xff\xff\xd2\x32\x5a\x28\x38\x9d\x00\x00") - -func v2SchemaJsonBytes() ([]byte, error) { - return bindataRead( - _v2SchemaJson, - "v2/schema.json", - ) -} - -func v2SchemaJson() (*asset, error) { - bytes, err := v2SchemaJsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "v2/schema.json", size: 40248, mode: os.FileMode(0640), modTime: time.Unix(1568964748, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x88, 0x5e, 0xf, 0xbf, 0x17, 0x74, 0x0, 0xb2, 0x5a, 0x7f, 0xbc, 0x58, 0xcd, 0xc, 0x25, 0x73, 0xd5, 0x29, 0x1c, 0x7a, 0xd0, 0xce, 0x79, 0xd4, 0x89, 0x31, 0x27, 0x90, 0xf2, 0xff, 0xe6}} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// AssetString returns the asset contents as a string (instead of a []byte). -func AssetString(name string) (string, error) { - data, err := Asset(name) - return string(data), err -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// MustAssetString is like AssetString but panics when Asset would return an -// error. It simplifies safe initialization of global variables. -func MustAssetString(name string) string { - return string(MustAsset(name)) -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetDigest returns the digest of the file with the given name. It returns an -// error if the asset could not be found or the digest could not be loaded. -func AssetDigest(name string) ([sha256.Size]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) - } - return a.digest, nil - } - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) -} - -// Digests returns a map of all known files and their checksums. -func Digests() (map[string][sha256.Size]byte, error) { - mp := make(map[string][sha256.Size]byte, len(_bindata)) - for name := range _bindata { - a, err := _bindata[name]() - if err != nil { - return nil, err - } - mp[name] = a.digest - } - return mp, nil -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "jsonschema-draft-04.json": jsonschemaDraft04Json, - - "v2/schema.json": v2SchemaJson, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"}, -// AssetDir("data/img") would return []string{"a.png", "b.png"}, -// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - canonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(canonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "jsonschema-draft-04.json": {jsonschemaDraft04Json, map[string]*bintree{}}, - "v2": {nil, map[string]*bintree{ - "schema.json": {v2SchemaJson, map[string]*bintree{}}, - }}, -}} - -// RestoreAsset restores an asset under the given directory. -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively. -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - canonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) -} diff --git a/vendor/github.com/go-openapi/spec/embed.go b/vendor/github.com/go-openapi/spec/embed.go new file mode 100644 index 00000000..1f428475 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/embed.go @@ -0,0 +1,17 @@ +package spec + +import ( + "embed" + "path" +) + +//go:embed schemas/*.json schemas/*/*.json +var assets embed.FS + +func jsonschemaDraft04JSONBytes() ([]byte, error) { + return assets.ReadFile(path.Join("schemas", "jsonschema-draft-04.json")) +} + +func v2SchemaJSONBytes() ([]byte, error) { + return assets.ReadFile(path.Join("schemas", "v2", "schema.json")) +} diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go index d4ea889d..74f91c3a 100644 --- a/vendor/github.com/go-openapi/spec/expander.go +++ b/vendor/github.com/go-openapi/spec/expander.go @@ -27,7 +27,6 @@ import ( // all relative $ref's will be resolved from there. // // PathLoader injects a document loading method. By default, this resolves to the function provided by the SpecLoader package variable. -// type ExpandOptions struct { RelativeBase string // the path to the root document to expand. This is a file, not a directory SkipSchemas bool // do not expand schemas, just paths, parameters and responses @@ -103,15 +102,21 @@ const rootBase = ".root" // baseForRoot loads in the cache the root document and produces a fake ".root" base path entry // for further $ref resolution -// -// Setting the cache is optional and this parameter may safely be left to nil. func baseForRoot(root interface{}, cache ResolutionCache) string { - if root == nil { - return "" - } - // cache the root document to resolve $ref's normalizedBase := normalizeBase(rootBase) + + if root == nil { + // ensure that we never leave a nil root: always cache the root base pseudo-document + cachedRoot, found := cache.Get(normalizedBase) + if found && cachedRoot != nil { + // the cache is already preloaded with a root + return normalizedBase + } + + root = map[string]interface{}{} + } + cache.Set(normalizedBase, root) return normalizedBase @@ -208,7 +213,19 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba } if target.Ref.String() != "" { - return expandSchemaRef(target, parentRefs, resolver, basePath) + if !resolver.options.SkipSchemas { + return expandSchemaRef(target, parentRefs, resolver, basePath) + } + + // when "expand" with SkipSchema, we just rebase the existing $ref without replacing + // the full schema. + rebasedRef, err := NewRef(normalizeURI(target.Ref.String(), basePath)) + if err != nil { + return nil, err + } + target.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) + + return &target, nil } for k := range target.Definitions { @@ -520,21 +537,25 @@ func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { } func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePath string) error { - ref, _, err := getRefAndSchema(input) + ref, sch, err := getRefAndSchema(input) if err != nil { return err } - if ref == nil { + if ref == nil && sch == nil { // nothing to do return nil } parentRefs := make([]string, 0, 10) - if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { - return err + if ref != nil { + // dereference this $ref + if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { + return err + } + + ref, sch, _ = getRefAndSchema(input) } - ref, sch, _ := getRefAndSchema(input) if ref.String() != "" { transitiveResolver := resolver.transitiveResolver(basePath, *ref) basePath = resolver.updateBasePath(transitiveResolver, basePath) @@ -546,6 +567,7 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa if ref != nil { *ref = Ref{} } + return nil } @@ -555,38 +577,29 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa return ern } - switch { - case resolver.isCircular(&rebasedRef, basePath, parentRefs...): + if resolver.isCircular(&rebasedRef, basePath, parentRefs...) { // this is a circular $ref: stop expansion if !resolver.options.AbsoluteCircularRef { sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) } else { sch.Ref = rebasedRef } - case !resolver.options.SkipSchemas: - // schema expanded to a $ref in another root - sch.Ref = rebasedRef - debugLog("rebased to: %s", sch.Ref.String()) - default: - // skip schema expansion but rebase $ref to schema - sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) } } + // $ref expansion or rebasing is performed by expandSchema below if ref != nil { *ref = Ref{} } // expand schema - if !resolver.options.SkipSchemas { - s, err := expandSchema(*sch, parentRefs, resolver, basePath) - if resolver.shouldStopOnError(err) { - return err - } - if s == nil { - // guard for when continuing on error - return nil - } + // yes, we do it even if options.SkipSchema is true: we have to go down that rabbit hole and rebase nested $ref) + s, err := expandSchema(*sch, parentRefs, resolver, basePath) + if resolver.shouldStopOnError(err) { + return err + } + + if s != nil { // guard for when continuing on error *sch = *s } diff --git a/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go b/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go index 2df07231..f19f1a8f 100644 --- a/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go +++ b/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go @@ -40,5 +40,5 @@ func repairURI(in string) (*url.URL, string) { return u, "" } -func fixWindowsURI(u *url.URL, in string) { +func fixWindowsURI(_ *url.URL, _ string) { } diff --git a/vendor/github.com/go-openapi/spec/operation.go b/vendor/github.com/go-openapi/spec/operation.go index 995ce6ac..a69cca88 100644 --- a/vendor/github.com/go-openapi/spec/operation.go +++ b/vendor/github.com/go-openapi/spec/operation.go @@ -217,9 +217,12 @@ func (o *Operation) AddParam(param *Parameter) *Operation { for i, p := range o.Parameters { if p.Name == param.Name && p.In == param.In { - params := append(o.Parameters[:i], *param) + params := make([]Parameter, 0, len(o.Parameters)+1) + params = append(params, o.Parameters[:i]...) + params = append(params, *param) params = append(params, o.Parameters[i+1:]...) o.Parameters = params + return o } } diff --git a/vendor/github.com/go-openapi/spec/parameter.go b/vendor/github.com/go-openapi/spec/parameter.go index 2b2b89b6..bd4f1cdb 100644 --- a/vendor/github.com/go-openapi/spec/parameter.go +++ b/vendor/github.com/go-openapi/spec/parameter.go @@ -84,27 +84,27 @@ type ParamProps struct { // Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn). // // There are five possible parameter types. -// * Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part -// of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, -// the path parameter is `itemId`. -// * Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`. -// * Header - Custom headers that are expected as part of the request. -// * Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be -// _one_ body parameter. The name of the body parameter has no effect on the parameter itself and is used for -// documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist -// together for the same operation. -// * Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or -// `multipart/form-data` are used as the content type of the request (in Swagger's definition, -// the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used -// to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be -// declared together with a body parameter for the same operation. Form parameters have a different format based on -// the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4). -// * `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload. -// For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple -// parameters that are being transferred. -// * `multipart/form-data` - each parameter takes a section in the payload with an internal header. -// For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is -// `submit-name`. This type of form parameters is more commonly used for file transfers. +// - Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part +// of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, +// the path parameter is `itemId`. +// - Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`. +// - Header - Custom headers that are expected as part of the request. +// - Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be +// _one_ body parameter. The name of the body parameter has no effect on the parameter itself and is used for +// documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist +// together for the same operation. +// - Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or +// `multipart/form-data` are used as the content type of the request (in Swagger's definition, +// the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used +// to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be +// declared together with a body parameter for the same operation. Form parameters have a different format based on +// the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4). +// - `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload. +// For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple +// parameters that are being transferred. +// - `multipart/form-data` - each parameter takes a section in the payload with an internal header. +// For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is +// `submit-name`. This type of form parameters is more commonly used for file transfers. // // For more information: http://goo.gl/8us55a#parameterObject type Parameter struct { diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go index b81175af..0059b99a 100644 --- a/vendor/github.com/go-openapi/spec/schema_loader.go +++ b/vendor/github.com/go-openapi/spec/schema_loader.go @@ -168,14 +168,7 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) normalized := normalizeBase(pth) debugLog("loading doc from: %s", normalized) - unescaped, err := url.PathUnescape(normalized) - if err != nil { - return nil, url.URL{}, false, err - } - - u := url.URL{Path: unescaped} - - data, fromCache := r.cache.Get(u.RequestURI()) + data, fromCache := r.cache.Get(normalized) if fromCache { return data, toFetch, fromCache, nil } diff --git a/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json b/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json new file mode 100644 index 00000000..bcbb8474 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json @@ -0,0 +1,149 @@ +{ + "id": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { "$ref": "#" } + }, + "positiveInteger": { + "type": "integer", + "minimum": 0 + }, + "positiveIntegerDefault0": { + "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] + }, + "simpleTypes": { + "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] + }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "uniqueItems": true + } + }, + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "$schema": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": {}, + "multipleOf": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "boolean", + "default": false + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "boolean", + "default": false + }, + "maxLength": { "$ref": "#/definitions/positiveInteger" }, + "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "items": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/schemaArray" } + ], + "default": {} + }, + "maxItems": { "$ref": "#/definitions/positiveInteger" }, + "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "maxProperties": { "$ref": "#/definitions/positiveInteger" }, + "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "definitions": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/stringArray" } + ] + } + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "type": { + "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "format": { "type": "string" }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "dependencies": { + "exclusiveMaximum": [ "maximum" ], + "exclusiveMinimum": [ "minimum" ] + }, + "default": {} +} diff --git a/vendor/github.com/go-openapi/spec/schemas/v2/schema.json b/vendor/github.com/go-openapi/spec/schemas/v2/schema.json new file mode 100644 index 00000000..ebe10ed3 --- /dev/null +++ b/vendor/github.com/go-openapi/spec/schemas/v2/schema.json @@ -0,0 +1,1607 @@ +{ + "title": "A JSON Schema for Swagger 2.0 API.", + "id": "http://swagger.io/v2/schema.json#", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "required": [ + "swagger", + "info", + "paths" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "swagger": { + "type": "string", + "enum": [ + "2.0" + ], + "description": "The Swagger version of this document." + }, + "info": { + "$ref": "#/definitions/info" + }, + "host": { + "type": "string", + "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", + "description": "The host (name or ip) of the API. Example: 'swagger.io'" + }, + "basePath": { + "type": "string", + "pattern": "^/", + "description": "The base path to the API. Example: '/api'." + }, + "schemes": { + "$ref": "#/definitions/schemesList" + }, + "consumes": { + "description": "A list of MIME types accepted by the API.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "produces": { + "description": "A list of MIME types the API can produce.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "paths": { + "$ref": "#/definitions/paths" + }, + "definitions": { + "$ref": "#/definitions/definitions" + }, + "parameters": { + "$ref": "#/definitions/parameterDefinitions" + }, + "responses": { + "$ref": "#/definitions/responseDefinitions" + }, + "security": { + "$ref": "#/definitions/security" + }, + "securityDefinitions": { + "$ref": "#/definitions/securityDefinitions" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/tag" + }, + "uniqueItems": true + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "definitions": { + "info": { + "type": "object", + "description": "General information about the API.", + "required": [ + "version", + "title" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "title": { + "type": "string", + "description": "A unique and precise title of the API." + }, + "version": { + "type": "string", + "description": "A semantic version number of the API." + }, + "description": { + "type": "string", + "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." + }, + "termsOfService": { + "type": "string", + "description": "The terms of service for the API." + }, + "contact": { + "$ref": "#/definitions/contact" + }, + "license": { + "$ref": "#/definitions/license" + } + } + }, + "contact": { + "type": "object", + "description": "Contact information for the owners of the API.", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The identifying name of the contact person/organization." + }, + "url": { + "type": "string", + "description": "The URL pointing to the contact information.", + "format": "uri" + }, + "email": { + "type": "string", + "description": "The email address of the contact person/organization.", + "format": "email" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "license": { + "type": "object", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the license type. It's encouraged to use an OSI compatible license." + }, + "url": { + "type": "string", + "description": "The URL pointing to the license.", + "format": "uri" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "paths": { + "type": "object", + "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + }, + "^/": { + "$ref": "#/definitions/pathItem" + } + }, + "additionalProperties": false + }, + "definitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "description": "One or more JSON objects describing the schemas being consumed and produced by the API." + }, + "parameterDefinitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/parameter" + }, + "description": "One or more JSON representations for parameters" + }, + "responseDefinitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/response" + }, + "description": "One or more JSON representations for responses" + }, + "externalDocs": { + "type": "object", + "additionalProperties": false, + "description": "information about external documentation", + "required": [ + "url" + ], + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "examples": { + "type": "object", + "additionalProperties": true + }, + "mimeType": { + "type": "string", + "description": "The MIME type of the HTTP message." + }, + "operation": { + "type": "object", + "required": [ + "responses" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "summary": { + "type": "string", + "description": "A brief summary of the operation." + }, + "description": { + "type": "string", + "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "operationId": { + "type": "string", + "description": "A unique identifier of the operation." + }, + "produces": { + "description": "A list of MIME types the API can produce.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "consumes": { + "description": "A list of MIME types the API can consume.", + "allOf": [ + { + "$ref": "#/definitions/mediaTypeList" + } + ] + }, + "parameters": { + "$ref": "#/definitions/parametersList" + }, + "responses": { + "$ref": "#/definitions/responses" + }, + "schemes": { + "$ref": "#/definitions/schemesList" + }, + "deprecated": { + "type": "boolean", + "default": false + }, + "security": { + "$ref": "#/definitions/security" + } + } + }, + "pathItem": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "get": { + "$ref": "#/definitions/operation" + }, + "put": { + "$ref": "#/definitions/operation" + }, + "post": { + "$ref": "#/definitions/operation" + }, + "delete": { + "$ref": "#/definitions/operation" + }, + "options": { + "$ref": "#/definitions/operation" + }, + "head": { + "$ref": "#/definitions/operation" + }, + "patch": { + "$ref": "#/definitions/operation" + }, + "parameters": { + "$ref": "#/definitions/parametersList" + } + } + }, + "responses": { + "type": "object", + "description": "Response objects names can either be any valid HTTP status code or 'default'.", + "minProperties": 1, + "additionalProperties": false, + "patternProperties": { + "^([0-9]{3})$|^(default)$": { + "$ref": "#/definitions/responseValue" + }, + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "not": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + } + }, + "responseValue": { + "oneOf": [ + { + "$ref": "#/definitions/response" + }, + { + "$ref": "#/definitions/jsonReference" + } + ] + }, + "response": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string" + }, + "schema": { + "oneOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/fileSchema" + } + ] + }, + "headers": { + "$ref": "#/definitions/headers" + }, + "examples": { + "$ref": "#/definitions/examples" + } + }, + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "headers": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/header" + } + }, + "header": { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "string", + "number", + "integer", + "boolean", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "vendorExtension": { + "description": "Any property starting with x- is valid.", + "additionalProperties": true, + "additionalItems": true + }, + "bodyParameter": { + "type": "object", + "required": [ + "name", + "in", + "schema" + ], + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "body" + ] + }, + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "schema": { + "$ref": "#/definitions/schema" + } + }, + "additionalProperties": false + }, + "headerParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "header" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "queryParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "query" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "allowEmptyValue": { + "type": "boolean", + "default": false, + "description": "allows sending a parameter by name only or with an empty value." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormatWithMulti" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "formDataParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "required": { + "type": "boolean", + "description": "Determines whether or not this parameter is required or optional.", + "default": false + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "formData" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "allowEmptyValue": { + "type": "boolean", + "default": false, + "description": "allows sending a parameter by name only or with an empty value." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array", + "file" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormatWithMulti" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "pathParameterSubSchema": { + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "required": [ + "required" + ], + "properties": { + "required": { + "type": "boolean", + "enum": [ + true + ], + "description": "Determines whether or not this parameter is required or optional." + }, + "in": { + "type": "string", + "description": "Determines the location of the parameter.", + "enum": [ + "path" + ] + }, + "description": { + "type": "string", + "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." + }, + "name": { + "type": "string", + "description": "The name of the parameter." + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "integer", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + } + }, + "nonBodyParameter": { + "type": "object", + "required": [ + "name", + "in", + "type" + ], + "oneOf": [ + { + "$ref": "#/definitions/headerParameterSubSchema" + }, + { + "$ref": "#/definitions/formDataParameterSubSchema" + }, + { + "$ref": "#/definitions/queryParameterSubSchema" + }, + { + "$ref": "#/definitions/pathParameterSubSchema" + } + ] + }, + "parameter": { + "oneOf": [ + { + "$ref": "#/definitions/bodyParameter" + }, + { + "$ref": "#/definitions/nonBodyParameter" + } + ] + }, + "schema": { + "type": "object", + "description": "A deterministic version of a JSON Schema object.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "format": { + "type": "string" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "maxProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "type": "boolean" + } + ], + "default": {} + }, + "type": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/type" + }, + "items": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + } + ], + "default": {} + }, + "allOf": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "default": {} + }, + "discriminator": { + "type": "string" + }, + "readOnly": { + "type": "boolean", + "default": false + }, + "xml": { + "$ref": "#/definitions/xml" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": {} + }, + "additionalProperties": false + }, + "fileSchema": { + "type": "object", + "description": "A deterministic version of a JSON Schema object.", + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + }, + "required": [ + "type" + ], + "properties": { + "format": { + "type": "string" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" + }, + "type": { + "type": "string", + "enum": [ + "file" + ] + }, + "readOnly": { + "type": "boolean", + "default": false + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": {} + }, + "additionalProperties": false + }, + "primitivesItems": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "string", + "number", + "integer", + "boolean", + "array" + ] + }, + "format": { + "type": "string" + }, + "items": { + "$ref": "#/definitions/primitivesItems" + }, + "collectionFormat": { + "$ref": "#/definitions/collectionFormat" + }, + "default": { + "$ref": "#/definitions/default" + }, + "maximum": { + "$ref": "#/definitions/maximum" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/exclusiveMaximum" + }, + "minimum": { + "$ref": "#/definitions/minimum" + }, + "exclusiveMinimum": { + "$ref": "#/definitions/exclusiveMinimum" + }, + "maxLength": { + "$ref": "#/definitions/maxLength" + }, + "minLength": { + "$ref": "#/definitions/minLength" + }, + "pattern": { + "$ref": "#/definitions/pattern" + }, + "maxItems": { + "$ref": "#/definitions/maxItems" + }, + "minItems": { + "$ref": "#/definitions/minItems" + }, + "uniqueItems": { + "$ref": "#/definitions/uniqueItems" + }, + "enum": { + "$ref": "#/definitions/enum" + }, + "multipleOf": { + "$ref": "#/definitions/multipleOf" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "securityRequirement": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "attribute": { + "type": "boolean", + "default": false + }, + "wrapped": { + "type": "boolean", + "default": false + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "tag": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "securityDefinitions": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/basicAuthenticationSecurity" + }, + { + "$ref": "#/definitions/apiKeySecurity" + }, + { + "$ref": "#/definitions/oauth2ImplicitSecurity" + }, + { + "$ref": "#/definitions/oauth2PasswordSecurity" + }, + { + "$ref": "#/definitions/oauth2ApplicationSecurity" + }, + { + "$ref": "#/definitions/oauth2AccessCodeSecurity" + } + ] + } + }, + "basicAuthenticationSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "apiKeySecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name", + "in" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "apiKey" + ] + }, + "name": { + "type": "string" + }, + "in": { + "type": "string", + "enum": [ + "header", + "query" + ] + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2ImplicitSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "authorizationUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "implicit" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "authorizationUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2PasswordSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "password" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2ApplicationSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "application" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2AccessCodeSecurity": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "flow", + "authorizationUrl", + "tokenUrl" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "oauth2" + ] + }, + "flow": { + "type": "string", + "enum": [ + "accessCode" + ] + }, + "scopes": { + "$ref": "#/definitions/oauth2Scopes" + }, + "authorizationUrl": { + "type": "string", + "format": "uri" + }, + "tokenUrl": { + "type": "string", + "format": "uri" + }, + "description": { + "type": "string" + } + }, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/vendorExtension" + } + } + }, + "oauth2Scopes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "mediaTypeList": { + "type": "array", + "items": { + "$ref": "#/definitions/mimeType" + }, + "uniqueItems": true + }, + "parametersList": { + "type": "array", + "description": "The parameters needed to send a valid API call.", + "additionalItems": false, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/parameter" + }, + { + "$ref": "#/definitions/jsonReference" + } + ] + }, + "uniqueItems": true + }, + "schemesList": { + "type": "array", + "description": "The transfer protocol of the API.", + "items": { + "type": "string", + "enum": [ + "http", + "https", + "ws", + "wss" + ] + }, + "uniqueItems": true + }, + "collectionFormat": { + "type": "string", + "enum": [ + "csv", + "ssv", + "tsv", + "pipes" + ], + "default": "csv" + }, + "collectionFormatWithMulti": { + "type": "string", + "enum": [ + "csv", + "ssv", + "tsv", + "pipes", + "multi" + ], + "default": "csv" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "description": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/description" + }, + "default": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/default" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "jsonReference": { + "type": "object", + "required": [ + "$ref" + ], + "additionalProperties": false, + "properties": { + "$ref": { + "type": "string" + } + } + } + } +} diff --git a/vendor/github.com/go-openapi/spec/spec.go b/vendor/github.com/go-openapi/spec/spec.go index 7d38b6e6..876aa127 100644 --- a/vendor/github.com/go-openapi/spec/spec.go +++ b/vendor/github.com/go-openapi/spec/spec.go @@ -26,7 +26,7 @@ import ( const ( // SwaggerSchemaURL the url for the swagger 2.0 schema to validate specs SwaggerSchemaURL = "http://swagger.io/v2/schema.json#" - // JSONSchemaURL the url for the json schema schema + // JSONSchemaURL the url for the json schema JSONSchemaURL = "http://json-schema.org/draft-04/schema#" ) @@ -41,7 +41,7 @@ func MustLoadJSONSchemaDraft04() *Schema { // JSONSchemaDraft04 loads the json schema document for json shema draft04 func JSONSchemaDraft04() (*Schema, error) { - b, err := Asset("jsonschema-draft-04.json") + b, err := jsonschemaDraft04JSONBytes() if err != nil { return nil, err } @@ -65,7 +65,7 @@ func MustLoadSwagger20Schema() *Schema { // Swagger20Schema loads the swagger 2.0 schema from the embedded assets func Swagger20Schema() (*Schema, error) { - b, err := Asset("v2/schema.json") + b, err := v2SchemaJSONBytes() if err != nil { return nil, err } diff --git a/vendor/github.com/go-openapi/spec/swagger.go b/vendor/github.com/go-openapi/spec/swagger.go index 44722ffd..1590fd17 100644 --- a/vendor/github.com/go-openapi/spec/swagger.go +++ b/vendor/github.com/go-openapi/spec/swagger.go @@ -253,7 +253,7 @@ func (s SchemaOrBool) MarshalJSON() ([]byte, error) { // UnmarshalJSON converts this bool or schema object from a JSON structure func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { var nw SchemaOrBool - if len(data) >= 4 { + if len(data) > 0 { if data[0] == '{' { var sch Schema if err := json.Unmarshal(data, &sch); err != nil { @@ -261,7 +261,7 @@ func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { } nw.Schema = &sch } - nw.Allows = !(data[0] == 'f' && data[1] == 'a' && data[2] == 'l' && data[3] == 's' && data[4] == 'e') + nw.Allows = !bytes.Equal(data, []byte("false")) } *s = nw return nil diff --git a/vendor/github.com/go-openapi/spec/url_go18.go b/vendor/github.com/go-openapi/spec/url_go18.go deleted file mode 100644 index 60b78515..00000000 --- a/vendor/github.com/go-openapi/spec/url_go18.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !go1.19 -// +build !go1.19 - -package spec - -import "net/url" - -var parseURL = url.Parse diff --git a/vendor/github.com/go-openapi/spec/url_go19.go b/vendor/github.com/go-openapi/spec/url_go19.go index 392e3e63..5bdfe40b 100644 --- a/vendor/github.com/go-openapi/spec/url_go19.go +++ b/vendor/github.com/go-openapi/spec/url_go19.go @@ -1,6 +1,3 @@ -//go:build go1.19 -// +build go1.19 - package spec import "net/url" diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore index d69b53ac..c4b1b64f 100644 --- a/vendor/github.com/go-openapi/swag/.gitignore +++ b/vendor/github.com/go-openapi/swag/.gitignore @@ -2,3 +2,4 @@ secrets.yml vendor Godeps .idea +*.out diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml index bf503e40..80e2be00 100644 --- a/vendor/github.com/go-openapi/swag/.golangci.yml +++ b/vendor/github.com/go-openapi/swag/.golangci.yml @@ -4,14 +4,14 @@ linters-settings: golint: min-confidence: 0 gocyclo: - min-complexity: 25 + min-complexity: 45 maligned: suggest-new: true dupl: - threshold: 100 + threshold: 200 goconst: min-len: 3 - min-occurrences: 2 + min-occurrences: 3 linters: enable-all: true @@ -20,35 +20,41 @@ linters: - lll - gochecknoinits - gochecknoglobals - - nlreturn - - testpackage + - funlen + - godox + - gocognit + - whitespace + - wsl - wrapcheck + - testpackage + - nlreturn - gomnd - - exhaustive - exhaustivestruct - goerr113 - - wsl - - whitespace - - gofumpt - - godot + - errorlint - nestif - - godox - - funlen - - gci - - gocognit + - godot + - gofumpt - paralleltest + - tparallel - thelper - ifshort - - gomoddirectives - - cyclop - - forcetypeassert - - ireturn - - tagliatelle - - varnamelen - - goimports - - tenv - - golint - exhaustruct - - nilnil + - varnamelen + - gci + - depguard + - errchkjson + - inamedparam - nonamedreturns + - musttag + - ireturn + - forcetypeassert + - cyclop + # deprecated linters + - deadcode + - interfacer + - scopelint + - varcheck + - structcheck + - golint - nosnakecase diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md index 217f6fa5..a7292229 100644 --- a/vendor/github.com/go-openapi/swag/README.md +++ b/vendor/github.com/go-openapi/swag/README.md @@ -1,7 +1,8 @@ -# Swag [![Build Status](https://travis-ci.org/go-openapi/swag.svg?branch=master)](https://travis-ci.org/go-openapi/swag) [![codecov](https://codecov.io/gh/go-openapi/swag/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/swag) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) +# Swag [![Build Status](https://github.com/go-openapi/swag/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/swag/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/swag/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/swag) +[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) [![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/go-openapi/swag?status.svg)](http://godoc.org/github.com/go-openapi/swag) +[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/swag.svg)](https://pkg.go.dev/github.com/go-openapi/swag) [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/swag)](https://goreportcard.com/report/github.com/go-openapi/swag) Contains a bunch of helper functions for go-openapi and go-swagger projects. @@ -18,4 +19,5 @@ You may also use it standalone for your projects. This repo has only few dependencies outside of the standard library: -* YAML utilities depend on gopkg.in/yaml.v2 +* YAML utilities depend on `gopkg.in/yaml.v3` +* `github.com/mailru/easyjson v0.7.7` diff --git a/vendor/github.com/go-openapi/swag/post_go19.go b/vendor/github.com/go-openapi/swag/initialism_index.go similarity index 98% rename from vendor/github.com/go-openapi/swag/post_go19.go rename to vendor/github.com/go-openapi/swag/initialism_index.go index 7c7da9c0..03555184 100644 --- a/vendor/github.com/go-openapi/swag/post_go19.go +++ b/vendor/github.com/go-openapi/swag/initialism_index.go @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build go1.9 -// +build go1.9 - package swag import ( diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go index 00038c37..783442fd 100644 --- a/vendor/github.com/go-openapi/swag/loading.go +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -21,6 +21,7 @@ import ( "net/http" "net/url" "os" + "path" "path/filepath" "runtime" "strings" @@ -40,43 +41,97 @@ var LoadHTTPBasicAuthPassword = "" var LoadHTTPCustomHeaders = map[string]string{} // LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in -func LoadFromFileOrHTTP(path string) ([]byte, error) { - return LoadStrategy(path, os.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) +func LoadFromFileOrHTTP(pth string) ([]byte, error) { + return LoadStrategy(pth, os.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(pth) } // LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in // timeout arg allows for per request overriding of the request timeout -func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) { - return LoadStrategy(path, os.ReadFile, loadHTTPBytes(timeout))(path) +func LoadFromFileOrHTTPWithTimeout(pth string, timeout time.Duration) ([]byte, error) { + return LoadStrategy(pth, os.ReadFile, loadHTTPBytes(timeout))(pth) } -// LoadStrategy returns a loader function for a given path or uri -func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) { - if strings.HasPrefix(path, "http") { +// LoadStrategy returns a loader function for a given path or URI. +// +// The load strategy returns the remote load for any path starting with `http`. +// So this works for any URI with a scheme `http` or `https`. +// +// The fallback strategy is to call the local loader. +// +// The local loader takes a local file system path (absolute or relative) as argument, +// or alternatively a `file://...` URI, **without host** (see also below for windows). +// +// There are a few liberalities, initially intended to be tolerant regarding the URI syntax, +// especially on windows. +// +// Before the local loader is called, the given path is transformed: +// - percent-encoded characters are unescaped +// - simple paths (e.g. `./folder/file`) are passed as-is +// - on windows, occurrences of `/` are replaced by `\`, so providing a relative path such a `folder/file` works too. +// +// For paths provided as URIs with the "file" scheme, please note that: +// - `file://` is simply stripped. +// This means that the host part of the URI is not parsed at all. +// For example, `file:///folder/file" becomes "/folder/file`, +// but `file://localhost/folder/file` becomes `localhost/folder/file` on unix systems. +// Similarly, `file://./folder/file` yields `./folder/file`. +// - on windows, `file://...` can take a host so as to specify an UNC share location. +// +// Reminder about windows-specifics: +// - `file://host/folder/file` becomes an UNC path like `\\host\folder\file` (no port specification is supported) +// - `file:///c:/folder/file` becomes `C:\folder\file` +// - `file://c:/folder/file` is tolerated (without leading `/`) and becomes `c:\folder\file` +func LoadStrategy(pth string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) { + if strings.HasPrefix(pth, "http") { return remote } - return func(pth string) ([]byte, error) { - upth, err := pathUnescape(pth) + + return func(p string) ([]byte, error) { + upth, err := url.PathUnescape(p) if err != nil { return nil, err } - if strings.HasPrefix(pth, `file://`) { - if runtime.GOOS == "windows" { - // support for canonical file URIs on windows. - // Zero tolerance here for dodgy URIs. - u, _ := url.Parse(upth) - if u.Host != "" { - // assume UNC name (volume share) - // file://host/share/folder\... ==> \\host\share\path\folder - // NOTE: UNC port not yet supported - upth = strings.Join([]string{`\`, u.Host, u.Path}, `\`) - } else { - // file:///c:/folder/... ==> just remove the leading slash - upth = strings.TrimPrefix(upth, `file:///`) - } - } else { - upth = strings.TrimPrefix(upth, `file://`) + if !strings.HasPrefix(p, `file://`) { + // regular file path provided: just normalize slashes + return local(filepath.FromSlash(upth)) + } + + if runtime.GOOS != "windows" { + // crude processing: this leaves full URIs with a host with a (mostly) unexpected result + upth = strings.TrimPrefix(upth, `file://`) + + return local(filepath.FromSlash(upth)) + } + + // windows-only pre-processing of file://... URIs + + // support for canonical file URIs on windows. + u, err := url.Parse(filepath.ToSlash(upth)) + if err != nil { + return nil, err + } + + if u.Host != "" { + // assume UNC name (volume share) + // NOTE: UNC port not yet supported + + // when the "host" segment is a drive letter: + // file://C:/folder/... => C:\folder + upth = path.Clean(strings.Join([]string{u.Host, u.Path}, `/`)) + if !strings.HasSuffix(u.Host, ":") && u.Host[0] != '.' { + // tolerance: if we have a leading dot, this can't be a host + // file://host/share/folder\... ==> \\host\share\path\folder + upth = "//" + upth + } + } else { + // no host, let's figure out if this is a drive letter + upth = strings.TrimPrefix(upth, `file://`) + first, _, _ := strings.Cut(strings.TrimPrefix(u.Path, "/"), "/") + if strings.HasSuffix(first, ":") { + // drive letter in the first segment: + // file:///c:/folder/... ==> strip the leading slash + upth = strings.TrimPrefix(upth, `/`) } } diff --git a/vendor/github.com/go-openapi/swag/post_go18.go b/vendor/github.com/go-openapi/swag/post_go18.go deleted file mode 100644 index f5228b82..00000000 --- a/vendor/github.com/go-openapi/swag/post_go18.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// 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:build go1.8 -// +build go1.8 - -package swag - -import "net/url" - -func pathUnescape(path string) (string, error) { - return url.PathUnescape(path) -} diff --git a/vendor/github.com/go-openapi/swag/pre_go19.go b/vendor/github.com/go-openapi/swag/pre_go19.go deleted file mode 100644 index 0565db37..00000000 --- a/vendor/github.com/go-openapi/swag/pre_go19.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// 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:build !go1.9 -// +build !go1.9 - -package swag - -import ( - "sort" - "sync" -) - -// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms. -// Before go1.9, this may be implemented with a mutex on the map. -type indexOfInitialisms struct { - getMutex *sync.Mutex - index map[string]bool -} - -func newIndexOfInitialisms() *indexOfInitialisms { - return &indexOfInitialisms{ - getMutex: new(sync.Mutex), - index: make(map[string]bool, 50), - } -} - -func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms { - m.getMutex.Lock() - defer m.getMutex.Unlock() - for k, v := range initial { - m.index[k] = v - } - return m -} - -func (m *indexOfInitialisms) isInitialism(key string) bool { - m.getMutex.Lock() - defer m.getMutex.Unlock() - _, ok := m.index[key] - return ok -} - -func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { - m.getMutex.Lock() - defer m.getMutex.Unlock() - m.index[key] = true - return m -} - -func (m *indexOfInitialisms) sorted() (result []string) { - m.getMutex.Lock() - defer m.getMutex.Unlock() - for k := range m.index { - result = append(result, k) - } - sort.Sort(sort.Reverse(byInitialism(result))) - return -} diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go index d971fbe3..0413f744 100644 --- a/vendor/github.com/go-openapi/swag/util.go +++ b/vendor/github.com/go-openapi/swag/util.go @@ -174,7 +174,7 @@ func (s byInitialism) Less(i, j int) bool { // Removes leading whitespaces func trim(str string) string { - return strings.Trim(str, " ") + return strings.TrimSpace(str) } // Shortcut to strings.ToUpper() @@ -231,7 +231,7 @@ func ToHumanNameLower(name string) string { if !w.IsInitialism() { out = append(out, lower(w.GetOriginal())) } else { - out = append(out, w.GetOriginal()) + out = append(out, trim(w.GetOriginal())) } } @@ -244,7 +244,7 @@ func ToHumanNameTitle(name string) string { out := make([]string, 0, len(in)) for _, w := range in { - original := w.GetOriginal() + original := trim(w.GetOriginal()) if !w.IsInitialism() { out = append(out, Camelize(original)) } else { @@ -264,7 +264,7 @@ func ToJSONName(name string) string { out = append(out, lower(w)) continue } - out = append(out, Camelize(w)) + out = append(out, Camelize(trim(w))) } return strings.Join(out, "") } @@ -343,7 +343,7 @@ type zeroable interface { func IsZero(data interface{}) bool { v := reflect.ValueOf(data) // check for nil data - switch v.Kind() { + switch v.Kind() { //nolint:exhaustive case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: if v.IsNil() { return true @@ -356,7 +356,7 @@ func IsZero(data interface{}) bool { } // continue with slightly more complex reflection - switch v.Kind() { + switch v.Kind() { //nolint:exhaustive case reflect.String: return v.Len() == 0 case reflect.Bool: diff --git a/vendor/github.com/go-openapi/swag/yaml.go b/vendor/github.com/go-openapi/swag/yaml.go index f09ee609..a8c4e359 100644 --- a/vendor/github.com/go-openapi/swag/yaml.go +++ b/vendor/github.com/go-openapi/swag/yaml.go @@ -18,6 +18,8 @@ import ( "encoding/json" "fmt" "path/filepath" + "reflect" + "sort" "strconv" "github.com/mailru/easyjson/jlexer" @@ -147,7 +149,7 @@ func yamlScalar(node *yaml.Node) (interface{}, error) { case yamlTimestamp: return node.Value, nil case yamlNull: - return nil, nil + return nil, nil //nolint:nilnil default: return nil, fmt.Errorf("YAML tag %q is not supported", node.LongTag()) } @@ -245,7 +247,27 @@ func (s JSONMapSlice) MarshalYAML() (interface{}, error) { return yaml.Marshal(&n) } +func isNil(input interface{}) bool { + if input == nil { + return true + } + kind := reflect.TypeOf(input).Kind() + switch kind { //nolint:exhaustive + case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Chan: + return reflect.ValueOf(input).IsNil() + default: + return false + } +} + func json2yaml(item interface{}) (*yaml.Node, error) { + if isNil(item) { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Value: "null", + }, nil + } + switch val := item.(type) { case JSONMapSlice: var n yaml.Node @@ -265,7 +287,14 @@ func json2yaml(item interface{}) (*yaml.Node, error) { case map[string]interface{}: var n yaml.Node n.Kind = yaml.MappingNode - for k, v := range val { + keys := make([]string, 0, len(val)) + for k := range val { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, k := range keys { + v := val[k] childNode, err := json2yaml(v) if err != nil { return nil, err @@ -318,8 +347,9 @@ func json2yaml(item interface{}) (*yaml.Node, error) { Tag: yamlBoolScalar, Value: strconv.FormatBool(val), }, nil + default: + return nil, fmt.Errorf("unhandled type: %T", val) } - return nil, nil } // JSONMapItem represents the value of a key in a JSON object held by JSONMapSlice diff --git a/vendor/github.com/go-playground/validator/v10/README.md b/vendor/github.com/go-playground/validator/v10/README.md index 30b60f80..dbbafc3e 100644 --- a/vendor/github.com/go-playground/validator/v10/README.md +++ b/vendor/github.com/go-playground/validator/v10/README.md @@ -1,7 +1,7 @@ Package validator ================= [![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![Project status](https://img.shields.io/badge/version-10.15.3-green.svg) +![Project status](https://img.shields.io/badge/version-10.16.0-green.svg) [![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator) [![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) @@ -178,6 +178,7 @@ validate := validator.New(validator.WithRequiredStructEnabled()) | isbn | International Standard Book Number | | isbn10 | International Standard Book Number 10 | | isbn13 | International Standard Book Number 13 | +| issn | International Standard Serial Number | | iso3166_1_alpha2 | Two-letter country code (ISO 3166-1 alpha-2) | | iso3166_1_alpha3 | Three-letter country code (ISO 3166-1 alpha-3) | | iso3166_1_alpha_numeric | Numeric country code (ISO 3166-1 numeric) | diff --git a/vendor/github.com/go-playground/validator/v10/baked_in.go b/vendor/github.com/go-playground/validator/v10/baked_in.go index cc92b784..95f56e00 100644 --- a/vendor/github.com/go-playground/validator/v10/baked_in.go +++ b/vendor/github.com/go-playground/validator/v10/baked_in.go @@ -51,6 +51,7 @@ var ( endKeysTag: {}, structOnlyTag: {}, omitempty: {}, + omitnil: {}, skipValidationTag: {}, utf8HexComma: {}, utf8Pipe: {}, @@ -149,6 +150,7 @@ var ( "isbn": isISBN, "isbn10": isISBN10, "isbn13": isISBN13, + "issn": isISSN, "eth_addr": isEthereumAddress, "eth_addr_checksum": isEthereumAddressChecksum, "btc_addr": isBitcoinAddress, @@ -373,9 +375,9 @@ func isMAC(fl FieldLevel) bool { // isCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address. func isCIDRv4(fl FieldLevel) bool { - ip, _, err := net.ParseCIDR(fl.Field().String()) + ip, net, err := net.ParseCIDR(fl.Field().String()) - return err == nil && ip.To4() != nil + return err == nil && ip.To4() != nil && net.IP.Equal(ip) } // isCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address. @@ -508,47 +510,47 @@ func isASCII(fl FieldLevel) bool { // isUUID5 is the validation function for validating if the field's value is a valid v5 UUID. func isUUID5(fl FieldLevel) bool { - return uUID5Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUID5Regex, fl) } // isUUID4 is the validation function for validating if the field's value is a valid v4 UUID. func isUUID4(fl FieldLevel) bool { - return uUID4Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUID4Regex, fl) } // isUUID3 is the validation function for validating if the field's value is a valid v3 UUID. func isUUID3(fl FieldLevel) bool { - return uUID3Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUID3Regex, fl) } // isUUID is the validation function for validating if the field's value is a valid UUID of any version. func isUUID(fl FieldLevel) bool { - return uUIDRegex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUIDRegex, fl) } // isUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID. func isUUID5RFC4122(fl FieldLevel) bool { - return uUID5RFC4122Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUID5RFC4122Regex, fl) } // isUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID. func isUUID4RFC4122(fl FieldLevel) bool { - return uUID4RFC4122Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUID4RFC4122Regex, fl) } // isUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID. func isUUID3RFC4122(fl FieldLevel) bool { - return uUID3RFC4122Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUID3RFC4122Regex, fl) } // isUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version. func isUUIDRFC4122(fl FieldLevel) bool { - return uUIDRFC4122Regex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uUIDRFC4122Regex, fl) } // isULID is the validation function for validating if the field's value is a valid ULID. func isULID(fl FieldLevel) bool { - return uLIDRegex.MatchString(fl.Field().String()) + return fieldMatchesRegexByStringerValOrString(uLIDRegex, fl) } // isMD4 is the validation function for validating if the field's value is a valid MD4. @@ -650,6 +652,32 @@ func isISBN10(fl FieldLevel) bool { return checksum%11 == 0 } +// isISSN is the validation function for validating if the field's value is a valid ISSN. +func isISSN(fl FieldLevel) bool { + s := fl.Field().String() + + if !iSSNRegex.MatchString(s) { + return false + } + s = strings.ReplaceAll(s, "-", "") + + pos := 8 + checksum := 0 + + for i := 0; i < 7; i++ { + checksum += pos * int(s[i]-'0') + pos-- + } + + if s[7] == 'X' { + checksum += 10 + } else { + checksum += int(s[7] - '0') + } + + return checksum%11 == 0 +} + // isEthereumAddress is the validation function for validating if the field's value is a valid Ethereum address. func isEthereumAddress(fl FieldLevel) bool { address := fl.Field().String() @@ -1413,6 +1441,15 @@ func isURI(fl FieldLevel) bool { panic(fmt.Sprintf("Bad field type %T", field.Interface())) } +// isFileURL is the helper function for validating if the `path` valid file URL as per RFC8089 +func isFileURL(path string) bool { + if !strings.HasPrefix(path, "file:/") { + return false + } + _, err := url.ParseRequestURI(path) + return err == nil +} + // isURL is the validation function for validating if the current field's value is a valid URL. func isURL(fl FieldLevel) bool { field := fl.Field() @@ -1420,12 +1457,16 @@ func isURL(fl FieldLevel) bool { switch field.Kind() { case reflect.String: - s := field.String() + s := strings.ToLower(field.String()) if len(s) == 0 { return false } + if isFileURL(s) { + return true + } + url, err := url.Parse(s) if err != nil || url.Scheme == "" { return false diff --git a/vendor/github.com/go-playground/validator/v10/cache.go b/vendor/github.com/go-playground/validator/v10/cache.go index bbfd2a4a..0f4fa6b5 100644 --- a/vendor/github.com/go-playground/validator/v10/cache.go +++ b/vendor/github.com/go-playground/validator/v10/cache.go @@ -20,6 +20,7 @@ const ( typeOr typeKeys typeEndKeys + typeOmitNil ) const ( @@ -252,6 +253,10 @@ func (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias s current.typeof = typeOmitEmpty continue + case omitnil: + current.typeof = typeOmitNil + continue + case structOnlyTag: current.typeof = typeStructOnly continue diff --git a/vendor/github.com/go-playground/validator/v10/doc.go b/vendor/github.com/go-playground/validator/v10/doc.go index c4dbb595..b4740918 100644 --- a/vendor/github.com/go-playground/validator/v10/doc.go +++ b/vendor/github.com/go-playground/validator/v10/doc.go @@ -194,6 +194,13 @@ such as min or max won't run, but if a value is set validation will run. Usage: omitempty +# Omit Nil + +Allows to skip the validation if the value is nil (same as omitempty, but +only for the nil-values). + + Usage: omitnil + # Dive This tells the validator to dive into a slice, array or map and validate that diff --git a/vendor/github.com/go-playground/validator/v10/regexes.go b/vendor/github.com/go-playground/validator/v10/regexes.go index 6c8f9856..af98d8da 100644 --- a/vendor/github.com/go-playground/validator/v10/regexes.go +++ b/vendor/github.com/go-playground/validator/v10/regexes.go @@ -22,6 +22,7 @@ const ( base64RawURLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2,4})$" iSBN10RegexString = "^(?:[0-9]{9}X|[0-9]{10})$" iSBN13RegexString = "^(?:(?:97(?:8|9))[0-9]{10})$" + iSSNRegexString = "^(?:[0-9]{4}-[0-9]{3}[0-9X])$" uUID3RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" uUID4RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" uUID5RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" @@ -93,6 +94,7 @@ var ( base64RawURLRegex = regexp.MustCompile(base64RawURLRegexString) iSBN10Regex = regexp.MustCompile(iSBN10RegexString) iSBN13Regex = regexp.MustCompile(iSBN13RegexString) + iSSNRegex = regexp.MustCompile(iSSNRegexString) uUID3Regex = regexp.MustCompile(uUID3RegexString) uUID4Regex = regexp.MustCompile(uUID4RegexString) uUID5Regex = regexp.MustCompile(uUID5RegexString) diff --git a/vendor/github.com/go-playground/validator/v10/util.go b/vendor/github.com/go-playground/validator/v10/util.go index 4bd947bd..16851593 100644 --- a/vendor/github.com/go-playground/validator/v10/util.go +++ b/vendor/github.com/go-playground/validator/v10/util.go @@ -1,7 +1,9 @@ package validator import ( + "fmt" "reflect" + "regexp" "strconv" "strings" "time" @@ -292,3 +294,18 @@ func panicIf(err error) { panic(err.Error()) } } + +// Checks if field value matches regex. If fl.Field can be cast to Stringer, it uses the Stringer interfaces +// String() return value. Otherwise, it uses fl.Field's String() value. +func fieldMatchesRegexByStringerValOrString(regex *regexp.Regexp, fl FieldLevel) bool { + switch fl.Field().Kind() { + case reflect.String: + return regex.MatchString(fl.Field().String()) + default: + if stringer, ok := fl.Field().Interface().(fmt.Stringer); ok { + return regex.MatchString(stringer.String()) + } else { + return regex.MatchString(fl.Field().String()) + } + } +} diff --git a/vendor/github.com/go-playground/validator/v10/validator.go b/vendor/github.com/go-playground/validator/v10/validator.go index 2cae8f7e..a072d39c 100644 --- a/vendor/github.com/go-playground/validator/v10/validator.go +++ b/vendor/github.com/go-playground/validator/v10/validator.go @@ -112,6 +112,10 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr return } + if ct.typeof == typeOmitNil && (kind != reflect.Invalid && current.IsNil()) { + return + } + if ct.hasTag { if kind == reflect.Invalid { v.str1 = string(append(ns, cf.altName...)) @@ -173,7 +177,7 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr // structs. Since it's basically nonsensical to use `required` with a non-pointer struct // are explicitly skipping the required validation for it. This WILL be removed in the // next major version. - if !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag { + if isNestedStruct && !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag { ct = ct.next } } @@ -233,6 +237,26 @@ OUTER: ct = ct.next continue + case typeOmitNil: + v.slflParent = parent + v.flField = current + v.cf = cf + v.ct = ct + + switch field := v.Field(); field.Kind() { + case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: + if field.IsNil() { + return + } + default: + if v.fldIsPointer && field.Interface() == nil { + return + } + } + + ct = ct.next + continue + case typeEndKeys: return diff --git a/vendor/github.com/go-playground/validator/v10/validator_instance.go b/vendor/github.com/go-playground/validator/v10/validator_instance.go index a4dbdd09..d5a7be1d 100644 --- a/vendor/github.com/go-playground/validator/v10/validator_instance.go +++ b/vendor/github.com/go-playground/validator/v10/validator_instance.go @@ -22,6 +22,7 @@ const ( structOnlyTag = "structonly" noStructLevelTag = "nostructlevel" omitempty = "omitempty" + omitnil = "omitnil" isdefault = "isdefault" requiredWithoutAllTag = "required_without_all" requiredWithoutTag = "required_without" diff --git a/vendor/github.com/golang-jwt/jwt/v5/MIGRATION_GUIDE.md b/vendor/github.com/golang-jwt/jwt/v5/MIGRATION_GUIDE.md index 6ad1c22b..ff9c57e1 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/MIGRATION_GUIDE.md +++ b/vendor/github.com/golang-jwt/jwt/v5/MIGRATION_GUIDE.md @@ -17,7 +17,7 @@ and corresponding updates for existing programs. ## Parsing and Validation Options -Under the hood, a new `validator` struct takes care of validating the claims. A +Under the hood, a new `Validator` struct takes care of validating the claims. A long awaited feature has been the option to fine-tune the validation of tokens. This is now possible with several `ParserOption` functions that can be appended to most `Parse` functions, such as `ParseWithClaims`. The most important options @@ -68,6 +68,16 @@ type Claims interface { } ``` +Users that previously directly called the `Valid` function on their claims, +e.g., to perform validation independently of parsing/verifying a token, can now +use the `jwt.NewValidator` function to create a `Validator` independently of the +`Parser`. + +```go +var v = jwt.NewValidator(jwt.WithLeeway(5*time.Second)) +v.Validate(myClaims) +``` + ### Supported Claim Types and Removal of `StandardClaims` The two standard claim types supported by this library, `MapClaims` and @@ -169,7 +179,7 @@ be a drop-in replacement, if you're having troubles migrating, please open an issue. You can replace all occurrences of `github.com/dgrijalva/jwt-go` or -`github.com/golang-jwt/jwt` with `github.com/golang-jwt/jwt/v5`, either manually +`github.com/golang-jwt/jwt` with `github.com/golang-jwt/jwt/v4`, either manually or by using tools such as `sed` or `gofmt`. And then you'd typically run: diff --git a/vendor/github.com/golang-jwt/jwt/v5/ecdsa.go b/vendor/github.com/golang-jwt/jwt/v5/ecdsa.go index 4ccae2a8..ca85659b 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/ecdsa.go +++ b/vendor/github.com/golang-jwt/jwt/v5/ecdsa.go @@ -62,7 +62,7 @@ func (m *SigningMethodECDSA) Verify(signingString string, sig []byte, key interf case *ecdsa.PublicKey: ecdsaKey = k default: - return ErrInvalidKeyType + return newError("ECDSA verify expects *ecsda.PublicKey", ErrInvalidKeyType) } if len(sig) != 2*m.KeySize { @@ -96,7 +96,7 @@ func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) ([]byte case *ecdsa.PrivateKey: ecdsaKey = k default: - return nil, ErrInvalidKeyType + return nil, newError("ECDSA sign expects *ecsda.PrivateKey", ErrInvalidKeyType) } // Create the hasher diff --git a/vendor/github.com/golang-jwt/jwt/v5/ed25519.go b/vendor/github.com/golang-jwt/jwt/v5/ed25519.go index 3db00e4a..c2138119 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/ed25519.go +++ b/vendor/github.com/golang-jwt/jwt/v5/ed25519.go @@ -1,11 +1,10 @@ package jwt import ( - "errors" - "crypto" "crypto/ed25519" "crypto/rand" + "errors" ) var ( @@ -39,7 +38,7 @@ func (m *SigningMethodEd25519) Verify(signingString string, sig []byte, key inte var ok bool if ed25519Key, ok = key.(ed25519.PublicKey); !ok { - return ErrInvalidKeyType + return newError("Ed25519 verify expects ed25519.PublicKey", ErrInvalidKeyType) } if len(ed25519Key) != ed25519.PublicKeySize { @@ -61,7 +60,7 @@ func (m *SigningMethodEd25519) Sign(signingString string, key interface{}) ([]by var ok bool if ed25519Key, ok = key.(crypto.Signer); !ok { - return nil, ErrInvalidKeyType + return nil, newError("Ed25519 sign expects crypto.Signer", ErrInvalidKeyType) } if _, ok := ed25519Key.Public().(ed25519.PublicKey); !ok { diff --git a/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go b/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go index 3afb04e6..2ad542f0 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go +++ b/vendor/github.com/golang-jwt/jwt/v5/errors_go_other.go @@ -22,7 +22,7 @@ func (je joinedError) Is(err error) bool { // wrappedErrors is a workaround for wrapping multiple errors in environments // where Go 1.20 is not available. It basically uses the already implemented -// functionatlity of joinedError to handle multiple errors with supplies a +// functionality of joinedError to handle multiple errors with supplies a // custom error message that is identical to the one we produce in Go 1.20 using // multiple %w directives. type wrappedErrors struct { diff --git a/vendor/github.com/golang-jwt/jwt/v5/hmac.go b/vendor/github.com/golang-jwt/jwt/v5/hmac.go index 91b688ba..96c62722 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/hmac.go +++ b/vendor/github.com/golang-jwt/jwt/v5/hmac.go @@ -59,7 +59,7 @@ func (m *SigningMethodHMAC) Verify(signingString string, sig []byte, key interfa // Verify the key is the right type keyBytes, ok := key.([]byte) if !ok { - return ErrInvalidKeyType + return newError("HMAC verify expects []byte", ErrInvalidKeyType) } // Can we use the specified hashing method? @@ -91,7 +91,7 @@ func (m *SigningMethodHMAC) Verify(signingString string, sig []byte, key interfa func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) ([]byte, error) { if keyBytes, ok := key.([]byte); ok { if !m.Hash.Available() { - return nil, ErrHashUnavailable + return nil, newError("HMAC sign expects []byte", ErrInvalidKeyType) } hasher := hmac.New(m.Hash.New, keyBytes) diff --git a/vendor/github.com/golang-jwt/jwt/v5/none.go b/vendor/github.com/golang-jwt/jwt/v5/none.go index c93daa58..685c2ea3 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/none.go +++ b/vendor/github.com/golang-jwt/jwt/v5/none.go @@ -32,7 +32,7 @@ func (m *signingMethodNone) Verify(signingString string, sig []byte, key interfa return NoneSignatureTypeDisallowedError } // If signing method is none, signature must be an empty string - if string(sig) != "" { + if len(sig) != 0 { return newError("'none' signing method with non-empty signature", ErrTokenUnverifiable) } diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser.go b/vendor/github.com/golang-jwt/jwt/v5/parser.go index f4386fba..ecf99af7 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/parser.go +++ b/vendor/github.com/golang-jwt/jwt/v5/parser.go @@ -18,7 +18,7 @@ type Parser struct { // Skip claims validation during token parsing. skipClaimsValidation bool - validator *validator + validator *Validator decodeStrict bool @@ -28,7 +28,7 @@ type Parser struct { // NewParser creates a new Parser with the specified options func NewParser(options ...ParserOption) *Parser { p := &Parser{ - validator: &validator{}, + validator: &Validator{}, } // Loop through our parsing options and apply them @@ -74,24 +74,40 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf } } - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, newError("no keyfunc was provided", ErrTokenUnverifiable) - } - if key, err = keyFunc(token); err != nil { - return token, newError("error while executing keyfunc", ErrTokenUnverifiable, err) - } - // Decode signature token.Signature, err = p.DecodeSegment(parts[2]) if err != nil { return token, newError("could not base64 decode signature", ErrTokenMalformed, err) } + text := strings.Join(parts[0:2], ".") - // Perform signature validation - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { + // Lookup key(s) + if keyFunc == nil { + // keyFunc was not provided. short circuiting validation + return token, newError("no keyfunc was provided", ErrTokenUnverifiable) + } + + got, err := keyFunc(token) + if err != nil { + return token, newError("error while executing keyfunc", ErrTokenUnverifiable, err) + } + + switch have := got.(type) { + case VerificationKeySet: + if len(have.Keys) == 0 { + return token, newError("keyfunc returned empty verification key set", ErrTokenUnverifiable) + } + // Iterate through keys and verify signature, skipping the rest when a match is found. + // Return the last error if no match is found. + for _, key := range have.Keys { + if err = token.Method.Verify(text, token.Signature, key); err == nil { + break + } + } + default: + err = token.Method.Verify(text, token.Signature, have) + } + if err != nil { return token, newError("", ErrTokenSignatureInvalid, err) } @@ -99,7 +115,7 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf if !p.skipClaimsValidation { // Make sure we have at least a default validator if p.validator == nil { - p.validator = newValidator() + p.validator = NewValidator() } if err := p.validator.Validate(claims); err != nil { @@ -117,8 +133,8 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf // // WARNING: Don't use this method unless you know what you're doing. // -// It's only ever useful in cases where you know the signature is valid (because it has -// been checked previously in the stack) and you want to extract values from it. +// It's only ever useful in cases where you know the signature is valid (since it has already +// been or will be checked elsewhere in the stack) and you want to extract values from it. func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { parts = strings.Split(tokenString, ".") if len(parts) != 3 { @@ -130,9 +146,6 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke // parse Header var headerBytes []byte if headerBytes, err = p.DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, parts, newError("tokenstring should not contain 'bearer '", ErrTokenMalformed) - } return token, parts, newError("could not base64 decode header", ErrTokenMalformed, err) } if err = json.Unmarshal(headerBytes, &token.Header); err != nil { @@ -140,23 +153,33 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke } // parse Claims - var claimBytes []byte token.Claims = claims - if claimBytes, err = p.DecodeSegment(parts[1]); err != nil { + claimBytes, err := p.DecodeSegment(parts[1]) + if err != nil { return token, parts, newError("could not base64 decode claim", ErrTokenMalformed, err) } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.useJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) + + // If `useJSONNumber` is enabled then we must use *json.Decoder to decode + // the claims. However, this comes with a performance penalty so only use + // it if we must and, otherwise, simple use json.Unmarshal. + if !p.useJSONNumber { + // JSON Unmarshal. Special case for map type to avoid weird pointer behavior. + if c, ok := token.Claims.(MapClaims); ok { + err = json.Unmarshal(claimBytes, &c) + } else { + err = json.Unmarshal(claimBytes, &claims) + } } else { - err = dec.Decode(&claims) + dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) + dec.UseNumber() + // JSON Decode. Special case for map type to avoid weird pointer behavior. + if c, ok := token.Claims.(MapClaims); ok { + err = dec.Decode(&c) + } else { + err = dec.Decode(&claims) + } } - // Handle decode error if err != nil { return token, parts, newError("could not JSON decode claim", ErrTokenMalformed, err) } diff --git a/vendor/github.com/golang-jwt/jwt/v5/parser_option.go b/vendor/github.com/golang-jwt/jwt/v5/parser_option.go index 1b5af970..88a780fb 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/parser_option.go +++ b/vendor/github.com/golang-jwt/jwt/v5/parser_option.go @@ -58,6 +58,14 @@ func WithIssuedAt() ParserOption { } } +// WithExpirationRequired returns the ParserOption to make exp claim required. +// By default exp claim is optional. +func WithExpirationRequired() ParserOption { + return func(p *Parser) { + p.validator.requireExp = true + } +} + // WithAudience configures the validator to require the specified audience in // the `aud` claim. Validation will fail if the audience is not listed in the // token or the `aud` claim is missing. diff --git a/vendor/github.com/golang-jwt/jwt/v5/rsa.go b/vendor/github.com/golang-jwt/jwt/v5/rsa.go index daff0943..83cbee6a 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/rsa.go +++ b/vendor/github.com/golang-jwt/jwt/v5/rsa.go @@ -51,7 +51,7 @@ func (m *SigningMethodRSA) Verify(signingString string, sig []byte, key interfac var ok bool if rsaKey, ok = key.(*rsa.PublicKey); !ok { - return ErrInvalidKeyType + return newError("RSA verify expects *rsa.PublicKey", ErrInvalidKeyType) } // Create hasher @@ -73,7 +73,7 @@ func (m *SigningMethodRSA) Sign(signingString string, key interface{}) ([]byte, // Validate type of key if rsaKey, ok = key.(*rsa.PrivateKey); !ok { - return nil, ErrInvalidKey + return nil, newError("RSA sign expects *rsa.PrivateKey", ErrInvalidKeyType) } // Create the hasher diff --git a/vendor/github.com/golang-jwt/jwt/v5/rsa_pss.go b/vendor/github.com/golang-jwt/jwt/v5/rsa_pss.go index 9599f0a4..28c386ec 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/rsa_pss.go +++ b/vendor/github.com/golang-jwt/jwt/v5/rsa_pss.go @@ -88,7 +88,7 @@ func (m *SigningMethodRSAPSS) Verify(signingString string, sig []byte, key inter case *rsa.PublicKey: rsaKey = k default: - return ErrInvalidKey + return newError("RSA-PSS verify expects *rsa.PublicKey", ErrInvalidKeyType) } // Create hasher @@ -115,7 +115,7 @@ func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) ([]byt case *rsa.PrivateKey: rsaKey = k default: - return nil, ErrInvalidKeyType + return nil, newError("RSA-PSS sign expects *rsa.PrivateKey", ErrInvalidKeyType) } // Create the hasher diff --git a/vendor/github.com/golang-jwt/jwt/v5/token.go b/vendor/github.com/golang-jwt/jwt/v5/token.go index c8ad7c78..352873a2 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/token.go +++ b/vendor/github.com/golang-jwt/jwt/v5/token.go @@ -1,6 +1,7 @@ package jwt import ( + "crypto" "encoding/base64" "encoding/json" ) @@ -9,8 +10,21 @@ import ( // the key for verification. The function receives the parsed, but unverified // Token. This allows you to use properties in the Header of the token (such as // `kid`) to identify which key to use. +// +// The returned interface{} may be a single key or a VerificationKeySet containing +// multiple keys. type Keyfunc func(*Token) (interface{}, error) +// VerificationKey represents a public or secret key for verifying a token's signature. +type VerificationKey interface { + crypto.PublicKey | []uint8 +} + +// VerificationKeySet is a set of public or secret keys. It is used by the parser to verify a token. +type VerificationKeySet struct { + Keys []VerificationKey +} + // Token represents a JWT Token. Different fields will be used depending on // whether you're creating or parsing/verifying a token. type Token struct { diff --git a/vendor/github.com/golang-jwt/jwt/v5/types.go b/vendor/github.com/golang-jwt/jwt/v5/types.go index b82b3886..b2655a9e 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/types.go +++ b/vendor/github.com/golang-jwt/jwt/v5/types.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "math" - "reflect" "strconv" "time" ) @@ -121,14 +120,14 @@ func (s *ClaimStrings) UnmarshalJSON(data []byte) (err error) { for _, vv := range v { vs, ok := vv.(string) if !ok { - return &json.UnsupportedTypeError{Type: reflect.TypeOf(vv)} + return ErrInvalidType } aud = append(aud, vs) } case nil: return nil default: - return &json.UnsupportedTypeError{Type: reflect.TypeOf(v)} + return ErrInvalidType } *s = aud diff --git a/vendor/github.com/golang-jwt/jwt/v5/validator.go b/vendor/github.com/golang-jwt/jwt/v5/validator.go index 38504389..008ecd87 100644 --- a/vendor/github.com/golang-jwt/jwt/v5/validator.go +++ b/vendor/github.com/golang-jwt/jwt/v5/validator.go @@ -28,13 +28,12 @@ type ClaimsValidator interface { Validate() error } -// validator is the core of the new Validation API. It is automatically used by +// Validator is the core of the new Validation API. It is automatically used by // a [Parser] during parsing and can be modified with various parser options. // -// Note: This struct is intentionally not exported (yet) as we want to -// internally finalize its API. In the future, we might make it publicly -// available. -type validator struct { +// The [NewValidator] function should be used to create an instance of this +// struct. +type Validator struct { // leeway is an optional leeway that can be provided to account for clock skew. leeway time.Duration @@ -42,6 +41,9 @@ type validator struct { // validation. If unspecified, this defaults to time.Now. timeFunc func() time.Time + // requireExp specifies whether the exp claim is required + requireExp bool + // verifyIat specifies whether the iat (Issued At) claim will be verified. // According to https://www.rfc-editor.org/rfc/rfc7519#section-4.1.6 this // only specifies the age of the token, but no validation check is @@ -62,16 +64,28 @@ type validator struct { expectedSub string } -// newValidator can be used to create a stand-alone validator with the supplied +// NewValidator can be used to create a stand-alone validator with the supplied // options. This validator can then be used to validate already parsed claims. -func newValidator(opts ...ParserOption) *validator { +// +// Note: Under normal circumstances, explicitly creating a validator is not +// needed and can potentially be dangerous; instead functions of the [Parser] +// class should be used. +// +// The [Validator] is only checking the *validity* of the claims, such as its +// expiration time, but it does NOT perform *signature verification* of the +// token. +func NewValidator(opts ...ParserOption) *Validator { p := NewParser(opts...) return p.validator } // Validate validates the given claims. It will also perform any custom // validation if claims implements the [ClaimsValidator] interface. -func (v *validator) Validate(claims Claims) error { +// +// Note: It will NOT perform any *signature verification* on the token that +// contains the claims and expects that the [Claim] was already successfully +// verified. +func (v *Validator) Validate(claims Claims) error { var ( now time.Time errs []error = make([]error, 0, 6) @@ -86,8 +100,9 @@ func (v *validator) Validate(claims Claims) error { } // We always need to check the expiration time, but usage of the claim - // itself is OPTIONAL. - if err = v.verifyExpiresAt(claims, now, false); err != nil { + // itself is OPTIONAL by default. requireExp overrides this behavior + // and makes the exp claim mandatory. + if err = v.verifyExpiresAt(claims, now, v.requireExp); err != nil { errs = append(errs, err) } @@ -149,7 +164,7 @@ func (v *validator) Validate(claims Claims) error { // // Additionally, if any error occurs while retrieving the claim, e.g., when its // the wrong type, an ErrTokenUnverifiable error will be returned. -func (v *validator) verifyExpiresAt(claims Claims, cmp time.Time, required bool) error { +func (v *Validator) verifyExpiresAt(claims Claims, cmp time.Time, required bool) error { exp, err := claims.GetExpirationTime() if err != nil { return err @@ -170,7 +185,7 @@ func (v *validator) verifyExpiresAt(claims Claims, cmp time.Time, required bool) // // Additionally, if any error occurs while retrieving the claim, e.g., when its // the wrong type, an ErrTokenUnverifiable error will be returned. -func (v *validator) verifyIssuedAt(claims Claims, cmp time.Time, required bool) error { +func (v *Validator) verifyIssuedAt(claims Claims, cmp time.Time, required bool) error { iat, err := claims.GetIssuedAt() if err != nil { return err @@ -191,7 +206,7 @@ func (v *validator) verifyIssuedAt(claims Claims, cmp time.Time, required bool) // // Additionally, if any error occurs while retrieving the claim, e.g., when its // the wrong type, an ErrTokenUnverifiable error will be returned. -func (v *validator) verifyNotBefore(claims Claims, cmp time.Time, required bool) error { +func (v *Validator) verifyNotBefore(claims Claims, cmp time.Time, required bool) error { nbf, err := claims.GetNotBefore() if err != nil { return err @@ -211,7 +226,7 @@ func (v *validator) verifyNotBefore(claims Claims, cmp time.Time, required bool) // // Additionally, if any error occurs while retrieving the claim, e.g., when its // the wrong type, an ErrTokenUnverifiable error will be returned. -func (v *validator) verifyAudience(claims Claims, cmp string, required bool) error { +func (v *Validator) verifyAudience(claims Claims, cmp string, required bool) error { aud, err := claims.GetAudience() if err != nil { return err @@ -247,7 +262,7 @@ func (v *validator) verifyAudience(claims Claims, cmp string, required bool) err // // Additionally, if any error occurs while retrieving the claim, e.g., when its // the wrong type, an ErrTokenUnverifiable error will be returned. -func (v *validator) verifyIssuer(claims Claims, cmp string, required bool) error { +func (v *Validator) verifyIssuer(claims Claims, cmp string, required bool) error { iss, err := claims.GetIssuer() if err != nil { return err @@ -267,7 +282,7 @@ func (v *validator) verifyIssuer(claims Claims, cmp string, required bool) error // // Additionally, if any error occurs while retrieving the claim, e.g., when its // the wrong type, an ErrTokenUnverifiable error will be returned. -func (v *validator) verifySubject(claims Claims, cmp string, required bool) error { +func (v *Validator) verifySubject(claims Claims, cmp string, required bool) error { sub, err := claims.GetSubject() if err != nil { return err diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS deleted file mode 100644 index 15167cd7..00000000 --- a/vendor/github.com/golang/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# 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 deleted file mode 100644 index 1c4577e9..00000000 --- a/vendor/github.com/golang/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# 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 deleted file mode 100644 index 0f646931..00000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -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/proto/buffer.go b/vendor/github.com/golang/protobuf/proto/buffer.go deleted file mode 100644 index e810e6fe..00000000 --- a/vendor/github.com/golang/protobuf/proto/buffer.go +++ /dev/null @@ -1,324 +0,0 @@ -// 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 file. - -package proto - -import ( - "errors" - "fmt" - - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - WireVarint = 0 - WireFixed32 = 5 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 -) - -// EncodeVarint returns the varint encoded bytes of v. -func EncodeVarint(v uint64) []byte { - return protowire.AppendVarint(nil, v) -} - -// SizeVarint returns the length of the varint encoded bytes of v. -// This is equal to len(EncodeVarint(v)). -func SizeVarint(v uint64) int { - return protowire.SizeVarint(v) -} - -// DecodeVarint parses a varint encoded integer from b, -// returning the integer value and the length of the varint. -// It returns (0, 0) if there is a parse error. -func DecodeVarint(b []byte) (uint64, int) { - v, n := protowire.ConsumeVarint(b) - if n < 0 { - return 0, 0 - } - return v, n -} - -// Buffer is a buffer for encoding and decoding the protobuf wire format. -// It may be reused between invocations to reduce memory usage. -type Buffer struct { - buf []byte - idx int - deterministic bool -} - -// NewBuffer allocates a new Buffer initialized with buf, -// where the contents of buf are considered the unread portion of the buffer. -func NewBuffer(buf []byte) *Buffer { - return &Buffer{buf: buf} -} - -// SetDeterministic specifies 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 (b *Buffer) SetDeterministic(deterministic bool) { - b.deterministic = deterministic -} - -// SetBuf sets buf as the internal buffer, -// where the contents of buf are considered the unread portion of the buffer. -func (b *Buffer) SetBuf(buf []byte) { - b.buf = buf - b.idx = 0 -} - -// Reset clears the internal buffer of all written and unread data. -func (b *Buffer) Reset() { - b.buf = b.buf[:0] - b.idx = 0 -} - -// Bytes returns the internal buffer. -func (b *Buffer) Bytes() []byte { - return b.buf -} - -// Unread returns the unread portion of the buffer. -func (b *Buffer) Unread() []byte { - return b.buf[b.idx:] -} - -// Marshal appends the wire-format encoding of m to the buffer. -func (b *Buffer) Marshal(m Message) error { - var err error - b.buf, err = marshalAppend(b.buf, m, b.deterministic) - return err -} - -// Unmarshal parses the wire-format message in the buffer and -// places the decoded results in m. -// It does not reset m before unmarshaling. -func (b *Buffer) Unmarshal(m Message) error { - err := UnmarshalMerge(b.Unread(), m) - b.idx = len(b.buf) - return err -} - -type unknownFields struct{ XXX_unrecognized protoimpl.UnknownFields } - -func (m *unknownFields) String() string { panic("not implemented") } -func (m *unknownFields) Reset() { panic("not implemented") } -func (m *unknownFields) ProtoMessage() { panic("not implemented") } - -// DebugPrint dumps the encoded bytes of b with a header and footer including s -// to stdout. This is only intended for debugging. -func (*Buffer) DebugPrint(s string, b []byte) { - m := MessageReflect(new(unknownFields)) - m.SetUnknown(b) - b, _ = prototext.MarshalOptions{AllowPartial: true, Indent: "\t"}.Marshal(m.Interface()) - fmt.Printf("==== %s ====\n%s==== %s ====\n", s, b, s) -} - -// EncodeVarint appends an unsigned varint encoding to the buffer. -func (b *Buffer) EncodeVarint(v uint64) error { - b.buf = protowire.AppendVarint(b.buf, v) - return nil -} - -// EncodeZigzag32 appends a 32-bit zig-zag varint encoding to the buffer. -func (b *Buffer) EncodeZigzag32(v uint64) error { - return b.EncodeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) -} - -// EncodeZigzag64 appends a 64-bit zig-zag varint encoding to the buffer. -func (b *Buffer) EncodeZigzag64(v uint64) error { - return b.EncodeVarint(uint64((uint64(v) << 1) ^ uint64((int64(v) >> 63)))) -} - -// EncodeFixed32 appends a 32-bit little-endian integer to the buffer. -func (b *Buffer) EncodeFixed32(v uint64) error { - b.buf = protowire.AppendFixed32(b.buf, uint32(v)) - return nil -} - -// EncodeFixed64 appends a 64-bit little-endian integer to the buffer. -func (b *Buffer) EncodeFixed64(v uint64) error { - b.buf = protowire.AppendFixed64(b.buf, uint64(v)) - return nil -} - -// EncodeRawBytes appends a length-prefixed raw bytes to the buffer. -func (b *Buffer) EncodeRawBytes(v []byte) error { - b.buf = protowire.AppendBytes(b.buf, v) - return nil -} - -// EncodeStringBytes appends a length-prefixed raw bytes to the buffer. -// It does not validate whether v contains valid UTF-8. -func (b *Buffer) EncodeStringBytes(v string) error { - b.buf = protowire.AppendString(b.buf, v) - return nil -} - -// EncodeMessage appends a length-prefixed encoded message to the buffer. -func (b *Buffer) EncodeMessage(m Message) error { - var err error - b.buf = protowire.AppendVarint(b.buf, uint64(Size(m))) - b.buf, err = marshalAppend(b.buf, m, b.deterministic) - return err -} - -// DecodeVarint consumes an encoded unsigned varint from the buffer. -func (b *Buffer) DecodeVarint() (uint64, error) { - v, n := protowire.ConsumeVarint(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeZigzag32 consumes an encoded 32-bit zig-zag varint from the buffer. -func (b *Buffer) DecodeZigzag32() (uint64, error) { - v, err := b.DecodeVarint() - if err != nil { - return 0, err - } - return uint64((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)), nil -} - -// DecodeZigzag64 consumes an encoded 64-bit zig-zag varint from the buffer. -func (b *Buffer) DecodeZigzag64() (uint64, error) { - v, err := b.DecodeVarint() - if err != nil { - return 0, err - } - return uint64((uint64(v) >> 1) ^ uint64((int64(v&1)<<63)>>63)), nil -} - -// DecodeFixed32 consumes a 32-bit little-endian integer from the buffer. -func (b *Buffer) DecodeFixed32() (uint64, error) { - v, n := protowire.ConsumeFixed32(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeFixed64 consumes a 64-bit little-endian integer from the buffer. -func (b *Buffer) DecodeFixed64() (uint64, error) { - v, n := protowire.ConsumeFixed64(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeRawBytes consumes a length-prefixed raw bytes from the buffer. -// If alloc is specified, it returns a copy the raw bytes -// rather than a sub-slice of the buffer. -func (b *Buffer) DecodeRawBytes(alloc bool) ([]byte, error) { - v, n := protowire.ConsumeBytes(b.buf[b.idx:]) - if n < 0 { - return nil, protowire.ParseError(n) - } - b.idx += n - if alloc { - v = append([]byte(nil), v...) - } - return v, nil -} - -// DecodeStringBytes consumes a length-prefixed raw bytes from the buffer. -// It does not validate whether the raw bytes contain valid UTF-8. -func (b *Buffer) DecodeStringBytes() (string, error) { - v, n := protowire.ConsumeString(b.buf[b.idx:]) - if n < 0 { - return "", protowire.ParseError(n) - } - b.idx += n - return v, nil -} - -// DecodeMessage consumes a length-prefixed message from the buffer. -// It does not reset m before unmarshaling. -func (b *Buffer) DecodeMessage(m Message) error { - v, err := b.DecodeRawBytes(false) - if err != nil { - return err - } - return UnmarshalMerge(v, m) -} - -// DecodeGroup consumes a message group from the buffer. -// It assumes that the start group marker has already been consumed and -// consumes all bytes until (and including the end group marker). -// It does not reset m before unmarshaling. -func (b *Buffer) DecodeGroup(m Message) error { - v, n, err := consumeGroup(b.buf[b.idx:]) - if err != nil { - return err - } - b.idx += n - return UnmarshalMerge(v, m) -} - -// consumeGroup parses b until it finds an end group marker, returning -// the raw bytes of the message (excluding the end group marker) and the -// the total length of the message (including the end group marker). -func consumeGroup(b []byte) ([]byte, int, error) { - b0 := b - depth := 1 // assume this follows a start group marker - for { - _, wtyp, tagLen := protowire.ConsumeTag(b) - if tagLen < 0 { - return nil, 0, protowire.ParseError(tagLen) - } - b = b[tagLen:] - - var valLen int - switch wtyp { - case protowire.VarintType: - _, valLen = protowire.ConsumeVarint(b) - case protowire.Fixed32Type: - _, valLen = protowire.ConsumeFixed32(b) - case protowire.Fixed64Type: - _, valLen = protowire.ConsumeFixed64(b) - case protowire.BytesType: - _, valLen = protowire.ConsumeBytes(b) - case protowire.StartGroupType: - depth++ - case protowire.EndGroupType: - depth-- - default: - return nil, 0, errors.New("proto: cannot parse reserved wire type") - } - if valLen < 0 { - return nil, 0, protowire.ParseError(valLen) - } - b = b[valLen:] - - if depth == 0 { - return b0[:len(b0)-len(b)-tagLen], len(b0) - len(b), nil - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/defaults.go b/vendor/github.com/golang/protobuf/proto/defaults.go deleted file mode 100644 index d399bf06..00000000 --- a/vendor/github.com/golang/protobuf/proto/defaults.go +++ /dev/null @@ -1,63 +0,0 @@ -// 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 file. - -package proto - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -// SetDefaults sets unpopulated scalar fields to their default values. -// Fields within a oneof are not set even if they have a default value. -// SetDefaults is recursively called upon any populated message fields. -func SetDefaults(m Message) { - if m != nil { - setDefaults(MessageReflect(m)) - } -} - -func setDefaults(m protoreflect.Message) { - fds := m.Descriptor().Fields() - for i := 0; i < fds.Len(); i++ { - fd := fds.Get(i) - if !m.Has(fd) { - if fd.HasDefault() && fd.ContainingOneof() == nil { - v := fd.Default() - if fd.Kind() == protoreflect.BytesKind { - v = protoreflect.ValueOf(append([]byte(nil), v.Bytes()...)) // copy the default bytes - } - m.Set(fd, v) - } - continue - } - } - - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - switch { - // Handle singular message. - case fd.Cardinality() != protoreflect.Repeated: - if fd.Message() != nil { - setDefaults(m.Get(fd).Message()) - } - // Handle list of messages. - case fd.IsList(): - if fd.Message() != nil { - ls := m.Get(fd).List() - for i := 0; i < ls.Len(); i++ { - setDefaults(ls.Get(i).Message()) - } - } - // Handle map of messages. - case fd.IsMap(): - if fd.MapValue().Message() != nil { - ms := m.Get(fd).Map() - ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool { - setDefaults(v.Message()) - return true - }) - } - } - return true - }) -} diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go deleted file mode 100644 index e8db57e0..00000000 --- a/vendor/github.com/golang/protobuf/proto/deprecated.go +++ /dev/null @@ -1,113 +0,0 @@ -// 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 file. - -package proto - -import ( - "encoding/json" - "errors" - "fmt" - "strconv" - - protoV2 "google.golang.org/protobuf/proto" -) - -var ( - // Deprecated: No longer returned. - ErrNil = errors.New("proto: Marshal called with nil") - - // Deprecated: No longer returned. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") - - // Deprecated: No longer returned. - ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") -) - -// 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) {} - -// Deprecated: Do not use. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// Deprecated: Do not use. -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 -} - -// Deprecated: Do not use; this type existed for intenal-use only. -type InternalMessageInfo struct{} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) DiscardUnknown(m Message) { - DiscardUnknown(m) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic bool) ([]byte, error) { - return protoV2.MarshalOptions{Deterministic: deterministic}.MarshalAppend(b, MessageV2(m)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Merge(dst, src Message) { - protoV2.Merge(MessageV2(dst), MessageV2(src)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Size(m Message) int { - return protoV2.Size(MessageV2(m)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error { - return protoV2.UnmarshalOptions{Merge: true}.Unmarshal(b, MessageV2(m)) -} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go deleted file mode 100644 index 2187e877..00000000 --- a/vendor/github.com/golang/protobuf/proto/discard.go +++ /dev/null @@ -1,58 +0,0 @@ -// 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 file. - -package proto - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -// 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. -func DiscardUnknown(m Message) { - if m != nil { - discardUnknown(MessageReflect(m)) - } -} - -func discardUnknown(m protoreflect.Message) { - m.Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool { - switch { - // Handle singular message. - case fd.Cardinality() != protoreflect.Repeated: - if fd.Message() != nil { - discardUnknown(m.Get(fd).Message()) - } - // Handle list of messages. - case fd.IsList(): - if fd.Message() != nil { - ls := m.Get(fd).List() - for i := 0; i < ls.Len(); i++ { - discardUnknown(ls.Get(i).Message()) - } - } - // Handle map of messages. - case fd.IsMap(): - if fd.MapValue().Message() != nil { - ms := m.Get(fd).Map() - ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool { - discardUnknown(v.Message()) - return true - }) - } - } - return true - }) - - // Discard unknown fields. - if len(m.GetUnknown()) > 0 { - m.SetUnknown(nil) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index 42fc120c..00000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2010 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 proto - -import ( - "errors" - "fmt" - "reflect" - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoiface" - "google.golang.org/protobuf/runtime/protoimpl" -) - -type ( - // ExtensionDesc represents an extension descriptor and - // is used to interact with an extension field in a message. - // - // Variables of this type are generated in code by protoc-gen-go. - ExtensionDesc = protoimpl.ExtensionInfo - - // ExtensionRange represents a range of message extensions. - // Used in code generated by protoc-gen-go. - ExtensionRange = protoiface.ExtensionRangeV1 - - // Deprecated: Do not use; this is an internal type. - Extension = protoimpl.ExtensionFieldV1 - - // Deprecated: Do not use; this is an internal type. - XXX_InternalExtensions = protoimpl.ExtensionFields -) - -// ErrMissingExtension reports whether the extension was not present. -var ErrMissingExtension = errors.New("proto: missing extension") - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -// HasExtension reports whether the extension field is present in m -// either as an explicitly populated field or as an unknown field. -func HasExtension(m Message, xt *ExtensionDesc) (has bool) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return false - } - - // Check whether any populated known field matches the field number. - xtd := xt.TypeDescriptor() - if isValidExtension(mr.Descriptor(), xtd) { - has = mr.Has(xtd) - } else { - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - has = int32(fd.Number()) == xt.Field - return !has - }) - } - - // Check whether any unknown field matches the field number. - for b := mr.GetUnknown(); !has && len(b) > 0; { - num, _, n := protowire.ConsumeField(b) - has = int32(num) == xt.Field - b = b[n:] - } - return has -} - -// ClearExtension removes the extension field from m -// either as an explicitly populated field or as an unknown field. -func ClearExtension(m Message, xt *ExtensionDesc) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - xtd := xt.TypeDescriptor() - if isValidExtension(mr.Descriptor(), xtd) { - mr.Clear(xtd) - } else { - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - if int32(fd.Number()) == xt.Field { - mr.Clear(fd) - return false - } - return true - }) - } - clearUnknown(mr, fieldNum(xt.Field)) -} - -// ClearAllExtensions clears all extensions from m. -// This includes populated fields and unknown fields in the extension range. -func ClearAllExtensions(m Message) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - if fd.IsExtension() { - mr.Clear(fd) - } - return true - }) - clearUnknown(mr, mr.Descriptor().ExtensionRanges()) -} - -// GetExtension retrieves a proto2 extended field from m. -// -// 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 type incomplete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes for the extension field. -func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return nil, errNotExtendable - } - - // Retrieve the unknown fields for this extension field. - var bo protoreflect.RawFields - for bi := mr.GetUnknown(); len(bi) > 0; { - num, _, n := protowire.ConsumeField(bi) - if int32(num) == xt.Field { - bo = append(bo, bi[:n]...) - } - bi = bi[n:] - } - - // For type incomplete descriptors, only retrieve the unknown fields. - if xt.ExtensionType == nil { - return []byte(bo), nil - } - - // If the extension field only exists as unknown fields, unmarshal it. - // This is rarely done since proto.Unmarshal eagerly unmarshals extensions. - xtd := xt.TypeDescriptor() - if !isValidExtension(mr.Descriptor(), xtd) { - return nil, fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) - } - if !mr.Has(xtd) && len(bo) > 0 { - m2 := mr.New() - if err := (proto.UnmarshalOptions{ - Resolver: extensionResolver{xt}, - }.Unmarshal(bo, m2.Interface())); err != nil { - return nil, err - } - if m2.Has(xtd) { - mr.Set(xtd, m2.Get(xtd)) - clearUnknown(mr, fieldNum(xt.Field)) - } - } - - // Check whether the message has the extension field set or a default. - var pv protoreflect.Value - switch { - case mr.Has(xtd): - pv = mr.Get(xtd) - case xtd.HasDefault(): - pv = xtd.Default() - default: - return nil, ErrMissingExtension - } - - v := xt.InterfaceOf(pv) - rv := reflect.ValueOf(v) - if isScalarKind(rv.Kind()) { - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - v = rv2.Interface() - } - return v, nil -} - -// extensionResolver is a custom extension resolver that stores a single -// extension type that takes precedence over the global registry. -type extensionResolver struct{ xt protoreflect.ExtensionType } - -func (r extensionResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { - if xtd := r.xt.TypeDescriptor(); xtd.FullName() == field { - return r.xt, nil - } - return protoregistry.GlobalTypes.FindExtensionByName(field) -} - -func (r extensionResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { - if xtd := r.xt.TypeDescriptor(); xtd.ContainingMessage().FullName() == message && xtd.Number() == field { - return r.xt, nil - } - return protoregistry.GlobalTypes.FindExtensionByNumber(message, field) -} - -// GetExtensions returns a list of the extensions values present in m, -// corresponding with the provided list of extension descriptors, xts. -// If an extension is missing in m, the corresponding value is nil. -func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return nil, errNotExtendable - } - - vs := make([]interface{}, len(xts)) - for i, xt := range xts { - v, err := GetExtension(m, xt) - if err != nil { - if err == ErrMissingExtension { - continue - } - return vs, err - } - vs[i] = v - } - return vs, nil -} - -// SetExtension sets an extension field in m to the provided value. -func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return errNotExtendable - } - - rv := reflect.ValueOf(v) - if reflect.TypeOf(v) != reflect.TypeOf(xt.ExtensionType) { - return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", v, xt.ExtensionType) - } - if rv.Kind() == reflect.Ptr { - if rv.IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", v) - } - if isScalarKind(rv.Elem().Kind()) { - v = rv.Elem().Interface() - } - } - - xtd := xt.TypeDescriptor() - if !isValidExtension(mr.Descriptor(), xtd) { - return fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) - } - mr.Set(xtd, xt.ValueOf(v)) - clearUnknown(mr, fieldNum(xt.Field)) - return nil -} - -// SetRawExtension inserts b into the unknown fields of m. -// -// Deprecated: Use Message.ProtoReflect.SetUnknown instead. -func SetRawExtension(m Message, fnum int32, b []byte) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - // Verify that the raw field is valid. - for b0 := b; len(b0) > 0; { - num, _, n := protowire.ConsumeField(b0) - if int32(num) != fnum { - panic(fmt.Sprintf("mismatching field number: got %d, want %d", num, fnum)) - } - b0 = b0[n:] - } - - ClearExtension(m, &ExtensionDesc{Field: fnum}) - mr.SetUnknown(append(mr.GetUnknown(), b...)) -} - -// ExtensionDescs returns a list of extension descriptors found in m, -// containing descriptors for both populated extension fields in m and -// also unknown fields of m that are in the extension range. -// For the later case, an type incomplete descriptor is provided where only -// the ExtensionDesc.Field field is populated. -// The order of the extension descriptors is undefined. -func ExtensionDescs(m Message) ([]*ExtensionDesc, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return nil, errNotExtendable - } - - // Collect a set of known extension descriptors. - extDescs := make(map[protoreflect.FieldNumber]*ExtensionDesc) - mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - xt := fd.(protoreflect.ExtensionTypeDescriptor) - if xd, ok := xt.Type().(*ExtensionDesc); ok { - extDescs[fd.Number()] = xd - } - } - return true - }) - - // Collect a set of unknown extension descriptors. - extRanges := mr.Descriptor().ExtensionRanges() - for b := mr.GetUnknown(); len(b) > 0; { - num, _, n := protowire.ConsumeField(b) - if extRanges.Has(num) && extDescs[num] == nil { - extDescs[num] = nil - } - b = b[n:] - } - - // Transpose the set of descriptors into a list. - var xts []*ExtensionDesc - for num, xt := range extDescs { - if xt == nil { - xt = &ExtensionDesc{Field: int32(num)} - } - xts = append(xts, xt) - } - return xts, nil -} - -// isValidExtension reports whether xtd is a valid extension descriptor for md. -func isValidExtension(md protoreflect.MessageDescriptor, xtd protoreflect.ExtensionTypeDescriptor) bool { - return xtd.ContainingMessage() == md && md.ExtensionRanges().Has(xtd.Number()) -} - -// isScalarKind reports whether k is a protobuf scalar kind (except bytes). -// This function exists for historical reasons since the representation of -// scalars differs between v1 and v2, where v1 uses *T and v2 uses T. -func isScalarKind(k reflect.Kind) bool { - switch k { - case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: - return true - default: - return false - } -} - -// clearUnknown removes unknown fields from m where remover.Has reports true. -func clearUnknown(m protoreflect.Message, remover interface { - Has(protoreflect.FieldNumber) bool -}) { - var bo protoreflect.RawFields - for bi := m.GetUnknown(); len(bi) > 0; { - num, _, n := protowire.ConsumeField(bi) - if !remover.Has(num) { - bo = append(bo, bi[:n]...) - } - bi = bi[n:] - } - if bi := m.GetUnknown(); len(bi) != len(bo) { - m.SetUnknown(bo) - } -} - -type fieldNum protoreflect.FieldNumber - -func (n1 fieldNum) Has(n2 protoreflect.FieldNumber) bool { - return protoreflect.FieldNumber(n1) == n2 -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index dcdc2202..00000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2010 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 proto - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "sync" - - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// StructProperties represents protocol buffer type information for a -// generated protobuf message in the open-struct API. -// -// Deprecated: Do not use. -type StructProperties struct { - // Prop are the properties for each field. - // - // Fields belonging to a oneof are stored in OneofTypes instead, with a - // single Properties representing the parent oneof held here. - // - // The order of Prop matches the order of fields in the Go struct. - // Struct fields that are not related to protobufs have a "XXX_" prefix - // in the Properties.Name and must be ignored by the user. - Prop []*Properties - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the protobuf field name. - OneofTypes map[string]*OneofProperties -} - -// Properties represents the type information for a protobuf message field. -// -// Deprecated: Do not use. -type Properties struct { - // Name is a placeholder name with little meaningful semantic value. - // If the name has an "XXX_" prefix, the entire Properties must be ignored. - Name string - // OrigName is the protobuf field name or oneof name. - OrigName string - // JSONName is the JSON name for the protobuf field. - JSONName string - // Enum is a placeholder name for enums. - // For historical reasons, this is neither the Go name for the enum, - // nor the protobuf name for the enum. - Enum string // Deprecated: Do not use. - // Weak contains the full name of the weakly referenced message. - Weak string - // Wire is a string representation of the wire type. - Wire string - // WireType is the protobuf wire type for the field. - WireType int - // Tag is the protobuf field number. - Tag int - // Required reports whether this is a required field. - Required bool - // Optional reports whether this is a optional field. - Optional bool - // Repeated reports whether this is a repeated field. - Repeated bool - // Packed reports whether this is a packed repeated field of scalars. - Packed bool - // Proto3 reports whether this field operates under the proto3 syntax. - Proto3 bool - // Oneof reports whether this field belongs within a oneof. - Oneof bool - - // Default is the default value in string form. - Default string - // HasDefault reports whether the field has a default value. - HasDefault bool - - // MapKeyProp is the properties for the key field for a map field. - MapKeyProp *Properties - // MapValProp is the properties for the value field for a map field. - MapValProp *Properties -} - -// OneofProperties represents the type information for a protobuf oneof. -// -// Deprecated: Do not use. -type OneofProperties struct { - // Type is a pointer to the generated wrapper type for the field value. - // This is nil for messages that are not in the open-struct API. - Type reflect.Type - // Field is the index into StructProperties.Prop for the containing oneof. - Field int - // Prop is the properties for the field. - Prop *Properties -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - 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 != "" { - s += ",json=" + p.JSONName - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if len(p.Weak) > 0 { - s += ",weak=" + p.Weak - } - if p.Proto3 { - s += ",proto3" - } - if p.Oneof { - s += ",oneof" - } - 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(tag string) { - // For example: "bytes,49,opt,name=foo,def=hello!" - for len(tag) > 0 { - i := strings.IndexByte(tag, ',') - if i < 0 { - i = len(tag) - } - switch s := tag[:i]; { - case strings.HasPrefix(s, "name="): - p.OrigName = s[len("name="):] - case strings.HasPrefix(s, "json="): - p.JSONName = s[len("json="):] - case strings.HasPrefix(s, "enum="): - p.Enum = s[len("enum="):] - case strings.HasPrefix(s, "weak="): - p.Weak = s[len("weak="):] - case strings.Trim(s, "0123456789") == "": - n, _ := strconv.ParseUint(s, 10, 32) - p.Tag = int(n) - case s == "opt": - p.Optional = true - case s == "req": - p.Required = true - case s == "rep": - p.Repeated = true - case s == "varint" || s == "zigzag32" || s == "zigzag64": - p.Wire = s - p.WireType = WireVarint - case s == "fixed32": - p.Wire = s - p.WireType = WireFixed32 - case s == "fixed64": - p.Wire = s - p.WireType = WireFixed64 - case s == "bytes": - p.Wire = s - p.WireType = WireBytes - case s == "group": - p.Wire = s - p.WireType = WireStartGroup - case s == "packed": - p.Packed = true - case s == "proto3": - p.Proto3 = true - case s == "oneof": - p.Oneof = true - case strings.HasPrefix(s, "def="): - // The default tag is special in that everything afterwards is the - // default regardless of the presence of commas. - p.HasDefault = true - p.Default, i = tag[len("def="):], len(tag) - } - tag = strings.TrimPrefix(tag[i:], ",") - } -} - -// Init populates the properties from a protocol buffer struct tag. -// -// Deprecated: Do not use. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.Name = name - p.OrigName = name - if tag == "" { - return - } - p.Parse(tag) - - if typ != nil && typ.Kind() == reflect.Map { - p.MapKeyProp = new(Properties) - p.MapKeyProp.Init(nil, "Key", f.Tag.Get("protobuf_key"), nil) - p.MapValProp = new(Properties) - p.MapValProp.Init(nil, "Value", f.Tag.Get("protobuf_val"), nil) - } -} - -var propertiesCache sync.Map // map[reflect.Type]*StructProperties - -// GetProperties returns the list of properties for the type represented by t, -// which must be a generated protocol buffer message in the open-struct API, -// where protobuf message fields are represented by exported Go struct fields. -// -// Deprecated: Use protobuf reflection instead. -func GetProperties(t reflect.Type) *StructProperties { - if p, ok := propertiesCache.Load(t); ok { - return p.(*StructProperties) - } - p, _ := propertiesCache.LoadOrStore(t, newProperties(t)) - return p.(*StructProperties) -} - -func newProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t)) - } - - var hasOneof bool - prop := new(StructProperties) - - // Construct a list of properties for each field in the struct. - for i := 0; i < t.NumField(); i++ { - p := new(Properties) - f := t.Field(i) - tagField := f.Tag.Get("protobuf") - p.Init(f.Type, f.Name, tagField, &f) - - tagOneof := f.Tag.Get("protobuf_oneof") - if tagOneof != "" { - hasOneof = true - p.OrigName = tagOneof - } - - // Rename unrelated struct fields with the "XXX_" prefix since so much - // user code simply checks for this to exclude special fields. - if tagField == "" && tagOneof == "" && !strings.HasPrefix(p.Name, "XXX_") { - p.Name = "XXX_" + p.Name - p.OrigName = "XXX_" + p.OrigName - } else if p.Weak != "" { - p.Name = p.OrigName // avoid possible "XXX_" prefix on weak field - } - - prop.Prop = append(prop.Prop, p) - } - - // Construct a mapping of oneof field names to properties. - if hasOneof { - var oneofWrappers []interface{} - if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok { - oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[3].Interface().([]interface{}) - } - if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok { - oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0].Interface().([]interface{}) - } - if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(protoreflect.ProtoMessage); ok { - if m, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *protoimpl.MessageInfo }); ok { - oneofWrappers = m.ProtoMessageInfo().OneofWrappers - } - } - - prop.OneofTypes = make(map[string]*OneofProperties) - for _, wrapper := range oneofWrappers { - p := &OneofProperties{ - Type: reflect.ValueOf(wrapper).Type(), // *T - Prop: new(Properties), - } - f := p.Type.Elem().Field(0) - p.Prop.Name = f.Name - p.Prop.Parse(f.Tag.Get("protobuf")) - - // Determine the struct field that contains this oneof. - // Each wrapper is assignable to exactly one parent field. - var foundOneof bool - for i := 0; i < t.NumField() && !foundOneof; i++ { - if p.Type.AssignableTo(t.Field(i).Type) { - p.Field = i - foundOneof = true - } - } - if !foundOneof { - panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t)) - } - prop.OneofTypes[p.Prop.OrigName] = p - } - } - - return prop -} - -func (sp *StructProperties) Len() int { return len(sp.Prop) } -func (sp *StructProperties) Less(i, j int) bool { return false } -func (sp *StructProperties) Swap(i, j int) { return } diff --git a/vendor/github.com/golang/protobuf/proto/proto.go b/vendor/github.com/golang/protobuf/proto/proto.go deleted file mode 100644 index 5aee89c3..00000000 --- a/vendor/github.com/golang/protobuf/proto/proto.go +++ /dev/null @@ -1,167 +0,0 @@ -// 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 file. - -// Package proto provides functionality for handling protocol buffer messages. -// In particular, it provides marshaling and unmarshaling between a protobuf -// message and the binary wire format. -// -// See https://developers.google.com/protocol-buffers/docs/gotutorial for -// more information. -// -// Deprecated: Use the "google.golang.org/protobuf/proto" package instead. -package proto - -import ( - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoiface" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - ProtoPackageIsVersion1 = true - ProtoPackageIsVersion2 = true - ProtoPackageIsVersion3 = true - ProtoPackageIsVersion4 = true -) - -// GeneratedEnum is any enum type generated by protoc-gen-go -// which is a named int32 kind. -// This type exists for documentation purposes. -type GeneratedEnum interface{} - -// GeneratedMessage is any message type generated by protoc-gen-go -// which is a pointer to a named struct kind. -// This type exists for documentation purposes. -type GeneratedMessage interface{} - -// Message is a protocol buffer message. -// -// This is the v1 version of the message interface and is marginally better -// than an empty interface as it lacks any method to programatically interact -// with the contents of the message. -// -// A v2 message is declared in "google.golang.org/protobuf/proto".Message and -// exposes protobuf reflection as a first-class feature of the interface. -// -// To convert a v1 message to a v2 message, use the MessageV2 function. -// To convert a v2 message to a v1 message, use the MessageV1 function. -type Message = protoiface.MessageV1 - -// MessageV1 converts either a v1 or v2 message to a v1 message. -// It returns nil if m is nil. -func MessageV1(m GeneratedMessage) protoiface.MessageV1 { - return protoimpl.X.ProtoMessageV1Of(m) -} - -// MessageV2 converts either a v1 or v2 message to a v2 message. -// It returns nil if m is nil. -func MessageV2(m GeneratedMessage) protoV2.Message { - return protoimpl.X.ProtoMessageV2Of(m) -} - -// MessageReflect returns a reflective view for a message. -// It returns nil if m is nil. -func MessageReflect(m Message) protoreflect.Message { - return protoimpl.X.MessageOf(m) -} - -// Marshaler is implemented by messages that can marshal themselves. -// This interface is used by the following functions: Size, Marshal, -// Buffer.Marshal, and Buffer.EncodeMessage. -// -// Deprecated: Do not implement. -type Marshaler interface { - // Marshal formats the encoded bytes of the message. - // It should be deterministic and emit valid protobuf wire data. - // The caller takes ownership of the returned buffer. - Marshal() ([]byte, error) -} - -// Unmarshaler is implemented by messages that can unmarshal themselves. -// This interface is used by the following functions: Unmarshal, UnmarshalMerge, -// Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup. -// -// Deprecated: Do not implement. -type Unmarshaler interface { - // Unmarshal parses the encoded bytes of the protobuf wire input. - // The provided buffer is only valid for during method call. - // It should not reset the receiver message. - Unmarshal([]byte) error -} - -// Merger is implemented by messages that can merge themselves. -// This interface is used by the following functions: Clone and Merge. -// -// Deprecated: Do not implement. -type Merger interface { - // Merge merges the contents of src into the receiver message. - // It clones all data structures in src such that it aliases no mutable - // memory referenced by src. - Merge(src Message) -} - -// RequiredNotSetError is an error type returned when -// marshaling or unmarshaling a message with missing required fields. -type RequiredNotSetError struct { - err error -} - -func (e *RequiredNotSetError) Error() string { - if e.err != nil { - return e.err.Error() - } - return "proto: required field not set" -} -func (e *RequiredNotSetError) RequiredNotSet() bool { - return true -} - -func checkRequiredNotSet(m protoV2.Message) error { - if err := protoV2.CheckInitialized(m); err != nil { - return &RequiredNotSetError{err: err} - } - return nil -} - -// Clone returns a deep copy of src. -func Clone(src Message) Message { - return MessageV1(protoV2.Clone(MessageV2(src))) -} - -// Merge merges src into dst, which must be messages of the same type. -// -// Populated scalar fields in src are copied to dst, while populated -// singular messages in src are merged into dst by recursively calling Merge. -// The elements of every list field in src is appended to the corresponded -// list fields in dst. The entries of every map field in src is copied into -// the corresponding map field in dst, possibly replacing existing entries. -// The unknown fields of src are appended to the unknown fields of dst. -func Merge(dst, src Message) { - protoV2.Merge(MessageV2(dst), MessageV2(src)) -} - -// Equal reports whether two messages are equal. -// If two messages marshal to the same bytes under deterministic serialization, -// then Equal is guaranteed to report true. -// -// Two messages are equal if they are the same protobuf message type, -// have the same set of populated known and extension field values, -// and the same set of unknown fields values. -// -// Scalar values are compared with the equivalent of the == operator in Go, -// except bytes values which are compared using bytes.Equal and -// floating point values which specially treat NaNs as equal. -// Message values are compared by recursively calling Equal. -// Lists are equal if each element value is also equal. -// Maps are equal if they have the same set of keys, where the pair of values -// for each key is also equal. -func Equal(x, y Message) bool { - return protoV2.Equal(MessageV2(x), MessageV2(y)) -} - -func isMessageSet(md protoreflect.MessageDescriptor) bool { - ms, ok := md.(interface{ IsMessageSet() bool }) - return ok && ms.IsMessageSet() -} diff --git a/vendor/github.com/golang/protobuf/proto/registry.go b/vendor/github.com/golang/protobuf/proto/registry.go deleted file mode 100644 index 066b4323..00000000 --- a/vendor/github.com/golang/protobuf/proto/registry.go +++ /dev/null @@ -1,317 +0,0 @@ -// 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 file. - -package proto - -import ( - "bytes" - "compress/gzip" - "fmt" - "io/ioutil" - "reflect" - "strings" - "sync" - - "google.golang.org/protobuf/reflect/protodesc" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// filePath is the path to the proto source file. -type filePath = string // e.g., "google/protobuf/descriptor.proto" - -// fileDescGZIP is the compressed contents of the encoded FileDescriptorProto. -type fileDescGZIP = []byte - -var fileCache sync.Map // map[filePath]fileDescGZIP - -// RegisterFile is called from generated code to register the compressed -// FileDescriptorProto with the file path for a proto source file. -// -// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead. -func RegisterFile(s filePath, d fileDescGZIP) { - // Decompress the descriptor. - zr, err := gzip.NewReader(bytes.NewReader(d)) - if err != nil { - panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err)) - } - b, err := ioutil.ReadAll(zr) - if err != nil { - panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err)) - } - - // Construct a protoreflect.FileDescriptor from the raw descriptor. - // Note that DescBuilder.Build automatically registers the constructed - // file descriptor with the v2 registry. - protoimpl.DescBuilder{RawDescriptor: b}.Build() - - // Locally cache the raw descriptor form for the file. - fileCache.Store(s, d) -} - -// FileDescriptor returns the compressed FileDescriptorProto given the file path -// for a proto source file. It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead. -func FileDescriptor(s filePath) fileDescGZIP { - if v, ok := fileCache.Load(s); ok { - return v.(fileDescGZIP) - } - - // Find the descriptor in the v2 registry. - var b []byte - if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil { - b, _ = Marshal(protodesc.ToFileDescriptorProto(fd)) - } - - // Locally cache the raw descriptor form for the file. - if len(b) > 0 { - v, _ := fileCache.LoadOrStore(s, protoimpl.X.CompressGZIP(b)) - return v.(fileDescGZIP) - } - return nil -} - -// enumName is the name of an enum. For historical reasons, the enum name is -// neither the full Go name nor the full protobuf name of the enum. -// The name is the dot-separated combination of just the proto package that the -// enum is declared within followed by the Go type name of the generated enum. -type enumName = string // e.g., "my.proto.package.GoMessage_GoEnum" - -// enumsByName maps enum values by name to their numeric counterpart. -type enumsByName = map[string]int32 - -// enumsByNumber maps enum values by number to their name counterpart. -type enumsByNumber = map[int32]string - -var enumCache sync.Map // map[enumName]enumsByName -var numFilesCache sync.Map // map[protoreflect.FullName]int - -// RegisterEnum is called from the generated code to register the mapping of -// enum value names to enum numbers for the enum identified by s. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead. -func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) { - if _, ok := enumCache.Load(s); ok { - panic("proto: duplicate enum registered: " + s) - } - enumCache.Store(s, m) - - // This does not forward registration to the v2 registry since this API - // lacks sufficient information to construct a complete v2 enum descriptor. -} - -// EnumValueMap returns the mapping from enum value names to enum numbers for -// the enum of the given name. It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead. -func EnumValueMap(s enumName) enumsByName { - if v, ok := enumCache.Load(s); ok { - return v.(enumsByName) - } - - // Check whether the cache is stale. If the number of files in the current - // package differs, then it means that some enums may have been recently - // registered upstream that we do not know about. - var protoPkg protoreflect.FullName - if i := strings.LastIndexByte(s, '.'); i >= 0 { - protoPkg = protoreflect.FullName(s[:i]) - } - v, _ := numFilesCache.Load(protoPkg) - numFiles, _ := v.(int) - if protoregistry.GlobalFiles.NumFilesByPackage(protoPkg) == numFiles { - return nil // cache is up-to-date; was not found earlier - } - - // Update the enum cache for all enums declared in the given proto package. - numFiles = 0 - protoregistry.GlobalFiles.RangeFilesByPackage(protoPkg, func(fd protoreflect.FileDescriptor) bool { - walkEnums(fd, func(ed protoreflect.EnumDescriptor) { - name := protoimpl.X.LegacyEnumName(ed) - if _, ok := enumCache.Load(name); !ok { - m := make(enumsByName) - evs := ed.Values() - for i := evs.Len() - 1; i >= 0; i-- { - ev := evs.Get(i) - m[string(ev.Name())] = int32(ev.Number()) - } - enumCache.LoadOrStore(name, m) - } - }) - numFiles++ - return true - }) - numFilesCache.Store(protoPkg, numFiles) - - // Check cache again for enum map. - if v, ok := enumCache.Load(s); ok { - return v.(enumsByName) - } - return nil -} - -// walkEnums recursively walks all enums declared in d. -func walkEnums(d interface { - Enums() protoreflect.EnumDescriptors - Messages() protoreflect.MessageDescriptors -}, f func(protoreflect.EnumDescriptor)) { - eds := d.Enums() - for i := eds.Len() - 1; i >= 0; i-- { - f(eds.Get(i)) - } - mds := d.Messages() - for i := mds.Len() - 1; i >= 0; i-- { - walkEnums(mds.Get(i), f) - } -} - -// messageName is the full name of protobuf message. -type messageName = string - -var messageTypeCache sync.Map // map[messageName]reflect.Type - -// RegisterType is called from generated code to register the message Go type -// for a message of the given name. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead. -func RegisterType(m Message, s messageName) { - mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s)) - if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil { - panic(err) - } - messageTypeCache.Store(s, reflect.TypeOf(m)) -} - -// RegisterMapType is called from generated code to register the Go map type -// for a protobuf message representing a map entry. -// -// Deprecated: Do not use. -func RegisterMapType(m interface{}, s messageName) { - t := reflect.TypeOf(m) - if t.Kind() != reflect.Map { - panic(fmt.Sprintf("invalid map kind: %v", t)) - } - if _, ok := messageTypeCache.Load(s); ok { - panic(fmt.Errorf("proto: duplicate proto message registered: %s", s)) - } - messageTypeCache.Store(s, t) -} - -// MessageType returns the message type for a named message. -// It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead. -func MessageType(s messageName) reflect.Type { - if v, ok := messageTypeCache.Load(s); ok { - return v.(reflect.Type) - } - - // Derive the message type from the v2 registry. - var t reflect.Type - if mt, _ := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(s)); mt != nil { - t = messageGoType(mt) - } - - // If we could not get a concrete type, it is possible that it is a - // pseudo-message for a map entry. - if t == nil { - d, _ := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(s)) - if md, _ := d.(protoreflect.MessageDescriptor); md != nil && md.IsMapEntry() { - kt := goTypeForField(md.Fields().ByNumber(1)) - vt := goTypeForField(md.Fields().ByNumber(2)) - t = reflect.MapOf(kt, vt) - } - } - - // Locally cache the message type for the given name. - if t != nil { - v, _ := messageTypeCache.LoadOrStore(s, t) - return v.(reflect.Type) - } - return nil -} - -func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type { - switch k := fd.Kind(); k { - case protoreflect.EnumKind: - if et, _ := protoregistry.GlobalTypes.FindEnumByName(fd.Enum().FullName()); et != nil { - return enumGoType(et) - } - return reflect.TypeOf(protoreflect.EnumNumber(0)) - case protoreflect.MessageKind, protoreflect.GroupKind: - if mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()); mt != nil { - return messageGoType(mt) - } - return reflect.TypeOf((*protoreflect.Message)(nil)).Elem() - default: - return reflect.TypeOf(fd.Default().Interface()) - } -} - -func enumGoType(et protoreflect.EnumType) reflect.Type { - return reflect.TypeOf(et.New(0)) -} - -func messageGoType(mt protoreflect.MessageType) reflect.Type { - return reflect.TypeOf(MessageV1(mt.Zero().Interface())) -} - -// MessageName returns the full protobuf name for the given message type. -// -// Deprecated: Use protoreflect.MessageDescriptor.FullName instead. -func MessageName(m Message) messageName { - if m == nil { - return "" - } - if m, ok := m.(interface{ XXX_MessageName() messageName }); ok { - return m.XXX_MessageName() - } - return messageName(protoimpl.X.MessageDescriptorOf(m).FullName()) -} - -// RegisterExtension is called from the generated code to register -// the extension descriptor. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead. -func RegisterExtension(d *ExtensionDesc) { - if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil { - panic(err) - } -} - -type extensionsByNumber = map[int32]*ExtensionDesc - -var extensionCache sync.Map // map[messageName]extensionsByNumber - -// RegisteredExtensions returns a map of the registered extensions for the -// provided protobuf message, indexed by the extension field number. -// -// Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead. -func RegisteredExtensions(m Message) extensionsByNumber { - // Check whether the cache is stale. If the number of extensions for - // the given message differs, then it means that some extensions were - // recently registered upstream that we do not know about. - s := MessageName(m) - v, _ := extensionCache.Load(s) - xs, _ := v.(extensionsByNumber) - if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName(s)) == len(xs) { - return xs // cache is up-to-date - } - - // Cache is stale, re-compute the extensions map. - xs = make(extensionsByNumber) - protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(s), func(xt protoreflect.ExtensionType) bool { - if xd, ok := xt.(*ExtensionDesc); ok { - xs[int32(xt.TypeDescriptor().Number())] = xd - } else { - // TODO: This implies that the protoreflect.ExtensionType is a - // custom type not generated by protoc-gen-go. We could try and - // convert the type to an ExtensionDesc. - } - return true - }) - extensionCache.Store(s, xs) - return xs -} diff --git a/vendor/github.com/golang/protobuf/proto/text_decode.go b/vendor/github.com/golang/protobuf/proto/text_decode.go deleted file mode 100644 index 47eb3e44..00000000 --- a/vendor/github.com/golang/protobuf/proto/text_decode.go +++ /dev/null @@ -1,801 +0,0 @@ -// Copyright 2010 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 proto - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" - - "google.golang.org/protobuf/encoding/prototext" - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapTextUnmarshalV2 = false - -// ParseError is returned by UnmarshalText. -type ParseError struct { - Message string - - // Deprecated: Do not use. - Line, Offset int -} - -func (e *ParseError) Error() string { - if wrapTextUnmarshalV2 { - return e.Message - } - if e.Line == 1 { - return fmt.Sprintf("line 1.%d: %v", e.Offset, e.Message) - } - return fmt.Sprintf("line %d: %v", e.Line, e.Message) -} - -// UnmarshalText parses a proto text formatted string into m. -func UnmarshalText(s string, m Message) error { - if u, ok := m.(encoding.TextUnmarshaler); ok { - return u.UnmarshalText([]byte(s)) - } - - m.Reset() - mi := MessageV2(m) - - if wrapTextUnmarshalV2 { - err := prototext.UnmarshalOptions{ - AllowPartial: true, - }.Unmarshal([]byte(s), mi) - if err != nil { - return &ParseError{Message: err.Error()} - } - return checkRequiredNotSet(mi) - } else { - if err := newTextParser(s).unmarshalMessage(mi.ProtoReflect(), ""); err != nil { - return err - } - return checkRequiredNotSet(mi) - } -} - -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 -} - -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 newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) unmarshalMessage(m protoreflect.Message, terminator string) (err error) { - md := m.Descriptor() - fds := md.Fields() - - // 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 ... > - seen := make(map[protoreflect.FieldNumber]bool) - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - if err := p.unmarshalExtensionOrAny(m, seen); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := protoreflect.Name(tok.value) - fd := fds.ByName(name) - switch { - case fd == nil: - gd := fds.ByName(protoreflect.Name(strings.ToLower(string(name)))) - if gd != nil && gd.Kind() == protoreflect.GroupKind && gd.Message().Name() == name { - fd = gd - } - case fd.Kind() == protoreflect.GroupKind && fd.Message().Name() != name: - fd = nil - case fd.IsWeak() && fd.Message().IsPlaceholder(): - fd = nil - } - if fd == nil { - typeName := string(md.FullName()) - if m, ok := m.Interface().(Message); ok { - t := reflect.TypeOf(m) - if t.Kind() == reflect.Ptr { - typeName = t.Elem().String() - } - } - return p.errorf("unknown field name %q in %v", name, typeName) - } - if od := fd.ContainingOneof(); od != nil && m.WhichOneof(od) != nil { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, od.Name()) - } - if fd.Cardinality() != protoreflect.Repeated && seen[fd.Number()] { - return p.errorf("non-repeated field %q was repeated", fd.Name()) - } - seen[fd.Number()] = true - - // Consume any colon. - if err := p.checkForColon(fd); err != nil { - return err - } - - // Parse into the field. - v := m.Get(fd) - if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) { - v = m.Mutable(fd) - } - if v, err = p.unmarshalValue(v, fd); err != nil { - return err - } - m.Set(fd, v) - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - } - return nil -} - -func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error { - name, err := p.consumeExtensionOrAnyName() - if err != nil { - return err - } - - // If it contains a slash, it's an Any type URL. - if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 { - 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) - } - - mt, err := protoregistry.GlobalTypes.FindMessageByURL(name) - if err != nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):]) - } - m2 := mt.New() - if err := p.unmarshalMessage(m2, terminator); err != nil { - return err - } - b, err := protoV2.Marshal(m2.Interface()) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err) - } - - urlFD := m.Descriptor().Fields().ByName("type_url") - valFD := m.Descriptor().Fields().ByName("value") - if seen[urlFD.Number()] { - return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name()) - } - if seen[valFD.Number()] { - return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name()) - } - m.Set(urlFD, protoreflect.ValueOfString(name)) - m.Set(valFD, protoreflect.ValueOfBytes(b)) - seen[urlFD.Number()] = true - seen[valFD.Number()] = true - return nil - } - - xname := protoreflect.FullName(name) - xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname) - if xt == nil && isMessageSet(m.Descriptor()) { - xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension")) - } - if xt == nil { - return p.errorf("unrecognized extension %q", name) - } - fd := xt.TypeDescriptor() - if fd.ContainingMessage().FullName() != m.Descriptor().FullName() { - return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName()) - } - - if err := p.checkForColon(fd); err != nil { - return err - } - - v := m.Get(fd) - if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) { - v = m.Mutable(fd) - } - v, err = p.unmarshalValue(v, fd) - if err != nil { - return err - } - m.Set(fd, v) - return p.consumeOptionalSeparator() -} - -func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "" { - return v, p.errorf("unexpected EOF") - } - - switch { - case fd.IsList(): - lv := v.List() - var err error - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - vv := lv.NewElement() - vv, err = p.unmarshalSingularValue(vv, fd) - if err != nil { - return v, err - } - lv.Append(vv) - - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return v, p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return v, nil - } - - // One value of the repeated field. - p.back() - vv := lv.NewElement() - vv, err = p.unmarshalSingularValue(vv, fd) - if err != nil { - return v, err - } - lv.Append(vv) - return v, nil - case fd.IsMap(): - // 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. - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return v, p.errorf("expected '{' or '<', found %q", tok.value) - } - - keyFD := fd.MapKey() - valFD := fd.MapValue() - - mv := v.Map() - kv := keyFD.Default() - vv := mv.NewValue() - for { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == terminator { - break - } - var err error - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return v, err - } - if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil { - return v, err - } - if err := p.consumeOptionalSeparator(); err != nil { - return v, err - } - case "value": - if err := p.checkForColon(valFD); err != nil { - return v, err - } - if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil { - return v, err - } - if err := p.consumeOptionalSeparator(); err != nil { - return v, err - } - default: - p.back() - return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - mv.Set(kv.MapKey(), vv) - return v, nil - default: - p.back() - return p.unmarshalSingularValue(v, fd) - } -} - -func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "" { - return v, p.errorf("unexpected EOF") - } - - switch fd.Kind() { - case protoreflect.BoolKind: - switch tok.value { - case "true", "1", "t", "True": - return protoreflect.ValueOfBool(true), nil - case "false", "0", "f", "False": - return protoreflect.ValueOfBool(false), nil - } - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfInt32(int32(x)), nil - } - - // The C++ parser accepts large positive hex numbers that uses - // two's complement arithmetic to represent negative numbers. - // This feature is here for backwards compatibility with C++. - if strings.HasPrefix(tok.value, "0x") { - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfInt32(int32(-(int64(^x) + 1))), nil - } - } - case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfInt64(int64(x)), nil - } - - // The C++ parser accepts large positive hex numbers that uses - // two's complement arithmetic to represent negative numbers. - // This feature is here for backwards compatibility with C++. - if strings.HasPrefix(tok.value, "0x") { - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfInt64(int64(-(int64(^x) + 1))), nil - } - } - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfUint32(uint32(x)), nil - } - case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfUint64(uint64(x)), nil - } - case protoreflect.FloatKind: - // Ignore 'f' for compatibility with output generated by C++, - // but don't remove 'f' when the value is "-inf" or "inf". - v := tok.value - if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" { - v = v[:len(v)-len("f")] - } - if x, err := strconv.ParseFloat(v, 32); err == nil { - return protoreflect.ValueOfFloat32(float32(x)), nil - } - case protoreflect.DoubleKind: - // Ignore 'f' for compatibility with output generated by C++, - // but don't remove 'f' when the value is "-inf" or "inf". - v := tok.value - if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" { - v = v[:len(v)-len("f")] - } - if x, err := strconv.ParseFloat(v, 64); err == nil { - return protoreflect.ValueOfFloat64(float64(x)), nil - } - case protoreflect.StringKind: - if isQuote(tok.value[0]) { - return protoreflect.ValueOfString(tok.unquoted), nil - } - case protoreflect.BytesKind: - if isQuote(tok.value[0]) { - return protoreflect.ValueOfBytes([]byte(tok.unquoted)), nil - } - case protoreflect.EnumKind: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), nil - } - vd := fd.Enum().Values().ByName(protoreflect.Name(tok.value)) - if vd != nil { - return protoreflect.ValueOfEnum(vd.Number()), nil - } - case protoreflect.MessageKind, protoreflect.GroupKind: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return v, p.errorf("expected '{' or '<', found %q", tok.value) - } - err := p.unmarshalMessage(v.Message(), terminator) - return v, err - default: - panic(fmt.Sprintf("invalid kind %v", fd.Kind())) - } - return v, p.errorf("invalid %v: %v", fd.Kind(), tok.value) -} - -// 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(fd protoreflect.FieldDescriptor) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - if fd.Message() == nil { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -// consumeExtensionOrAnyName consumes an extension name or an Any type URL and -// the following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtensionOrAnyName() (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 unmarshalMessage 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) 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 -} - -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) -} - -// 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 -} - -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(rune(i)), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -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 -} diff --git a/vendor/github.com/golang/protobuf/proto/text_encode.go b/vendor/github.com/golang/protobuf/proto/text_encode.go deleted file mode 100644 index a31134ee..00000000 --- a/vendor/github.com/golang/protobuf/proto/text_encode.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2010 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 proto - -import ( - "bytes" - "encoding" - "fmt" - "io" - "math" - "sort" - "strings" - - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapTextMarshalV2 = 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 the proto text format of m to w. -func (tm *TextMarshaler) Marshal(w io.Writer, m Message) error { - b, err := tm.marshal(m) - if len(b) > 0 { - if _, err := w.Write(b); err != nil { - return err - } - } - return err -} - -// Text returns a proto text formatted string of m. -func (tm *TextMarshaler) Text(m Message) string { - b, _ := tm.marshal(m) - return string(b) -} - -func (tm *TextMarshaler) marshal(m Message) ([]byte, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return []byte(""), nil - } - - if wrapTextMarshalV2 { - if m, ok := m.(encoding.TextMarshaler); ok { - return m.MarshalText() - } - - opts := prototext.MarshalOptions{ - AllowPartial: true, - EmitUnknown: true, - } - if !tm.Compact { - opts.Indent = " " - } - if !tm.ExpandAny { - opts.Resolver = (*protoregistry.Types)(nil) - } - return opts.Marshal(mr.Interface()) - } else { - w := &textWriter{ - compact: tm.Compact, - expandAny: tm.ExpandAny, - complete: true, - } - - if m, ok := m.(encoding.TextMarshaler); ok { - b, err := m.MarshalText() - if err != nil { - return nil, err - } - w.Write(b) - return w.buf, nil - } - - err := w.writeMessage(mr) - return w.buf, err - } -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// MarshalText writes the proto text format of m to w. -func MarshalText(w io.Writer, m Message) error { return defaultTextMarshaler.Marshal(w, m) } - -// MarshalTextString returns a proto text formatted string of m. -func MarshalTextString(m Message) string { return defaultTextMarshaler.Text(m) } - -// CompactText writes the compact proto text format of m to w. -func CompactText(w io.Writer, m Message) error { return compactTextMarshaler.Marshal(w, m) } - -// CompactTextString returns a compact proto text formatted string of m. -func CompactTextString(m Message) string { return compactTextMarshaler.Text(m) } - -var ( - newline = []byte("\n") - endBraceNewline = []byte("}\n") - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - compact bool // same as TextMarshaler.Compact - expandAny bool // same as TextMarshaler.ExpandAny - complete bool // whether the current position is a complete line - indent int // indentation level; never negative - buf []byte -} - -func (w *textWriter) Write(p []byte) (n int, _ error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - w.buf = append(w.buf, p...) - w.complete = false - return len(p), nil - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - w.buf = append(w.buf, ' ') - n++ - } - w.buf = append(w.buf, frag...) - n += len(frag) - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - w.buf = append(w.buf, frag...) - n += len(frag) - if i+1 < len(frags) { - w.buf = append(w.buf, '\n') - 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() - } - w.buf = append(w.buf, c) - w.complete = c == '\n' - return nil -} - -func (w *textWriter) writeName(fd protoreflect.FieldDescriptor) { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - - if fd.Kind() != protoreflect.GroupKind { - w.buf = append(w.buf, fd.Name()...) - w.WriteByte(':') - } else { - // Use message type name for group field name. - w.buf = append(w.buf, fd.Message().Name()...) - } - - if !w.compact { - w.WriteByte(' ') - } -} - -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 -} - -// 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 (w *textWriter) writeProto3Any(m protoreflect.Message) (bool, error) { - md := m.Descriptor() - fdURL := md.Fields().ByName("type_url") - fdVal := md.Fields().ByName("value") - - url := m.Get(fdURL).String() - mt, err := protoregistry.GlobalTypes.FindMessageByURL(url) - if err != nil { - return false, nil - } - - b := m.Get(fdVal).Bytes() - m2 := mt.New() - if err := proto.Unmarshal(b, m2.Interface()); err != nil { - return false, nil - } - w.Write([]byte("[")) - if requiresQuotes(url) { - w.writeQuotedString(url) - } else { - w.Write([]byte(url)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.indent++ - } - if err := w.writeMessage(m2); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.indent-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (w *textWriter) writeMessage(m protoreflect.Message) error { - md := m.Descriptor() - if w.expandAny && md.FullName() == "google.protobuf.Any" { - if canExpand, err := w.writeProto3Any(m); canExpand { - return err - } - } - - fds := md.Fields() - for i := 0; i < fds.Len(); { - fd := fds.Get(i) - if od := fd.ContainingOneof(); od != nil { - fd = m.WhichOneof(od) - i += od.Fields().Len() - } else { - i++ - } - if fd == nil || !m.Has(fd) { - continue - } - - switch { - case fd.IsList(): - lv := m.Get(fd).List() - for j := 0; j < lv.Len(); j++ { - w.writeName(fd) - v := lv.Get(j) - if err := w.writeSingularValue(v, fd); err != nil { - return err - } - w.WriteByte('\n') - } - case fd.IsMap(): - kfd := fd.MapKey() - vfd := fd.MapValue() - mv := m.Get(fd).Map() - - type entry struct{ key, val protoreflect.Value } - var entries []entry - mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { - entries = append(entries, entry{k.Value(), v}) - return true - }) - sort.Slice(entries, func(i, j int) bool { - switch kfd.Kind() { - case protoreflect.BoolKind: - return !entries[i].key.Bool() && entries[j].key.Bool() - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - return entries[i].key.Int() < entries[j].key.Int() - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - return entries[i].key.Uint() < entries[j].key.Uint() - case protoreflect.StringKind: - return entries[i].key.String() < entries[j].key.String() - default: - panic("invalid kind") - } - }) - for _, entry := range entries { - w.writeName(fd) - w.WriteByte('<') - if !w.compact { - w.WriteByte('\n') - } - w.indent++ - w.writeName(kfd) - if err := w.writeSingularValue(entry.key, kfd); err != nil { - return err - } - w.WriteByte('\n') - w.writeName(vfd) - if err := w.writeSingularValue(entry.val, vfd); err != nil { - return err - } - w.WriteByte('\n') - w.indent-- - w.WriteByte('>') - w.WriteByte('\n') - } - default: - w.writeName(fd) - if err := w.writeSingularValue(m.Get(fd), fd); err != nil { - return err - } - w.WriteByte('\n') - } - } - - if b := m.GetUnknown(); len(b) > 0 { - w.writeUnknownFields(b) - } - return w.writeExtensions(m) -} - -func (w *textWriter) writeSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) error { - switch fd.Kind() { - case protoreflect.FloatKind, protoreflect.DoubleKind: - switch vf := v.Float(); { - case math.IsInf(vf, +1): - w.Write(posInf) - case math.IsInf(vf, -1): - w.Write(negInf) - case math.IsNaN(vf): - w.Write(nan) - default: - fmt.Fprint(w, v.Interface()) - } - case protoreflect.StringKind: - // NOTE: This does not validate UTF-8 for historical reasons. - w.writeQuotedString(string(v.String())) - case protoreflect.BytesKind: - w.writeQuotedString(string(v.Bytes())) - case protoreflect.MessageKind, protoreflect.GroupKind: - var bra, ket byte = '<', '>' - if fd.Kind() == protoreflect.GroupKind { - bra, ket = '{', '}' - } - w.WriteByte(bra) - if !w.compact { - w.WriteByte('\n') - } - w.indent++ - m := v.Message() - if m2, ok := m.Interface().(encoding.TextMarshaler); ok { - b, err := m2.MarshalText() - if err != nil { - return err - } - w.Write(b) - } else { - w.writeMessage(m) - } - w.indent-- - w.WriteByte(ket) - case protoreflect.EnumKind: - if ev := fd.Enum().Values().ByNumber(v.Enum()); ev != nil { - fmt.Fprint(w, ev.Name()) - } else { - fmt.Fprint(w, v.Enum()) - } - default: - fmt.Fprint(w, v.Interface()) - } - return nil -} - -// writeQuotedString writes a quoted string in the protocol buffer text format. -func (w *textWriter) writeQuotedString(s string) { - w.WriteByte('"') - for i := 0; i < len(s); i++ { - switch c := s[i]; c { - case '\n': - w.buf = append(w.buf, `\n`...) - case '\r': - w.buf = append(w.buf, `\r`...) - case '\t': - w.buf = append(w.buf, `\t`...) - case '"': - w.buf = append(w.buf, `\"`...) - case '\\': - w.buf = append(w.buf, `\\`...) - default: - if isPrint := c >= 0x20 && c < 0x7f; isPrint { - w.buf = append(w.buf, c) - } else { - w.buf = append(w.buf, fmt.Sprintf(`\%03o`, c)...) - } - } - } - w.WriteByte('"') -} - -func (w *textWriter) writeUnknownFields(b []byte) { - if !w.compact { - fmt.Fprintf(w, "/* %d unknown bytes */\n", len(b)) - } - - for len(b) > 0 { - num, wtyp, n := protowire.ConsumeTag(b) - if n < 0 { - return - } - b = b[n:] - - if wtyp == protowire.EndGroupType { - w.indent-- - w.Write(endBraceNewline) - continue - } - fmt.Fprint(w, num) - if wtyp != protowire.StartGroupType { - w.WriteByte(':') - } - if !w.compact || wtyp == protowire.StartGroupType { - w.WriteByte(' ') - } - switch wtyp { - case protowire.VarintType: - v, n := protowire.ConsumeVarint(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.Fixed32Type: - v, n := protowire.ConsumeFixed32(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.Fixed64Type: - v, n := protowire.ConsumeFixed64(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.BytesType: - v, n := protowire.ConsumeBytes(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprintf(w, "%q", v) - case protowire.StartGroupType: - w.WriteByte('{') - w.indent++ - default: - fmt.Fprintf(w, "/* unknown wire type %d */", wtyp) - } - w.WriteByte('\n') - } -} - -// writeExtensions writes all the extensions in m. -func (w *textWriter) writeExtensions(m protoreflect.Message) error { - md := m.Descriptor() - if md.ExtensionRanges().Len() == 0 { - return nil - } - - type ext struct { - desc protoreflect.FieldDescriptor - val protoreflect.Value - } - var exts []ext - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - exts = append(exts, ext{fd, v}) - } - return true - }) - sort.Slice(exts, func(i, j int) bool { - return exts[i].desc.Number() < exts[j].desc.Number() - }) - - for _, ext := range exts { - // For message set, use the name of the message as the extension name. - name := string(ext.desc.FullName()) - if isMessageSet(ext.desc.ContainingMessage()) { - name = strings.TrimSuffix(name, ".message_set_extension") - } - - if !ext.desc.IsList() { - if err := w.writeSingularExtension(name, ext.val, ext.desc); err != nil { - return err - } - } else { - lv := ext.val.List() - for i := 0; i < lv.Len(); i++ { - if err := w.writeSingularExtension(name, lv.Get(i), ext.desc); err != nil { - return err - } - } - } - } - return nil -} - -func (w *textWriter) writeSingularExtension(name string, v protoreflect.Value, fd protoreflect.FieldDescriptor) error { - fmt.Fprintf(w, "[%s]:", name) - if !w.compact { - w.WriteByte(' ') - } - if err := w.writeSingularValue(v, fd); err != nil { - return err - } - w.WriteByte('\n') - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - for i := 0; i < w.indent*2; i++ { - w.buf = append(w.buf, ' ') - } - w.complete = false -} diff --git a/vendor/github.com/golang/protobuf/proto/wire.go b/vendor/github.com/golang/protobuf/proto/wire.go deleted file mode 100644 index d7c28da5..00000000 --- a/vendor/github.com/golang/protobuf/proto/wire.go +++ /dev/null @@ -1,78 +0,0 @@ -// 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 file. - -package proto - -import ( - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/runtime/protoiface" -) - -// Size returns the size in bytes of the wire-format encoding of m. -func Size(m Message) int { - if m == nil { - return 0 - } - mi := MessageV2(m) - return protoV2.Size(mi) -} - -// Marshal returns the wire-format encoding of m. -func Marshal(m Message) ([]byte, error) { - b, err := marshalAppend(nil, m, false) - if b == nil { - b = zeroBytes - } - return b, err -} - -var zeroBytes = make([]byte, 0, 0) - -func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) { - if m == nil { - return nil, ErrNil - } - mi := MessageV2(m) - nbuf, err := protoV2.MarshalOptions{ - Deterministic: deterministic, - AllowPartial: true, - }.MarshalAppend(buf, mi) - if err != nil { - return buf, err - } - if len(buf) == len(nbuf) { - if !mi.ProtoReflect().IsValid() { - return buf, ErrNil - } - } - return nbuf, checkRequiredNotSet(mi) -} - -// Unmarshal parses a wire-format message in b and places the decoded results in m. -// -// Unmarshal resets m before starting to unmarshal, so any existing data in m is always -// removed. Use UnmarshalMerge to preserve and append to existing data. -func Unmarshal(b []byte, m Message) error { - m.Reset() - return UnmarshalMerge(b, m) -} - -// UnmarshalMerge parses a wire-format message in b and places the decoded results in m. -func UnmarshalMerge(b []byte, m Message) error { - mi := MessageV2(m) - out, err := protoV2.UnmarshalOptions{ - AllowPartial: true, - Merge: true, - }.UnmarshalState(protoiface.UnmarshalInput{ - Buf: b, - Message: mi.ProtoReflect(), - }) - if err != nil { - return err - } - if out.Flags&protoiface.UnmarshalInitialized > 0 { - return nil - } - return checkRequiredNotSet(mi) -} diff --git a/vendor/github.com/golang/protobuf/proto/wrappers.go b/vendor/github.com/golang/protobuf/proto/wrappers.go deleted file mode 100644 index 398e3485..00000000 --- a/vendor/github.com/golang/protobuf/proto/wrappers.go +++ /dev/null @@ -1,34 +0,0 @@ -// 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 file. - -package proto - -// Bool stores v in a new bool value and returns a pointer to it. -func Bool(v bool) *bool { return &v } - -// Int stores v in a new int32 value and returns a pointer to it. -// -// Deprecated: Use Int32 instead. -func Int(v int) *int32 { return Int32(int32(v)) } - -// Int32 stores v in a new int32 value and returns a pointer to it. -func Int32(v int32) *int32 { return &v } - -// Int64 stores v in a new int64 value and returns a pointer to it. -func Int64(v int64) *int64 { return &v } - -// Uint32 stores v in a new uint32 value and returns a pointer to it. -func Uint32(v uint32) *uint32 { return &v } - -// Uint64 stores v in a new uint64 value and returns a pointer to it. -func Uint64(v uint64) *uint64 { return &v } - -// Float32 stores v in a new float32 value and returns a pointer to it. -func Float32(v float32) *float32 { return &v } - -// Float64 stores v in a new float64 value and returns a pointer to it. -func Float64(v float64) *float64 { return &v } - -// String stores v in a new string value and returns a pointer to it. -func String(v string) *string { return &v } diff --git a/vendor/github.com/google/uuid/CHANGELOG.md b/vendor/github.com/google/uuid/CHANGELOG.md index 2bd78667..c9fb829d 100644 --- a/vendor/github.com/google/uuid/CHANGELOG.md +++ b/vendor/github.com/google/uuid/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## [1.5.0](https://github.com/google/uuid/compare/v1.4.0...v1.5.0) (2023-12-12) + + +### Features + +* Validate UUID without creating new UUID ([#141](https://github.com/google/uuid/issues/141)) ([9ee7366](https://github.com/google/uuid/commit/9ee7366e66c9ad96bab89139418a713dc584ae29)) + +## [1.4.0](https://github.com/google/uuid/compare/v1.3.1...v1.4.0) (2023-10-26) + + +### Features + +* UUIDs slice type with Strings() convenience method ([#133](https://github.com/google/uuid/issues/133)) ([cd5fbbd](https://github.com/google/uuid/commit/cd5fbbdd02f3e3467ac18940e07e062be1f864b4)) + +### Fixes + +* Clarify that Parse's job is to parse but not necessarily validate strings. (Documents current behavior) + ## [1.3.1](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) (2023-08-18) diff --git a/vendor/github.com/google/uuid/CONTRIBUTING.md b/vendor/github.com/google/uuid/CONTRIBUTING.md index 55668887..a502fdc5 100644 --- a/vendor/github.com/google/uuid/CONTRIBUTING.md +++ b/vendor/github.com/google/uuid/CONTRIBUTING.md @@ -11,7 +11,7 @@ please explain why in the pull request description. ### Releasing -Commits that would precipitate a SemVer change, as desrcibed in the Conventional +Commits that would precipitate a SemVer change, as described in the Conventional Commits Specification, will trigger [`release-please`](https://github.com/google-github-actions/release-please-action) to create a release candidate pull request. Once submitted, `release-please` will create a release. diff --git a/vendor/github.com/google/uuid/time.go b/vendor/github.com/google/uuid/time.go index e6ef06cd..c3511292 100644 --- a/vendor/github.com/google/uuid/time.go +++ b/vendor/github.com/google/uuid/time.go @@ -108,12 +108,23 @@ func setClockSequence(seq int) { } // 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. +// uuid. The time is only defined for version 1, 2, 6 and 7 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) + var t Time + switch uuid.Version() { + case 6: + time := binary.BigEndian.Uint64(uuid[:8]) // Ignore uuid[6] version b0110 + t = Time(time) + case 7: + time := binary.BigEndian.Uint64(uuid[:8]) + t = Time((time>>16)*10000 + g1582ns100) + default: // forward compatible + 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 + t = Time(time) + } + return t } // ClockSequence returns the clock sequence encoded in uuid. diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index a56138cc..5232b486 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -56,11 +56,15 @@ func IsInvalidLengthError(err error) bool { return ok } -// 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. +// Parse decodes s into a UUID or returns an error if it cannot be parsed. Both +// the standard UUID forms defined in RFC 4122 +// (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) are decoded. In addition, +// Parse accepts non-standard strings such as the raw hex encoding +// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx and 38 byte "Microsoft style" encodings, +// e.g. {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Only the middle 36 bytes are +// examined in the latter case. Parse should not be used to validate strings as +// it parses non-standard encodings as indicated above. func Parse(s string) (UUID, error) { var uuid UUID switch len(s) { @@ -182,6 +186,59 @@ func Must(uuid UUID, err error) UUID { return uuid } +// Validate returns an error if s is not a properly formatted UUID in one of the following formats: +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} +// It returns an error if the format is invalid, otherwise nil. +func Validate(s string) error { + switch len(s) { + // Standard UUID format + case 36: + + // UUID with "urn:uuid:" prefix + case 36 + 9: + if !strings.EqualFold(s[:9], "urn:uuid:") { + return fmt.Errorf("invalid urn prefix: %q", s[:9]) + } + s = s[9:] + + // UUID enclosed in braces + case 36 + 2: + if s[0] != '{' || s[len(s)-1] != '}' { + return fmt.Errorf("invalid bracketed UUID format") + } + s = s[1 : len(s)-1] + + // UUID without hyphens + case 32: + for i := 0; i < len(s); i += 2 { + _, ok := xtob(s[i], s[i+1]) + if !ok { + return errors.New("invalid UUID format") + } + } + + default: + return invalidLengthError{len(s)} + } + + // Check for standard UUID format + if len(s) == 36 { + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return errors.New("invalid UUID format") + } + for _, x := range []int{0, 2, 4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34} { + if _, ok := xtob(s[x], s[x+1]); !ok { + return errors.New("invalid UUID format") + } + } + } + + return nil +} + // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx // , or "" if uuid is invalid. func (uuid UUID) String() string { @@ -294,3 +351,15 @@ func DisableRandPool() { poolMu.Lock() poolPos = randPoolSize } + +// UUIDs is a slice of UUID types. +type UUIDs []UUID + +// Strings returns a string slice containing the string form of each UUID in uuids. +func (uuids UUIDs) Strings() []string { + var uuidStrs = make([]string, len(uuids)) + for i, uuid := range uuids { + uuidStrs[i] = uuid.String() + } + return uuidStrs +} diff --git a/vendor/github.com/google/uuid/version6.go b/vendor/github.com/google/uuid/version6.go new file mode 100644 index 00000000..339a959a --- /dev/null +++ b/vendor/github.com/google/uuid/version6.go @@ -0,0 +1,56 @@ +// Copyright 2023 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" + +// UUID version 6 is a field-compatible version of UUIDv1, reordered for improved DB locality. +// It is expected that UUIDv6 will primarily be used in contexts where there are existing v1 UUIDs. +// Systems that do not involve legacy UUIDv1 SHOULD consider using UUIDv7 instead. +// +// see https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#uuidv6 +// +// NewV6 returns a Version 6 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 NewV6 set NodeID is random bits automatically . If clock sequence has not been set by +// SetClockSequence then it will be set automatically. If GetTime fails to +// return the current NewV6 returns Nil and an error. +func NewV6() (UUID, error) { + var uuid UUID + now, seq, err := GetTime() + if err != nil { + return uuid, err + } + + /* + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | time_high | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | time_mid | time_low_and_version | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |clk_seq_hi_res | clk_seq_low | node (0-1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | node (2-5) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + + binary.BigEndian.PutUint64(uuid[0:], uint64(now)) + binary.BigEndian.PutUint16(uuid[8:], seq) + + uuid[6] = 0x60 | (uuid[6] & 0x0F) + uuid[8] = 0x80 | (uuid[8] & 0x3F) + + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } + copy(uuid[10:], nodeID[:]) + nodeMu.Unlock() + + return uuid, nil +} diff --git a/vendor/github.com/google/uuid/version7.go b/vendor/github.com/google/uuid/version7.go new file mode 100644 index 00000000..ba9dd5eb --- /dev/null +++ b/vendor/github.com/google/uuid/version7.go @@ -0,0 +1,75 @@ +// Copyright 2023 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" +) + +// UUID version 7 features a time-ordered value field derived from the widely +// implemented and well known Unix Epoch timestamp source, +// the number of milliseconds seconds since midnight 1 Jan 1970 UTC, leap seconds excluded. +// As well as improved entropy characteristics over versions 1 or 6. +// +// see https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#name-uuid-version-7 +// +// Implementations SHOULD utilize UUID version 7 over UUID version 1 and 6 if possible. +// +// NewV7 returns a Version 7 UUID based on the current time(Unix Epoch). +// Uses the randomness pool if it was enabled with EnableRandPool. +// On error, NewV7 returns Nil and an error +func NewV7() (UUID, error) { + uuid, err := NewRandom() + if err != nil { + return uuid, err + } + makeV7(uuid[:]) + return uuid, nil +} + +// NewV7FromReader returns a Version 7 UUID based on the current time(Unix Epoch). +// it use NewRandomFromReader fill random bits. +// On error, NewV7FromReader returns Nil and an error. +func NewV7FromReader(r io.Reader) (UUID, error) { + uuid, err := NewRandomFromReader(r) + if err != nil { + return uuid, err + } + + makeV7(uuid[:]) + return uuid, nil +} + +// makeV7 fill 48 bits time (uuid[0] - uuid[5]), set version b0111 (uuid[6]) +// uuid[8] already has the right version number (Variant is 10) +// see function NewV7 and NewV7FromReader +func makeV7(uuid []byte) { + /* + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | unix_ts_ms | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | unix_ts_ms | ver | rand_a | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |var| rand_b | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | rand_b | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + _ = uuid[15] // bounds check + + t := timeNow().UnixMilli() + + uuid[0] = byte(t >> 40) + uuid[1] = byte(t >> 32) + uuid[2] = byte(t >> 24) + uuid[3] = byte(t >> 16) + uuid[4] = byte(t >> 8) + uuid[5] = byte(t) + + uuid[6] = 0x70 | (uuid[6] & 0x0F) + // uuid[8] has already has right version +} diff --git a/vendor/github.com/gorilla/websocket/.editorconfig b/vendor/github.com/gorilla/websocket/.editorconfig new file mode 100644 index 00000000..2940ec92 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/.editorconfig @@ -0,0 +1,20 @@ +; https://editorconfig.org/ + +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[{Makefile,go.mod,go.sum,*.go,.gitmodules}] +indent_style = tab +indent_size = 4 + +[*.md] +indent_size = 4 +trim_trailing_whitespace = false + +eclint_indent_style = unset diff --git a/vendor/github.com/gorilla/websocket/.gitignore b/vendor/github.com/gorilla/websocket/.gitignore index cd3fcd1e..84039fec 100644 --- a/vendor/github.com/gorilla/websocket/.gitignore +++ b/vendor/github.com/gorilla/websocket/.gitignore @@ -1,25 +1 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -.idea/ -*.iml +coverage.coverprofile diff --git a/vendor/github.com/gorilla/websocket/.golangci.yml b/vendor/github.com/gorilla/websocket/.golangci.yml new file mode 100644 index 00000000..34882139 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/.golangci.yml @@ -0,0 +1,3 @@ +run: + skip-dirs: + - examples/*.go diff --git a/vendor/github.com/gorilla/websocket/AUTHORS b/vendor/github.com/gorilla/websocket/AUTHORS deleted file mode 100644 index 1931f400..00000000 --- a/vendor/github.com/gorilla/websocket/AUTHORS +++ /dev/null @@ -1,9 +0,0 @@ -# This is the official list of Gorilla WebSocket authors for copyright -# purposes. -# -# Please keep the list sorted. - -Gary Burd -Google LLC (https://opensource.google.com/) -Joachim Bauch - diff --git a/vendor/github.com/gorilla/websocket/LICENSE b/vendor/github.com/gorilla/websocket/LICENSE index 9171c972..bb9d80bc 100644 --- a/vendor/github.com/gorilla/websocket/LICENSE +++ b/vendor/github.com/gorilla/websocket/LICENSE @@ -1,22 +1,27 @@ -Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved. +Copyright (c) 2023 The Gorilla 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: +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 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. - 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 HOLDER 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 +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/gorilla/websocket/Makefile b/vendor/github.com/gorilla/websocket/Makefile new file mode 100644 index 00000000..603a63f5 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/Makefile @@ -0,0 +1,34 @@ +GO_LINT=$(shell which golangci-lint 2> /dev/null || echo '') +GO_LINT_URI=github.com/golangci/golangci-lint/cmd/golangci-lint@latest + +GO_SEC=$(shell which gosec 2> /dev/null || echo '') +GO_SEC_URI=github.com/securego/gosec/v2/cmd/gosec@latest + +GO_VULNCHECK=$(shell which govulncheck 2> /dev/null || echo '') +GO_VULNCHECK_URI=golang.org/x/vuln/cmd/govulncheck@latest + +.PHONY: golangci-lint +golangci-lint: + $(if $(GO_LINT), ,go install $(GO_LINT_URI)) + @echo "##### Running golangci-lint" + golangci-lint run -v + +.PHONY: gosec +gosec: + $(if $(GO_SEC), ,go install $(GO_SEC_URI)) + @echo "##### Running gosec" + gosec -exclude-dir examples ./... + +.PHONY: govulncheck +govulncheck: + $(if $(GO_VULNCHECK), ,go install $(GO_VULNCHECK_URI)) + @echo "##### Running govulncheck" + govulncheck ./... + +.PHONY: verify +verify: golangci-lint gosec govulncheck + +.PHONY: test +test: + @echo "##### Running tests" + go test -race -cover -coverprofile=coverage.coverprofile -covermode=atomic -v ./... diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md index 2517a287..1fd5e9c4 100644 --- a/vendor/github.com/gorilla/websocket/README.md +++ b/vendor/github.com/gorilla/websocket/README.md @@ -1,17 +1,14 @@ -# Gorilla WebSocket +# gorilla/websocket -[![GoDoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) -[![CircleCI](https://circleci.com/gh/gorilla/websocket.svg?style=svg)](https://circleci.com/gh/gorilla/websocket) +![testing](https://github.com/gorilla/websocket/actions/workflows/test.yml/badge.svg) +[![codecov](https://codecov.io/github/gorilla/websocket/branch/main/graph/badge.svg)](https://codecov.io/github/gorilla/websocket) +[![godoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) +[![sourcegraph](https://sourcegraph.com/github.com/gorilla/websocket/-/badge.svg)](https://sourcegraph.com/github.com/gorilla/websocket?badge) -Gorilla WebSocket is a [Go](http://golang.org/) implementation of the -[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. +Gorilla WebSocket is a [Go](http://golang.org/) implementation of the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. +![Gorilla Logo](https://github.com/gorilla/.github/assets/53367916/d92caabf-98e0-473e-bfbf-ab554ba435e5) ---- - -⚠️ **[The Gorilla WebSocket Package is looking for a new maintainer](https://github.com/gorilla/websocket/issues/370)** - ---- ### Documentation @@ -20,6 +17,7 @@ Gorilla WebSocket is a [Go](http://golang.org/) implementation of the * [Command example](https://github.com/gorilla/websocket/tree/master/examples/command) * [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo) * [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch) +* [Write buffer pool example](https://github.com/gorilla/websocket/tree/master/examples/bufferpool) ### Status @@ -36,4 +34,3 @@ package API is stable. The Gorilla WebSocket package passes the server tests in the [Autobahn Test Suite](https://github.com/crossbario/autobahn-testsuite) using the application in the [examples/autobahn subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). - diff --git a/vendor/github.com/gorilla/websocket/client.go b/vendor/github.com/gorilla/websocket/client.go index 2efd8355..815b0ca5 100644 --- a/vendor/github.com/gorilla/websocket/client.go +++ b/vendor/github.com/gorilla/websocket/client.go @@ -9,14 +9,18 @@ import ( "context" "crypto/tls" "errors" + "fmt" "io" - "io/ioutil" + "log" + "net" "net/http" "net/http/httptrace" "net/url" "strings" "time" + + "golang.org/x/net/proxy" ) // ErrBadHandshake is returned when the server response to opening handshake is @@ -224,6 +228,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h k == "Connection" || k == "Sec-Websocket-Key" || k == "Sec-Websocket-Version" || + //#nosec G101 (CWE-798): Potential HTTP request smuggling via parameter pollution k == "Sec-Websocket-Extensions" || (k == "Sec-Websocket-Protocol" && len(d.Subprotocols) > 0): return nil, nil, errors.New("websocket: duplicate header not allowed: " + k) @@ -289,7 +294,9 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } err = c.SetDeadline(deadline) if err != nil { - c.Close() + if err := c.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } return nil, err } return c, nil @@ -303,7 +310,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h return nil, nil, err } if proxyURL != nil { - dialer, err := proxy_FromURL(proxyURL, netDialerFunc(netDial)) + dialer, err := proxy.FromURL(proxyURL, netDialerFunc(netDial)) if err != nil { return nil, nil, err } @@ -318,18 +325,20 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } netConn, err := netDial("tcp", hostPort) + if err != nil { + return nil, nil, err + } if trace != nil && trace.GotConn != nil { trace.GotConn(httptrace.GotConnInfo{ Conn: netConn, }) } - if err != nil { - return nil, nil, err - } defer func() { if netConn != nil { - netConn.Close() + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } } }() @@ -370,6 +379,17 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h resp, err := http.ReadResponse(conn.br, req) if err != nil { + if d.TLSClientConfig != nil { + for _, proto := range d.TLSClientConfig.NextProtos { + if proto != "http/1.1" { + return nil, nil, fmt.Errorf( + "websocket: protocol %q was given but is not supported;"+ + "sharing tls.Config with net/http Transport can cause this error: %w", + proto, err, + ) + } + } + } return nil, nil, err } @@ -388,7 +408,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h // debugging. buf := make([]byte, 1024) n, _ := io.ReadFull(resp.Body, buf) - resp.Body = ioutil.NopCloser(bytes.NewReader(buf[:n])) + resp.Body = io.NopCloser(bytes.NewReader(buf[:n])) return nil, resp, ErrBadHandshake } @@ -406,17 +426,19 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h break } - resp.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) + resp.Body = io.NopCloser(bytes.NewReader([]byte{})) conn.subprotocol = resp.Header.Get("Sec-Websocket-Protocol") - netConn.SetDeadline(time.Time{}) + if err := netConn.SetDeadline(time.Time{}); err != nil { + return nil, nil, err + } netConn = nil // to avoid close in defer. return conn, resp, nil } func cloneTLSConfig(cfg *tls.Config) *tls.Config { if cfg == nil { - return &tls.Config{} + return &tls.Config{MinVersion: tls.VersionTLS12} } return cfg.Clone() } diff --git a/vendor/github.com/gorilla/websocket/compression.go b/vendor/github.com/gorilla/websocket/compression.go index 813ffb1e..9fed0ef5 100644 --- a/vendor/github.com/gorilla/websocket/compression.go +++ b/vendor/github.com/gorilla/websocket/compression.go @@ -8,6 +8,7 @@ import ( "compress/flate" "errors" "io" + "log" "strings" "sync" ) @@ -33,7 +34,9 @@ func decompressNoContextTakeover(r io.Reader) io.ReadCloser { "\x01\x00\x00\xff\xff" fr, _ := flateReaderPool.Get().(io.ReadCloser) - fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil) + if err := fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil); err != nil { + panic(err) + } return &flateReadWrapper{fr} } @@ -132,7 +135,9 @@ func (r *flateReadWrapper) Read(p []byte) (int, error) { // Preemptively place the reader back in the pool. This helps with // scenarios where the application does not call NextReader() soon after // this final read. - r.Close() + if err := r.Close(); err != nil { + log.Printf("websocket: flateReadWrapper.Close() returned error: %v", err) + } } return n, err } diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go index 331eebc8..221e6cf7 100644 --- a/vendor/github.com/gorilla/websocket/conn.go +++ b/vendor/github.com/gorilla/websocket/conn.go @@ -6,11 +6,11 @@ package websocket import ( "bufio" + "crypto/rand" "encoding/binary" "errors" "io" - "io/ioutil" - "math/rand" + "log" "net" "strconv" "strings" @@ -181,13 +181,20 @@ var ( errInvalidControlFrame = errors.New("websocket: invalid control frame") ) +// maskRand is an io.Reader for generating mask bytes. The reader is initialized +// to crypto/rand Reader. Tests swap the reader to a math/rand reader for +// reproducible results. +var maskRand = rand.Reader + +// newMaskKey returns a new 32 bit value for masking client frames. func newMaskKey() [4]byte { - n := rand.Uint32() - return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)} + var k [4]byte + _, _ = io.ReadFull(maskRand, k[:]) + return k } func hideTempErr(err error) error { - if e, ok := err.(net.Error); ok && e.Temporary() { + if e, ok := err.(net.Error); ok { err = &netError{msg: e.Error(), timeout: e.Timeout()} } return err @@ -372,7 +379,9 @@ func (c *Conn) read(n int) ([]byte, error) { if err == io.EOF { err = errUnexpectedEOF } - c.br.Discard(len(p)) + if _, err := c.br.Discard(len(p)); err != nil { + return p, err + } return p, err } @@ -387,7 +396,9 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error return err } - c.conn.SetWriteDeadline(deadline) + if err := c.conn.SetWriteDeadline(deadline); err != nil { + return c.writeFatal(err) + } if len(buf1) == 0 { _, err = c.conn.Write(buf0) } else { @@ -397,7 +408,7 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error return c.writeFatal(err) } if frameType == CloseMessage { - c.writeFatal(ErrCloseSent) + _ = c.writeFatal(ErrCloseSent) } return nil } @@ -438,7 +449,7 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er d := 1000 * time.Hour if !deadline.IsZero() { - d = deadline.Sub(time.Now()) + d = time.Until(deadline) if d < 0 { return errWriteTimeout } @@ -460,13 +471,15 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er return err } - c.conn.SetWriteDeadline(deadline) + if err := c.conn.SetWriteDeadline(deadline); err != nil { + return c.writeFatal(err) + } _, err = c.conn.Write(buf) if err != nil { return c.writeFatal(err) } if messageType == CloseMessage { - c.writeFatal(ErrCloseSent) + _ = c.writeFatal(ErrCloseSent) } return err } @@ -477,7 +490,9 @@ func (c *Conn) beginMessage(mw *messageWriter, messageType int) error { // probably better to return an error in this situation, but we cannot // change this without breaking existing applications. if c.writer != nil { - c.writer.Close() + if err := c.writer.Close(); err != nil { + log.Printf("websocket: discarding writer close error: %v", err) + } c.writer = nil } @@ -630,7 +645,7 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error { } if final { - w.endMessage(errWriteClosed) + _ = w.endMessage(errWriteClosed) return nil } @@ -795,7 +810,7 @@ func (c *Conn) advanceFrame() (int, error) { // 1. Skip remainder of previous frame. if c.readRemaining > 0 { - if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil { + if _, err := io.CopyN(io.Discard, c.br, c.readRemaining); err != nil { return noFrame, err } } @@ -817,7 +832,9 @@ func (c *Conn) advanceFrame() (int, error) { rsv2 := p[0]&rsv2Bit != 0 rsv3 := p[0]&rsv3Bit != 0 mask := p[1]&maskBit != 0 - c.setReadRemaining(int64(p[1] & 0x7f)) + if err := c.setReadRemaining(int64(p[1] & 0x7f)); err != nil { + return noFrame, err + } c.readDecompress = false if rsv1 { @@ -922,7 +939,9 @@ func (c *Conn) advanceFrame() (int, error) { } if c.readLimit > 0 && c.readLength > c.readLimit { - c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)) + if err := c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)); err != nil { + return noFrame, err + } return noFrame, ErrReadLimit } @@ -934,7 +953,9 @@ func (c *Conn) advanceFrame() (int, error) { var payload []byte if c.readRemaining > 0 { payload, err = c.read(int(c.readRemaining)) - c.setReadRemaining(0) + if err := c.setReadRemaining(0); err != nil { + return noFrame, err + } if err != nil { return noFrame, err } @@ -981,7 +1002,9 @@ func (c *Conn) handleProtocolError(message string) error { if len(data) > maxControlFramePayloadSize { data = data[:maxControlFramePayloadSize] } - c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)) + if err := c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)); err != nil { + return err + } return errors.New("websocket: " + message) } @@ -998,7 +1021,9 @@ func (c *Conn) handleProtocolError(message string) error { func (c *Conn) NextReader() (messageType int, r io.Reader, err error) { // Close previous reader, only relevant for decompression. if c.reader != nil { - c.reader.Close() + if err := c.reader.Close(); err != nil { + log.Printf("websocket: discarding reader close error: %v", err) + } c.reader = nil } @@ -1054,7 +1079,9 @@ func (r *messageReader) Read(b []byte) (int, error) { } rem := c.readRemaining rem -= int64(n) - c.setReadRemaining(rem) + if err := c.setReadRemaining(rem); err != nil { + return 0, err + } if c.readRemaining > 0 && c.readErr == io.EOF { c.readErr = errUnexpectedEOF } @@ -1094,7 +1121,7 @@ func (c *Conn) ReadMessage() (messageType int, p []byte, err error) { if err != nil { return messageType, nil, err } - p, err = ioutil.ReadAll(r) + p, err = io.ReadAll(r) return messageType, p, err } @@ -1136,7 +1163,9 @@ func (c *Conn) SetCloseHandler(h func(code int, text string) error) { if h == nil { h = func(code int, text string) error { message := FormatCloseMessage(code, "") - c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)) + if err := c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)); err != nil { + return err + } return nil } } @@ -1161,7 +1190,7 @@ func (c *Conn) SetPingHandler(h func(appData string) error) { err := c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait)) if err == ErrCloseSent { return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { + } else if _, ok := err.(net.Error); ok { return nil } return err @@ -1189,8 +1218,16 @@ func (c *Conn) SetPongHandler(h func(appData string) error) { c.handlePong = h } +// NetConn returns the underlying connection that is wrapped by c. +// Note that writing to or reading from this connection directly will corrupt the +// WebSocket connection. +func (c *Conn) NetConn() net.Conn { + return c.conn +} + // UnderlyingConn returns the internal net.Conn. This can be used to further // modifications to connection specific flags. +// Deprecated: Use the NetConn method. func (c *Conn) UnderlyingConn() net.Conn { return c.conn } diff --git a/vendor/github.com/gorilla/websocket/mask.go b/vendor/github.com/gorilla/websocket/mask.go index d0742bf2..67d0968b 100644 --- a/vendor/github.com/gorilla/websocket/mask.go +++ b/vendor/github.com/gorilla/websocket/mask.go @@ -9,6 +9,7 @@ package websocket import "unsafe" +// #nosec G103 -- (CWE-242) Has been audited const wordSize = int(unsafe.Sizeof(uintptr(0))) func maskBytes(key [4]byte, pos int, b []byte) int { @@ -22,6 +23,7 @@ func maskBytes(key [4]byte, pos int, b []byte) int { } // Mask one byte at a time to word boundary. + //#nosec G103 -- (CWE-242) Has been audited if n := int(uintptr(unsafe.Pointer(&b[0]))) % wordSize; n != 0 { n = wordSize - n for i := range b[:n] { @@ -36,11 +38,13 @@ func maskBytes(key [4]byte, pos int, b []byte) int { for i := range k { k[i] = key[(pos+i)&3] } + //#nosec G103 -- (CWE-242) Has been audited kw := *(*uintptr)(unsafe.Pointer(&k)) // Mask one word at a time. n := (len(b) / wordSize) * wordSize for i := 0; i < n; i += wordSize { + //#nosec G103 -- (CWE-242) Has been audited *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + uintptr(i))) ^= kw } diff --git a/vendor/github.com/gorilla/websocket/proxy.go b/vendor/github.com/gorilla/websocket/proxy.go index e0f466b7..80f55d1e 100644 --- a/vendor/github.com/gorilla/websocket/proxy.go +++ b/vendor/github.com/gorilla/websocket/proxy.go @@ -8,10 +8,13 @@ import ( "bufio" "encoding/base64" "errors" + "log" "net" "net/http" "net/url" "strings" + + "golang.org/x/net/proxy" ) type netDialerFunc func(network, addr string) (net.Conn, error) @@ -21,7 +24,7 @@ func (fn netDialerFunc) Dial(network, addr string) (net.Conn, error) { } func init() { - proxy_RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy_Dialer) (proxy_Dialer, error) { + proxy.RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy.Dialer) (proxy.Dialer, error) { return &httpProxyDialer{proxyURL: proxyURL, forwardDial: forwardDialer.Dial}, nil }) } @@ -55,7 +58,9 @@ func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) } if err := connectReq.Write(conn); err != nil { - conn.Close() + if err := conn.Close(); err != nil { + log.Printf("httpProxyDialer: failed to close connection: %v", err) + } return nil, err } @@ -64,12 +69,16 @@ func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) br := bufio.NewReader(conn) resp, err := http.ReadResponse(br, connectReq) if err != nil { - conn.Close() + if err := conn.Close(); err != nil { + log.Printf("httpProxyDialer: failed to close connection: %v", err) + } return nil, err } if resp.StatusCode != 200 { - conn.Close() + if err := conn.Close(); err != nil { + log.Printf("httpProxyDialer: failed to close connection: %v", err) + } f := strings.SplitN(resp.Status, " ", 2) return nil, errors.New(f[1]) } diff --git a/vendor/github.com/gorilla/websocket/server.go b/vendor/github.com/gorilla/websocket/server.go index 24d53b38..1e720e1d 100644 --- a/vendor/github.com/gorilla/websocket/server.go +++ b/vendor/github.com/gorilla/websocket/server.go @@ -8,6 +8,7 @@ import ( "bufio" "errors" "io" + "log" "net/http" "net/url" "strings" @@ -154,8 +155,8 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade } challengeKey := r.Header.Get("Sec-Websocket-Key") - if challengeKey == "" { - return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: 'Sec-WebSocket-Key' header is missing or blank") + if !isValidChallengeKey(challengeKey) { + return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: 'Sec-WebSocket-Key' header must be Base64 encoded value of 16-byte in length") } subprotocol := u.selectSubprotocol(r, responseHeader) @@ -183,7 +184,9 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade } if brw.Reader.Buffered() > 0 { - netConn.Close() + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } return nil, errors.New("websocket: client sent data before handshake is complete") } @@ -248,17 +251,34 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade p = append(p, "\r\n"...) // Clear deadlines set by HTTP server. - netConn.SetDeadline(time.Time{}) + if err := netConn.SetDeadline(time.Time{}); err != nil { + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } + return nil, err + } if u.HandshakeTimeout > 0 { - netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)) + if err := netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)); err != nil { + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } + return nil, err + } } if _, err = netConn.Write(p); err != nil { - netConn.Close() + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } return nil, err } if u.HandshakeTimeout > 0 { - netConn.SetWriteDeadline(time.Time{}) + if err := netConn.SetWriteDeadline(time.Time{}); err != nil { + if err := netConn.Close(); err != nil { + log.Printf("websocket: failed to close network connection: %v", err) + } + return nil, err + } } return c, nil @@ -356,8 +376,12 @@ func bufioWriterBuffer(originalWriter io.Writer, bw *bufio.Writer) []byte { // bufio.Writer's underlying writer. var wh writeHook bw.Reset(&wh) - bw.WriteByte(0) - bw.Flush() + if err := bw.WriteByte(0); err != nil { + panic(err) + } + if err := bw.Flush(); err != nil { + log.Printf("websocket: bufioWriterBuffer: Flush: %v", err) + } bw.Reset(originalWriter) diff --git a/vendor/github.com/gorilla/websocket/tls_handshake.go b/vendor/github.com/gorilla/websocket/tls_handshake.go index a62b68cc..7f386453 100644 --- a/vendor/github.com/gorilla/websocket/tls_handshake.go +++ b/vendor/github.com/gorilla/websocket/tls_handshake.go @@ -1,6 +1,3 @@ -//go:build go1.17 -// +build go1.17 - package websocket import ( diff --git a/vendor/github.com/gorilla/websocket/tls_handshake_116.go b/vendor/github.com/gorilla/websocket/tls_handshake_116.go deleted file mode 100644 index e1b2b44f..00000000 --- a/vendor/github.com/gorilla/websocket/tls_handshake_116.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build !go1.17 -// +build !go1.17 - -package websocket - -import ( - "context" - "crypto/tls" -) - -func doHandshake(ctx context.Context, tlsConn *tls.Conn, cfg *tls.Config) error { - if err := tlsConn.Handshake(); err != nil { - return err - } - if !cfg.InsecureSkipVerify { - if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/gorilla/websocket/util.go b/vendor/github.com/gorilla/websocket/util.go index 7bf2f66c..9b1a629b 100644 --- a/vendor/github.com/gorilla/websocket/util.go +++ b/vendor/github.com/gorilla/websocket/util.go @@ -6,7 +6,7 @@ package websocket import ( "crypto/rand" - "crypto/sha1" + "crypto/sha1" //#nosec G505 -- (CWE-327) https://datatracker.ietf.org/doc/html/rfc6455#page-54 "encoding/base64" "io" "net/http" @@ -17,7 +17,7 @@ import ( var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") func computeAcceptKey(challengeKey string) string { - h := sha1.New() + h := sha1.New() //#nosec G401 -- (CWE-326) https://datatracker.ietf.org/doc/html/rfc6455#page-54 h.Write([]byte(challengeKey)) h.Write(keyGUID) return base64.StdEncoding.EncodeToString(h.Sum(nil)) @@ -281,3 +281,18 @@ headers: } return result } + +// isValidChallengeKey checks if the argument meets RFC6455 specification. +func isValidChallengeKey(s string) bool { + // From RFC6455: + // + // A |Sec-WebSocket-Key| header field with a base64-encoded (see + // Section 4 of [RFC4648]) value that, when decoded, is 16 bytes in + // length. + + if s == "" { + return false + } + decoded, err := base64.StdEncoding.DecodeString(s) + return err == nil && len(decoded) == 16 +} diff --git a/vendor/github.com/gorilla/websocket/x_net_proxy.go b/vendor/github.com/gorilla/websocket/x_net_proxy.go deleted file mode 100644 index 2e668f6b..00000000 --- a/vendor/github.com/gorilla/websocket/x_net_proxy.go +++ /dev/null @@ -1,473 +0,0 @@ -// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT. -//go:generate bundle -o x_net_proxy.go golang.org/x/net/proxy - -// Package proxy provides support for a variety of protocols to proxy network -// data. -// - -package websocket - -import ( - "errors" - "io" - "net" - "net/url" - "os" - "strconv" - "strings" - "sync" -) - -type proxy_direct struct{} - -// Direct is a direct proxy: one that makes network connections directly. -var proxy_Direct = proxy_direct{} - -func (proxy_direct) Dial(network, addr string) (net.Conn, error) { - return net.Dial(network, addr) -} - -// A PerHost directs connections to a default Dialer unless the host name -// requested matches one of a number of exceptions. -type proxy_PerHost struct { - def, bypass proxy_Dialer - - bypassNetworks []*net.IPNet - bypassIPs []net.IP - bypassZones []string - bypassHosts []string -} - -// NewPerHost returns a PerHost Dialer that directs connections to either -// defaultDialer or bypass, depending on whether the connection matches one of -// the configured rules. -func proxy_NewPerHost(defaultDialer, bypass proxy_Dialer) *proxy_PerHost { - return &proxy_PerHost{ - def: defaultDialer, - bypass: bypass, - } -} - -// Dial connects to the address addr on the given network through either -// defaultDialer or bypass. -func (p *proxy_PerHost) Dial(network, addr string) (c net.Conn, err error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - return p.dialerForRequest(host).Dial(network, addr) -} - -func (p *proxy_PerHost) dialerForRequest(host string) proxy_Dialer { - if ip := net.ParseIP(host); ip != nil { - for _, net := range p.bypassNetworks { - if net.Contains(ip) { - return p.bypass - } - } - for _, bypassIP := range p.bypassIPs { - if bypassIP.Equal(ip) { - return p.bypass - } - } - return p.def - } - - for _, zone := range p.bypassZones { - if strings.HasSuffix(host, zone) { - return p.bypass - } - if host == zone[1:] { - // For a zone ".example.com", we match "example.com" - // too. - return p.bypass - } - } - for _, bypassHost := range p.bypassHosts { - if bypassHost == host { - return p.bypass - } - } - return p.def -} - -// AddFromString parses a string that contains comma-separated values -// specifying hosts that should use the bypass proxy. Each value is either an -// IP address, a CIDR range, a zone (*.example.com) or a host name -// (localhost). A best effort is made to parse the string and errors are -// ignored. -func (p *proxy_PerHost) AddFromString(s string) { - hosts := strings.Split(s, ",") - for _, host := range hosts { - host = strings.TrimSpace(host) - if len(host) == 0 { - continue - } - if strings.Contains(host, "/") { - // We assume that it's a CIDR address like 127.0.0.0/8 - if _, net, err := net.ParseCIDR(host); err == nil { - p.AddNetwork(net) - } - continue - } - if ip := net.ParseIP(host); ip != nil { - p.AddIP(ip) - continue - } - if strings.HasPrefix(host, "*.") { - p.AddZone(host[1:]) - continue - } - p.AddHost(host) - } -} - -// AddIP specifies an IP address that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match an IP. -func (p *proxy_PerHost) AddIP(ip net.IP) { - p.bypassIPs = append(p.bypassIPs, ip) -} - -// AddNetwork specifies an IP range that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match. -func (p *proxy_PerHost) AddNetwork(net *net.IPNet) { - p.bypassNetworks = append(p.bypassNetworks, net) -} - -// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of -// "example.com" matches "example.com" and all of its subdomains. -func (p *proxy_PerHost) AddZone(zone string) { - if strings.HasSuffix(zone, ".") { - zone = zone[:len(zone)-1] - } - if !strings.HasPrefix(zone, ".") { - zone = "." + zone - } - p.bypassZones = append(p.bypassZones, zone) -} - -// AddHost specifies a host name that will use the bypass proxy. -func (p *proxy_PerHost) AddHost(host string) { - if strings.HasSuffix(host, ".") { - host = host[:len(host)-1] - } - p.bypassHosts = append(p.bypassHosts, host) -} - -// A Dialer is a means to establish a connection. -type proxy_Dialer interface { - // Dial connects to the given address via the proxy. - Dial(network, addr string) (c net.Conn, err error) -} - -// Auth contains authentication parameters that specific Dialers may require. -type proxy_Auth struct { - User, Password string -} - -// FromEnvironment returns the dialer specified by the proxy related variables in -// the environment. -func proxy_FromEnvironment() proxy_Dialer { - allProxy := proxy_allProxyEnv.Get() - if len(allProxy) == 0 { - return proxy_Direct - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return proxy_Direct - } - proxy, err := proxy_FromURL(proxyURL, proxy_Direct) - if err != nil { - return proxy_Direct - } - - noProxy := proxy_noProxyEnv.Get() - if len(noProxy) == 0 { - return proxy - } - - perHost := proxy_NewPerHost(proxy, proxy_Direct) - perHost.AddFromString(noProxy) - return perHost -} - -// proxySchemes is a map from URL schemes to a function that creates a Dialer -// from a URL with such a scheme. -var proxy_proxySchemes map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error) - -// RegisterDialerType takes a URL scheme and a function to generate Dialers from -// a URL with that scheme and a forwarding Dialer. Registered schemes are used -// by FromURL. -func proxy_RegisterDialerType(scheme string, f func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) { - if proxy_proxySchemes == nil { - proxy_proxySchemes = make(map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) - } - proxy_proxySchemes[scheme] = f -} - -// FromURL returns a Dialer given a URL specification and an underlying -// Dialer for it to make network requests. -func proxy_FromURL(u *url.URL, forward proxy_Dialer) (proxy_Dialer, error) { - var auth *proxy_Auth - if u.User != nil { - auth = new(proxy_Auth) - auth.User = u.User.Username() - if p, ok := u.User.Password(); ok { - auth.Password = p - } - } - - switch u.Scheme { - case "socks5": - return proxy_SOCKS5("tcp", u.Host, auth, forward) - } - - // If the scheme doesn't match any of the built-in schemes, see if it - // was registered by another package. - if proxy_proxySchemes != nil { - if f, ok := proxy_proxySchemes[u.Scheme]; ok { - return f(u, forward) - } - } - - return nil, errors.New("proxy: unknown scheme: " + u.Scheme) -} - -var ( - proxy_allProxyEnv = &proxy_envOnce{ - names: []string{"ALL_PROXY", "all_proxy"}, - } - proxy_noProxyEnv = &proxy_envOnce{ - names: []string{"NO_PROXY", "no_proxy"}, - } -) - -// envOnce looks up an environment variable (optionally by multiple -// names) once. It mitigates expensive lookups on some platforms -// (e.g. Windows). -// (Borrowed from net/http/transport.go) -type proxy_envOnce struct { - names []string - once sync.Once - val string -} - -func (e *proxy_envOnce) Get() string { - e.once.Do(e.init) - return e.val -} - -func (e *proxy_envOnce) init() { - for _, n := range e.names { - e.val = os.Getenv(n) - if e.val != "" { - return - } - } -} - -// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address -// with an optional username and password. See RFC 1928 and RFC 1929. -func proxy_SOCKS5(network, addr string, auth *proxy_Auth, forward proxy_Dialer) (proxy_Dialer, error) { - s := &proxy_socks5{ - network: network, - addr: addr, - forward: forward, - } - if auth != nil { - s.user = auth.User - s.password = auth.Password - } - - return s, nil -} - -type proxy_socks5 struct { - user, password string - network, addr string - forward proxy_Dialer -} - -const proxy_socks5Version = 5 - -const ( - proxy_socks5AuthNone = 0 - proxy_socks5AuthPassword = 2 -) - -const proxy_socks5Connect = 1 - -const ( - proxy_socks5IP4 = 1 - proxy_socks5Domain = 3 - proxy_socks5IP6 = 4 -) - -var proxy_socks5Errors = []string{ - "", - "general failure", - "connection forbidden", - "network unreachable", - "host unreachable", - "connection refused", - "TTL expired", - "command not supported", - "address type not supported", -} - -// Dial connects to the address addr on the given network via the SOCKS5 proxy. -func (s *proxy_socks5) Dial(network, addr string) (net.Conn, error) { - switch network { - case "tcp", "tcp6", "tcp4": - default: - return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) - } - - conn, err := s.forward.Dial(s.network, s.addr) - if err != nil { - return nil, err - } - if err := s.connect(conn, addr); err != nil { - conn.Close() - return nil, err - } - return conn, nil -} - -// connect takes an existing connection to a socks5 proxy server, -// and commands the server to extend that connection to target, -// which must be a canonical address with a host and port. -func (s *proxy_socks5) connect(conn net.Conn, target string) error { - host, portStr, err := net.SplitHostPort(target) - if err != nil { - return err - } - - port, err := strconv.Atoi(portStr) - if err != nil { - return errors.New("proxy: failed to parse port number: " + portStr) - } - if port < 1 || port > 0xffff { - return errors.New("proxy: port number out of range: " + portStr) - } - - // the size here is just an estimate - buf := make([]byte, 0, 6+len(host)) - - buf = append(buf, proxy_socks5Version) - if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { - buf = append(buf, 2 /* num auth methods */, proxy_socks5AuthNone, proxy_socks5AuthPassword) - } else { - buf = append(buf, 1 /* num auth methods */, proxy_socks5AuthNone) - } - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - if buf[0] != 5 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) - } - if buf[1] == 0xff { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") - } - - // See RFC 1929 - if buf[1] == proxy_socks5AuthPassword { - buf = buf[:0] - buf = append(buf, 1 /* password protocol version */) - buf = append(buf, uint8(len(s.user))) - buf = append(buf, s.user...) - buf = append(buf, uint8(len(s.password))) - buf = append(buf, s.password...) - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if buf[1] != 0 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") - } - } - - buf = buf[:0] - buf = append(buf, proxy_socks5Version, proxy_socks5Connect, 0 /* reserved */) - - if ip := net.ParseIP(host); ip != nil { - if ip4 := ip.To4(); ip4 != nil { - buf = append(buf, proxy_socks5IP4) - ip = ip4 - } else { - buf = append(buf, proxy_socks5IP6) - } - buf = append(buf, ip...) - } else { - if len(host) > 255 { - return errors.New("proxy: destination host name too long: " + host) - } - buf = append(buf, proxy_socks5Domain) - buf = append(buf, byte(len(host))) - buf = append(buf, host...) - } - buf = append(buf, byte(port>>8), byte(port)) - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:4]); err != nil { - return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - failure := "unknown error" - if int(buf[1]) < len(proxy_socks5Errors) { - failure = proxy_socks5Errors[buf[1]] - } - - if len(failure) > 0 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) - } - - bytesToDiscard := 0 - switch buf[3] { - case proxy_socks5IP4: - bytesToDiscard = net.IPv4len - case proxy_socks5IP6: - bytesToDiscard = net.IPv6len - case proxy_socks5Domain: - _, err := io.ReadFull(conn, buf[:1]) - if err != nil { - return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - bytesToDiscard = int(buf[0]) - default: - return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) - } - - if cap(buf) < bytesToDiscard { - buf = make([]byte, bytesToDiscard) - } else { - buf = buf[:bytesToDiscard] - } - if _, err := io.ReadFull(conn, buf); err != nil { - return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - // Also need to discard the port number - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - return nil -} diff --git a/vendor/github.com/hashicorp/golang-lru/v2/2q.go b/vendor/github.com/hashicorp/golang-lru/v2/2q.go index 5e00d9a7..8c95252b 100644 --- a/vendor/github.com/hashicorp/golang-lru/v2/2q.go +++ b/vendor/github.com/hashicorp/golang-lru/v2/2q.go @@ -30,8 +30,10 @@ const ( // head. The ARCCache is similar, but does not require setting any // parameters. type TwoQueueCache[K comparable, V any] struct { - size int - recentSize int + size int + recentSize int + recentRatio float64 + ghostRatio float64 recent simplelru.LRUCache[K, V] frequent simplelru.LRUCache[K, V] @@ -80,6 +82,8 @@ func New2QParams[K comparable, V any](size int, recentRatio, ghostRatio float64) c := &TwoQueueCache[K, V]{ size: size, recentSize: recentSize, + recentRatio: recentRatio, + ghostRatio: ghostRatio, recent: recent, frequent: frequent, recentEvict: recentEvict, @@ -171,6 +175,34 @@ func (c *TwoQueueCache[K, V]) Len() int { return c.recent.Len() + c.frequent.Len() } +// Resize changes the cache size. +func (c *TwoQueueCache[K, V]) Resize(size int) (evicted int) { + c.lock.Lock() + defer c.lock.Unlock() + + // Recalculate the sub-sizes + recentSize := int(float64(size) * c.recentRatio) + evictSize := int(float64(size) * c.ghostRatio) + c.size = size + c.recentSize = recentSize + + // ensureSpace + diff := c.recent.Len() + c.frequent.Len() - size + if diff < 0 { + diff = 0 + } + for i := 0; i < diff; i++ { + c.ensureSpace(true) + } + + // Reallocate the LRUs + c.recent.Resize(size) + c.frequent.Resize(size) + c.recentEvict.Resize(evictSize) + + return diff +} + // Keys returns a slice of the keys in the cache. // The frequently used keys are first in the returned slice. func (c *TwoQueueCache[K, V]) Keys() []K { diff --git a/vendor/github.com/klauspost/compress/s2/dict.go b/vendor/github.com/klauspost/compress/s2/dict.go index 24f7ce80..f125ad09 100644 --- a/vendor/github.com/klauspost/compress/s2/dict.go +++ b/vendor/github.com/klauspost/compress/s2/dict.go @@ -106,6 +106,25 @@ func MakeDict(data []byte, searchStart []byte) *Dict { return &d } +// MakeDictManual will create a dictionary. +// 'data' must be at least MinDictSize and less than or equal to MaxDictSize. +// A manual first repeat index into data must be provided. +// It must be less than len(data)-8. +func MakeDictManual(data []byte, firstIdx uint16) *Dict { + if len(data) < MinDictSize || int(firstIdx) >= len(data)-8 || len(data) > MaxDictSize { + return nil + } + var d Dict + dict := data + d.dict = dict + if cap(d.dict) < len(d.dict)+16 { + d.dict = append(make([]byte, 0, len(d.dict)+16), d.dict...) + } + + d.repeat = int(firstIdx) + return &d +} + // Encode returns the encoded form of src. The returned slice may be a sub- // slice of dst if dst was large enough to hold the entire encoded block. // Otherwise, a newly allocated slice will be returned. diff --git a/vendor/github.com/klauspost/compress/s2/encode.go b/vendor/github.com/klauspost/compress/s2/encode.go index e6c23102..0c9088ad 100644 --- a/vendor/github.com/klauspost/compress/s2/encode.go +++ b/vendor/github.com/klauspost/compress/s2/encode.go @@ -57,7 +57,7 @@ func Encode(dst, src []byte) []byte { // The function returns -1 if no improvement could be achieved. // Using actual compression will most often produce better compression than the estimate. func EstimateBlockSize(src []byte) (d int) { - if len(src) < 6 || int64(len(src)) > 0xffffffff { + if len(src) <= inputMargin || int64(len(src)) > 0xffffffff { return -1 } if len(src) <= 1024 { diff --git a/vendor/github.com/klauspost/compress/s2/encode_best.go b/vendor/github.com/klauspost/compress/s2/encode_best.go index 1d13e869..47bac742 100644 --- a/vendor/github.com/klauspost/compress/s2/encode_best.go +++ b/vendor/github.com/klauspost/compress/s2/encode_best.go @@ -157,6 +157,9 @@ func encodeBlockBest(dst, src []byte, dict *Dict) (d int) { return m } matchDict := func(candidate, s int, first uint32, rep bool) match { + if s >= MaxDictSrcOffset { + return match{offset: candidate, s: s} + } // Calculate offset as if in continuous array with s offset := -len(dict.dict) + candidate if best.length != 0 && best.s-best.offset == s-offset && !rep { diff --git a/vendor/github.com/klauspost/compress/s2/encode_go.go b/vendor/github.com/klauspost/compress/s2/encode_go.go index 0d39c7b0..6b393c34 100644 --- a/vendor/github.com/klauspost/compress/s2/encode_go.go +++ b/vendor/github.com/klauspost/compress/s2/encode_go.go @@ -316,6 +316,7 @@ func matchLen(a []byte, b []byte) int { return len(a) + checked } +// input must be > inputMargin func calcBlockSize(src []byte) (d int) { // Initialize the hash table. const ( @@ -501,6 +502,7 @@ emitRemainder: return d } +// length must be > inputMargin. func calcBlockSizeSmall(src []byte) (d int) { // Initialize the hash table. const ( diff --git a/vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s b/vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s index 54031aa3..5f110d19 100644 --- a/vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s +++ b/vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s @@ -249,15 +249,43 @@ emit_literal_done_repeat_emit_encodeBlockAsm: // matchLen XORL R11, R11 + +matchlen_loopback_16_repeat_extend_encodeBlockAsm: + CMPL R8, $0x10 + JB matchlen_match8_repeat_extend_encodeBlockAsm + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm + XORQ 8(BX)(R11*1), R12 + JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm + LEAL -16(R8), R8 + LEAL 16(R11), R11 + JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm + +matchlen_bsf_16repeat_extend_encodeBlockAsm: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP repeat_extend_forward_end_encodeBlockAsm + +matchlen_match8_repeat_extend_encodeBlockAsm: CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm + MOVQ (R9)(R11*1), R10 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm + LEAL -8(R8), R8 + LEAL 8(R11), R11 + JMP matchlen_match4_repeat_extend_encodeBlockAsm -matchlen_loopback_repeat_extend_encodeBlockAsm: - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_repeat_extend_encodeBlockAsm - +matchlen_bsf_8_repeat_extend_encodeBlockAsm: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -269,12 +297,6 @@ matchlen_loopback_repeat_extend_encodeBlockAsm: LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeBlockAsm -matchlen_loop_repeat_extend_encodeBlockAsm: - LEAL -8(R8), R8 - LEAL 8(R11), R11 - CMPL R8, $0x08 - JAE matchlen_loopback_repeat_extend_encodeBlockAsm - matchlen_match4_repeat_extend_encodeBlockAsm: CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm @@ -851,15 +873,43 @@ match_nolit_loop_encodeBlockAsm: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeBlockAsm: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeBlockAsm + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeBlockAsm + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeBlockAsm + +matchlen_bsf_16match_nolit_encodeBlockAsm: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeBlockAsm + +matchlen_match8_match_nolit_encodeBlockAsm: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeBlockAsm -matchlen_loopback_match_nolit_encodeBlockAsm: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeBlockAsm - +matchlen_bsf_8_match_nolit_encodeBlockAsm: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -871,12 +921,6 @@ matchlen_loopback_match_nolit_encodeBlockAsm: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeBlockAsm -matchlen_loop_match_nolit_encodeBlockAsm: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBlockAsm - matchlen_match4_match_nolit_encodeBlockAsm: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm @@ -1610,15 +1654,43 @@ emit_literal_done_repeat_emit_encodeBlockAsm4MB: // matchLen XORL R11, R11 + +matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB: + CMPL R8, $0x10 + JB matchlen_match8_repeat_extend_encodeBlockAsm4MB + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB + XORQ 8(BX)(R11*1), R12 + JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm4MB + LEAL -16(R8), R8 + LEAL 16(R11), R11 + JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB + +matchlen_bsf_16repeat_extend_encodeBlockAsm4MB: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP repeat_extend_forward_end_encodeBlockAsm4MB + +matchlen_match8_repeat_extend_encodeBlockAsm4MB: CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm4MB + MOVQ (R9)(R11*1), R10 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB + LEAL -8(R8), R8 + LEAL 8(R11), R11 + JMP matchlen_match4_repeat_extend_encodeBlockAsm4MB -matchlen_loopback_repeat_extend_encodeBlockAsm4MB: - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_repeat_extend_encodeBlockAsm4MB - +matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -1630,12 +1702,6 @@ matchlen_loopback_repeat_extend_encodeBlockAsm4MB: LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeBlockAsm4MB -matchlen_loop_repeat_extend_encodeBlockAsm4MB: - LEAL -8(R8), R8 - LEAL 8(R11), R11 - CMPL R8, $0x08 - JAE matchlen_loopback_repeat_extend_encodeBlockAsm4MB - matchlen_match4_repeat_extend_encodeBlockAsm4MB: CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm4MB @@ -2162,15 +2228,43 @@ match_nolit_loop_encodeBlockAsm4MB: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeBlockAsm4MB: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeBlockAsm4MB + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm4MB + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeBlockAsm4MB + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeBlockAsm4MB + +matchlen_bsf_16match_nolit_encodeBlockAsm4MB: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeBlockAsm4MB + +matchlen_match8_match_nolit_encodeBlockAsm4MB: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm4MB + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm4MB + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeBlockAsm4MB -matchlen_loopback_match_nolit_encodeBlockAsm4MB: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeBlockAsm4MB - +matchlen_bsf_8_match_nolit_encodeBlockAsm4MB: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -2182,12 +2276,6 @@ matchlen_loopback_match_nolit_encodeBlockAsm4MB: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeBlockAsm4MB -matchlen_loop_match_nolit_encodeBlockAsm4MB: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBlockAsm4MB - matchlen_match4_match_nolit_encodeBlockAsm4MB: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm4MB @@ -2873,15 +2961,43 @@ emit_literal_done_repeat_emit_encodeBlockAsm12B: // matchLen XORL R11, R11 + +matchlen_loopback_16_repeat_extend_encodeBlockAsm12B: + CMPL R8, $0x10 + JB matchlen_match8_repeat_extend_encodeBlockAsm12B + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm12B + XORQ 8(BX)(R11*1), R12 + JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm12B + LEAL -16(R8), R8 + LEAL 16(R11), R11 + JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm12B + +matchlen_bsf_16repeat_extend_encodeBlockAsm12B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP repeat_extend_forward_end_encodeBlockAsm12B + +matchlen_match8_repeat_extend_encodeBlockAsm12B: CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm12B + MOVQ (R9)(R11*1), R10 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm12B + LEAL -8(R8), R8 + LEAL 8(R11), R11 + JMP matchlen_match4_repeat_extend_encodeBlockAsm12B -matchlen_loopback_repeat_extend_encodeBlockAsm12B: - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_repeat_extend_encodeBlockAsm12B - +matchlen_bsf_8_repeat_extend_encodeBlockAsm12B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -2893,12 +3009,6 @@ matchlen_loopback_repeat_extend_encodeBlockAsm12B: LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeBlockAsm12B -matchlen_loop_repeat_extend_encodeBlockAsm12B: - LEAL -8(R8), R8 - LEAL 8(R11), R11 - CMPL R8, $0x08 - JAE matchlen_loopback_repeat_extend_encodeBlockAsm12B - matchlen_match4_repeat_extend_encodeBlockAsm12B: CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm12B @@ -3303,15 +3413,43 @@ match_nolit_loop_encodeBlockAsm12B: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeBlockAsm12B: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeBlockAsm12B + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm12B + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeBlockAsm12B + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeBlockAsm12B + +matchlen_bsf_16match_nolit_encodeBlockAsm12B: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeBlockAsm12B + +matchlen_match8_match_nolit_encodeBlockAsm12B: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm12B + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm12B + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeBlockAsm12B -matchlen_loopback_match_nolit_encodeBlockAsm12B: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeBlockAsm12B - +matchlen_bsf_8_match_nolit_encodeBlockAsm12B: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -3323,12 +3461,6 @@ matchlen_loopback_match_nolit_encodeBlockAsm12B: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeBlockAsm12B -matchlen_loop_match_nolit_encodeBlockAsm12B: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBlockAsm12B - matchlen_match4_match_nolit_encodeBlockAsm12B: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm12B @@ -3904,15 +4036,43 @@ emit_literal_done_repeat_emit_encodeBlockAsm10B: // matchLen XORL R11, R11 + +matchlen_loopback_16_repeat_extend_encodeBlockAsm10B: + CMPL R8, $0x10 + JB matchlen_match8_repeat_extend_encodeBlockAsm10B + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm10B + XORQ 8(BX)(R11*1), R12 + JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm10B + LEAL -16(R8), R8 + LEAL 16(R11), R11 + JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm10B + +matchlen_bsf_16repeat_extend_encodeBlockAsm10B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP repeat_extend_forward_end_encodeBlockAsm10B + +matchlen_match8_repeat_extend_encodeBlockAsm10B: CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm10B + MOVQ (R9)(R11*1), R10 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm10B + LEAL -8(R8), R8 + LEAL 8(R11), R11 + JMP matchlen_match4_repeat_extend_encodeBlockAsm10B -matchlen_loopback_repeat_extend_encodeBlockAsm10B: - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_repeat_extend_encodeBlockAsm10B - +matchlen_bsf_8_repeat_extend_encodeBlockAsm10B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -3924,12 +4084,6 @@ matchlen_loopback_repeat_extend_encodeBlockAsm10B: LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeBlockAsm10B -matchlen_loop_repeat_extend_encodeBlockAsm10B: - LEAL -8(R8), R8 - LEAL 8(R11), R11 - CMPL R8, $0x08 - JAE matchlen_loopback_repeat_extend_encodeBlockAsm10B - matchlen_match4_repeat_extend_encodeBlockAsm10B: CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm10B @@ -4334,15 +4488,43 @@ match_nolit_loop_encodeBlockAsm10B: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeBlockAsm10B: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeBlockAsm10B + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm10B + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeBlockAsm10B + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeBlockAsm10B + +matchlen_bsf_16match_nolit_encodeBlockAsm10B: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeBlockAsm10B + +matchlen_match8_match_nolit_encodeBlockAsm10B: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm10B + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm10B + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeBlockAsm10B -matchlen_loopback_match_nolit_encodeBlockAsm10B: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeBlockAsm10B - +matchlen_bsf_8_match_nolit_encodeBlockAsm10B: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -4354,12 +4536,6 @@ matchlen_loopback_match_nolit_encodeBlockAsm10B: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeBlockAsm10B -matchlen_loop_match_nolit_encodeBlockAsm10B: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBlockAsm10B - matchlen_match4_match_nolit_encodeBlockAsm10B: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm10B @@ -4935,15 +5111,43 @@ emit_literal_done_repeat_emit_encodeBlockAsm8B: // matchLen XORL R11, R11 + +matchlen_loopback_16_repeat_extend_encodeBlockAsm8B: + CMPL R8, $0x10 + JB matchlen_match8_repeat_extend_encodeBlockAsm8B + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm8B + XORQ 8(BX)(R11*1), R12 + JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm8B + LEAL -16(R8), R8 + LEAL 16(R11), R11 + JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm8B + +matchlen_bsf_16repeat_extend_encodeBlockAsm8B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP repeat_extend_forward_end_encodeBlockAsm8B + +matchlen_match8_repeat_extend_encodeBlockAsm8B: CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm8B + MOVQ (R9)(R11*1), R10 + XORQ (BX)(R11*1), R10 + JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm8B + LEAL -8(R8), R8 + LEAL 8(R11), R11 + JMP matchlen_match4_repeat_extend_encodeBlockAsm8B -matchlen_loopback_repeat_extend_encodeBlockAsm8B: - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_repeat_extend_encodeBlockAsm8B - +matchlen_bsf_8_repeat_extend_encodeBlockAsm8B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -4955,12 +5159,6 @@ matchlen_loopback_repeat_extend_encodeBlockAsm8B: LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeBlockAsm8B -matchlen_loop_repeat_extend_encodeBlockAsm8B: - LEAL -8(R8), R8 - LEAL 8(R11), R11 - CMPL R8, $0x08 - JAE matchlen_loopback_repeat_extend_encodeBlockAsm8B - matchlen_match4_repeat_extend_encodeBlockAsm8B: CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm8B @@ -5351,15 +5549,43 @@ match_nolit_loop_encodeBlockAsm8B: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeBlockAsm8B: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeBlockAsm8B + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm8B + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeBlockAsm8B + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeBlockAsm8B + +matchlen_bsf_16match_nolit_encodeBlockAsm8B: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeBlockAsm8B + +matchlen_match8_match_nolit_encodeBlockAsm8B: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm8B + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm8B + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeBlockAsm8B -matchlen_loopback_match_nolit_encodeBlockAsm8B: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeBlockAsm8B - +matchlen_bsf_8_match_nolit_encodeBlockAsm8B: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -5371,12 +5597,6 @@ matchlen_loopback_match_nolit_encodeBlockAsm8B: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeBlockAsm8B -matchlen_loop_match_nolit_encodeBlockAsm8B: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBlockAsm8B - matchlen_match4_match_nolit_encodeBlockAsm8B: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm8B @@ -5854,15 +6074,43 @@ match_dst_size_check_encodeBetterBlockAsm: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeBetterBlockAsm: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeBetterBlockAsm + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm + +matchlen_bsf_16match_nolit_encodeBetterBlockAsm: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeBetterBlockAsm + +matchlen_match8_match_nolit_encodeBetterBlockAsm: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeBetterBlockAsm -matchlen_loopback_match_nolit_encodeBetterBlockAsm: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeBetterBlockAsm - +matchlen_bsf_8_match_nolit_encodeBetterBlockAsm: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -5874,12 +6122,6 @@ matchlen_loopback_match_nolit_encodeBetterBlockAsm: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeBetterBlockAsm -matchlen_loop_match_nolit_encodeBetterBlockAsm: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBetterBlockAsm - matchlen_match4_match_nolit_encodeBetterBlockAsm: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm @@ -6926,15 +7168,43 @@ match_dst_size_check_encodeBetterBlockAsm4MB: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeBetterBlockAsm4MB + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB + +matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeBetterBlockAsm4MB + +matchlen_match8_match_nolit_encodeBetterBlockAsm4MB: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm4MB + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeBetterBlockAsm4MB -matchlen_loopback_match_nolit_encodeBetterBlockAsm4MB: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeBetterBlockAsm4MB - +matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -6946,12 +7216,6 @@ matchlen_loopback_match_nolit_encodeBetterBlockAsm4MB: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeBetterBlockAsm4MB -matchlen_loop_match_nolit_encodeBetterBlockAsm4MB: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBetterBlockAsm4MB - matchlen_match4_match_nolit_encodeBetterBlockAsm4MB: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm4MB @@ -7924,15 +8188,43 @@ match_dst_size_check_encodeBetterBlockAsm12B: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeBetterBlockAsm12B + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B + +matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeBetterBlockAsm12B + +matchlen_match8_match_nolit_encodeBetterBlockAsm12B: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm12B + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeBetterBlockAsm12B -matchlen_loopback_match_nolit_encodeBetterBlockAsm12B: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeBetterBlockAsm12B - +matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -7944,12 +8236,6 @@ matchlen_loopback_match_nolit_encodeBetterBlockAsm12B: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeBetterBlockAsm12B -matchlen_loop_match_nolit_encodeBetterBlockAsm12B: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBetterBlockAsm12B - matchlen_match4_match_nolit_encodeBetterBlockAsm12B: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm12B @@ -8775,15 +9061,43 @@ match_dst_size_check_encodeBetterBlockAsm10B: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeBetterBlockAsm10B + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B + +matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeBetterBlockAsm10B + +matchlen_match8_match_nolit_encodeBetterBlockAsm10B: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm10B + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeBetterBlockAsm10B -matchlen_loopback_match_nolit_encodeBetterBlockAsm10B: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeBetterBlockAsm10B - +matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -8795,12 +9109,6 @@ matchlen_loopback_match_nolit_encodeBetterBlockAsm10B: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeBetterBlockAsm10B -matchlen_loop_match_nolit_encodeBetterBlockAsm10B: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBetterBlockAsm10B - matchlen_match4_match_nolit_encodeBetterBlockAsm10B: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm10B @@ -9626,15 +9934,43 @@ match_dst_size_check_encodeBetterBlockAsm8B: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeBetterBlockAsm8B + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B + +matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeBetterBlockAsm8B + +matchlen_match8_match_nolit_encodeBetterBlockAsm8B: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm8B + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeBetterBlockAsm8B -matchlen_loopback_match_nolit_encodeBetterBlockAsm8B: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeBetterBlockAsm8B - +matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -9646,12 +9982,6 @@ matchlen_loopback_match_nolit_encodeBetterBlockAsm8B: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeBetterBlockAsm8B -matchlen_loop_match_nolit_encodeBetterBlockAsm8B: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeBetterBlockAsm8B - matchlen_match4_match_nolit_encodeBetterBlockAsm8B: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm8B @@ -10575,15 +10905,43 @@ emit_literal_done_repeat_emit_encodeSnappyBlockAsm: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm + +matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_encodeSnappyBlockAsm + +matchlen_match8_repeat_extend_encodeSnappyBlockAsm: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm -matchlen_loopback_repeat_extend_encodeSnappyBlockAsm: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_encodeSnappyBlockAsm - +matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -10595,12 +10953,6 @@ matchlen_loopback_repeat_extend_encodeSnappyBlockAsm: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_encodeSnappyBlockAsm -matchlen_loop_repeat_extend_encodeSnappyBlockAsm: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_encodeSnappyBlockAsm - matchlen_match4_repeat_extend_encodeSnappyBlockAsm: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm @@ -10897,15 +11249,43 @@ match_nolit_loop_encodeSnappyBlockAsm: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBlockAsm + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm + +matchlen_bsf_16match_nolit_encodeSnappyBlockAsm: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeSnappyBlockAsm + +matchlen_match8_match_nolit_encodeSnappyBlockAsm: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm -matchlen_loopback_match_nolit_encodeSnappyBlockAsm: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeSnappyBlockAsm - +matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -10917,12 +11297,6 @@ matchlen_loopback_match_nolit_encodeSnappyBlockAsm: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeSnappyBlockAsm -matchlen_loop_match_nolit_encodeSnappyBlockAsm: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBlockAsm - matchlen_match4_match_nolit_encodeSnappyBlockAsm: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm @@ -11437,15 +11811,43 @@ emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K + +matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K + +matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K -matchlen_loopback_repeat_extend_encodeSnappyBlockAsm64K: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_encodeSnappyBlockAsm64K - +matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -11457,12 +11859,6 @@ matchlen_loopback_repeat_extend_encodeSnappyBlockAsm64K: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K -matchlen_loop_repeat_extend_encodeSnappyBlockAsm64K: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_encodeSnappyBlockAsm64K - matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K @@ -11719,15 +12115,43 @@ match_nolit_loop_encodeSnappyBlockAsm64K: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBlockAsm64K + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K + +matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeSnappyBlockAsm64K + +matchlen_match8_match_nolit_encodeSnappyBlockAsm64K: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm64K + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm64K -matchlen_loopback_match_nolit_encodeSnappyBlockAsm64K: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeSnappyBlockAsm64K - +matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -11739,12 +12163,6 @@ matchlen_loopback_match_nolit_encodeSnappyBlockAsm64K: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeSnappyBlockAsm64K -matchlen_loop_match_nolit_encodeSnappyBlockAsm64K: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBlockAsm64K - matchlen_match4_match_nolit_encodeSnappyBlockAsm64K: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm64K @@ -12219,15 +12637,43 @@ emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B + +matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B + +matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B -matchlen_loopback_repeat_extend_encodeSnappyBlockAsm12B: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_encodeSnappyBlockAsm12B - +matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -12239,12 +12685,6 @@ matchlen_loopback_repeat_extend_encodeSnappyBlockAsm12B: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B -matchlen_loop_repeat_extend_encodeSnappyBlockAsm12B: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_encodeSnappyBlockAsm12B - matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B @@ -12501,15 +12941,43 @@ match_nolit_loop_encodeSnappyBlockAsm12B: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBlockAsm12B + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B + +matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeSnappyBlockAsm12B + +matchlen_match8_match_nolit_encodeSnappyBlockAsm12B: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm12B + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm12B -matchlen_loopback_match_nolit_encodeSnappyBlockAsm12B: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeSnappyBlockAsm12B - +matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -12521,12 +12989,6 @@ matchlen_loopback_match_nolit_encodeSnappyBlockAsm12B: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeSnappyBlockAsm12B -matchlen_loop_match_nolit_encodeSnappyBlockAsm12B: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBlockAsm12B - matchlen_match4_match_nolit_encodeSnappyBlockAsm12B: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm12B @@ -13001,15 +13463,43 @@ emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B + +matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B + +matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B -matchlen_loopback_repeat_extend_encodeSnappyBlockAsm10B: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_encodeSnappyBlockAsm10B - +matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -13021,12 +13511,6 @@ matchlen_loopback_repeat_extend_encodeSnappyBlockAsm10B: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B -matchlen_loop_repeat_extend_encodeSnappyBlockAsm10B: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_encodeSnappyBlockAsm10B - matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B @@ -13283,15 +13767,43 @@ match_nolit_loop_encodeSnappyBlockAsm10B: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBlockAsm10B + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B + +matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeSnappyBlockAsm10B + +matchlen_match8_match_nolit_encodeSnappyBlockAsm10B: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm10B + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm10B -matchlen_loopback_match_nolit_encodeSnappyBlockAsm10B: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeSnappyBlockAsm10B - +matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -13303,12 +13815,6 @@ matchlen_loopback_match_nolit_encodeSnappyBlockAsm10B: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeSnappyBlockAsm10B -matchlen_loop_match_nolit_encodeSnappyBlockAsm10B: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBlockAsm10B - matchlen_match4_match_nolit_encodeSnappyBlockAsm10B: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm10B @@ -13783,15 +14289,43 @@ emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B + +matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B + +matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B -matchlen_loopback_repeat_extend_encodeSnappyBlockAsm8B: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_encodeSnappyBlockAsm8B - +matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -13803,12 +14337,6 @@ matchlen_loopback_repeat_extend_encodeSnappyBlockAsm8B: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B -matchlen_loop_repeat_extend_encodeSnappyBlockAsm8B: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_encodeSnappyBlockAsm8B - matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B @@ -14063,15 +14591,43 @@ match_nolit_loop_encodeSnappyBlockAsm8B: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBlockAsm8B + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B + +matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_encodeSnappyBlockAsm8B + +matchlen_match8_match_nolit_encodeSnappyBlockAsm8B: CMPL SI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm8B + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm8B -matchlen_loopback_match_nolit_encodeSnappyBlockAsm8B: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_encodeSnappyBlockAsm8B - +matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -14083,12 +14639,6 @@ matchlen_loopback_match_nolit_encodeSnappyBlockAsm8B: LEAL (R9)(R8*1), R9 JMP match_nolit_end_encodeSnappyBlockAsm8B -matchlen_loop_match_nolit_encodeSnappyBlockAsm8B: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBlockAsm8B - matchlen_match4_match_nolit_encodeSnappyBlockAsm8B: CMPL SI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm8B @@ -14473,15 +15023,43 @@ match_dst_size_check_encodeSnappyBetterBlockAsm: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm + +matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeSnappyBetterBlockAsm + +matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm -matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm - +matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -14493,12 +15071,6 @@ matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeSnappyBetterBlockAsm -matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm - matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm @@ -15096,15 +15668,43 @@ match_dst_size_check_encodeSnappyBetterBlockAsm64K: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K + +matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeSnappyBetterBlockAsm64K + +matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K -matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm64K: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm64K - +matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -15116,12 +15716,6 @@ matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm64K: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeSnappyBetterBlockAsm64K -matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm64K: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm64K - matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K @@ -15654,15 +16248,43 @@ match_dst_size_check_encodeSnappyBetterBlockAsm12B: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B + +matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeSnappyBetterBlockAsm12B + +matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B -matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm12B: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm12B - +matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -15674,12 +16296,6 @@ matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm12B: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeSnappyBetterBlockAsm12B -matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm12B: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm12B - matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B @@ -16212,15 +16828,43 @@ match_dst_size_check_encodeSnappyBetterBlockAsm10B: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B + +matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeSnappyBetterBlockAsm10B + +matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B -matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm10B: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm10B - +matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -16232,12 +16876,6 @@ matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm10B: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeSnappyBetterBlockAsm10B -matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm10B: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm10B - matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B @@ -16770,15 +17408,43 @@ match_dst_size_check_encodeSnappyBetterBlockAsm8B: // matchLen XORL R11, R11 + +matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B: + CMPL DI, $0x10 + JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B + MOVQ (R8)(R11*1), R10 + MOVQ 8(R8)(R11*1), R12 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B + XORQ 8(R9)(R11*1), R12 + JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B + LEAL -16(DI), DI + LEAL 16(R11), R11 + JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B + +matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B: +#ifdef GOAMD64_v3 + TZCNTQ R12, R12 + +#else + BSFQ R12, R12 + +#endif + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 + JMP match_nolit_end_encodeSnappyBetterBlockAsm8B + +matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B: CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B + MOVQ (R8)(R11*1), R10 + XORQ (R9)(R11*1), R10 + JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B + LEAL -8(DI), DI + LEAL 8(R11), R11 + JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B -matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm8B: - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 - TESTQ R10, R10 - JZ matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm8B - +matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B: #ifdef GOAMD64_v3 TZCNTQ R10, R10 @@ -16790,12 +17456,6 @@ matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm8B: LEAL (R11)(R10*1), R11 JMP match_nolit_end_encodeSnappyBetterBlockAsm8B -matchlen_loop_match_nolit_encodeSnappyBetterBlockAsm8B: - LEAL -8(DI), DI - LEAL 8(R11), R11 - CMPL DI, $0x08 - JAE matchlen_loopback_match_nolit_encodeSnappyBetterBlockAsm8B - matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B: CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B @@ -17343,15 +18003,43 @@ emit_literal_done_repeat_emit_calcBlockSize: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_calcBlockSize: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_calcBlockSize + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_calcBlockSize + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_calcBlockSize + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_calcBlockSize + +matchlen_bsf_16repeat_extend_calcBlockSize: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_calcBlockSize + +matchlen_match8_repeat_extend_calcBlockSize: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_calcBlockSize + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_calcBlockSize + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_calcBlockSize -matchlen_loopback_repeat_extend_calcBlockSize: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_calcBlockSize - +matchlen_bsf_8_repeat_extend_calcBlockSize: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -17363,12 +18051,6 @@ matchlen_loopback_repeat_extend_calcBlockSize: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_calcBlockSize -matchlen_loop_repeat_extend_calcBlockSize: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_calcBlockSize - matchlen_match4_repeat_extend_calcBlockSize: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_calcBlockSize @@ -17554,15 +18236,43 @@ match_nolit_loop_calcBlockSize: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_calcBlockSize: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_calcBlockSize + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_calcBlockSize + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_calcBlockSize + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_calcBlockSize + +matchlen_bsf_16match_nolit_calcBlockSize: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_calcBlockSize + +matchlen_match8_match_nolit_calcBlockSize: CMPL SI, $0x08 JB matchlen_match4_match_nolit_calcBlockSize + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_calcBlockSize + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_calcBlockSize -matchlen_loopback_match_nolit_calcBlockSize: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_calcBlockSize - +matchlen_bsf_8_match_nolit_calcBlockSize: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -17574,12 +18284,6 @@ matchlen_loopback_match_nolit_calcBlockSize: LEAL (R9)(R8*1), R9 JMP match_nolit_end_calcBlockSize -matchlen_loop_match_nolit_calcBlockSize: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_calcBlockSize - matchlen_match4_match_nolit_calcBlockSize: CMPL SI, $0x04 JB matchlen_match2_match_nolit_calcBlockSize @@ -17872,15 +18576,43 @@ emit_literal_done_repeat_emit_calcBlockSizeSmall: // matchLen XORL R10, R10 + +matchlen_loopback_16_repeat_extend_calcBlockSizeSmall: + CMPL DI, $0x10 + JB matchlen_match8_repeat_extend_calcBlockSizeSmall + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_calcBlockSizeSmall + XORQ 8(BX)(R10*1), R11 + JNZ matchlen_bsf_16repeat_extend_calcBlockSizeSmall + LEAL -16(DI), DI + LEAL 16(R10), R10 + JMP matchlen_loopback_16_repeat_extend_calcBlockSizeSmall + +matchlen_bsf_16repeat_extend_calcBlockSizeSmall: +#ifdef GOAMD64_v3 + TZCNTQ R11, R11 + +#else + BSFQ R11, R11 + +#endif + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 + JMP repeat_extend_forward_end_calcBlockSizeSmall + +matchlen_match8_repeat_extend_calcBlockSizeSmall: CMPL DI, $0x08 JB matchlen_match4_repeat_extend_calcBlockSizeSmall + MOVQ (R8)(R10*1), R9 + XORQ (BX)(R10*1), R9 + JNZ matchlen_bsf_8_repeat_extend_calcBlockSizeSmall + LEAL -8(DI), DI + LEAL 8(R10), R10 + JMP matchlen_match4_repeat_extend_calcBlockSizeSmall -matchlen_loopback_repeat_extend_calcBlockSizeSmall: - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 - TESTQ R9, R9 - JZ matchlen_loop_repeat_extend_calcBlockSizeSmall - +matchlen_bsf_8_repeat_extend_calcBlockSizeSmall: #ifdef GOAMD64_v3 TZCNTQ R9, R9 @@ -17892,12 +18624,6 @@ matchlen_loopback_repeat_extend_calcBlockSizeSmall: LEAL (R10)(R9*1), R10 JMP repeat_extend_forward_end_calcBlockSizeSmall -matchlen_loop_repeat_extend_calcBlockSizeSmall: - LEAL -8(DI), DI - LEAL 8(R10), R10 - CMPL DI, $0x08 - JAE matchlen_loopback_repeat_extend_calcBlockSizeSmall - matchlen_match4_repeat_extend_calcBlockSizeSmall: CMPL DI, $0x04 JB matchlen_match2_repeat_extend_calcBlockSizeSmall @@ -18053,15 +18779,43 @@ match_nolit_loop_calcBlockSizeSmall: // matchLen XORL R9, R9 + +matchlen_loopback_16_match_nolit_calcBlockSizeSmall: + CMPL SI, $0x10 + JB matchlen_match8_match_nolit_calcBlockSizeSmall + MOVQ (DI)(R9*1), R8 + MOVQ 8(DI)(R9*1), R10 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_calcBlockSizeSmall + XORQ 8(BX)(R9*1), R10 + JNZ matchlen_bsf_16match_nolit_calcBlockSizeSmall + LEAL -16(SI), SI + LEAL 16(R9), R9 + JMP matchlen_loopback_16_match_nolit_calcBlockSizeSmall + +matchlen_bsf_16match_nolit_calcBlockSizeSmall: +#ifdef GOAMD64_v3 + TZCNTQ R10, R10 + +#else + BSFQ R10, R10 + +#endif + SARQ $0x03, R10 + LEAL 8(R9)(R10*1), R9 + JMP match_nolit_end_calcBlockSizeSmall + +matchlen_match8_match_nolit_calcBlockSizeSmall: CMPL SI, $0x08 JB matchlen_match4_match_nolit_calcBlockSizeSmall + MOVQ (DI)(R9*1), R8 + XORQ (BX)(R9*1), R8 + JNZ matchlen_bsf_8_match_nolit_calcBlockSizeSmall + LEAL -8(SI), SI + LEAL 8(R9), R9 + JMP matchlen_match4_match_nolit_calcBlockSizeSmall -matchlen_loopback_match_nolit_calcBlockSizeSmall: - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 - TESTQ R8, R8 - JZ matchlen_loop_match_nolit_calcBlockSizeSmall - +matchlen_bsf_8_match_nolit_calcBlockSizeSmall: #ifdef GOAMD64_v3 TZCNTQ R8, R8 @@ -18073,12 +18827,6 @@ matchlen_loopback_match_nolit_calcBlockSizeSmall: LEAL (R9)(R8*1), R9 JMP match_nolit_end_calcBlockSizeSmall -matchlen_loop_match_nolit_calcBlockSizeSmall: - LEAL -8(SI), SI - LEAL 8(R9), R9 - CMPL SI, $0x08 - JAE matchlen_loopback_match_nolit_calcBlockSizeSmall - matchlen_match4_match_nolit_calcBlockSizeSmall: CMPL SI, $0x04 JB matchlen_match2_match_nolit_calcBlockSizeSmall @@ -18840,15 +19588,43 @@ TEXT ·matchLen(SB), NOSPLIT, $0-56 // matchLen XORL SI, SI + +matchlen_loopback_16_standalone: + CMPL DX, $0x10 + JB matchlen_match8_standalone + MOVQ (AX)(SI*1), BX + MOVQ 8(AX)(SI*1), DI + XORQ (CX)(SI*1), BX + JNZ matchlen_bsf_8_standalone + XORQ 8(CX)(SI*1), DI + JNZ matchlen_bsf_16standalone + LEAL -16(DX), DX + LEAL 16(SI), SI + JMP matchlen_loopback_16_standalone + +matchlen_bsf_16standalone: +#ifdef GOAMD64_v3 + TZCNTQ DI, DI + +#else + BSFQ DI, DI + +#endif + SARQ $0x03, DI + LEAL 8(SI)(DI*1), SI + JMP gen_match_len_end + +matchlen_match8_standalone: CMPL DX, $0x08 JB matchlen_match4_standalone + MOVQ (AX)(SI*1), BX + XORQ (CX)(SI*1), BX + JNZ matchlen_bsf_8_standalone + LEAL -8(DX), DX + LEAL 8(SI), SI + JMP matchlen_match4_standalone -matchlen_loopback_standalone: - MOVQ (AX)(SI*1), BX - XORQ (CX)(SI*1), BX - TESTQ BX, BX - JZ matchlen_loop_standalone - +matchlen_bsf_8_standalone: #ifdef GOAMD64_v3 TZCNTQ BX, BX @@ -18860,12 +19636,6 @@ matchlen_loopback_standalone: LEAL (SI)(BX*1), SI JMP gen_match_len_end -matchlen_loop_standalone: - LEAL -8(DX), DX - LEAL 8(SI), SI - CMPL DX, $0x08 - JAE matchlen_loopback_standalone - matchlen_match4_standalone: CMPL DX, $0x04 JB matchlen_match2_standalone diff --git a/vendor/github.com/klauspost/compress/s2/index.go b/vendor/github.com/klauspost/compress/s2/index.go index dd9ecfe7..18a4f7ac 100644 --- a/vendor/github.com/klauspost/compress/s2/index.go +++ b/vendor/github.com/klauspost/compress/s2/index.go @@ -511,24 +511,22 @@ func IndexStream(r io.Reader) ([]byte, error) { // JSON returns the index as JSON text. func (i *Index) JSON() []byte { + type offset struct { + CompressedOffset int64 `json:"compressed"` + UncompressedOffset int64 `json:"uncompressed"` + } x := struct { - TotalUncompressed int64 `json:"total_uncompressed"` // Total Uncompressed size if known. Will be -1 if unknown. - TotalCompressed int64 `json:"total_compressed"` // Total Compressed size if known. Will be -1 if unknown. - Offsets []struct { - CompressedOffset int64 `json:"compressed"` - UncompressedOffset int64 `json:"uncompressed"` - } `json:"offsets"` - EstBlockUncomp int64 `json:"est_block_uncompressed"` + TotalUncompressed int64 `json:"total_uncompressed"` // Total Uncompressed size if known. Will be -1 if unknown. + TotalCompressed int64 `json:"total_compressed"` // Total Compressed size if known. Will be -1 if unknown. + Offsets []offset `json:"offsets"` + EstBlockUncomp int64 `json:"est_block_uncompressed"` }{ TotalUncompressed: i.TotalUncompressed, TotalCompressed: i.TotalCompressed, EstBlockUncomp: i.estBlockUncomp, } for _, v := range i.info { - x.Offsets = append(x.Offsets, struct { - CompressedOffset int64 `json:"compressed"` - UncompressedOffset int64 `json:"uncompressed"` - }{CompressedOffset: v.compressedOffset, UncompressedOffset: v.uncompressedOffset}) + x.Offsets = append(x.Offsets, offset{CompressedOffset: v.compressedOffset, UncompressedOffset: v.uncompressedOffset}) } b, _ := json.MarshalIndent(x, "", " ") return b diff --git a/vendor/github.com/klauspost/cpuid/v2/README.md b/vendor/github.com/klauspost/cpuid/v2/README.md index accd7aba..30f8d296 100644 --- a/vendor/github.com/klauspost/cpuid/v2/README.md +++ b/vendor/github.com/klauspost/cpuid/v2/README.md @@ -9,10 +9,7 @@ You can access the CPU information by accessing the shared CPU variable of the c Package home: https://github.com/klauspost/cpuid [![PkgGoDev](https://pkg.go.dev/badge/github.com/klauspost/cpuid)](https://pkg.go.dev/github.com/klauspost/cpuid/v2) -[![Build Status][3]][4] - -[3]: https://travis-ci.org/klauspost/cpuid.svg?branch=master -[4]: https://travis-ci.org/klauspost/cpuid +[![Go](https://github.com/klauspost/cpuid/actions/workflows/go.yml/badge.svg)](https://github.com/klauspost/cpuid/actions/workflows/go.yml) ## installing @@ -285,7 +282,12 @@ Exit Code 1 | AMXINT8 | Tile computational operations on 8-bit integers | | AMXFP16 | Tile computational operations on FP16 numbers | | AMXTILE | Tile architecture | +| APX_F | Intel APX | | AVX | AVX functions | +| AVX10 | If set the Intel AVX10 Converged Vector ISA is supported | +| AVX10_128 | If set indicates that AVX10 128-bit vector support is present | +| AVX10_256 | If set indicates that AVX10 256-bit vector support is present | +| AVX10_512 | If set indicates that AVX10 512-bit vector support is present | | AVX2 | AVX2 functions | | AVX512BF16 | AVX-512 BFLOAT16 Instructions | | AVX512BITALG | AVX-512 Bit Algorithms | @@ -365,6 +367,8 @@ Exit Code 1 | IDPRED_CTRL | IPRED_DIS | | INT_WBINVD | WBINVD/WBNOINVD are interruptible. | | INVLPGB | NVLPGB and TLBSYNC instruction supported | +| KEYLOCKER | Key locker | +| KEYLOCKERW | Key locker wide | | LAHF | LAHF/SAHF in long mode | | LAM | If set, CPU supports Linear Address Masking | | LBRVIRT | LBR virtualization | @@ -380,7 +384,7 @@ Exit Code 1 | MOVDIRI | Move Doubleword as Direct Store | | MOVSB_ZL | Fast Zero-Length MOVSB | | MPX | Intel MPX (Memory Protection Extensions) | -| MOVU | MOVU SSE instructions are more efficient and should be preferred to SSE MOVL/MOVH. MOVUPS is more efficient than MOVLPS/MOVHPS. MOVUPD is more efficient than MOVLPD/MOVHPD | +| MOVU | MOVU SSE instructions are more efficient and should be preferred to SSE MOVL/MOVH. MOVUPS is more efficient than MOVLPS/MOVHPS. MOVUPD is more efficient than MOVLPD/MOVHPD | | MSRIRC | Instruction Retired Counter MSR available | | MSRLIST | Read/Write List of Model Specific Registers | | MSR_PAGEFLUSH | Page Flush MSR available | diff --git a/vendor/github.com/klauspost/cpuid/v2/cpuid.go b/vendor/github.com/klauspost/cpuid/v2/cpuid.go index d015c744..15b76033 100644 --- a/vendor/github.com/klauspost/cpuid/v2/cpuid.go +++ b/vendor/github.com/klauspost/cpuid/v2/cpuid.go @@ -76,7 +76,12 @@ const ( AMXFP16 // Tile computational operations on FP16 numbers AMXINT8 // Tile computational operations on 8-bit integers AMXTILE // Tile architecture + APX_F // Intel APX AVX // AVX functions + AVX10 // If set the Intel AVX10 Converged Vector ISA is supported + AVX10_128 // If set indicates that AVX10 128-bit vector support is present + AVX10_256 // If set indicates that AVX10 256-bit vector support is present + AVX10_512 // If set indicates that AVX10 512-bit vector support is present AVX2 // AVX2 functions AVX512BF16 // AVX-512 BFLOAT16 Instructions AVX512BITALG // AVX-512 Bit Algorithms @@ -156,6 +161,8 @@ const ( IDPRED_CTRL // IPRED_DIS INT_WBINVD // WBINVD/WBNOINVD are interruptible. INVLPGB // NVLPGB and TLBSYNC instruction supported + KEYLOCKER // Key locker + KEYLOCKERW // Key locker wide LAHF // LAHF/SAHF in long mode LAM // If set, CPU supports Linear Address Masking LBRVIRT // LBR virtualization @@ -302,9 +309,10 @@ type CPUInfo struct { L2 int // L2 Cache (per core or shared). Will be -1 if undetected L3 int // L3 Cache (per core, per ccx or shared). Will be -1 if undetected } - SGX SGXSupport - maxFunc uint32 - maxExFunc uint32 + SGX SGXSupport + AVX10Level uint8 + maxFunc uint32 + maxExFunc uint32 } var cpuid func(op uint32) (eax, ebx, ecx, edx uint32) @@ -1165,6 +1173,7 @@ func support() flagSet { fs.setIf(ecx&(1<<10) != 0, VPCLMULQDQ) fs.setIf(ecx&(1<<13) != 0, TME) fs.setIf(ecx&(1<<25) != 0, CLDEMOTE) + fs.setIf(ecx&(1<<23) != 0, KEYLOCKER) fs.setIf(ecx&(1<<27) != 0, MOVDIRI) fs.setIf(ecx&(1<<28) != 0, MOVDIR64B) fs.setIf(ecx&(1<<29) != 0, ENQCMD) @@ -1202,6 +1211,8 @@ func support() flagSet { fs.setIf(edx1&(1<<4) != 0, AVXVNNIINT8) fs.setIf(edx1&(1<<5) != 0, AVXNECONVERT) fs.setIf(edx1&(1<<14) != 0, PREFETCHI) + fs.setIf(edx1&(1<<19) != 0, AVX10) + fs.setIf(edx1&(1<<21) != 0, APX_F) // Only detect AVX-512 features if XGETBV is supported if c&((1<<26)|(1<<27)) == (1<<26)|(1<<27) { @@ -1252,6 +1263,19 @@ func support() flagSet { fs.setIf(edx&(1<<4) != 0, BHI_CTRL) fs.setIf(edx&(1<<5) != 0, MCDT_NO) + // Add keylocker features. + if fs.inSet(KEYLOCKER) && mfi >= 0x19 { + _, ebx, _, _ := cpuidex(0x19, 0) + fs.setIf(ebx&5 == 5, KEYLOCKERW) // Bit 0 and 2 (1+4) + } + + // Add AVX10 features. + if fs.inSet(AVX10) && mfi >= 0x24 { + _, ebx, _, _ := cpuidex(0x24, 0) + fs.setIf(ebx&(1<<16) != 0, AVX10_128) + fs.setIf(ebx&(1<<17) != 0, AVX10_256) + fs.setIf(ebx&(1<<18) != 0, AVX10_512) + } } // Processor Extended State Enumeration Sub-leaf (EAX = 0DH, ECX = 1) @@ -1394,6 +1418,20 @@ func support() flagSet { fs.setIf((a>>24)&1 == 1, VMSA_REGPROT) } + if mfi >= 0x20 { + // Microsoft has decided to purposefully hide the information + // of the guest TEE when VMs are being created using Hyper-V. + // + // This leads us to check for the Hyper-V cpuid features + // (0x4000000C), and then for the `ebx` value set. + // + // For Intel TDX, `ebx` is set as `0xbe3`, being 3 the part + // we're mostly interested about,according to: + // https://github.com/torvalds/linux/blob/d2f51b3516dade79269ff45eae2a7668ae711b25/arch/x86/include/asm/hyperv-tlfs.h#L169-L174 + _, ebx, _, _ := cpuid(0x4000000C) + fs.setIf(ebx == 0xbe3, TDX_GUEST) + } + if mfi >= 0x21 { // Intel Trusted Domain Extensions Guests have their own cpuid leaf (0x21). _, ebx, ecx, edx := cpuid(0x21) @@ -1404,6 +1442,14 @@ func support() flagSet { return fs } +func (c *CPUInfo) supportAVX10() uint8 { + if c.maxFunc >= 0x24 && c.featureSet.inSet(AVX10) { + _, ebx, _, _ := cpuidex(0x24, 0) + return uint8(ebx) + } + return 0 +} + func valAsString(values ...uint32) []byte { r := make([]byte, 4*len(values)) for i, v := range values { diff --git a/vendor/github.com/klauspost/cpuid/v2/detect_x86.go b/vendor/github.com/klauspost/cpuid/v2/detect_x86.go index c946824e..c7dfa125 100644 --- a/vendor/github.com/klauspost/cpuid/v2/detect_x86.go +++ b/vendor/github.com/klauspost/cpuid/v2/detect_x86.go @@ -31,6 +31,7 @@ func addInfo(c *CPUInfo, safe bool) { c.LogicalCores = logicalCores() c.PhysicalCores = physicalCores() c.VendorID, c.VendorString = vendorID() + c.AVX10Level = c.supportAVX10() c.cacheSize() c.frequencies() } diff --git a/vendor/github.com/klauspost/cpuid/v2/featureid_string.go b/vendor/github.com/klauspost/cpuid/v2/featureid_string.go index 024c706a..43bd05f5 100644 --- a/vendor/github.com/klauspost/cpuid/v2/featureid_string.go +++ b/vendor/github.com/klauspost/cpuid/v2/featureid_string.go @@ -16,210 +16,217 @@ func _() { _ = x[AMXFP16-6] _ = x[AMXINT8-7] _ = x[AMXTILE-8] - _ = x[AVX-9] - _ = x[AVX2-10] - _ = x[AVX512BF16-11] - _ = x[AVX512BITALG-12] - _ = x[AVX512BW-13] - _ = x[AVX512CD-14] - _ = x[AVX512DQ-15] - _ = x[AVX512ER-16] - _ = x[AVX512F-17] - _ = x[AVX512FP16-18] - _ = x[AVX512IFMA-19] - _ = x[AVX512PF-20] - _ = x[AVX512VBMI-21] - _ = x[AVX512VBMI2-22] - _ = x[AVX512VL-23] - _ = x[AVX512VNNI-24] - _ = x[AVX512VP2INTERSECT-25] - _ = x[AVX512VPOPCNTDQ-26] - _ = x[AVXIFMA-27] - _ = x[AVXNECONVERT-28] - _ = x[AVXSLOW-29] - _ = x[AVXVNNI-30] - _ = x[AVXVNNIINT8-31] - _ = x[BHI_CTRL-32] - _ = x[BMI1-33] - _ = x[BMI2-34] - _ = x[CETIBT-35] - _ = x[CETSS-36] - _ = x[CLDEMOTE-37] - _ = x[CLMUL-38] - _ = x[CLZERO-39] - _ = x[CMOV-40] - _ = x[CMPCCXADD-41] - _ = x[CMPSB_SCADBS_SHORT-42] - _ = x[CMPXCHG8-43] - _ = x[CPBOOST-44] - _ = x[CPPC-45] - _ = x[CX16-46] - _ = x[EFER_LMSLE_UNS-47] - _ = x[ENQCMD-48] - _ = x[ERMS-49] - _ = x[F16C-50] - _ = x[FLUSH_L1D-51] - _ = x[FMA3-52] - _ = x[FMA4-53] - _ = x[FP128-54] - _ = x[FP256-55] - _ = x[FSRM-56] - _ = x[FXSR-57] - _ = x[FXSROPT-58] - _ = x[GFNI-59] - _ = x[HLE-60] - _ = x[HRESET-61] - _ = x[HTT-62] - _ = x[HWA-63] - _ = x[HYBRID_CPU-64] - _ = x[HYPERVISOR-65] - _ = x[IA32_ARCH_CAP-66] - _ = x[IA32_CORE_CAP-67] - _ = x[IBPB-68] - _ = x[IBRS-69] - _ = x[IBRS_PREFERRED-70] - _ = x[IBRS_PROVIDES_SMP-71] - _ = x[IBS-72] - _ = x[IBSBRNTRGT-73] - _ = x[IBSFETCHSAM-74] - _ = x[IBSFFV-75] - _ = x[IBSOPCNT-76] - _ = x[IBSOPCNTEXT-77] - _ = x[IBSOPSAM-78] - _ = x[IBSRDWROPCNT-79] - _ = x[IBSRIPINVALIDCHK-80] - _ = x[IBS_FETCH_CTLX-81] - _ = x[IBS_OPDATA4-82] - _ = x[IBS_OPFUSE-83] - _ = x[IBS_PREVENTHOST-84] - _ = x[IBS_ZEN4-85] - _ = x[IDPRED_CTRL-86] - _ = x[INT_WBINVD-87] - _ = x[INVLPGB-88] - _ = x[LAHF-89] - _ = x[LAM-90] - _ = x[LBRVIRT-91] - _ = x[LZCNT-92] - _ = x[MCAOVERFLOW-93] - _ = x[MCDT_NO-94] - _ = x[MCOMMIT-95] - _ = x[MD_CLEAR-96] - _ = x[MMX-97] - _ = x[MMXEXT-98] - _ = x[MOVBE-99] - _ = x[MOVDIR64B-100] - _ = x[MOVDIRI-101] - _ = x[MOVSB_ZL-102] - _ = x[MOVU-103] - _ = x[MPX-104] - _ = x[MSRIRC-105] - _ = x[MSRLIST-106] - _ = x[MSR_PAGEFLUSH-107] - _ = x[NRIPS-108] - _ = x[NX-109] - _ = x[OSXSAVE-110] - _ = x[PCONFIG-111] - _ = x[POPCNT-112] - _ = x[PPIN-113] - _ = x[PREFETCHI-114] - _ = x[PSFD-115] - _ = x[RDPRU-116] - _ = x[RDRAND-117] - _ = x[RDSEED-118] - _ = x[RDTSCP-119] - _ = x[RRSBA_CTRL-120] - _ = x[RTM-121] - _ = x[RTM_ALWAYS_ABORT-122] - _ = x[SERIALIZE-123] - _ = x[SEV-124] - _ = x[SEV_64BIT-125] - _ = x[SEV_ALTERNATIVE-126] - _ = x[SEV_DEBUGSWAP-127] - _ = x[SEV_ES-128] - _ = x[SEV_RESTRICTED-129] - _ = x[SEV_SNP-130] - _ = x[SGX-131] - _ = x[SGXLC-132] - _ = x[SHA-133] - _ = x[SME-134] - _ = x[SME_COHERENT-135] - _ = x[SPEC_CTRL_SSBD-136] - _ = x[SRBDS_CTRL-137] - _ = x[SSE-138] - _ = x[SSE2-139] - _ = x[SSE3-140] - _ = x[SSE4-141] - _ = x[SSE42-142] - _ = x[SSE4A-143] - _ = x[SSSE3-144] - _ = x[STIBP-145] - _ = x[STIBP_ALWAYSON-146] - _ = x[STOSB_SHORT-147] - _ = x[SUCCOR-148] - _ = x[SVM-149] - _ = x[SVMDA-150] - _ = x[SVMFBASID-151] - _ = x[SVML-152] - _ = x[SVMNP-153] - _ = x[SVMPF-154] - _ = x[SVMPFT-155] - _ = x[SYSCALL-156] - _ = x[SYSEE-157] - _ = x[TBM-158] - _ = x[TDX_GUEST-159] - _ = x[TLB_FLUSH_NESTED-160] - _ = x[TME-161] - _ = x[TOPEXT-162] - _ = x[TSCRATEMSR-163] - _ = x[TSXLDTRK-164] - _ = x[VAES-165] - _ = x[VMCBCLEAN-166] - _ = x[VMPL-167] - _ = x[VMSA_REGPROT-168] - _ = x[VMX-169] - _ = x[VPCLMULQDQ-170] - _ = x[VTE-171] - _ = x[WAITPKG-172] - _ = x[WBNOINVD-173] - _ = x[WRMSRNS-174] - _ = x[X87-175] - _ = x[XGETBV1-176] - _ = x[XOP-177] - _ = x[XSAVE-178] - _ = x[XSAVEC-179] - _ = x[XSAVEOPT-180] - _ = x[XSAVES-181] - _ = x[AESARM-182] - _ = x[ARMCPUID-183] - _ = x[ASIMD-184] - _ = x[ASIMDDP-185] - _ = x[ASIMDHP-186] - _ = x[ASIMDRDM-187] - _ = x[ATOMICS-188] - _ = x[CRC32-189] - _ = x[DCPOP-190] - _ = x[EVTSTRM-191] - _ = x[FCMA-192] - _ = x[FP-193] - _ = x[FPHP-194] - _ = x[GPA-195] - _ = x[JSCVT-196] - _ = x[LRCPC-197] - _ = x[PMULL-198] - _ = x[SHA1-199] - _ = x[SHA2-200] - _ = x[SHA3-201] - _ = x[SHA512-202] - _ = x[SM3-203] - _ = x[SM4-204] - _ = x[SVE-205] - _ = x[lastID-206] + _ = x[APX_F-9] + _ = x[AVX-10] + _ = x[AVX10-11] + _ = x[AVX10_128-12] + _ = x[AVX10_256-13] + _ = x[AVX10_512-14] + _ = x[AVX2-15] + _ = x[AVX512BF16-16] + _ = x[AVX512BITALG-17] + _ = x[AVX512BW-18] + _ = x[AVX512CD-19] + _ = x[AVX512DQ-20] + _ = x[AVX512ER-21] + _ = x[AVX512F-22] + _ = x[AVX512FP16-23] + _ = x[AVX512IFMA-24] + _ = x[AVX512PF-25] + _ = x[AVX512VBMI-26] + _ = x[AVX512VBMI2-27] + _ = x[AVX512VL-28] + _ = x[AVX512VNNI-29] + _ = x[AVX512VP2INTERSECT-30] + _ = x[AVX512VPOPCNTDQ-31] + _ = x[AVXIFMA-32] + _ = x[AVXNECONVERT-33] + _ = x[AVXSLOW-34] + _ = x[AVXVNNI-35] + _ = x[AVXVNNIINT8-36] + _ = x[BHI_CTRL-37] + _ = x[BMI1-38] + _ = x[BMI2-39] + _ = x[CETIBT-40] + _ = x[CETSS-41] + _ = x[CLDEMOTE-42] + _ = x[CLMUL-43] + _ = x[CLZERO-44] + _ = x[CMOV-45] + _ = x[CMPCCXADD-46] + _ = x[CMPSB_SCADBS_SHORT-47] + _ = x[CMPXCHG8-48] + _ = x[CPBOOST-49] + _ = x[CPPC-50] + _ = x[CX16-51] + _ = x[EFER_LMSLE_UNS-52] + _ = x[ENQCMD-53] + _ = x[ERMS-54] + _ = x[F16C-55] + _ = x[FLUSH_L1D-56] + _ = x[FMA3-57] + _ = x[FMA4-58] + _ = x[FP128-59] + _ = x[FP256-60] + _ = x[FSRM-61] + _ = x[FXSR-62] + _ = x[FXSROPT-63] + _ = x[GFNI-64] + _ = x[HLE-65] + _ = x[HRESET-66] + _ = x[HTT-67] + _ = x[HWA-68] + _ = x[HYBRID_CPU-69] + _ = x[HYPERVISOR-70] + _ = x[IA32_ARCH_CAP-71] + _ = x[IA32_CORE_CAP-72] + _ = x[IBPB-73] + _ = x[IBRS-74] + _ = x[IBRS_PREFERRED-75] + _ = x[IBRS_PROVIDES_SMP-76] + _ = x[IBS-77] + _ = x[IBSBRNTRGT-78] + _ = x[IBSFETCHSAM-79] + _ = x[IBSFFV-80] + _ = x[IBSOPCNT-81] + _ = x[IBSOPCNTEXT-82] + _ = x[IBSOPSAM-83] + _ = x[IBSRDWROPCNT-84] + _ = x[IBSRIPINVALIDCHK-85] + _ = x[IBS_FETCH_CTLX-86] + _ = x[IBS_OPDATA4-87] + _ = x[IBS_OPFUSE-88] + _ = x[IBS_PREVENTHOST-89] + _ = x[IBS_ZEN4-90] + _ = x[IDPRED_CTRL-91] + _ = x[INT_WBINVD-92] + _ = x[INVLPGB-93] + _ = x[KEYLOCKER-94] + _ = x[KEYLOCKERW-95] + _ = x[LAHF-96] + _ = x[LAM-97] + _ = x[LBRVIRT-98] + _ = x[LZCNT-99] + _ = x[MCAOVERFLOW-100] + _ = x[MCDT_NO-101] + _ = x[MCOMMIT-102] + _ = x[MD_CLEAR-103] + _ = x[MMX-104] + _ = x[MMXEXT-105] + _ = x[MOVBE-106] + _ = x[MOVDIR64B-107] + _ = x[MOVDIRI-108] + _ = x[MOVSB_ZL-109] + _ = x[MOVU-110] + _ = x[MPX-111] + _ = x[MSRIRC-112] + _ = x[MSRLIST-113] + _ = x[MSR_PAGEFLUSH-114] + _ = x[NRIPS-115] + _ = x[NX-116] + _ = x[OSXSAVE-117] + _ = x[PCONFIG-118] + _ = x[POPCNT-119] + _ = x[PPIN-120] + _ = x[PREFETCHI-121] + _ = x[PSFD-122] + _ = x[RDPRU-123] + _ = x[RDRAND-124] + _ = x[RDSEED-125] + _ = x[RDTSCP-126] + _ = x[RRSBA_CTRL-127] + _ = x[RTM-128] + _ = x[RTM_ALWAYS_ABORT-129] + _ = x[SERIALIZE-130] + _ = x[SEV-131] + _ = x[SEV_64BIT-132] + _ = x[SEV_ALTERNATIVE-133] + _ = x[SEV_DEBUGSWAP-134] + _ = x[SEV_ES-135] + _ = x[SEV_RESTRICTED-136] + _ = x[SEV_SNP-137] + _ = x[SGX-138] + _ = x[SGXLC-139] + _ = x[SHA-140] + _ = x[SME-141] + _ = x[SME_COHERENT-142] + _ = x[SPEC_CTRL_SSBD-143] + _ = x[SRBDS_CTRL-144] + _ = x[SSE-145] + _ = x[SSE2-146] + _ = x[SSE3-147] + _ = x[SSE4-148] + _ = x[SSE42-149] + _ = x[SSE4A-150] + _ = x[SSSE3-151] + _ = x[STIBP-152] + _ = x[STIBP_ALWAYSON-153] + _ = x[STOSB_SHORT-154] + _ = x[SUCCOR-155] + _ = x[SVM-156] + _ = x[SVMDA-157] + _ = x[SVMFBASID-158] + _ = x[SVML-159] + _ = x[SVMNP-160] + _ = x[SVMPF-161] + _ = x[SVMPFT-162] + _ = x[SYSCALL-163] + _ = x[SYSEE-164] + _ = x[TBM-165] + _ = x[TDX_GUEST-166] + _ = x[TLB_FLUSH_NESTED-167] + _ = x[TME-168] + _ = x[TOPEXT-169] + _ = x[TSCRATEMSR-170] + _ = x[TSXLDTRK-171] + _ = x[VAES-172] + _ = x[VMCBCLEAN-173] + _ = x[VMPL-174] + _ = x[VMSA_REGPROT-175] + _ = x[VMX-176] + _ = x[VPCLMULQDQ-177] + _ = x[VTE-178] + _ = x[WAITPKG-179] + _ = x[WBNOINVD-180] + _ = x[WRMSRNS-181] + _ = x[X87-182] + _ = x[XGETBV1-183] + _ = x[XOP-184] + _ = x[XSAVE-185] + _ = x[XSAVEC-186] + _ = x[XSAVEOPT-187] + _ = x[XSAVES-188] + _ = x[AESARM-189] + _ = x[ARMCPUID-190] + _ = x[ASIMD-191] + _ = x[ASIMDDP-192] + _ = x[ASIMDHP-193] + _ = x[ASIMDRDM-194] + _ = x[ATOMICS-195] + _ = x[CRC32-196] + _ = x[DCPOP-197] + _ = x[EVTSTRM-198] + _ = x[FCMA-199] + _ = x[FP-200] + _ = x[FPHP-201] + _ = x[GPA-202] + _ = x[JSCVT-203] + _ = x[LRCPC-204] + _ = x[PMULL-205] + _ = x[SHA1-206] + _ = x[SHA2-207] + _ = x[SHA3-208] + _ = x[SHA512-209] + _ = x[SM3-210] + _ = x[SM4-211] + _ = x[SVE-212] + _ = x[lastID-213] _ = x[firstID-0] } -const _FeatureID_name = "firstIDADXAESNIAMD3DNOWAMD3DNOWEXTAMXBF16AMXFP16AMXINT8AMXTILEAVXAVX2AVX512BF16AVX512BITALGAVX512BWAVX512CDAVX512DQAVX512ERAVX512FAVX512FP16AVX512IFMAAVX512PFAVX512VBMIAVX512VBMI2AVX512VLAVX512VNNIAVX512VP2INTERSECTAVX512VPOPCNTDQAVXIFMAAVXNECONVERTAVXSLOWAVXVNNIAVXVNNIINT8BHI_CTRLBMI1BMI2CETIBTCETSSCLDEMOTECLMULCLZEROCMOVCMPCCXADDCMPSB_SCADBS_SHORTCMPXCHG8CPBOOSTCPPCCX16EFER_LMSLE_UNSENQCMDERMSF16CFLUSH_L1DFMA3FMA4FP128FP256FSRMFXSRFXSROPTGFNIHLEHRESETHTTHWAHYBRID_CPUHYPERVISORIA32_ARCH_CAPIA32_CORE_CAPIBPBIBRSIBRS_PREFERREDIBRS_PROVIDES_SMPIBSIBSBRNTRGTIBSFETCHSAMIBSFFVIBSOPCNTIBSOPCNTEXTIBSOPSAMIBSRDWROPCNTIBSRIPINVALIDCHKIBS_FETCH_CTLXIBS_OPDATA4IBS_OPFUSEIBS_PREVENTHOSTIBS_ZEN4IDPRED_CTRLINT_WBINVDINVLPGBLAHFLAMLBRVIRTLZCNTMCAOVERFLOWMCDT_NOMCOMMITMD_CLEARMMXMMXEXTMOVBEMOVDIR64BMOVDIRIMOVSB_ZLMOVUMPXMSRIRCMSRLISTMSR_PAGEFLUSHNRIPSNXOSXSAVEPCONFIGPOPCNTPPINPREFETCHIPSFDRDPRURDRANDRDSEEDRDTSCPRRSBA_CTRLRTMRTM_ALWAYS_ABORTSERIALIZESEVSEV_64BITSEV_ALTERNATIVESEV_DEBUGSWAPSEV_ESSEV_RESTRICTEDSEV_SNPSGXSGXLCSHASMESME_COHERENTSPEC_CTRL_SSBDSRBDS_CTRLSSESSE2SSE3SSE4SSE42SSE4ASSSE3STIBPSTIBP_ALWAYSONSTOSB_SHORTSUCCORSVMSVMDASVMFBASIDSVMLSVMNPSVMPFSVMPFTSYSCALLSYSEETBMTDX_GUESTTLB_FLUSH_NESTEDTMETOPEXTTSCRATEMSRTSXLDTRKVAESVMCBCLEANVMPLVMSA_REGPROTVMXVPCLMULQDQVTEWAITPKGWBNOINVDWRMSRNSX87XGETBV1XOPXSAVEXSAVECXSAVEOPTXSAVESAESARMARMCPUIDASIMDASIMDDPASIMDHPASIMDRDMATOMICSCRC32DCPOPEVTSTRMFCMAFPFPHPGPAJSCVTLRCPCPMULLSHA1SHA2SHA3SHA512SM3SM4SVElastID" +const _FeatureID_name = "firstIDADXAESNIAMD3DNOWAMD3DNOWEXTAMXBF16AMXFP16AMXINT8AMXTILEAPX_FAVXAVX10AVX10_128AVX10_256AVX10_512AVX2AVX512BF16AVX512BITALGAVX512BWAVX512CDAVX512DQAVX512ERAVX512FAVX512FP16AVX512IFMAAVX512PFAVX512VBMIAVX512VBMI2AVX512VLAVX512VNNIAVX512VP2INTERSECTAVX512VPOPCNTDQAVXIFMAAVXNECONVERTAVXSLOWAVXVNNIAVXVNNIINT8BHI_CTRLBMI1BMI2CETIBTCETSSCLDEMOTECLMULCLZEROCMOVCMPCCXADDCMPSB_SCADBS_SHORTCMPXCHG8CPBOOSTCPPCCX16EFER_LMSLE_UNSENQCMDERMSF16CFLUSH_L1DFMA3FMA4FP128FP256FSRMFXSRFXSROPTGFNIHLEHRESETHTTHWAHYBRID_CPUHYPERVISORIA32_ARCH_CAPIA32_CORE_CAPIBPBIBRSIBRS_PREFERREDIBRS_PROVIDES_SMPIBSIBSBRNTRGTIBSFETCHSAMIBSFFVIBSOPCNTIBSOPCNTEXTIBSOPSAMIBSRDWROPCNTIBSRIPINVALIDCHKIBS_FETCH_CTLXIBS_OPDATA4IBS_OPFUSEIBS_PREVENTHOSTIBS_ZEN4IDPRED_CTRLINT_WBINVDINVLPGBKEYLOCKERKEYLOCKERWLAHFLAMLBRVIRTLZCNTMCAOVERFLOWMCDT_NOMCOMMITMD_CLEARMMXMMXEXTMOVBEMOVDIR64BMOVDIRIMOVSB_ZLMOVUMPXMSRIRCMSRLISTMSR_PAGEFLUSHNRIPSNXOSXSAVEPCONFIGPOPCNTPPINPREFETCHIPSFDRDPRURDRANDRDSEEDRDTSCPRRSBA_CTRLRTMRTM_ALWAYS_ABORTSERIALIZESEVSEV_64BITSEV_ALTERNATIVESEV_DEBUGSWAPSEV_ESSEV_RESTRICTEDSEV_SNPSGXSGXLCSHASMESME_COHERENTSPEC_CTRL_SSBDSRBDS_CTRLSSESSE2SSE3SSE4SSE42SSE4ASSSE3STIBPSTIBP_ALWAYSONSTOSB_SHORTSUCCORSVMSVMDASVMFBASIDSVMLSVMNPSVMPFSVMPFTSYSCALLSYSEETBMTDX_GUESTTLB_FLUSH_NESTEDTMETOPEXTTSCRATEMSRTSXLDTRKVAESVMCBCLEANVMPLVMSA_REGPROTVMXVPCLMULQDQVTEWAITPKGWBNOINVDWRMSRNSX87XGETBV1XOPXSAVEXSAVECXSAVEOPTXSAVESAESARMARMCPUIDASIMDASIMDDPASIMDHPASIMDRDMATOMICSCRC32DCPOPEVTSTRMFCMAFPFPHPGPAJSCVTLRCPCPMULLSHA1SHA2SHA3SHA512SM3SM4SVElastID" -var _FeatureID_index = [...]uint16{0, 7, 10, 15, 23, 34, 41, 48, 55, 62, 65, 69, 79, 91, 99, 107, 115, 123, 130, 140, 150, 158, 168, 179, 187, 197, 215, 230, 237, 249, 256, 263, 274, 282, 286, 290, 296, 301, 309, 314, 320, 324, 333, 351, 359, 366, 370, 374, 388, 394, 398, 402, 411, 415, 419, 424, 429, 433, 437, 444, 448, 451, 457, 460, 463, 473, 483, 496, 509, 513, 517, 531, 548, 551, 561, 572, 578, 586, 597, 605, 617, 633, 647, 658, 668, 683, 691, 702, 712, 719, 723, 726, 733, 738, 749, 756, 763, 771, 774, 780, 785, 794, 801, 809, 813, 816, 822, 829, 842, 847, 849, 856, 863, 869, 873, 882, 886, 891, 897, 903, 909, 919, 922, 938, 947, 950, 959, 974, 987, 993, 1007, 1014, 1017, 1022, 1025, 1028, 1040, 1054, 1064, 1067, 1071, 1075, 1079, 1084, 1089, 1094, 1099, 1113, 1124, 1130, 1133, 1138, 1147, 1151, 1156, 1161, 1167, 1174, 1179, 1182, 1191, 1207, 1210, 1216, 1226, 1234, 1238, 1247, 1251, 1263, 1266, 1276, 1279, 1286, 1294, 1301, 1304, 1311, 1314, 1319, 1325, 1333, 1339, 1345, 1353, 1358, 1365, 1372, 1380, 1387, 1392, 1397, 1404, 1408, 1410, 1414, 1417, 1422, 1427, 1432, 1436, 1440, 1444, 1450, 1453, 1456, 1459, 1465} +var _FeatureID_index = [...]uint16{0, 7, 10, 15, 23, 34, 41, 48, 55, 62, 67, 70, 75, 84, 93, 102, 106, 116, 128, 136, 144, 152, 160, 167, 177, 187, 195, 205, 216, 224, 234, 252, 267, 274, 286, 293, 300, 311, 319, 323, 327, 333, 338, 346, 351, 357, 361, 370, 388, 396, 403, 407, 411, 425, 431, 435, 439, 448, 452, 456, 461, 466, 470, 474, 481, 485, 488, 494, 497, 500, 510, 520, 533, 546, 550, 554, 568, 585, 588, 598, 609, 615, 623, 634, 642, 654, 670, 684, 695, 705, 720, 728, 739, 749, 756, 765, 775, 779, 782, 789, 794, 805, 812, 819, 827, 830, 836, 841, 850, 857, 865, 869, 872, 878, 885, 898, 903, 905, 912, 919, 925, 929, 938, 942, 947, 953, 959, 965, 975, 978, 994, 1003, 1006, 1015, 1030, 1043, 1049, 1063, 1070, 1073, 1078, 1081, 1084, 1096, 1110, 1120, 1123, 1127, 1131, 1135, 1140, 1145, 1150, 1155, 1169, 1180, 1186, 1189, 1194, 1203, 1207, 1212, 1217, 1223, 1230, 1235, 1238, 1247, 1263, 1266, 1272, 1282, 1290, 1294, 1303, 1307, 1319, 1322, 1332, 1335, 1342, 1350, 1357, 1360, 1367, 1370, 1375, 1381, 1389, 1395, 1401, 1409, 1414, 1421, 1428, 1436, 1443, 1448, 1453, 1460, 1464, 1466, 1470, 1473, 1478, 1483, 1488, 1492, 1496, 1500, 1506, 1509, 1512, 1515, 1521} func (i FeatureID) String() string { if i < 0 || i >= FeatureID(len(_FeatureID_index)-1) { diff --git a/vendor/github.com/labstack/echo/v4/CHANGELOG.md b/vendor/github.com/labstack/echo/v4/CHANGELOG.md index fef7bb98..cc17e28d 100644 --- a/vendor/github.com/labstack/echo/v4/CHANGELOG.md +++ b/vendor/github.com/labstack/echo/v4/CHANGELOG.md @@ -1,5 +1,46 @@ # Changelog +## v4.11.4 - 2023-12-20 + +**Security** + +* Upgrade golang.org/x/crypto to v0.17.0 to fix vulnerability [issue](https://pkg.go.dev/vuln/GO-2023-2402) [#2562](https://github.com/labstack/echo/pull/2562) + +**Enhancements** + +* Update deps and mark Go version to 1.18 as this is what golang.org/x/* use [#2563](https://github.com/labstack/echo/pull/2563) +* Request logger: add example for Slog https://pkg.go.dev/log/slog [#2543](https://github.com/labstack/echo/pull/2543) + + +## v4.11.3 - 2023-11-07 + +**Security** + +* 'c.Attachment' and 'c.Inline' should escape filename in 'Content-Disposition' header to avoid 'Reflect File Download' vulnerability. [#2541](https://github.com/labstack/echo/pull/2541) + +**Enhancements** + +* Tests: refactor context tests to be separate functions [#2540](https://github.com/labstack/echo/pull/2540) +* Proxy middleware: reuse echo request context [#2537](https://github.com/labstack/echo/pull/2537) +* Mark unmarshallable yaml struct tags as ignored [#2536](https://github.com/labstack/echo/pull/2536) + + +## v4.11.2 - 2023-10-11 + +**Security** + +* Bump golang.org/x/net to prevent CVE-2023-39325 / CVE-2023-44487 HTTP/2 Rapid Reset Attack [#2527](https://github.com/labstack/echo/pull/2527) +* fix(sec): randomString bias introduced by #2490 [#2492](https://github.com/labstack/echo/pull/2492) +* CSRF/RequestID mw: switch math/random usage to crypto/random [#2490](https://github.com/labstack/echo/pull/2490) + +**Enhancements** + +* Delete unused context in body_limit.go [#2483](https://github.com/labstack/echo/pull/2483) +* Use Go 1.21 in CI [#2505](https://github.com/labstack/echo/pull/2505) +* Fix some typos [#2511](https://github.com/labstack/echo/pull/2511) +* Allow CORS middleware to send Access-Control-Max-Age: 0 [#2518](https://github.com/labstack/echo/pull/2518) +* Bump dependancies [#2522](https://github.com/labstack/echo/pull/2522) + ## v4.11.1 - 2023-07-16 **Fixes** diff --git a/vendor/github.com/labstack/echo/v4/README.md b/vendor/github.com/labstack/echo/v4/README.md index ea8f30f6..18accea7 100644 --- a/vendor/github.com/labstack/echo/v4/README.md +++ b/vendor/github.com/labstack/echo/v4/README.md @@ -3,7 +3,7 @@ [![Sourcegraph](https://sourcegraph.com/github.com/labstack/echo/-/badge.svg?style=flat-square)](https://sourcegraph.com/github.com/labstack/echo?badge) [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://pkg.go.dev/github.com/labstack/echo/v4) [![Go Report Card](https://goreportcard.com/badge/github.com/labstack/echo?style=flat-square)](https://goreportcard.com/report/github.com/labstack/echo) -[![Build Status](http://img.shields.io/travis/labstack/echo.svg?style=flat-square)](https://travis-ci.org/labstack/echo) +[![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/labstack/echo/echo.yml?style=flat-square)](https://github.com/labstack/echo/actions) [![Codecov](https://img.shields.io/codecov/c/github/labstack/echo.svg?style=flat-square)](https://codecov.io/gh/labstack/echo) [![Forum](https://img.shields.io/badge/community-forum-00afd1.svg?style=flat-square)](https://github.com/labstack/echo/discussions) [![Twitter](https://img.shields.io/badge/twitter-@labstack-55acee.svg?style=flat-square)](https://twitter.com/labstack) diff --git a/vendor/github.com/labstack/echo/v4/binder.go b/vendor/github.com/labstack/echo/v4/binder.go index 29cceca0..8e7b8141 100644 --- a/vendor/github.com/labstack/echo/v4/binder.go +++ b/vendor/github.com/labstack/echo/v4/binder.go @@ -1323,7 +1323,7 @@ func (b *ValueBinder) unixTime(sourceParam string, dest *time.Time, valueMustExi case time.Second: *dest = time.Unix(n, 0) case time.Millisecond: - *dest = time.Unix(n/1e3, (n%1e3)*1e6) // TODO: time.UnixMilli(n) exists since Go1.17 switch to that when min version allows + *dest = time.UnixMilli(n) case time.Nanosecond: *dest = time.Unix(0, n) } diff --git a/vendor/github.com/labstack/echo/v4/context.go b/vendor/github.com/labstack/echo/v4/context.go index 27da28a9..6a181168 100644 --- a/vendor/github.com/labstack/echo/v4/context.go +++ b/vendor/github.com/labstack/echo/v4/context.go @@ -584,8 +584,10 @@ func (c *context) Inline(file, name string) error { return c.contentDisposition(file, name, "inline") } +var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") + func (c *context) contentDisposition(file, name, dispositionType string) error { - c.response.Header().Set(HeaderContentDisposition, fmt.Sprintf("%s; filename=%q", dispositionType, name)) + c.response.Header().Set(HeaderContentDisposition, fmt.Sprintf(`%s; filename="%s"`, dispositionType, quoteEscaper.Replace(name))) return c.File(file) } diff --git a/vendor/github.com/labstack/echo/v4/echo.go b/vendor/github.com/labstack/echo/v4/echo.go index 22a5b7af..9924ac86 100644 --- a/vendor/github.com/labstack/echo/v4/echo.go +++ b/vendor/github.com/labstack/echo/v4/echo.go @@ -259,7 +259,7 @@ const ( const ( // Version of Echo - Version = "4.11.1" + Version = "4.11.4" website = "https://echo.labstack.com" // http://patorjk.com/software/taag/#p=display&f=Small%20Slant&t=Echo banner = ` diff --git a/vendor/github.com/labstack/echo/v4/middleware/body_limit.go b/vendor/github.com/labstack/echo/v4/middleware/body_limit.go index b436bd59..99e3ac54 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/body_limit.go +++ b/vendor/github.com/labstack/echo/v4/middleware/body_limit.go @@ -23,9 +23,8 @@ type ( limitedReader struct { BodyLimitConfig - reader io.ReadCloser - read int64 - context echo.Context + reader io.ReadCloser + read int64 } ) @@ -80,7 +79,7 @@ func BodyLimitWithConfig(config BodyLimitConfig) echo.MiddlewareFunc { // Based on content read r := pool.Get().(*limitedReader) - r.Reset(req.Body, c) + r.Reset(req.Body) defer pool.Put(r) req.Body = r @@ -102,9 +101,8 @@ func (r *limitedReader) Close() error { return r.reader.Close() } -func (r *limitedReader) Reset(reader io.ReadCloser, context echo.Context) { +func (r *limitedReader) Reset(reader io.ReadCloser) { r.reader = reader - r.context = context r.read = 0 } diff --git a/vendor/github.com/labstack/echo/v4/middleware/context_timeout.go b/vendor/github.com/labstack/echo/v4/middleware/context_timeout.go index be260e18..1937693f 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/context_timeout.go +++ b/vendor/github.com/labstack/echo/v4/middleware/context_timeout.go @@ -13,7 +13,7 @@ type ContextTimeoutConfig struct { // Skipper defines a function to skip middleware. Skipper Skipper - // ErrorHandler is a function when error aries in middeware execution. + // ErrorHandler is a function when error aries in middleware execution. ErrorHandler func(err error, c echo.Context) error // Timeout configures a timeout for the middleware, defaults to 0 for no timeout diff --git a/vendor/github.com/labstack/echo/v4/middleware/cors.go b/vendor/github.com/labstack/echo/v4/middleware/cors.go index 6ddb540a..7ace2f22 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/cors.go +++ b/vendor/github.com/labstack/echo/v4/middleware/cors.go @@ -39,7 +39,7 @@ type ( // See https://blog.portswigger.net/2016/10/exploiting-cors-misconfigurations-for.html // // Optional. - AllowOriginFunc func(origin string) (bool, error) `yaml:"allow_origin_func"` + AllowOriginFunc func(origin string) (bool, error) `yaml:"-"` // AllowMethods determines the value of the Access-Control-Allow-Methods // response header. This header specified the list of methods allowed when @@ -99,8 +99,9 @@ type ( // MaxAge determines the value of the Access-Control-Max-Age response header. // This header indicates how long (in seconds) the results of a preflight // request can be cached. + // The header is set only if MaxAge != 0, negative value sends "0" which instructs browsers not to cache that response. // - // Optional. Default value 0. The header is set only if MaxAge > 0. + // Optional. Default value 0 - meaning header is not sent. // // See also: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age MaxAge int `yaml:"max_age"` @@ -159,7 +160,11 @@ func CORSWithConfig(config CORSConfig) echo.MiddlewareFunc { allowMethods := strings.Join(config.AllowMethods, ",") allowHeaders := strings.Join(config.AllowHeaders, ",") exposeHeaders := strings.Join(config.ExposeHeaders, ",") - maxAge := strconv.Itoa(config.MaxAge) + + maxAge := "0" + if config.MaxAge > 0 { + maxAge = strconv.Itoa(config.MaxAge) + } return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { @@ -282,7 +287,7 @@ func CORSWithConfig(config CORSConfig) echo.MiddlewareFunc { res.Header().Set(echo.HeaderAccessControlAllowHeaders, h) } } - if config.MaxAge > 0 { + if config.MaxAge != 0 { res.Header().Set(echo.HeaderAccessControlMaxAge, maxAge) } return c.NoContent(http.StatusNoContent) diff --git a/vendor/github.com/labstack/echo/v4/middleware/csrf.go b/vendor/github.com/labstack/echo/v4/middleware/csrf.go index 6899700c..adf12210 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/csrf.go +++ b/vendor/github.com/labstack/echo/v4/middleware/csrf.go @@ -6,7 +6,6 @@ import ( "time" "github.com/labstack/echo/v4" - "github.com/labstack/gommon/random" ) type ( @@ -103,6 +102,7 @@ func CSRFWithConfig(config CSRFConfig) echo.MiddlewareFunc { if config.TokenLength == 0 { config.TokenLength = DefaultCSRFConfig.TokenLength } + if config.TokenLookup == "" { config.TokenLookup = DefaultCSRFConfig.TokenLookup } @@ -132,7 +132,7 @@ func CSRFWithConfig(config CSRFConfig) echo.MiddlewareFunc { token := "" if k, err := c.Cookie(config.CookieName); err != nil { - token = random.String(config.TokenLength) // Generate token + token = randomString(config.TokenLength) } else { token = k.Value // Reuse token } diff --git a/vendor/github.com/labstack/echo/v4/middleware/proxy.go b/vendor/github.com/labstack/echo/v4/middleware/proxy.go index e4f98d9e..16b00d64 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/proxy.go +++ b/vendor/github.com/labstack/echo/v4/middleware/proxy.go @@ -359,6 +359,10 @@ func ProxyWithConfig(config ProxyConfig) echo.MiddlewareFunc { c.Set("_error", nil) } + // This is needed for ProxyConfig.ModifyResponse and/or ProxyConfig.Transport to be able to process the Request + // that Balancer may have replaced with c.SetRequest. + req = c.Request() + // Proxy switch { case c.IsWebSocket(): diff --git a/vendor/github.com/labstack/echo/v4/middleware/request_id.go b/vendor/github.com/labstack/echo/v4/middleware/request_id.go index 8c5ff660..e29c8f50 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/request_id.go +++ b/vendor/github.com/labstack/echo/v4/middleware/request_id.go @@ -2,7 +2,6 @@ package middleware import ( "github.com/labstack/echo/v4" - "github.com/labstack/gommon/random" ) type ( @@ -12,7 +11,7 @@ type ( Skipper Skipper // Generator defines a function to generate an ID. - // Optional. Default value random.String(32). + // Optional. Defaults to generator for random string of length 32. Generator func() string // RequestIDHandler defines a function which is executed for a request id. @@ -73,5 +72,5 @@ func RequestIDWithConfig(config RequestIDConfig) echo.MiddlewareFunc { } func generator() string { - return random.String(32) + return randomString(32) } diff --git a/vendor/github.com/labstack/echo/v4/middleware/request_logger.go b/vendor/github.com/labstack/echo/v4/middleware/request_logger.go index ce76230c..f82f6b62 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/request_logger.go +++ b/vendor/github.com/labstack/echo/v4/middleware/request_logger.go @@ -8,6 +8,30 @@ import ( "github.com/labstack/echo/v4" ) +// Example for `slog` https://pkg.go.dev/log/slog +// logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) +// e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{ +// LogStatus: true, +// LogURI: true, +// LogError: true, +// HandleError: true, // forwards error to the global error handler, so it can decide appropriate status code +// LogValuesFunc: func(c echo.Context, v middleware.RequestLoggerValues) error { +// if v.Error == nil { +// logger.LogAttrs(context.Background(), slog.LevelInfo, "REQUEST", +// slog.String("uri", v.URI), +// slog.Int("status", v.Status), +// ) +// } else { +// logger.LogAttrs(context.Background(), slog.LevelError, "REQUEST_ERROR", +// slog.String("uri", v.URI), +// slog.Int("status", v.Status), +// slog.String("err", v.Error.Error()), +// ) +// } +// return nil +// }, +// })) +// // Example for `fmt.Printf` // e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{ // LogStatus: true, diff --git a/vendor/github.com/labstack/echo/v4/middleware/rewrite.go b/vendor/github.com/labstack/echo/v4/middleware/rewrite.go index e5b0a6b5..2090eac0 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/rewrite.go +++ b/vendor/github.com/labstack/echo/v4/middleware/rewrite.go @@ -27,7 +27,7 @@ type ( // Example: // "^/old/[0.9]+/": "/new", // "^/api/.+?/(.*)": "/v2/$1", - RegexRules map[*regexp.Regexp]string `yaml:"regex_rules"` + RegexRules map[*regexp.Regexp]string `yaml:"-"` } ) diff --git a/vendor/github.com/labstack/echo/v4/middleware/util.go b/vendor/github.com/labstack/echo/v4/middleware/util.go index ab951a0e..4d2d172f 100644 --- a/vendor/github.com/labstack/echo/v4/middleware/util.go +++ b/vendor/github.com/labstack/echo/v4/middleware/util.go @@ -1,7 +1,11 @@ package middleware import ( + "bufio" + "crypto/rand" + "io" "strings" + "sync" ) func matchScheme(domain, pattern string) bool { @@ -52,3 +56,45 @@ func matchSubdomain(domain, pattern string) bool { } return false } + +// https://tip.golang.org/doc/go1.19#:~:text=Read%20no%20longer%20buffers%20random%20data%20obtained%20from%20the%20operating%20system%20between%20calls +var randomReaderPool = sync.Pool{New: func() interface{} { + return bufio.NewReader(rand.Reader) +}} + +const randomStringCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +const randomStringCharsetLen = 52 // len(randomStringCharset) +const randomStringMaxByte = 255 - (256 % randomStringCharsetLen) + +func randomString(length uint8) string { + reader := randomReaderPool.Get().(*bufio.Reader) + defer randomReaderPool.Put(reader) + + b := make([]byte, length) + r := make([]byte, length+(length/4)) // perf: avoid read from rand.Reader many times + var i uint8 = 0 + + // security note: + // we can't just simply do b[i]=randomStringCharset[rb%len(randomStringCharset)], + // len(len(randomStringCharset)) is 52, and rb is [0, 255], 256 = 52 * 4 + 48. + // make the first 48 characters more possibly to be generated then others. + // So we have to skip bytes when rb > randomStringMaxByte + + for { + _, err := io.ReadFull(reader, r) + if err != nil { + panic("unexpected error happened when reading from bufio.NewReader(crypto/rand.Reader)") + } + for _, rb := range r { + if rb > randomStringMaxByte { + // Skip this number to avoid bias. + continue + } + b[i] = randomStringCharset[rb%randomStringCharsetLen] + i++ + if i == length { + return string(b) + } + } + } +} diff --git a/vendor/github.com/labstack/gommon/random/random.go b/vendor/github.com/labstack/gommon/random/random.go deleted file mode 100644 index 482d0524..00000000 --- a/vendor/github.com/labstack/gommon/random/random.go +++ /dev/null @@ -1,48 +0,0 @@ -package random - -import ( - "math/rand" - "strings" - "time" -) - -type ( - Random struct { - } -) - -// Charsets -const ( - Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - Lowercase = "abcdefghijklmnopqrstuvwxyz" - Alphabetic = Uppercase + Lowercase - Numeric = "0123456789" - Alphanumeric = Alphabetic + Numeric - Symbols = "`" + `~!@#$%^&*()-_+={}[]|\;:"<>,./?` - Hex = Numeric + "abcdef" -) - -var ( - global = New() -) - -func New() *Random { - rand.Seed(time.Now().UnixNano()) - return new(Random) -} - -func (r *Random) String(length uint8, charsets ...string) string { - charset := strings.Join(charsets, "") - if charset == "" { - charset = Alphanumeric - } - b := make([]byte, length) - for i := range b { - b[i] = charset[rand.Int63()%int64(len(charset))] - } - return string(b) -} - -func String(length uint8, charsets ...string) string { - return global.String(length, charsets...) -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go index d569c0c9..d0ea68f4 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ b/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -1,6 +1,7 @@ -//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine +//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine && !tinygo // +build darwin freebsd openbsd netbsd dragonfly hurd // +build !appengine +// +build !tinygo package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go index 31503226..7402e061 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -1,5 +1,6 @@ -//go:build appengine || js || nacl || wasm -// +build appengine js nacl wasm +//go:build (appengine || js || nacl || tinygo || wasm) && !windows +// +build appengine js nacl tinygo wasm +// +build !windows package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go index 67787657..0337d8cf 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -1,6 +1,7 @@ -//go:build (linux || aix || zos) && !appengine +//go:build (linux || aix || zos) && !appengine && !tinygo // +build linux aix zos // +build !appengine +// +build !tinygo package isatty diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go similarity index 83% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go index 258c0636..7c08e564 100644 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go @@ -19,9 +19,10 @@ import ( "errors" "io" - "github.com/golang/protobuf/proto" + "google.golang.org/protobuf/proto" ) +// TODO: Give error package name prefix in next minor release. var errInvalidVarint = errors.New("invalid varint32 encountered") // ReadDelimited decodes a message from the provided length-delimited stream, @@ -36,6 +37,12 @@ var errInvalidVarint = errors.New("invalid varint32 encountered") // of the stream has been reached in doing so. In that case, any subsequent // calls return (0, io.EOF). func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { + // TODO: Consider allowing the caller to specify a decode buffer in the + // next major version. + + // TODO: Consider using error wrapping to annotate error state in pass- + // through cases in the next minor version. + // Per AbstractParser#parsePartialDelimitedFrom with // CodedInputStream#readRawVarint32. var headerBuf [binary.MaxVarintLen32]byte @@ -53,15 +60,14 @@ func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { if err != nil { return bytesRead, err } - // A Reader should not return (0, nil), but if it does, - // it should be treated as no-op (according to the - // Reader contract). So let's go on... + // A Reader should not return (0, nil); but if it does, it should + // be treated as no-op according to the Reader contract. continue } bytesRead += newBytesRead // Now present everything read so far to the varint decoder and // see if a varint can be decoded already. - messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) + messageLength, varIntBytes = binary.Uvarint(headerBuf[:bytesRead]) } messageBuf := make([]byte, messageLength) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go similarity index 91% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go rename to vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go index 8fb59ad2..e58dd9d2 100644 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go @@ -18,7 +18,7 @@ import ( "encoding/binary" "io" - "github.com/golang/protobuf/proto" + "google.golang.org/protobuf/proto" ) // WriteDelimited encodes and dumps a message to the provided writer prefixed @@ -28,6 +28,9 @@ import ( // number of bytes written and any applicable error. This is roughly // equivalent to the companion Java API's MessageLite#writeDelimitedTo. func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { + // TODO: Consider allowing the caller to specify an encode buffer in the + // next major version. + buffer, err := proto.Marshal(m) if err != nil { return 0, err diff --git a/vendor/github.com/miekg/dns/README.md b/vendor/github.com/miekg/dns/README.md index 06bea9fa..95bc08d5 100644 --- a/vendor/github.com/miekg/dns/README.md +++ b/vendor/github.com/miekg/dns/README.md @@ -81,6 +81,7 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://addr.tools/ * https://dnscheck.tools/ * https://github.com/egbakou/domainverifier +* https://github.com/semihalev/sdns Send pull request if you want to be listed here. diff --git a/vendor/github.com/miekg/dns/acceptfunc.go b/vendor/github.com/miekg/dns/acceptfunc.go index ab2812e3..1a59a854 100644 --- a/vendor/github.com/miekg/dns/acceptfunc.go +++ b/vendor/github.com/miekg/dns/acceptfunc.go @@ -10,8 +10,6 @@ type MsgAcceptFunc func(dh Header) MsgAcceptAction // // * opcode isn't OpcodeQuery or OpcodeNotify // -// * Zero bit isn't zero -// // * does not have exactly 1 question in the question section // // * has more than 1 RR in the Answer section diff --git a/vendor/github.com/miekg/dns/defaults.go b/vendor/github.com/miekg/dns/defaults.go index c1558b79..02d9199a 100644 --- a/vendor/github.com/miekg/dns/defaults.go +++ b/vendor/github.com/miekg/dns/defaults.go @@ -22,8 +22,7 @@ func (dns *Msg) SetReply(request *Msg) *Msg { } dns.Rcode = RcodeSuccess if len(request.Question) > 0 { - dns.Question = make([]Question, 1) - dns.Question[0] = request.Question[0] + dns.Question = []Question{request.Question[0]} } return dns } @@ -292,26 +291,19 @@ func IsFqdn(s string) bool { return (len(s)-i)%2 != 0 } -// IsRRset checks if a set of RRs is a valid RRset as defined by RFC 2181. -// This means the RRs need to have the same type, name, and class. Returns true -// if the RR set is valid, otherwise false. +// IsRRset reports whether a set of RRs is a valid RRset as defined by RFC 2181. +// This means the RRs need to have the same type, name, and class. func IsRRset(rrset []RR) bool { if len(rrset) == 0 { return false } - if len(rrset) == 1 { - return true - } - rrHeader := rrset[0].Header() - rrType := rrHeader.Rrtype - rrClass := rrHeader.Class - rrName := rrHeader.Name + baseH := rrset[0].Header() for _, rr := range rrset[1:] { - curRRHeader := rr.Header() - if curRRHeader.Rrtype != rrType || curRRHeader.Class != rrClass || curRRHeader.Name != rrName { + curH := rr.Header() + if curH.Rrtype != baseH.Rrtype || curH.Class != baseH.Class || curH.Name != baseH.Name { // Mismatch between the records, so this is not a valid rrset for - //signing/verifying + // signing/verifying return false } } @@ -329,9 +321,15 @@ func Fqdn(s string) string { } // CanonicalName returns the domain name in canonical form. A name in canonical -// form is lowercase and fully qualified. See Section 6.2 in RFC 4034. +// form is lowercase and fully qualified. Only US-ASCII letters are affected. See +// Section 6.2 in RFC 4034. func CanonicalName(s string) string { - return strings.ToLower(Fqdn(s)) + return strings.Map(func(r rune) rune { + if r >= 'A' && r <= 'Z' { + r += 'a' - 'A' + } + return r + }, Fqdn(s)) } // Copied from the official Go code. diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go index f7965816..5e72249b 100644 --- a/vendor/github.com/miekg/dns/dnssec_keyscan.go +++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go @@ -37,7 +37,8 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er return nil, ErrPrivKey } // TODO(mg): check if the pubkey matches the private key - algo, err := strconv.ParseUint(strings.SplitN(m["algorithm"], " ", 2)[0], 10, 8) + algoStr, _, _ := strings.Cut(m["algorithm"], " ") + algo, err := strconv.ParseUint(algoStr, 10, 8) if err != nil { return nil, ErrPrivKey } diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go index b5bdac81..1b58e8f0 100644 --- a/vendor/github.com/miekg/dns/edns.go +++ b/vendor/github.com/miekg/dns/edns.go @@ -185,7 +185,7 @@ func (rr *OPT) Do() bool { // SetDo sets the DO (DNSSEC OK) bit. // If we pass an argument, set the DO bit to that value. -// It is possible to pass 2 or more arguments. Any arguments after the 1st is silently ignored. +// It is possible to pass 2 or more arguments, but they will be ignored. func (rr *OPT) SetDo(do ...bool) { if len(do) == 1 { if do[0] { @@ -508,6 +508,7 @@ func (e *EDNS0_LLQ) String() string { " " + strconv.FormatUint(uint64(e.LeaseLife), 10) return s } + func (e *EDNS0_LLQ) copy() EDNS0 { return &EDNS0_LLQ{e.Code, e.Version, e.Opcode, e.Error, e.Id, e.LeaseLife} } diff --git a/vendor/github.com/miekg/dns/generate.go b/vendor/github.com/miekg/dns/generate.go index ac8df34d..713e9d2d 100644 --- a/vendor/github.com/miekg/dns/generate.go +++ b/vendor/github.com/miekg/dns/generate.go @@ -35,17 +35,17 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) { token = token[:i] } - sx := strings.SplitN(token, "-", 2) - if len(sx) != 2 { + startStr, endStr, ok := strings.Cut(token, "-") + if !ok { return zp.setParseError("bad start-stop in $GENERATE range", l) } - start, err := strconv.ParseInt(sx[0], 10, 64) + start, err := strconv.ParseInt(startStr, 10, 64) if err != nil { return zp.setParseError("bad start in $GENERATE range", l) } - end, err := strconv.ParseInt(sx[1], 10, 64) + end, err := strconv.ParseInt(endStr, 10, 64) if err != nil { return zp.setParseError("bad stop in $GENERATE range", l) } @@ -54,7 +54,7 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) { } // _BLANK - l, ok := zp.c.Next() + l, ok = zp.c.Next() if !ok || l.value != zBlank { return zp.setParseError("garbage after $GENERATE range", l) } @@ -211,15 +211,16 @@ func (r *generateReader) ReadByte() (byte, error) { func modToPrintf(s string) (string, int64, string) { // Modifier is { offset [ ,width [ ,base ] ] } - provide default // values for optional width and type, if necessary. - var offStr, widthStr, base string - switch xs := strings.Split(s, ","); len(xs) { - case 1: - offStr, widthStr, base = xs[0], "0", "d" - case 2: - offStr, widthStr, base = xs[0], xs[1], "d" - case 3: - offStr, widthStr, base = xs[0], xs[1], xs[2] - default: + offStr, s, ok0 := strings.Cut(s, ",") + widthStr, s, ok1 := strings.Cut(s, ",") + base, _, ok2 := strings.Cut(s, ",") + if !ok0 { + widthStr = "0" + } + if !ok1 { + base = "d" + } + if ok2 { return "", 0, "bad modifier in $GENERATE" } @@ -234,8 +235,8 @@ func modToPrintf(s string) (string, int64, string) { return "", 0, "bad offset in $GENERATE" } - width, err := strconv.ParseInt(widthStr, 10, 64) - if err != nil || width < 0 || width > 255 { + width, err := strconv.ParseUint(widthStr, 10, 8) + if err != nil { return "", 0, "bad width in $GENERATE" } diff --git a/vendor/github.com/miekg/dns/listen_no_reuseport.go b/vendor/github.com/miekg/dns/listen_no_reuseport.go index 6ed50f86..8cebb2f1 100644 --- a/vendor/github.com/miekg/dns/listen_no_reuseport.go +++ b/vendor/github.com/miekg/dns/listen_no_reuseport.go @@ -7,16 +7,18 @@ import "net" const supportsReusePort = false -func listenTCP(network, addr string, reuseport bool) (net.Listener, error) { - if reuseport { +func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) { + if reuseport || reuseaddr { // TODO(tmthrgd): return an error? } return net.Listen(network, addr) } -func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) { - if reuseport { +const supportsReuseAddr = false + +func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { + if reuseport || reuseaddr { // TODO(tmthrgd): return an error? } diff --git a/vendor/github.com/miekg/dns/listen_reuseport.go b/vendor/github.com/miekg/dns/listen_reuseport.go index 89bac903..41326f20 100644 --- a/vendor/github.com/miekg/dns/listen_reuseport.go +++ b/vendor/github.com/miekg/dns/listen_reuseport.go @@ -25,19 +25,41 @@ func reuseportControl(network, address string, c syscall.RawConn) error { return opErr } -func listenTCP(network, addr string, reuseport bool) (net.Listener, error) { +const supportsReuseAddr = true + +func reuseaddrControl(network, address string, c syscall.RawConn) error { + var opErr error + err := c.Control(func(fd uintptr) { + opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) + }) + if err != nil { + return err + } + + return opErr +} + +func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) { var lc net.ListenConfig - if reuseport { + switch { + case reuseaddr && reuseport: + case reuseport: lc.Control = reuseportControl + case reuseaddr: + lc.Control = reuseaddrControl } return lc.Listen(context.Background(), network, addr) } -func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) { +func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { var lc net.ListenConfig - if reuseport { + switch { + case reuseaddr && reuseport: + case reuseport: lc.Control = reuseportControl + case reuseaddr: + lc.Control = reuseaddrControl } return lc.ListenPacket(context.Background(), network, addr) diff --git a/vendor/github.com/miekg/dns/msg.go b/vendor/github.com/miekg/dns/msg.go index d5049a4f..8294d039 100644 --- a/vendor/github.com/miekg/dns/msg.go +++ b/vendor/github.com/miekg/dns/msg.go @@ -501,30 +501,28 @@ func packTxtString(s string, msg []byte, offset int) (int, error) { return offset, nil } -func packOctetString(s string, msg []byte, offset int, tmp []byte) (int, error) { - if offset >= len(msg) || len(s) > len(tmp) { +func packOctetString(s string, msg []byte, offset int) (int, error) { + if offset >= len(msg) || len(s) > 256*4+1 { return offset, ErrBuf } - bs := tmp[:len(s)] - copy(bs, s) - for i := 0; i < len(bs); i++ { + for i := 0; i < len(s); i++ { if len(msg) <= offset { return offset, ErrBuf } - if bs[i] == '\\' { + if s[i] == '\\' { i++ - if i == len(bs) { + if i == len(s) { break } // check for \DDD - if isDDD(bs[i:]) { - msg[offset] = dddToByte(bs[i:]) + if isDDD(s[i:]) { + msg[offset] = dddToByte(s[i:]) i += 2 } else { - msg[offset] = bs[i] + msg[offset] = s[i] } } else { - msg[offset] = bs[i] + msg[offset] = s[i] } offset++ } @@ -896,23 +894,38 @@ func (dns *Msg) String() string { return " MsgHdr" } s := dns.MsgHdr.String() + " " - s += "QUERY: " + strconv.Itoa(len(dns.Question)) + ", " - s += "ANSWER: " + strconv.Itoa(len(dns.Answer)) + ", " - s += "AUTHORITY: " + strconv.Itoa(len(dns.Ns)) + ", " - s += "ADDITIONAL: " + strconv.Itoa(len(dns.Extra)) + "\n" + if dns.MsgHdr.Opcode == OpcodeUpdate { + s += "ZONE: " + strconv.Itoa(len(dns.Question)) + ", " + s += "PREREQ: " + strconv.Itoa(len(dns.Answer)) + ", " + s += "UPDATE: " + strconv.Itoa(len(dns.Ns)) + ", " + s += "ADDITIONAL: " + strconv.Itoa(len(dns.Extra)) + "\n" + } else { + s += "QUERY: " + strconv.Itoa(len(dns.Question)) + ", " + s += "ANSWER: " + strconv.Itoa(len(dns.Answer)) + ", " + s += "AUTHORITY: " + strconv.Itoa(len(dns.Ns)) + ", " + s += "ADDITIONAL: " + strconv.Itoa(len(dns.Extra)) + "\n" + } opt := dns.IsEdns0() if opt != nil { // OPT PSEUDOSECTION s += opt.String() + "\n" } if len(dns.Question) > 0 { - s += "\n;; QUESTION SECTION:\n" + if dns.MsgHdr.Opcode == OpcodeUpdate { + s += "\n;; ZONE SECTION:\n" + } else { + s += "\n;; QUESTION SECTION:\n" + } for _, r := range dns.Question { s += r.String() + "\n" } } if len(dns.Answer) > 0 { - s += "\n;; ANSWER SECTION:\n" + if dns.MsgHdr.Opcode == OpcodeUpdate { + s += "\n;; PREREQUISITE SECTION:\n" + } else { + s += "\n;; ANSWER SECTION:\n" + } for _, r := range dns.Answer { if r != nil { s += r.String() + "\n" @@ -920,7 +933,11 @@ func (dns *Msg) String() string { } } if len(dns.Ns) > 0 { - s += "\n;; AUTHORITY SECTION:\n" + if dns.MsgHdr.Opcode == OpcodeUpdate { + s += "\n;; UPDATE SECTION:\n" + } else { + s += "\n;; AUTHORITY SECTION:\n" + } for _, r := range dns.Ns { if r != nil { s += r.String() + "\n" diff --git a/vendor/github.com/miekg/dns/msg_helpers.go b/vendor/github.com/miekg/dns/msg_helpers.go index 8582fc0a..acec21f7 100644 --- a/vendor/github.com/miekg/dns/msg_helpers.go +++ b/vendor/github.com/miekg/dns/msg_helpers.go @@ -20,9 +20,7 @@ func unpackDataA(msg []byte, off int) (net.IP, int, error) { if off+net.IPv4len > len(msg) { return nil, len(msg), &Error{err: "overflow unpacking a"} } - a := append(make(net.IP, 0, net.IPv4len), msg[off:off+net.IPv4len]...) - off += net.IPv4len - return a, off, nil + return cloneSlice(msg[off : off+net.IPv4len]), off + net.IPv4len, nil } func packDataA(a net.IP, msg []byte, off int) (int, error) { @@ -47,9 +45,7 @@ func unpackDataAAAA(msg []byte, off int) (net.IP, int, error) { if off+net.IPv6len > len(msg) { return nil, len(msg), &Error{err: "overflow unpacking aaaa"} } - aaaa := append(make(net.IP, 0, net.IPv6len), msg[off:off+net.IPv6len]...) - off += net.IPv6len - return aaaa, off, nil + return cloneSlice(msg[off : off+net.IPv6len]), off + net.IPv6len, nil } func packDataAAAA(aaaa net.IP, msg []byte, off int) (int, error) { @@ -410,29 +406,24 @@ func packStringTxt(s []string, msg []byte, off int) (int, error) { func unpackDataOpt(msg []byte, off int) ([]EDNS0, int, error) { var edns []EDNS0 -Option: - var code uint16 - if off+4 > len(msg) { - return nil, len(msg), &Error{err: "overflow unpacking opt"} + for off < len(msg) { + if off+4 > len(msg) { + return nil, len(msg), &Error{err: "overflow unpacking opt"} + } + code := binary.BigEndian.Uint16(msg[off:]) + off += 2 + optlen := binary.BigEndian.Uint16(msg[off:]) + off += 2 + if off+int(optlen) > len(msg) { + return nil, len(msg), &Error{err: "overflow unpacking opt"} + } + opt := makeDataOpt(code) + if err := opt.unpack(msg[off : off+int(optlen)]); err != nil { + return nil, len(msg), err + } + edns = append(edns, opt) + off += int(optlen) } - code = binary.BigEndian.Uint16(msg[off:]) - off += 2 - optlen := binary.BigEndian.Uint16(msg[off:]) - off += 2 - if off+int(optlen) > len(msg) { - return nil, len(msg), &Error{err: "overflow unpacking opt"} - } - e := makeDataOpt(code) - if err := e.unpack(msg[off : off+int(optlen)]); err != nil { - return nil, len(msg), err - } - edns = append(edns, e) - off += int(optlen) - - if off < len(msg) { - goto Option - } - return edns, off, nil } @@ -461,8 +452,7 @@ func unpackStringOctet(msg []byte, off int) (string, int, error) { } func packStringOctet(s string, msg []byte, off int) (int, error) { - txtTmp := make([]byte, 256*4+1) - off, err := packOctetString(s, msg, off, txtTmp) + off, err := packOctetString(s, msg, off) if err != nil { return len(msg), err } diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go index 3083c3e5..062d8ff3 100644 --- a/vendor/github.com/miekg/dns/scan.go +++ b/vendor/github.com/miekg/dns/scan.go @@ -605,8 +605,6 @@ func (zp *ZoneParser) Next() (RR, bool) { if !isPrivate && zp.c.Peek().token == "" { // This is a dynamic update rr. - // TODO(tmthrgd): Previously slurpRemainder was only called - // for certain RR types, which may have been important. if err := slurpRemainder(zp.c); err != nil { return zp.setParseError(err.err, err.lex) } @@ -1216,42 +1214,34 @@ func stringToCm(token string) (e, m uint8, ok bool) { if token[len(token)-1] == 'M' || token[len(token)-1] == 'm' { token = token[0 : len(token)-1] } - s := strings.SplitN(token, ".", 2) - var meters, cmeters, val int - var err error - switch len(s) { - case 2: - if cmeters, err = strconv.Atoi(s[1]); err != nil { - return - } + + var ( + meters, cmeters, val int + err error + ) + mStr, cmStr, hasCM := strings.Cut(token, ".") + if hasCM { // There's no point in having more than 2 digits in this part, and would rather make the implementation complicated ('123' should be treated as '12'). // So we simply reject it. // We also make sure the first character is a digit to reject '+-' signs. - if len(s[1]) > 2 || s[1][0] < '0' || s[1][0] > '9' { + cmeters, err = strconv.Atoi(cmStr) + if err != nil || len(cmStr) > 2 || cmStr[0] < '0' || cmStr[0] > '9' { return } - if len(s[1]) == 1 { + if len(cmStr) == 1 { // 'nn.1' must be treated as 'nn-meters and 10cm, not 1cm. cmeters *= 10 } - if s[0] == "" { - // This will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). - break - } - fallthrough - case 1: - if meters, err = strconv.Atoi(s[0]); err != nil { - return - } - // RFC1876 states the max value is 90000000.00. The latter two conditions enforce it. - if s[0][0] < '0' || s[0][0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) { - return - } - case 0: - // huh? - return 0, 0, false } - ok = true + // This slighly ugly condition will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). + if !hasCM || mStr != "" { + meters, err = strconv.Atoi(mStr) + // RFC1876 states the max value is 90000000.00. The latter two conditions enforce it. + if err != nil || mStr[0] < '0' || mStr[0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) { + return + } + } + if meters > 0 { e = 2 val = meters @@ -1263,8 +1253,7 @@ func stringToCm(token string) (e, m uint8, ok bool) { e++ val /= 10 } - m = uint8(val) - return + return e, uint8(val), true } func toAbsoluteName(name, origin string) (absolute string, ok bool) { diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index d08c8e6a..a635e1c5 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -1,7 +1,6 @@ package dns import ( - "bytes" "encoding/base64" "errors" "net" @@ -12,15 +11,15 @@ import ( // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces) // or an error func endingToString(c *zlexer, errstr string) (string, *ParseError) { - var buffer bytes.Buffer + var s strings.Builder l, _ := c.Next() // zString for l.value != zNewline && l.value != zEOF { if l.err { - return buffer.String(), &ParseError{"", errstr, l} + return s.String(), &ParseError{"", errstr, l} } switch l.value { case zString: - buffer.WriteString(l.token) + s.WriteString(l.token) case zBlank: // Ok default: return "", &ParseError{"", errstr, l} @@ -28,7 +27,7 @@ func endingToString(c *zlexer, errstr string) (string, *ParseError) { l, _ = c.Next() } - return buffer.String(), nil + return s.String(), nil } // A remainder of the rdata with embedded spaces, split on unquoted whitespace diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index 64e38854..0207d6da 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -226,6 +226,10 @@ type Server struct { // Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address. // It is only supported on certain GOOSes and when using ListenAndServe. ReusePort bool + // Whether to set the SO_REUSEADDR socket option, allowing multiple listeners to be bound to a single address. + // Crucially this allows binding when an existing server is listening on `0.0.0.0` or `::`. + // It is only supported on certain GOOSes and when using ListenAndServe. + ReuseAddr bool // AcceptMsgFunc will check the incoming message and will reject it early in the process. // By default DefaultMsgAcceptFunc will be used. MsgAcceptFunc MsgAcceptFunc @@ -304,7 +308,7 @@ func (srv *Server) ListenAndServe() error { switch srv.Net { case "tcp", "tcp4", "tcp6": - l, err := listenTCP(srv.Net, addr, srv.ReusePort) + l, err := listenTCP(srv.Net, addr, srv.ReusePort, srv.ReuseAddr) if err != nil { return err } @@ -317,7 +321,7 @@ func (srv *Server) ListenAndServe() error { return errors.New("dns: neither Certificates nor GetCertificate set in Config") } network := strings.TrimSuffix(srv.Net, "-tls") - l, err := listenTCP(network, addr, srv.ReusePort) + l, err := listenTCP(network, addr, srv.ReusePort, srv.ReuseAddr) if err != nil { return err } @@ -327,7 +331,7 @@ func (srv *Server) ListenAndServe() error { unlock() return srv.serveTCP(l) case "udp", "udp4", "udp6": - l, err := listenUDP(srv.Net, addr, srv.ReusePort) + l, err := listenUDP(srv.Net, addr, srv.ReusePort, srv.ReuseAddr) if err != nil { return err } diff --git a/vendor/github.com/miekg/dns/svcb.go b/vendor/github.com/miekg/dns/svcb.go index 6d496d74..d38aa2f0 100644 --- a/vendor/github.com/miekg/dns/svcb.go +++ b/vendor/github.com/miekg/dns/svcb.go @@ -314,10 +314,11 @@ func (s *SVCBMandatory) unpack(b []byte) error { } func (s *SVCBMandatory) parse(b string) error { - str := strings.Split(b, ",") - codes := make([]SVCBKey, 0, len(str)) - for _, e := range str { - codes = append(codes, svcbStringToKey(e)) + codes := make([]SVCBKey, 0, strings.Count(b, ",")+1) + for len(b) > 0 { + var key string + key, b, _ = strings.Cut(b, ",") + codes = append(codes, svcbStringToKey(key)) } s.Code = codes return nil @@ -613,19 +614,24 @@ func (s *SVCBIPv4Hint) String() string { } func (s *SVCBIPv4Hint) parse(b string) error { + if b == "" { + return errors.New("dns: svcbipv4hint: empty hint") + } if strings.Contains(b, ":") { return errors.New("dns: svcbipv4hint: expected ipv4, got ipv6") } - str := strings.Split(b, ",") - dst := make([]net.IP, len(str)) - for i, e := range str { + + hint := make([]net.IP, 0, strings.Count(b, ",")+1) + for len(b) > 0 { + var e string + e, b, _ = strings.Cut(b, ",") ip := net.ParseIP(e).To4() if ip == nil { return errors.New("dns: svcbipv4hint: bad ip") } - dst[i] = ip + hint = append(hint, ip) } - s.Hint = dst + s.Hint = hint return nil } @@ -733,9 +739,14 @@ func (s *SVCBIPv6Hint) String() string { } func (s *SVCBIPv6Hint) parse(b string) error { - str := strings.Split(b, ",") - dst := make([]net.IP, len(str)) - for i, e := range str { + if b == "" { + return errors.New("dns: svcbipv6hint: empty hint") + } + + hint := make([]net.IP, 0, strings.Count(b, ",")+1) + for len(b) > 0 { + var e string + e, b, _ = strings.Cut(b, ",") ip := net.ParseIP(e) if ip == nil { return errors.New("dns: svcbipv6hint: bad ip") @@ -743,9 +754,9 @@ func (s *SVCBIPv6Hint) parse(b string) error { if ip.To4() != nil { return errors.New("dns: svcbipv6hint: expected ipv6, got ipv4-mapped-ipv6") } - dst[i] = ip + hint = append(hint, ip) } - s.Hint = dst + s.Hint = hint return nil } diff --git a/vendor/github.com/miekg/dns/types.go b/vendor/github.com/miekg/dns/types.go index 03afeccd..c9a03dec 100644 --- a/vendor/github.com/miekg/dns/types.go +++ b/vendor/github.com/miekg/dns/types.go @@ -236,6 +236,9 @@ var CertTypeToString = map[uint16]string{ CertOID: "OID", } +// Prefix for IPv4 encoded as IPv6 address +const ipv4InIPv6Prefix = "::ffff:" + //go:generate go run types_generate.go // Question holds a DNS question. Usually there is just one. While the @@ -751,6 +754,11 @@ func (rr *AAAA) String() string { if rr.AAAA == nil { return rr.Hdr.String() } + + if rr.AAAA.To4() != nil { + return rr.Hdr.String() + ipv4InIPv6Prefix + rr.AAAA.String() + } + return rr.Hdr.String() + rr.AAAA.String() } @@ -1517,7 +1525,7 @@ func (a *APLPrefix) str() string { case net.IPv6len: // add prefix for IPv4-mapped IPv6 if v4 := a.Network.IP.To4(); v4 != nil { - sb.WriteString("::ffff:") + sb.WriteString(ipv4InIPv6Prefix) } sb.WriteString(a.Network.IP.String()) } diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index 5891044a..9fd300f6 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,7 +3,7 @@ package dns import "fmt" // Version is current version of this library. -var Version = v{1, 1, 55} +var Version = v{1, 1, 57} // v holds the version of this library. type v struct { diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go index 0a831c88..05b3c5ad 100644 --- a/vendor/github.com/miekg/dns/xfr.go +++ b/vendor/github.com/miekg/dns/xfr.go @@ -80,8 +80,13 @@ func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) { func (t *Transfer) inAxfr(q *Msg, c chan *Envelope) { first := true - defer t.Close() - defer close(c) + defer func() { + // First close the connection, then the channel. This allows functions blocked on + // the channel to assume that the connection is closed and no further operations are + // pending when they resume. + t.Close() + close(c) + }() timeout := dnsTimeout if t.ReadTimeout != 0 { timeout = t.ReadTimeout @@ -131,8 +136,13 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) { axfr := true n := 0 qser := q.Ns[0].(*SOA).Serial - defer t.Close() - defer close(c) + defer func() { + // First close the connection, then the channel. This allows functions blocked on + // the channel to assume that the connection is closed and no further operations are + // pending when they resume. + t.Close() + close(c) + }() timeout := dnsTimeout if t.ReadTimeout != 0 { timeout = t.ReadTimeout diff --git a/vendor/github.com/minio/minio-go/v7/README.md b/vendor/github.com/minio/minio-go/v7/README.md index 9b6bbbec..82f70a13 100644 --- a/vendor/github.com/minio/minio-go/v7/README.md +++ b/vendor/github.com/minio/minio-go/v7/README.md @@ -1,23 +1,28 @@ # MinIO Go Client SDK for Amazon S3 Compatible Cloud Storage [![Slack](https://slack.min.io/slack?type=svg)](https://slack.min.io) [![Sourcegraph](https://sourcegraph.com/github.com/minio/minio-go/-/badge.svg)](https://sourcegraph.com/github.com/minio/minio-go?badge) [![Apache V2 License](https://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/minio/minio-go/blob/master/LICENSE) -The MinIO Go Client SDK provides simple APIs to access any Amazon S3 compatible object storage. +The MinIO Go Client SDK provides straightforward APIs to access any Amazon S3 compatible object storage. -This quickstart guide will show you how to install the MinIO client SDK, connect to MinIO, and provide a walkthrough for a simple file uploader. For a complete list of APIs and examples, please take a look at the [Go Client API Reference](https://min.io/docs/minio/linux/developers/go/API.html). +This Quickstart Guide covers how to install the MinIO client SDK, connect to MinIO, and create a sample file uploader. +For a complete list of APIs and examples, see the [godoc documentation](https://pkg.go.dev/github.com/minio/minio-go/v7) or [Go Client API Reference](https://min.io/docs/minio/linux/developers/go/API.html). -This document assumes that you have a working [Go development environment](https://golang.org/doc/install). +These examples presume a working [Go development environment](https://golang.org/doc/install) and the [MinIO `mc` command line tool](https://min.io/docs/minio/linux/reference/minio-mc.html). ## Download from Github + +From your project directory: + ```sh go get github.com/minio/minio-go/v7 ``` -## Initialize MinIO Client -MinIO client requires the following four parameters specified to connect to an Amazon S3 compatible object storage. +## Initialize a MinIO Client Object -| Parameter | Description| -| :--- | :--- | -| endpoint | URL to object storage service. | -| _minio.Options_ | All the options such as credentials, custom transport etc. | +The MinIO client requires the following parameters to connect to an Amazon S3 compatible object storage: + +| Parameter | Description | +| ----------------- | ---------------------------------------------------------- | +| `endpoint` | URL to object storage service. | +| `_minio.Options_` | All the options such as credentials, custom transport etc. | ```go package main @@ -48,13 +53,25 @@ func main() { } ``` -## Quick Start Example - File Uploader -This example program connects to an object storage server, creates a bucket and uploads a file to the bucket. +## Example - File Uploader -We will use the MinIO server running at [https://play.min.io](https://play.min.io) in this example. Feel free to use this service for testing and development. Access credentials shown in this example are open to the public. +This sample code connects to an object storage server, creates a bucket, and uploads a file to the bucket. +It uses the MinIO `play` server, a public MinIO cluster located at [https://play.min.io](https://play.min.io). + +The `play` server runs the latest stable version of MinIO and may be used for testing and development. +The access credentials shown in this example are open to the public and all data uploaded to `play` should be considered public and non-protected. ### FileUploader.go + +This example does the following: + +- Connects to the MinIO `play` server using the provided credentials. +- Creates a bucket named `testbucket`. +- Uploads a file named `testdata` from `/tmp`. +- Verifies the file was created using `mc ls`. + ```go +// FileUploader.go MinIO example package main import ( @@ -81,8 +98,8 @@ func main() { log.Fatalln(err) } - // Make a new bucket called mymusic. - bucketName := "mymusic" + // Make a new bucket called testbucket. + bucketName := "testbucket" location := "us-east-1" err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location}) @@ -98,12 +115,13 @@ func main() { log.Printf("Successfully created %s\n", bucketName) } - // Upload the zip file - objectName := "golden-oldies.zip" - filePath := "/tmp/golden-oldies.zip" - contentType := "application/zip" + // Upload the test file + // Change the value of filePath if the file is in another location + objectName := "testdata" + filePath := "/tmp/testdata" + contentType := "application/octet-stream" - // Upload the zip file with FPutObject + // Upload the test file with FPutObject info, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType}) if err != nil { log.Fatalln(err) @@ -113,22 +131,51 @@ func main() { } ``` -### Run FileUploader -```sh -go run file-uploader.go -2016/08/13 17:03:28 Successfully created mymusic -2016/08/13 17:03:40 Successfully uploaded golden-oldies.zip of size 16253413 +**1. Create a test file containing data:** -mc ls play/mymusic/ -[2016-05-27 16:02:16 PDT] 17MiB golden-oldies.zip +You can do this with `dd` on Linux or macOS systems: + +```sh +dd if=/dev/urandom of=/tmp/testdata bs=2048 count=10 +``` + +or `fsutil` on Windows: + +```sh +fsutil file createnew "C:\Users\\Desktop\sample.txt" 20480 +``` + +**2. Run FileUploader with the following commands:** + +```sh +go mod init example/FileUploader +go get github.com/minio/minio-go/v7 +go get github.com/minio/minio-go/v7/pkg/credentials +go run FileUploader.go +``` + +The output resembles the following: + +```sh +2023/11/01 14:27:55 Successfully created testbucket +2023/11/01 14:27:55 Successfully uploaded testdata of size 20480 +``` + +**3. Verify the Uploaded File With `mc ls`:** + +```sh +mc ls play/testbucket +[2023-11-01 14:27:55 UTC] 20KiB STANDARD TestDataFile ``` ## API Reference + The full API Reference is available here. * [Complete API Reference](https://min.io/docs/minio/linux/developers/go/API.html) ### API Reference : Bucket Operations + * [`MakeBucket`](https://min.io/docs/minio/linux/developers/go/API.html#MakeBucket) * [`ListBuckets`](https://min.io/docs/minio/linux/developers/go/API.html#ListBuckets) * [`BucketExists`](https://min.io/docs/minio/linux/developers/go/API.html#BucketExists) @@ -137,10 +184,12 @@ The full API Reference is available here. * [`ListIncompleteUploads`](https://min.io/docs/minio/linux/developers/go/API.html#ListIncompleteUploads) ### API Reference : Bucket policy Operations + * [`SetBucketPolicy`](https://min.io/docs/minio/linux/developers/go/API.html#SetBucketPolicy) * [`GetBucketPolicy`](https://min.io/docs/minio/linux/developers/go/API.html#GetBucketPolicy) ### API Reference : Bucket notification Operations + * [`SetBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#SetBucketNotification) * [`GetBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#GetBucketNotification) * [`RemoveAllBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveAllBucketNotification) @@ -148,10 +197,12 @@ The full API Reference is available here. * [`ListenNotification`](https://min.io/docs/minio/linux/developers/go/API.html#ListenNotification) (MinIO Extension) ### API Reference : File Object Operations + * [`FPutObject`](https://min.io/docs/minio/linux/developers/go/API.html#FPutObject) * [`FGetObject`](https://min.io/docs/minio/linux/developers/go/API.html#FGetObject) ### API Reference : Object Operations + * [`GetObject`](https://min.io/docs/minio/linux/developers/go/API.html#GetObject) * [`PutObject`](https://min.io/docs/minio/linux/developers/go/API.html#PutObject) * [`PutObjectStreaming`](https://min.io/docs/minio/linux/developers/go/API.html#PutObjectStreaming) @@ -162,14 +213,15 @@ The full API Reference is available here. * [`RemoveIncompleteUpload`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveIncompleteUpload) * [`SelectObjectContent`](https://min.io/docs/minio/linux/developers/go/API.html#SelectObjectContent) - ### API Reference : Presigned Operations + * [`PresignedGetObject`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedGetObject) * [`PresignedPutObject`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedPutObject) * [`PresignedHeadObject`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedHeadObject) * [`PresignedPostPolicy`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedPostPolicy) ### API Reference : Client custom settings + * [`SetAppInfo`](https://min.io/docs/minio/linux/developers/go/API.html#SetAppInfo) * [`TraceOn`](https://min.io/docs/minio/linux/developers/go/API.html#TraceOn) * [`TraceOff`](https://min.io/docs/minio/linux/developers/go/API.html#TraceOff) @@ -177,6 +229,7 @@ The full API Reference is available here. ## Full Examples ### Full Examples : Bucket Operations + * [makebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/makebucket.go) * [listbuckets.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbuckets.go) * [bucketexists.go](https://github.com/minio/minio-go/blob/master/examples/s3/bucketexists.go) @@ -186,25 +239,30 @@ The full API Reference is available here. * [listincompleteuploads.go](https://github.com/minio/minio-go/blob/master/examples/s3/listincompleteuploads.go) ### Full Examples : Bucket policy Operations + * [setbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketpolicy.go) * [getbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketpolicy.go) * [listbucketpolicies.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbucketpolicies.go) ### Full Examples : Bucket lifecycle Operations + * [setbucketlifecycle.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketlifecycle.go) * [getbucketlifecycle.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketlifecycle.go) ### Full Examples : Bucket encryption Operations + * [setbucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketencryption.go) * [getbucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketencryption.go) * [deletebucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/deletebucketencryption.go) ### Full Examples : Bucket replication Operations + * [setbucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketreplication.go) * [getbucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketreplication.go) * [removebucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucketreplication.go) ### Full Examples : Bucket notification Operations + * [setbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketnotification.go) * [getbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketnotification.go) * [removeallbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeallbucketnotification.go) @@ -212,10 +270,12 @@ The full API Reference is available here. * [listennotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listen-notification.go) (MinIO Extension) ### Full Examples : File Object Operations + * [fputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject.go) * [fgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject.go) ### Full Examples : Object Operations + * [putobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject.go) * [getobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject.go) * [statobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/statobject.go) @@ -225,22 +285,28 @@ The full API Reference is available here. * [removeobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobjects.go) ### Full Examples : Encrypted Object Operations + * [put-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/put-encrypted-object.go) * [get-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/get-encrypted-object.go) * [fput-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputencrypted-object.go) ### Full Examples : Presigned Operations + * [presignedgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedgetobject.go) * [presignedputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedputobject.go) * [presignedheadobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedheadobject.go) * [presignedpostpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedpostpolicy.go) ## Explore Further + +* [Godoc Documentation](https://pkg.go.dev/github.com/minio/minio-go/v7) * [Complete Documentation](https://min.io/docs/minio/kubernetes/upstream/index.html) * [MinIO Go Client SDK API Reference](https://min.io/docs/minio/linux/developers/go/API.html) ## Contribute + [Contributors Guide](https://github.com/minio/minio-go/blob/master/CONTRIBUTING.md) ## License + This SDK is distributed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0), see [LICENSE](https://github.com/minio/minio-go/blob/master/LICENSE) and [NOTICE](https://github.com/minio/minio-go/blob/master/NOTICE) for more information. diff --git a/vendor/github.com/minio/minio-go/v7/api-get-object.go b/vendor/github.com/minio/minio-go/v7/api-get-object.go index e31e4cf9..9e6b1543 100644 --- a/vendor/github.com/minio/minio-go/v7/api-get-object.go +++ b/vendor/github.com/minio/minio-go/v7/api-get-object.go @@ -550,6 +550,8 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { } } + newOffset := o.currOffset + // Switch through whence. switch whence { default: @@ -558,12 +560,12 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { if o.objectInfo.Size > -1 && offset > o.objectInfo.Size { return 0, io.EOF } - o.currOffset = offset + newOffset = offset case 1: if o.objectInfo.Size > -1 && o.currOffset+offset > o.objectInfo.Size { return 0, io.EOF } - o.currOffset += offset + newOffset += offset case 2: // If we don't know the object size return an error for io.SeekEnd if o.objectInfo.Size < 0 { @@ -579,7 +581,7 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { if o.objectInfo.Size+offset < 0 { return 0, errInvalidArgument(fmt.Sprintf("Seeking at negative offset not allowed for %d", whence)) } - o.currOffset = o.objectInfo.Size + offset + newOffset = o.objectInfo.Size + offset } // Reset the saved error since we successfully seeked, let the Read // and ReadAt decide. @@ -587,8 +589,9 @@ func (o *Object) Seek(offset int64, whence int) (n int64, err error) { o.prevErr = nil } - // Ask lower level to fetch again from source - o.seekData = true + // Ask lower level to fetch again from source when necessary + o.seekData = (newOffset != o.currOffset) || o.seekData + o.currOffset = newOffset // Return the effective offset. return o.currOffset, nil diff --git a/vendor/github.com/minio/minio-go/v7/api-get-options.go b/vendor/github.com/minio/minio-go/v7/api-get-options.go index bb86a599..a0216e20 100644 --- a/vendor/github.com/minio/minio-go/v7/api-get-options.go +++ b/vendor/github.com/minio/minio-go/v7/api-get-options.go @@ -87,10 +87,10 @@ func (o *GetObjectOptions) Set(key, value string) { } // SetReqParam - set request query string parameter -// supported key: see supportedQueryValues. +// supported key: see supportedQueryValues and allowedCustomQueryPrefix. // If an unsupported key is passed in, it will be ignored and nothing will be done. func (o *GetObjectOptions) SetReqParam(key, value string) { - if !isStandardQueryValue(key) { + if !isCustomQueryValue(key) && !isStandardQueryValue(key) { // do nothing return } @@ -101,10 +101,10 @@ func (o *GetObjectOptions) SetReqParam(key, value string) { } // AddReqParam - add request query string parameter -// supported key: see supportedQueryValues. +// supported key: see supportedQueryValues and allowedCustomQueryPrefix. // If an unsupported key is passed in, it will be ignored and nothing will be done. func (o *GetObjectOptions) AddReqParam(key, value string) { - if !isStandardQueryValue(key) { + if !isCustomQueryValue(key) && !isStandardQueryValue(key) { // do nothing return } diff --git a/vendor/github.com/minio/minio-go/v7/api-object-tagging.go b/vendor/github.com/minio/minio-go/v7/api-object-tagging.go index 305c36de..6623e262 100644 --- a/vendor/github.com/minio/minio-go/v7/api-object-tagging.go +++ b/vendor/github.com/minio/minio-go/v7/api-object-tagging.go @@ -32,6 +32,12 @@ import ( // to update tag(s) of a specific object version type PutObjectTaggingOptions struct { VersionID string + Internal AdvancedObjectTaggingOptions +} + +// AdvancedObjectTaggingOptions for internal use by MinIO server - not intended for client use. +type AdvancedObjectTaggingOptions struct { + ReplicationProxyRequest string } // PutObjectTagging replaces or creates object tag(s) and can target @@ -50,7 +56,10 @@ func (c *Client) PutObjectTagging(ctx context.Context, bucketName, objectName st if opts.VersionID != "" { urlValues.Set("versionId", opts.VersionID) } - + headers := make(http.Header, 0) + if opts.Internal.ReplicationProxyRequest != "" { + headers.Set(minIOBucketReplicationProxyRequest, opts.Internal.ReplicationProxyRequest) + } reqBytes, err := xml.Marshal(otags) if err != nil { return err @@ -63,6 +72,7 @@ func (c *Client) PutObjectTagging(ctx context.Context, bucketName, objectName st contentBody: bytes.NewReader(reqBytes), contentLength: int64(len(reqBytes)), contentMD5Base64: sumMD5Base64(reqBytes), + customHeader: headers, } // Execute PUT to set a object tagging. @@ -83,6 +93,7 @@ func (c *Client) PutObjectTagging(ctx context.Context, bucketName, objectName st // to fetch the tagging key/value pairs type GetObjectTaggingOptions struct { VersionID string + Internal AdvancedObjectTaggingOptions } // GetObjectTagging fetches object tag(s) with options to target @@ -96,12 +107,16 @@ func (c *Client) GetObjectTagging(ctx context.Context, bucketName, objectName st if opts.VersionID != "" { urlValues.Set("versionId", opts.VersionID) } - + headers := make(http.Header, 0) + if opts.Internal.ReplicationProxyRequest != "" { + headers.Set(minIOBucketReplicationProxyRequest, opts.Internal.ReplicationProxyRequest) + } // Execute GET on object to get object tag(s) resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + customHeader: headers, }) defer closeResponse(resp) @@ -121,6 +136,7 @@ func (c *Client) GetObjectTagging(ctx context.Context, bucketName, objectName st // RemoveObjectTaggingOptions holds the version id of the object to remove type RemoveObjectTaggingOptions struct { VersionID string + Internal AdvancedObjectTaggingOptions } // RemoveObjectTagging removes object tag(s) with options to control a specific object @@ -134,12 +150,16 @@ func (c *Client) RemoveObjectTagging(ctx context.Context, bucketName, objectName if opts.VersionID != "" { urlValues.Set("versionId", opts.VersionID) } - + headers := make(http.Header, 0) + if opts.Internal.ReplicationProxyRequest != "" { + headers.Set(minIOBucketReplicationProxyRequest, opts.Internal.ReplicationProxyRequest) + } // Execute DELETE on object to remove object tag(s) resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ - bucketName: bucketName, - objectName: objectName, - queryValues: urlValues, + bucketName: bucketName, + objectName: objectName, + queryValues: urlValues, + customHeader: headers, }) defer closeResponse(resp) diff --git a/vendor/github.com/minio/minio-go/v7/api-put-object.go b/vendor/github.com/minio/minio-go/v7/api-put-object.go index 2c4de4f9..bbd8924e 100644 --- a/vendor/github.com/minio/minio-go/v7/api-put-object.go +++ b/vendor/github.com/minio/minio-go/v7/api-put-object.go @@ -77,6 +77,7 @@ type PutObjectOptions struct { ContentDisposition string ContentLanguage string CacheControl string + Expires time.Time Mode RetentionMode RetainUntilDate time.Time ServerSideEncryption encrypt.ServerSide @@ -153,6 +154,10 @@ func (opts PutObjectOptions) Header() (header http.Header) { header.Set("Cache-Control", opts.CacheControl) } + if !opts.Expires.IsZero() { + header.Set("Expires", opts.Expires.UTC().Format(http.TimeFormat)) + } + if opts.Mode != "" { header.Set(amzLockMode, opts.Mode.String()) } diff --git a/vendor/github.com/minio/minio-go/v7/api-putobject-snowball.go b/vendor/github.com/minio/minio-go/v7/api-putobject-snowball.go index 983ed674..eb4da414 100644 --- a/vendor/github.com/minio/minio-go/v7/api-putobject-snowball.go +++ b/vendor/github.com/minio/minio-go/v7/api-putobject-snowball.go @@ -24,6 +24,7 @@ import ( "context" "fmt" "io" + "net/http" "os" "strings" "sync" @@ -70,6 +71,14 @@ type SnowballObject struct { // Exactly 'Size' number of bytes must be provided. Content io.Reader + // VersionID of the object; if empty, a new versionID will be generated + VersionID string + + // Headers contains more options for this object upload, the same as you + // would include in a regular PutObject operation, such as user metadata + // and content-disposition, expires, .. + Headers http.Header + // Close will be called when an object has finished processing. // Note that if PutObjectsSnowball returns because of an error, // objects not consumed from the input will NOT have been closed. @@ -181,6 +190,14 @@ objectLoop: header.ModTime = time.Now().UTC() } + header.PAXRecords = make(map[string]string) + if obj.VersionID != "" { + header.PAXRecords["minio.versionId"] = obj.VersionID + } + for k, vals := range obj.Headers { + header.PAXRecords["minio.metadata."+k] = strings.Join(vals, ",") + } + if err := t.WriteHeader(&header); err != nil { closeObj() return err diff --git a/vendor/github.com/minio/minio-go/v7/api.go b/vendor/github.com/minio/minio-go/v7/api.go index e8e324a9..f8a9b34c 100644 --- a/vendor/github.com/minio/minio-go/v7/api.go +++ b/vendor/github.com/minio/minio-go/v7/api.go @@ -127,7 +127,7 @@ type Options struct { // Global constants. const ( libraryName = "minio-go" - libraryVersion = "v7.0.63" + libraryVersion = "v7.0.66" ) // User Agent should always following the below style. diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go index 1c73d100..800c4a29 100644 --- a/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/assume_role.go @@ -93,7 +93,8 @@ type STSAssumeRoleOptions struct { AccessKey string SecretKey string - Policy string // Optional to assign a policy to the assumed role + SessionToken string // Optional if the first request is made with temporary credentials. + Policy string // Optional to assign a policy to the assumed role Location string // Optional commonly needed with AWS STS. DurationSeconds int // Optional defaults to 1 hour. @@ -101,6 +102,7 @@ type STSAssumeRoleOptions struct { // Optional only valid if using with AWS STS RoleARN string RoleSessionName string + ExternalID string } // NewSTSAssumeRole returns a pointer to a new @@ -161,6 +163,9 @@ func getAssumeRoleCredentials(clnt *http.Client, endpoint string, opts STSAssume if opts.Policy != "" { v.Set("Policy", opts.Policy) } + if opts.ExternalID != "" { + v.Set("ExternalId", opts.ExternalID) + } u, err := url.Parse(endpoint) if err != nil { @@ -181,6 +186,9 @@ func getAssumeRoleCredentials(clnt *http.Client, endpoint string, opts STSAssume } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("X-Amz-Content-Sha256", hex.EncodeToString(hash.Sum(nil))) + if opts.SessionToken != "" { + req.Header.Set("X-Amz-Security-Token", opts.SessionToken) + } req = signer.SignV4STS(*req, opts.AccessKey, opts.SecretKey, opts.Location) resp, err := clnt.Do(req) diff --git a/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go b/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go index 0c9536de..c5153c4c 100644 --- a/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/credentials/iam_aws.go @@ -54,19 +54,36 @@ type IAM struct { // Custom endpoint to fetch IAM role credentials. Endpoint string + + // Region configurable custom region for STS + Region string + + // Support for container authorization token https://docs.aws.amazon.com/sdkref/latest/guide/feature-container-credentials.html + Container struct { + AuthorizationToken string + CredentialsFullURI string + CredentialsRelativeURI string + } + + // EKS based k8s RBAC authorization - https://docs.aws.amazon.com/eks/latest/userguide/pod-configuration.html + EKSIdentity struct { + TokenFile string + RoleARN string + RoleSessionName string + } } // IAM Roles for Amazon EC2 // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html const ( - defaultIAMRoleEndpoint = "http://169.254.169.254" - defaultECSRoleEndpoint = "http://169.254.170.2" - defaultSTSRoleEndpoint = "https://sts.amazonaws.com" - defaultIAMSecurityCredsPath = "/latest/meta-data/iam/security-credentials/" - tokenRequestTTLHeader = "X-aws-ec2-metadata-token-ttl-seconds" - tokenPath = "/latest/api/token" - tokenTTL = "21600" - tokenRequestHeader = "X-aws-ec2-metadata-token" + DefaultIAMRoleEndpoint = "http://169.254.169.254" + DefaultECSRoleEndpoint = "http://169.254.170.2" + DefaultSTSRoleEndpoint = "https://sts.amazonaws.com" + DefaultIAMSecurityCredsPath = "/latest/meta-data/iam/security-credentials/" + TokenRequestTTLHeader = "X-aws-ec2-metadata-token-ttl-seconds" + TokenPath = "/latest/api/token" + TokenTTL = "21600" + TokenRequestHeader = "X-aws-ec2-metadata-token" ) // NewIAM returns a pointer to a new Credentials object wrapping the IAM. @@ -84,21 +101,55 @@ func NewIAM(endpoint string) *Credentials { // the desired func (m *IAM) Retrieve() (Value, error) { token := os.Getenv("AWS_CONTAINER_AUTHORIZATION_TOKEN") + if token == "" { + token = m.Container.AuthorizationToken + } + + relativeURI := os.Getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") + if relativeURI == "" { + relativeURI = m.Container.CredentialsRelativeURI + } + + fullURI := os.Getenv("AWS_CONTAINER_CREDENTIALS_FULL_URI") + if fullURI == "" { + fullURI = m.Container.CredentialsFullURI + } + + identityFile := os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE") + if identityFile == "" { + identityFile = m.EKSIdentity.TokenFile + } + + roleArn := os.Getenv("AWS_ROLE_ARN") + if roleArn == "" { + roleArn = m.EKSIdentity.RoleARN + } + + roleSessionName := os.Getenv("AWS_ROLE_SESSION_NAME") + if roleSessionName == "" { + roleSessionName = m.EKSIdentity.RoleSessionName + } + + region := os.Getenv("AWS_REGION") + if region == "" { + region = m.Region + } + var roleCreds ec2RoleCredRespBody var err error endpoint := m.Endpoint switch { - case len(os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")) > 0: + case identityFile != "": if len(endpoint) == 0 { - if len(os.Getenv("AWS_REGION")) > 0 { - if strings.HasPrefix(os.Getenv("AWS_REGION"), "cn-") { - endpoint = "https://sts." + os.Getenv("AWS_REGION") + ".amazonaws.com.cn" + if region != "" { + if strings.HasPrefix(region, "cn-") { + endpoint = "https://sts." + region + ".amazonaws.com.cn" } else { - endpoint = "https://sts." + os.Getenv("AWS_REGION") + ".amazonaws.com" + endpoint = "https://sts." + region + ".amazonaws.com" } } else { - endpoint = defaultSTSRoleEndpoint + endpoint = DefaultSTSRoleEndpoint } } @@ -106,15 +157,15 @@ func (m *IAM) Retrieve() (Value, error) { Client: m.Client, STSEndpoint: endpoint, GetWebIDTokenExpiry: func() (*WebIdentityToken, error) { - token, err := os.ReadFile(os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE")) + token, err := os.ReadFile(identityFile) if err != nil { return nil, err } return &WebIdentityToken{Token: string(token)}, nil }, - RoleARN: os.Getenv("AWS_ROLE_ARN"), - roleSessionName: os.Getenv("AWS_ROLE_SESSION_NAME"), + RoleARN: roleArn, + roleSessionName: roleSessionName, } stsWebIdentityCreds, err := creds.Retrieve() @@ -123,17 +174,16 @@ func (m *IAM) Retrieve() (Value, error) { } return stsWebIdentityCreds, err - case len(os.Getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI")) > 0: + case relativeURI != "": if len(endpoint) == 0 { - endpoint = fmt.Sprintf("%s%s", defaultECSRoleEndpoint, - os.Getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI")) + endpoint = fmt.Sprintf("%s%s", DefaultECSRoleEndpoint, relativeURI) } roleCreds, err = getEcsTaskCredentials(m.Client, endpoint, token) - case len(os.Getenv("AWS_CONTAINER_CREDENTIALS_FULL_URI")) > 0: + case fullURI != "": if len(endpoint) == 0 { - endpoint = os.Getenv("AWS_CONTAINER_CREDENTIALS_FULL_URI") + endpoint = fullURI var ok bool if ok, err = isLoopback(endpoint); !ok { if err == nil { @@ -189,7 +239,7 @@ func getIAMRoleURL(endpoint string) (*url.URL, error) { if err != nil { return nil, err } - u.Path = defaultIAMSecurityCredsPath + u.Path = DefaultIAMSecurityCredsPath return u, nil } @@ -203,7 +253,7 @@ func listRoleNames(client *http.Client, u *url.URL, token string) ([]string, err return nil, err } if token != "" { - req.Header.Add(tokenRequestHeader, token) + req.Header.Add(TokenRequestHeader, token) } resp, err := client.Do(req) if err != nil { @@ -258,11 +308,11 @@ func fetchIMDSToken(client *http.Client, endpoint string) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - req, err := http.NewRequestWithContext(ctx, http.MethodPut, endpoint+tokenPath, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodPut, endpoint+TokenPath, nil) if err != nil { return "", err } - req.Header.Add(tokenRequestTTLHeader, tokenTTL) + req.Header.Add(TokenRequestTTLHeader, TokenTTL) resp, err := client.Do(req) if err != nil { return "", err @@ -285,7 +335,7 @@ func fetchIMDSToken(client *http.Client, endpoint string) (string, error) { // reading the response an error will be returned. func getCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, error) { if endpoint == "" { - endpoint = defaultIAMRoleEndpoint + endpoint = DefaultIAMRoleEndpoint } // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html @@ -332,7 +382,7 @@ func getCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, return ec2RoleCredRespBody{}, err } if token != "" { - req.Header.Add(tokenRequestHeader, token) + req.Header.Add(TokenRequestHeader, token) } resp, err := client.Do(req) diff --git a/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go b/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go index 830061b8..c52f78c3 100644 --- a/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/lifecycle/lifecycle.go @@ -211,35 +211,43 @@ func (t Transition) MarshalXML(en *xml.Encoder, startElement xml.StartElement) e // And And Rule for LifecycleTag, to be used in LifecycleRuleFilter type And struct { - XMLName xml.Name `xml:"And" json:"-"` - Prefix string `xml:"Prefix" json:"Prefix,omitempty"` - Tags []Tag `xml:"Tag" json:"Tags,omitempty"` + XMLName xml.Name `xml:"And" json:"-"` + Prefix string `xml:"Prefix" json:"Prefix,omitempty"` + Tags []Tag `xml:"Tag" json:"Tags,omitempty"` + ObjectSizeLessThan int64 `xml:"ObjectSizeLessThan,omitempty" json:"ObjectSizeLessThan,omitempty"` + ObjectSizeGreaterThan int64 `xml:"ObjectSizeGreaterThan,omitempty" json:"ObjectSizeGreaterThan,omitempty"` } // IsEmpty returns true if Tags field is null func (a And) IsEmpty() bool { - return len(a.Tags) == 0 && a.Prefix == "" + return len(a.Tags) == 0 && a.Prefix == "" && + a.ObjectSizeLessThan == 0 && a.ObjectSizeGreaterThan == 0 } // Filter will be used in selecting rule(s) for lifecycle configuration type Filter struct { - XMLName xml.Name `xml:"Filter" json:"-"` - And And `xml:"And,omitempty" json:"And,omitempty"` - Prefix string `xml:"Prefix,omitempty" json:"Prefix,omitempty"` - Tag Tag `xml:"Tag,omitempty" json:"Tag,omitempty"` + XMLName xml.Name `xml:"Filter" json:"-"` + And And `xml:"And,omitempty" json:"And,omitempty"` + Prefix string `xml:"Prefix,omitempty" json:"Prefix,omitempty"` + Tag Tag `xml:"Tag,omitempty" json:"Tag,omitempty"` + ObjectSizeLessThan int64 `xml:"ObjectSizeLessThan,omitempty" json:"ObjectSizeLessThan,omitempty"` + ObjectSizeGreaterThan int64 `xml:"ObjectSizeGreaterThan,omitempty" json:"ObjectSizeGreaterThan,omitempty"` } // IsNull returns true if all Filter fields are empty. func (f Filter) IsNull() bool { - return f.Tag.IsEmpty() && f.And.IsEmpty() && f.Prefix == "" + return f.Tag.IsEmpty() && f.And.IsEmpty() && f.Prefix == "" && + f.ObjectSizeLessThan == 0 && f.ObjectSizeGreaterThan == 0 } // MarshalJSON customizes json encoding by removing empty values. func (f Filter) MarshalJSON() ([]byte, error) { type filter struct { - And *And `json:"And,omitempty"` - Prefix string `json:"Prefix,omitempty"` - Tag *Tag `json:"Tag,omitempty"` + And *And `json:"And,omitempty"` + Prefix string `json:"Prefix,omitempty"` + Tag *Tag `json:"Tag,omitempty"` + ObjectSizeLessThan int64 `json:"ObjectSizeLessThan,omitempty"` + ObjectSizeGreaterThan int64 `json:"ObjectSizeGreaterThan,omitempty"` } newf := filter{ @@ -251,6 +259,8 @@ func (f Filter) MarshalJSON() ([]byte, error) { if !f.And.IsEmpty() { newf.And = &f.And } + newf.ObjectSizeLessThan = f.ObjectSizeLessThan + newf.ObjectSizeGreaterThan = f.ObjectSizeGreaterThan return json.Marshal(newf) } @@ -271,7 +281,19 @@ func (f Filter) MarshalXML(e *xml.Encoder, start xml.StartElement) error { return err } default: - // Always print Prefix field when both And & Tag are empty + if f.ObjectSizeLessThan > 0 { + if err := e.EncodeElement(f.ObjectSizeLessThan, xml.StartElement{Name: xml.Name{Local: "ObjectSizeLessThan"}}); err != nil { + return err + } + break + } + if f.ObjectSizeGreaterThan > 0 { + if err := e.EncodeElement(f.ObjectSizeGreaterThan, xml.StartElement{Name: xml.Name{Local: "ObjectSizeGreaterThan"}}); err != nil { + return err + } + break + } + // Print empty Prefix field only when everything else is empty if err := e.EncodeElement(f.Prefix, xml.StartElement{Name: xml.Name{Local: "Prefix"}}); err != nil { return err } diff --git a/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go b/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go index 01cc26fc..a44799d2 100644 --- a/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go +++ b/vendor/github.com/minio/minio-go/v7/pkg/notification/notification.go @@ -37,9 +37,15 @@ const ( ObjectCreatedPut EventType = "s3:ObjectCreated:Put" ObjectCreatedPost EventType = "s3:ObjectCreated:Post" ObjectCreatedCopy EventType = "s3:ObjectCreated:Copy" + ObjectCreatedDeleteTagging EventType = "s3:ObjectCreated:DeleteTagging" ObjectCreatedCompleteMultipartUpload EventType = "s3:ObjectCreated:CompleteMultipartUpload" + ObjectCreatedPutLegalHold EventType = "s3:ObjectCreated:PutLegalHold" + ObjectCreatedPutRetention EventType = "s3:ObjectCreated:PutRetention" + ObjectCreatedPutTagging EventType = "s3:ObjectCreated:PutTagging" ObjectAccessedGet EventType = "s3:ObjectAccessed:Get" ObjectAccessedHead EventType = "s3:ObjectAccessed:Head" + ObjectAccessedGetRetention EventType = "s3:ObjectAccessed:GetRetention" + ObjectAccessedGetLegalHold EventType = "s3:ObjectAccessed:GetLegalHold" ObjectAccessedAll EventType = "s3:ObjectAccessed:*" ObjectRemovedAll EventType = "s3:ObjectRemoved:*" ObjectRemovedDelete EventType = "s3:ObjectRemoved:Delete" @@ -56,6 +62,9 @@ const ( ObjectReplicationOperationMissedThreshold EventType = "s3:Replication:OperationMissedThreshold" ObjectReplicationOperationNotTracked EventType = "s3:Replication:OperationNotTracked" ObjectReplicationOperationReplicatedAfterThreshold EventType = "s3:Replication:OperationReplicatedAfterThreshold" + ObjectScannerManyVersions EventType = "s3:Scanner:ManyVersions" + ObjectScannerBigPrefix EventType = "s3:Scanner:BigPrefix" + ObjectScannerAll EventType = "s3:Scanner:*" BucketCreatedAll EventType = "s3:BucketCreated:*" BucketRemovedAll EventType = "s3:BucketRemoved:*" ) diff --git a/vendor/github.com/minio/minio-go/v7/s3-endpoints.go b/vendor/github.com/minio/minio-go/v7/s3-endpoints.go index 0a26edd5..b1de7b62 100644 --- a/vendor/github.com/minio/minio-go/v7/s3-endpoints.go +++ b/vendor/github.com/minio/minio-go/v7/s3-endpoints.go @@ -50,6 +50,7 @@ var awsS3EndpointMap = map[string]string{ "cn-northwest-1": "s3.dualstack.cn-northwest-1.amazonaws.com.cn", "ap-southeast-3": "s3.dualstack.ap-southeast-3.amazonaws.com", "ap-southeast-4": "s3.dualstack.ap-southeast-4.amazonaws.com", + "il-central-1": "s3.dualstack.il-central-1.amazonaws.com", } // getS3Endpoint get Amazon S3 endpoint based on the bucket location. diff --git a/vendor/github.com/minio/minio-go/v7/utils.go b/vendor/github.com/minio/minio-go/v7/utils.go index 6a93561e..e39eba02 100644 --- a/vendor/github.com/minio/minio-go/v7/utils.go +++ b/vendor/github.com/minio/minio-go/v7/utils.go @@ -528,6 +528,14 @@ func isStandardQueryValue(qsKey string) bool { return supportedQueryValues[qsKey] } +// Per documentation at https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html#LogFormatCustom, the +// set of query params starting with "x-" are ignored by S3. +const allowedCustomQueryPrefix = "x-" + +func isCustomQueryValue(qsKey string) bool { + return strings.HasPrefix(qsKey, allowedCustomQueryPrefix) +} + var ( md5Pool = sync.Pool{New: func() interface{} { return md5.New() }} sha256Pool = sync.Pool{New: func() interface{} { return sha256.New() }} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go index 62de4dc5..4ce84e7a 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -20,6 +20,7 @@ import ( "time" dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/types/known/timestamppb" ) // Counter is a Metric that represents a single numerical value that only ever @@ -66,7 +67,7 @@ type CounterVecOpts struct { CounterOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -90,8 +91,12 @@ func NewCounter(opts CounterOpts) Counter { nil, opts.ConstLabels, ) - result := &counter{desc: desc, labelPairs: desc.constLabelPairs, now: time.Now} + if opts.now == nil { + opts.now = time.Now + } + result := &counter{desc: desc, labelPairs: desc.constLabelPairs, now: opts.now} result.init(result) // Init self-collection. + result.createdTs = timestamppb.New(opts.now()) return result } @@ -106,10 +111,12 @@ type counter struct { selfCollector desc *Desc + createdTs *timestamppb.Timestamp labelPairs []*dto.LabelPair exemplar atomic.Value // Containing nil or a *dto.Exemplar. - now func() time.Time // To mock out time.Now() for testing. + // now is for testing purposes, by default it's time.Now. + now func() time.Time } func (c *counter) Desc() *Desc { @@ -159,8 +166,7 @@ func (c *counter) Write(out *dto.Metric) error { exemplar = e.(*dto.Exemplar) } val := c.get() - - return populateMetric(CounterValue, val, c.labelPairs, exemplar, out) + return populateMetric(CounterValue, val, c.labelPairs, exemplar, out, c.createdTs) } func (c *counter) updateExemplar(v float64, l Labels) { @@ -200,13 +206,17 @@ func (v2) NewCounterVec(opts CounterVecOpts) *CounterVec { opts.VariableLabels, opts.ConstLabels, ) + if opts.now == nil { + opts.now = time.Now + } return &CounterVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) + if len(lvs) != len(desc.variableLabels.names) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, lvs)) } - result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: time.Now} + result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: opts.now} result.init(result) // Init self-collection. + result.createdTs = timestamppb.New(opts.now()) return result }), } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go index deedc2df..68ffe3c2 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -52,7 +52,7 @@ type Desc struct { constLabelPairs []*dto.LabelPair // variableLabels contains names of labels and normalization function for // which the metric maintains variable values. - variableLabels ConstrainedLabels + variableLabels *compiledLabels // id is a hash of the values of the ConstLabels and fqName. This // must be unique among all registered descriptors and can therefore be // used as an identifier of the descriptor. @@ -93,7 +93,7 @@ func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, const d := &Desc{ fqName: fqName, help: help, - variableLabels: variableLabels.constrainedLabels(), + variableLabels: variableLabels.compile(), } if !model.IsValidMetricName(model.LabelValue(fqName)) { d.err = fmt.Errorf("%q is not a valid metric name", fqName) @@ -103,7 +103,7 @@ func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, const // their sorted label names) plus the fqName (at position 0). labelValues := make([]string, 1, len(constLabels)+1) labelValues[0] = fqName - labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels)) + labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels.names)) labelNameSet := map[string]struct{}{} // First add only the const label names and sort them... for labelName := range constLabels { @@ -128,13 +128,13 @@ func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, const // Now add the variable label names, but prefix them with something that // cannot be in a regular label name. That prevents matching the label // dimension with a different mix between preset and variable labels. - for _, label := range d.variableLabels { - if !checkLabelName(label.Name) { - d.err = fmt.Errorf("%q is not a valid label name for metric %q", label.Name, fqName) + for _, label := range d.variableLabels.names { + if !checkLabelName(label) { + d.err = fmt.Errorf("%q is not a valid label name for metric %q", label, fqName) return d } - labelNames = append(labelNames, "$"+label.Name) - labelNameSet[label.Name] = struct{}{} + labelNames = append(labelNames, "$"+label) + labelNameSet[label] = struct{}{} } if len(labelNames) != len(labelNameSet) { d.err = fmt.Errorf("duplicate label names in constant and variable labels for metric %q", fqName) @@ -189,11 +189,19 @@ func (d *Desc) String() string { fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), ) } + vlStrings := make([]string, 0, len(d.variableLabels.names)) + for _, vl := range d.variableLabels.names { + if fn, ok := d.variableLabels.labelConstraints[vl]; ok && fn != nil { + vlStrings = append(vlStrings, fmt.Sprintf("c(%s)", vl)) + } else { + vlStrings = append(vlStrings, vl) + } + } return fmt.Sprintf( - "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: {%s}}", d.fqName, d.help, strings.Join(lpStrings, ","), - d.variableLabels, + strings.Join(vlStrings, ","), ) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go index c41ab37f..de5a8562 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -48,7 +48,7 @@ func (e *expvarCollector) Collect(ch chan<- Metric) { continue } var v interface{} - labels := make([]string, len(desc.variableLabels)) + labels := make([]string, len(desc.variableLabels.names)) if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { ch <- NewInvalidMetric(desc, err) continue diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go index f1ea6c76..dd2eac94 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -62,7 +62,7 @@ type GaugeVecOpts struct { GaugeOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -135,7 +135,7 @@ func (g *gauge) Sub(val float64) { func (g *gauge) Write(out *dto.Metric) error { val := math.Float64frombits(atomic.LoadUint64(&g.valBits)) - return populateMetric(GaugeValue, val, g.labelPairs, nil, out) + return populateMetric(GaugeValue, val, g.labelPairs, nil, out, nil) } // GaugeVec is a Collector that bundles a set of Gauges that all share the same @@ -166,8 +166,8 @@ func (v2) NewGaugeVec(opts GaugeVecOpts) *GaugeVec { ) return &GaugeVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) + if len(lvs) != len(desc.variableLabels.names) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, lvs)) } result := &gauge{desc: desc, labelPairs: MakeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index 8d818afe..b5c8bcb3 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -25,6 +25,7 @@ import ( dto "github.com/prometheus/client_model/go" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" ) // nativeHistogramBounds for the frac of observed values. Only relevant for @@ -391,7 +392,7 @@ type HistogramOpts struct { // zero, it is replaced by default buckets. The default buckets are // DefBuckets if no buckets for a native histogram (see below) are used, // otherwise the default is no buckets. (In other words, if you want to - // use both reguler buckets and buckets for a native histogram, you have + // use both regular buckets and buckets for a native histogram, you have // to define the regular buckets here explicitly.) Buckets []float64 @@ -413,8 +414,8 @@ type HistogramOpts struct { // and 2, same as between 2 and 4, and 4 and 8, etc.). // // Details about the actually used factor: The factor is calculated as - // 2^(2^n), where n is an integer number between (and including) -8 and - // 4. n is chosen so that the resulting factor is the largest that is + // 2^(2^-n), where n is an integer number between (and including) -4 and + // 8. n is chosen so that the resulting factor is the largest that is // still smaller or equal to NativeHistogramBucketFactor. Note that the // smallest possible factor is therefore approx. 1.00271 (i.e. 2^(2^-8) // ). If NativeHistogramBucketFactor is greater than 1 but smaller than @@ -428,12 +429,12 @@ type HistogramOpts struct { // a major version bump. NativeHistogramBucketFactor float64 // All observations with an absolute value of less or equal - // NativeHistogramZeroThreshold are accumulated into a “zero” - // bucket. For best results, this should be close to a bucket - // boundary. This is usually the case if picking a power of two. If + // NativeHistogramZeroThreshold are accumulated into a “zero” bucket. + // For best results, this should be close to a bucket boundary. This is + // usually the case if picking a power of two. If // NativeHistogramZeroThreshold is left at zero, - // DefNativeHistogramZeroThreshold is used as the threshold. To configure - // a zero bucket with an actual threshold of zero (i.e. only + // DefNativeHistogramZeroThreshold is used as the threshold. To + // configure a zero bucket with an actual threshold of zero (i.e. only // observations of precisely zero will go into the zero bucket), set // NativeHistogramZeroThreshold to the NativeHistogramZeroThresholdZero // constant (or any negative float value). @@ -446,26 +447,37 @@ type HistogramOpts struct { // Histogram are sufficiently wide-spread. In particular, this could be // used as a DoS attack vector. Where the observed values depend on // external inputs, it is highly recommended to set a - // NativeHistogramMaxBucketNumber.) Once the set + // NativeHistogramMaxBucketNumber.) Once the set // NativeHistogramMaxBucketNumber is exceeded, the following strategy is - // enacted: First, if the last reset (or the creation) of the histogram - // is at least NativeHistogramMinResetDuration ago, then the whole - // histogram is reset to its initial state (including regular - // buckets). If less time has passed, or if - // NativeHistogramMinResetDuration is zero, no reset is - // performed. Instead, the zero threshold is increased sufficiently to - // reduce the number of buckets to or below - // NativeHistogramMaxBucketNumber, but not to more than - // NativeHistogramMaxZeroThreshold. Thus, if - // NativeHistogramMaxZeroThreshold is already at or below the current - // zero threshold, nothing happens at this step. After that, if the - // number of buckets still exceeds NativeHistogramMaxBucketNumber, the - // resolution of the histogram is reduced by doubling the width of the - // sparse buckets (up to a growth factor between one bucket to the next - // of 2^(2^4) = 65536, see above). + // enacted: + // - First, if the last reset (or the creation) of the histogram is at + // least NativeHistogramMinResetDuration ago, then the whole + // histogram is reset to its initial state (including regular + // buckets). + // - If less time has passed, or if NativeHistogramMinResetDuration is + // zero, no reset is performed. Instead, the zero threshold is + // increased sufficiently to reduce the number of buckets to or below + // NativeHistogramMaxBucketNumber, but not to more than + // NativeHistogramMaxZeroThreshold. Thus, if + // NativeHistogramMaxZeroThreshold is already at or below the current + // zero threshold, nothing happens at this step. + // - After that, if the number of buckets still exceeds + // NativeHistogramMaxBucketNumber, the resolution of the histogram is + // reduced by doubling the width of the sparse buckets (up to a + // growth factor between one bucket to the next of 2^(2^4) = 65536, + // see above). + // - Any increased zero threshold or reduced resolution is reset back + // to their original values once NativeHistogramMinResetDuration has + // passed (since the last reset or the creation of the histogram). NativeHistogramMaxBucketNumber uint32 NativeHistogramMinResetDuration time.Duration NativeHistogramMaxZeroThreshold float64 + + // now is for testing purposes, by default it's time.Now. + now func() time.Time + + // afterFunc is for testing purposes, by default it's time.AfterFunc. + afterFunc func(time.Duration, func()) *time.Timer } // HistogramVecOpts bundles the options to create a HistogramVec metric. @@ -475,7 +487,7 @@ type HistogramVecOpts struct { HistogramOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -499,12 +511,12 @@ func NewHistogram(opts HistogramOpts) Histogram { } func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { - if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) + if len(desc.variableLabels.names) != len(labelValues) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, labelValues)) } - for _, n := range desc.variableLabels { - if n.Name == bucketLabel { + for _, n := range desc.variableLabels.names { + if n == bucketLabel { panic(errBucketLabelNotAllowed) } } @@ -514,6 +526,12 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr } } + if opts.now == nil { + opts.now = time.Now + } + if opts.afterFunc == nil { + opts.afterFunc = time.AfterFunc + } h := &histogram{ desc: desc, upperBounds: opts.Buckets, @@ -521,8 +539,9 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr nativeHistogramMaxBuckets: opts.NativeHistogramMaxBucketNumber, nativeHistogramMaxZeroThreshold: opts.NativeHistogramMaxZeroThreshold, nativeHistogramMinResetDuration: opts.NativeHistogramMinResetDuration, - lastResetTime: time.Now(), - now: time.Now, + lastResetTime: opts.now(), + now: opts.now, + afterFunc: opts.afterFunc, } if len(h.upperBounds) == 0 && opts.NativeHistogramBucketFactor <= 1 { h.upperBounds = DefBuckets @@ -701,9 +720,18 @@ type histogram struct { nativeHistogramMaxZeroThreshold float64 nativeHistogramMaxBuckets uint32 nativeHistogramMinResetDuration time.Duration - lastResetTime time.Time // Protected by mtx. + // lastResetTime is protected by mtx. It is also used as created timestamp. + lastResetTime time.Time + // resetScheduled is protected by mtx. It is true if a reset is + // scheduled for a later time (when nativeHistogramMinResetDuration has + // passed). + resetScheduled bool - now func() time.Time // To mock out time.Now() for testing. + // now is for testing purposes, by default it's time.Now. + now func() time.Time + + // afterFunc is for testing purposes, by default it's time.AfterFunc. + afterFunc func(time.Duration, func()) *time.Timer } func (h *histogram) Desc() *Desc { @@ -742,9 +770,10 @@ func (h *histogram) Write(out *dto.Metric) error { waitForCooldown(count, coldCounts) his := &dto.Histogram{ - Bucket: make([]*dto.Bucket, len(h.upperBounds)), - SampleCount: proto.Uint64(count), - SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + Bucket: make([]*dto.Bucket, len(h.upperBounds)), + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + CreatedTimestamp: timestamppb.New(h.lastResetTime), } out.Histogram = his out.Label = h.labelPairs @@ -782,6 +811,16 @@ func (h *histogram) Write(out *dto.Metric) error { his.ZeroCount = proto.Uint64(zeroBucket) his.NegativeSpan, his.NegativeDelta = makeBuckets(&coldCounts.nativeHistogramBucketsNegative) his.PositiveSpan, his.PositiveDelta = makeBuckets(&coldCounts.nativeHistogramBucketsPositive) + + // Add a no-op span to a histogram without observations and with + // a zero threshold of zero. Otherwise, a native histogram would + // look like a classic histogram to scrapers. + if *his.ZeroThreshold == 0 && *his.ZeroCount == 0 && len(his.PositiveSpan) == 0 && len(his.NegativeSpan) == 0 { + his.PositiveSpan = []*dto.BucketSpan{{ + Offset: proto.Int32(0), + Length: proto.Uint32(0), + }} + } } addAndResetCounts(hotCounts, coldCounts) return nil @@ -848,26 +887,39 @@ func (h *histogram) limitBuckets(counts *histogramCounts, value float64, bucket if h.maybeReset(hotCounts, coldCounts, coldIdx, value, bucket) { return } + // One of the other strategies will happen. To undo what they will do as + // soon as enough time has passed to satisfy + // h.nativeHistogramMinResetDuration, schedule a reset at the right time + // if we haven't done so already. + if h.nativeHistogramMinResetDuration > 0 && !h.resetScheduled { + h.resetScheduled = true + h.afterFunc(h.nativeHistogramMinResetDuration-h.now().Sub(h.lastResetTime), h.reset) + } + if h.maybeWidenZeroBucket(hotCounts, coldCounts) { return } h.doubleBucketWidth(hotCounts, coldCounts) } -// maybeReset resests the whole histogram if at least h.nativeHistogramMinResetDuration -// has been passed. It returns true if the histogram has been reset. The caller -// must have locked h.mtx. -func (h *histogram) maybeReset(hot, cold *histogramCounts, coldIdx uint64, value float64, bucket int) bool { +// maybeReset resets the whole histogram if at least +// h.nativeHistogramMinResetDuration has been passed. It returns true if the +// histogram has been reset. The caller must have locked h.mtx. +func (h *histogram) maybeReset( + hot, cold *histogramCounts, coldIdx uint64, value float64, bucket int, +) bool { // We are using the possibly mocked h.now() rather than // time.Since(h.lastResetTime) to enable testing. - if h.nativeHistogramMinResetDuration == 0 || h.now().Sub(h.lastResetTime) < h.nativeHistogramMinResetDuration { + if h.nativeHistogramMinResetDuration == 0 || // No reset configured. + h.resetScheduled || // Do not interefere if a reset is already scheduled. + h.now().Sub(h.lastResetTime) < h.nativeHistogramMinResetDuration { return false } // Completely reset coldCounts. h.resetCounts(cold) // Repeat the latest observation to not lose it completely. cold.observe(value, bucket, true) - // Make coldCounts the new hot counts while ressetting countAndHotIdx. + // Make coldCounts the new hot counts while resetting countAndHotIdx. n := atomic.SwapUint64(&h.countAndHotIdx, (coldIdx<<63)+1) count := n & ((1 << 63) - 1) waitForCooldown(count, hot) @@ -877,6 +929,29 @@ func (h *histogram) maybeReset(hot, cold *histogramCounts, coldIdx uint64, value return true } +// reset resets the whole histogram. It locks h.mtx itself, i.e. it has to be +// called without having locked h.mtx. +func (h *histogram) reset() { + h.mtx.Lock() + defer h.mtx.Unlock() + + n := atomic.LoadUint64(&h.countAndHotIdx) + hotIdx := n >> 63 + coldIdx := (^n) >> 63 + hot := h.counts[hotIdx] + cold := h.counts[coldIdx] + // Completely reset coldCounts. + h.resetCounts(cold) + // Make coldCounts the new hot counts while resetting countAndHotIdx. + n = atomic.SwapUint64(&h.countAndHotIdx, coldIdx<<63) + count := n & ((1 << 63) - 1) + waitForCooldown(count, hot) + // Finally, reset the formerly hot counts, too. + h.resetCounts(hot) + h.lastResetTime = h.now() + h.resetScheduled = false +} + // maybeWidenZeroBucket widens the zero bucket until it includes the existing // buckets closest to the zero bucket (which could be two, if an equidistant // negative and a positive bucket exists, but usually it's only one bucket to be @@ -1176,6 +1251,7 @@ type constHistogram struct { sum float64 buckets map[float64]uint64 labelPairs []*dto.LabelPair + createdTs *timestamppb.Timestamp } func (h *constHistogram) Desc() *Desc { @@ -1183,7 +1259,9 @@ func (h *constHistogram) Desc() *Desc { } func (h *constHistogram) Write(out *dto.Metric) error { - his := &dto.Histogram{} + his := &dto.Histogram{ + CreatedTimestamp: h.createdTs, + } buckets := make([]*dto.Bucket, 0, len(h.buckets)) @@ -1230,7 +1308,7 @@ func NewConstHistogram( if desc.err != nil { return nil, desc.err } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } return &constHistogram{ @@ -1324,7 +1402,7 @@ func makeBuckets(buckets *sync.Map) ([]*dto.BucketSpan, []int64) { // Multiple spans with only small gaps in between are probably // encoded more efficiently as one larger span with a few empty // buckets. Needs some research to find the sweet spot. For now, - // we assume that gaps of one ore two buckets should not create + // we assume that gaps of one or two buckets should not create // a new span. iDelta := int32(i - nextI) if n == 0 || iDelta > 2 { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go index fd0750f2..a595a203 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go @@ -14,7 +14,7 @@ // It provides tools to compare sequences of strings and generate textual diffs. // // Maintaining `GetUnifiedDiffString` here because original repository -// (https://github.com/pmezard/go-difflib) is no loger maintained. +// (https://github.com/pmezard/go-difflib) is no longer maintained. package internal import ( diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go index 63ff8683..c21911f2 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -32,19 +32,15 @@ import ( // create a Desc. type Labels map[string]string +// LabelConstraint normalizes label values. +type LabelConstraint func(string) string + // ConstrainedLabels represents a label name and its constrain function // to normalize label values. This type is commonly used when constructing // metric vector Collectors. type ConstrainedLabel struct { Name string - Constraint func(string) string -} - -func (cl ConstrainedLabel) Constrain(v string) string { - if cl.Constraint == nil { - return v - } - return cl.Constraint(v) + Constraint LabelConstraint } // ConstrainableLabels is an interface that allows creating of labels that can @@ -58,7 +54,7 @@ func (cl ConstrainedLabel) Constrain(v string) string { // }, // }) type ConstrainableLabels interface { - constrainedLabels() ConstrainedLabels + compile() *compiledLabels labelNames() []string } @@ -67,8 +63,20 @@ type ConstrainableLabels interface { // metric vector Collectors. type ConstrainedLabels []ConstrainedLabel -func (cls ConstrainedLabels) constrainedLabels() ConstrainedLabels { - return cls +func (cls ConstrainedLabels) compile() *compiledLabels { + compiled := &compiledLabels{ + names: make([]string, len(cls)), + labelConstraints: map[string]LabelConstraint{}, + } + + for i, label := range cls { + compiled.names[i] = label.Name + if label.Constraint != nil { + compiled.labelConstraints[label.Name] = label.Constraint + } + } + + return compiled } func (cls ConstrainedLabels) labelNames() []string { @@ -92,18 +100,36 @@ func (cls ConstrainedLabels) labelNames() []string { // } type UnconstrainedLabels []string -func (uls UnconstrainedLabels) constrainedLabels() ConstrainedLabels { - constrainedLabels := make([]ConstrainedLabel, len(uls)) - for i, l := range uls { - constrainedLabels[i] = ConstrainedLabel{Name: l} +func (uls UnconstrainedLabels) compile() *compiledLabels { + return &compiledLabels{ + names: uls, } - return constrainedLabels } func (uls UnconstrainedLabels) labelNames() []string { return uls } +type compiledLabels struct { + names []string + labelConstraints map[string]LabelConstraint +} + +func (cls *compiledLabels) compile() *compiledLabels { + return cls +} + +func (cls *compiledLabels) labelNames() []string { + return cls.names +} + +func (cls *compiledLabels) constrain(labelName, value string) string { + if fn, ok := cls.labelConstraints[labelName]; ok && fn != nil { + return fn(value) + } + return value +} + // reservedLabelPrefix is a prefix which is not legal in user-supplied // label names. const reservedLabelPrefix = "__" @@ -139,6 +165,8 @@ func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { func validateLabelValues(vals []string, expectedNumberOfValues int) error { if len(vals) != expectedNumberOfValues { + // The call below makes vals escape, copy them to avoid that. + vals := append([]string(nil), vals...) return fmt.Errorf( "%w: expected %d label values but got %d in %#v", errInconsistentCardinality, expectedNumberOfValues, diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go index 07bbc9d7..f018e572 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -92,6 +92,9 @@ type Opts struct { // machine_role metric). See also // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels + + // now is for testing purposes, by default it's time.Now. + now func() time.Time } // BuildFQName joins the given three name components by "_". Empty name diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go index c0152cdb..8c1136ce 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !windows && !js -// +build !windows,!js +//go:build !windows && !js && !wasip1 +// +build !windows,!js,!wasip1 package prometheus diff --git a/vendor/github.com/go-openapi/swag/pre_go18.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_wasip1.go similarity index 64% rename from vendor/github.com/go-openapi/swag/pre_go18.go rename to vendor/github.com/prometheus/client_golang/prometheus/process_collector_wasip1.go index 2757d9b9..d8d9a6d7 100644 --- a/vendor/github.com/go-openapi/swag/pre_go18.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_wasip1.go @@ -1,10 +1,9 @@ -// Copyright 2015 go-swagger maintainers -// +// Copyright 2023 The Prometheus 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 +// 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, @@ -12,13 +11,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !go1.8 -// +build !go1.8 +//go:build wasip1 +// +build wasip1 -package swag +package prometheus -import "net/url" - -func pathUnescape(path string) (string, error) { - return url.QueryUnescape(path) +func canCollectProcess() bool { + return false +} + +func (*processCollector) processCollect(chan<- Metric) { + // noop on this platform + return } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index 3793036a..356edb78 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -389,16 +389,13 @@ func isLabelCurried(c prometheus.Collector, label string) bool { return true } -// emptyLabels is a one-time allocation for non-partitioned metrics to avoid -// unnecessary allocations on each request. -var emptyLabels = prometheus.Labels{} - func labels(code, method bool, reqMethod string, status int, extraMethods ...string) prometheus.Labels { - if !(code || method) { - return emptyLabels - } labels := prometheus.Labels{} + if !(code || method) { + return labels + } + if code { labels["code"] = sanitizeCode(status) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go index 44da9433..5e2ced25 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -548,7 +548,7 @@ func (r *Registry) Gather() ([]*dto.MetricFamily, error) { goroutineBudget-- runtime.Gosched() } - // Once both checkedMetricChan and uncheckdMetricChan are closed + // Once both checkedMetricChan and uncheckedMetricChan are closed // and drained, the contraption above will nil out cmc and umc, // and then we can leave the collect loop here. if cmc == nil && umc == nil { @@ -963,9 +963,9 @@ func checkDescConsistency( // Is the desc consistent with the content of the metric? lpsFromDesc := make([]*dto.LabelPair, len(desc.constLabelPairs), len(dtoMetric.Label)) copy(lpsFromDesc, desc.constLabelPairs) - for _, l := range desc.variableLabels { + for _, l := range desc.variableLabels.names { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ - Name: proto.String(l.Name), + Name: proto.String(l), }) } if len(lpsFromDesc) != len(dtoMetric.Label) { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go index dd359264..14627044 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -26,6 +26,7 @@ import ( "github.com/beorn7/perks/quantile" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" ) // quantileLabel is used for the label that defines the quantile in a @@ -145,6 +146,9 @@ type SummaryOpts struct { // is the internal buffer size of the underlying package // "github.com/bmizerany/perks/quantile"). BufCap uint32 + + // now is for testing purposes, by default it's time.Now. + now func() time.Time } // SummaryVecOpts bundles the options to create a SummaryVec metric. @@ -154,7 +158,7 @@ type SummaryVecOpts struct { SummaryOpts // VariableLabels are used to partition the metric vector by the given set - // of labels. Each label value will be constrained with the optional Contraint + // of labels. Each label value will be constrained with the optional Constraint // function, if provided. VariableLabels ConstrainableLabels } @@ -188,12 +192,12 @@ func NewSummary(opts SummaryOpts) Summary { } func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { - if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) + if len(desc.variableLabels.names) != len(labelValues) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.names, labelValues)) } - for _, n := range desc.variableLabels { - if n.Name == quantileLabel { + for _, n := range desc.variableLabels.names { + if n == quantileLabel { panic(errQuantileLabelNotAllowed) } } @@ -222,6 +226,9 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { opts.BufCap = DefBufCap } + if opts.now == nil { + opts.now = time.Now + } if len(opts.Objectives) == 0 { // Use the lock-free implementation of a Summary without objectives. s := &noObjectivesSummary{ @@ -230,6 +237,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { counts: [2]*summaryCounts{{}, {}}, } s.init(s) // Init self-collection. + s.createdTs = timestamppb.New(opts.now()) return s } @@ -245,7 +253,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { coldBuf: make([]float64, 0, opts.BufCap), streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), } - s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.headStreamExpTime = opts.now().Add(s.streamDuration) s.hotBufExpTime = s.headStreamExpTime for i := uint32(0); i < opts.AgeBuckets; i++ { @@ -259,6 +267,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { sort.Float64s(s.sortedObjectives) s.init(s) // Init self-collection. + s.createdTs = timestamppb.New(opts.now()) return s } @@ -286,6 +295,8 @@ type summary struct { headStream *quantile.Stream headStreamIdx int headStreamExpTime, hotBufExpTime time.Time + + createdTs *timestamppb.Timestamp } func (s *summary) Desc() *Desc { @@ -307,7 +318,9 @@ func (s *summary) Observe(v float64) { } func (s *summary) Write(out *dto.Metric) error { - sum := &dto.Summary{} + sum := &dto.Summary{ + CreatedTimestamp: s.createdTs, + } qs := make([]*dto.Quantile, 0, len(s.objectives)) s.bufMtx.Lock() @@ -440,6 +453,8 @@ type noObjectivesSummary struct { counts [2]*summaryCounts labelPairs []*dto.LabelPair + + createdTs *timestamppb.Timestamp } func (s *noObjectivesSummary) Desc() *Desc { @@ -490,8 +505,9 @@ func (s *noObjectivesSummary) Write(out *dto.Metric) error { } sum := &dto.Summary{ - SampleCount: proto.Uint64(count), - SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + CreatedTimestamp: s.createdTs, } out.Summary = sum @@ -681,6 +697,7 @@ type constSummary struct { sum float64 quantiles map[float64]float64 labelPairs []*dto.LabelPair + createdTs *timestamppb.Timestamp } func (s *constSummary) Desc() *Desc { @@ -688,7 +705,9 @@ func (s *constSummary) Desc() *Desc { } func (s *constSummary) Write(out *dto.Metric) error { - sum := &dto.Summary{} + sum := &dto.Summary{ + CreatedTimestamp: s.createdTs, + } qs := make([]*dto.Quantile, 0, len(s.quantiles)) sum.SampleCount = proto.Uint64(s.count) @@ -737,7 +756,7 @@ func NewConstSummary( if desc.err != nil { return nil, desc.err } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } return &constSummary{ diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go index 5f6bb800..cc23011f 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -14,6 +14,7 @@ package prometheus import ( + "errors" "fmt" "sort" "time" @@ -91,7 +92,7 @@ func (v *valueFunc) Desc() *Desc { } func (v *valueFunc) Write(out *dto.Metric) error { - return populateMetric(v.valType, v.function(), v.labelPairs, nil, out) + return populateMetric(v.valType, v.function(), v.labelPairs, nil, out, nil) } // NewConstMetric returns a metric with one fixed value that cannot be @@ -105,12 +106,12 @@ func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues if desc.err != nil { return nil, desc.err } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { return nil, err } metric := &dto.Metric{} - if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric); err != nil { + if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric, nil); err != nil { return nil, err } @@ -130,6 +131,43 @@ func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelVal return m } +// NewConstMetricWithCreatedTimestamp does the same thing as NewConstMetric, but generates Counters +// with created timestamp set and returns an error for other metric types. +func NewConstMetricWithCreatedTimestamp(desc *Desc, valueType ValueType, value float64, ct time.Time, labelValues ...string) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels.names)); err != nil { + return nil, err + } + switch valueType { + case CounterValue: + break + default: + return nil, errors.New("created timestamps are only supported for counters") + } + + metric := &dto.Metric{} + if err := populateMetric(valueType, value, MakeLabelPairs(desc, labelValues), nil, metric, timestamppb.New(ct)); err != nil { + return nil, err + } + + return &constMetric{ + desc: desc, + metric: metric, + }, nil +} + +// MustNewConstMetricWithCreatedTimestamp is a version of NewConstMetricWithCreatedTimestamp that panics where +// NewConstMetricWithCreatedTimestamp would have returned an error. +func MustNewConstMetricWithCreatedTimestamp(desc *Desc, valueType ValueType, value float64, ct time.Time, labelValues ...string) Metric { + m, err := NewConstMetricWithCreatedTimestamp(desc, valueType, value, ct, labelValues...) + if err != nil { + panic(err) + } + return m +} + type constMetric struct { desc *Desc metric *dto.Metric @@ -153,11 +191,12 @@ func populateMetric( labelPairs []*dto.LabelPair, e *dto.Exemplar, m *dto.Metric, + ct *timestamppb.Timestamp, ) error { m.Label = labelPairs switch t { case CounterValue: - m.Counter = &dto.Counter{Value: proto.Float64(v), Exemplar: e} + m.Counter = &dto.Counter{Value: proto.Float64(v), Exemplar: e, CreatedTimestamp: ct} case GaugeValue: m.Gauge = &dto.Gauge{Value: proto.Float64(v)} case UntypedValue: @@ -176,19 +215,19 @@ func populateMetric( // This function is only needed for custom Metric implementations. See MetricVec // example. func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { - totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + totalLen := len(desc.variableLabels.names) + len(desc.constLabelPairs) if totalLen == 0 { // Super fast path. return nil } - if len(desc.variableLabels) == 0 { + if len(desc.variableLabels.names) == 0 { // Moderately fast path. return desc.constLabelPairs } labelPairs := make([]*dto.LabelPair, 0, totalLen) - for i, l := range desc.variableLabels { + for i, l := range desc.variableLabels.names { labelPairs = append(labelPairs, &dto.LabelPair{ - Name: proto.String(l.Name), + Name: proto.String(l), Value: proto.String(labelValues[i]), }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go index f0d0015a..955cfd59 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -20,24 +20,6 @@ import ( "github.com/prometheus/common/model" ) -var labelsPool = &sync.Pool{ - New: func() interface{} { - return make(Labels) - }, -} - -func getLabelsFromPool() Labels { - return labelsPool.Get().(Labels) -} - -func putLabelsToPool(labels Labels) { - for k := range labels { - delete(labels, k) - } - - labelsPool.Put(labels) -} - // MetricVec is a Collector to bundle metrics of the same name that differ in // their label values. MetricVec is not used directly but as a building block // for implementations of vectors of a given metric type, like GaugeVec, @@ -91,6 +73,7 @@ func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { // See also the CounterVec example. func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { lvs = constrainLabelValues(m.desc, lvs, m.curry) + h, err := m.hashLabelValues(lvs) if err != nil { return false @@ -110,8 +93,8 @@ func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { // This method is used for the same purpose as DeleteLabelValues(...string). See // there for pros and cons of the two methods. func (m *MetricVec) Delete(labels Labels) bool { - labels = constrainLabels(m.desc, labels) - defer putLabelsToPool(labels) + labels, closer := constrainLabels(m.desc, labels) + defer closer() h, err := m.hashLabels(labels) if err != nil { @@ -128,8 +111,8 @@ func (m *MetricVec) Delete(labels Labels) bool { // Note that curried labels will never be matched if deleting from the curried vector. // To match curried labels with DeletePartialMatch, it must be called on the base vector. func (m *MetricVec) DeletePartialMatch(labels Labels) int { - labels = constrainLabels(m.desc, labels) - defer putLabelsToPool(labels) + labels, closer := constrainLabels(m.desc, labels) + defer closer() return m.metricMap.deleteByLabels(labels, m.curry) } @@ -169,11 +152,11 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { oldCurry = m.curry iCurry int ) - for i, label := range m.desc.variableLabels { - val, ok := labels[label.Name] + for i, labelName := range m.desc.variableLabels.names { + val, ok := labels[labelName] if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { if ok { - return nil, fmt.Errorf("label name %q is already curried", label.Name) + return nil, fmt.Errorf("label name %q is already curried", labelName) } newCurry = append(newCurry, oldCurry[iCurry]) iCurry++ @@ -181,7 +164,10 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { if !ok { continue // Label stays uncurried. } - newCurry = append(newCurry, curriedLabelValue{i, label.Constrain(val)}) + newCurry = append(newCurry, curriedLabelValue{ + i, + m.desc.variableLabels.constrain(labelName, val), + }) } } if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { @@ -250,8 +236,8 @@ func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { // around MetricVec, implementing a vector for a specific Metric implementation, // for example GaugeVec. func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { - labels = constrainLabels(m.desc, labels) - defer putLabelsToPool(labels) + labels, closer := constrainLabels(m.desc, labels) + defer closer() h, err := m.hashLabels(labels) if err != nil { @@ -262,7 +248,7 @@ func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { } func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { - if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil { + if err := validateLabelValues(vals, len(m.desc.variableLabels.names)-len(m.curry)); err != nil { return 0, err } @@ -271,7 +257,7 @@ func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { curry = m.curry iVals, iCurry int ) - for i := 0; i < len(m.desc.variableLabels); i++ { + for i := 0; i < len(m.desc.variableLabels.names); i++ { if iCurry < len(curry) && curry[iCurry].index == i { h = m.hashAdd(h, curry[iCurry].value) iCurry++ @@ -285,7 +271,7 @@ func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { } func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { - if err := validateValuesInLabels(labels, len(m.desc.variableLabels)-len(m.curry)); err != nil { + if err := validateValuesInLabels(labels, len(m.desc.variableLabels.names)-len(m.curry)); err != nil { return 0, err } @@ -294,17 +280,17 @@ func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { curry = m.curry iCurry int ) - for i, label := range m.desc.variableLabels { - val, ok := labels[label.Name] + for i, labelName := range m.desc.variableLabels.names { + val, ok := labels[labelName] if iCurry < len(curry) && curry[iCurry].index == i { if ok { - return 0, fmt.Errorf("label name %q is already curried", label.Name) + return 0, fmt.Errorf("label name %q is already curried", labelName) } h = m.hashAdd(h, curry[iCurry].value) iCurry++ } else { if !ok { - return 0, fmt.Errorf("label name %q missing in label map", label.Name) + return 0, fmt.Errorf("label name %q missing in label map", labelName) } h = m.hashAdd(h, val) } @@ -482,7 +468,7 @@ func valueMatchesVariableOrCurriedValue(targetValue string, index int, values [] func matchPartialLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { for l, v := range labels { // Check if the target label exists in our metrics and get the index. - varLabelIndex, validLabel := indexOf(l, desc.variableLabels.labelNames()) + varLabelIndex, validLabel := indexOf(l, desc.variableLabels.names) if validLabel { // Check the value of that label against the target value. // We don't consider curried values in partial matches. @@ -626,7 +612,7 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe return false } iCurry := 0 - for i, k := range desc.variableLabels { + for i, k := range desc.variableLabels.names { if iCurry < len(curry) && curry[iCurry].index == i { if values[i] != curry[iCurry].value { return false @@ -634,7 +620,7 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe iCurry++ continue } - if values[i] != labels[k.Name] { + if values[i] != labels[k] { return false } } @@ -644,13 +630,13 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) []string { labelValues := make([]string, len(labels)+len(curry)) iCurry := 0 - for i, k := range desc.variableLabels { + for i, k := range desc.variableLabels.names { if iCurry < len(curry) && curry[iCurry].index == i { labelValues[i] = curry[iCurry].value iCurry++ continue } - labelValues[i] = labels[k.Name] + labelValues[i] = labels[k] } return labelValues } @@ -670,20 +656,37 @@ func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { return labelValues } -func constrainLabels(desc *Desc, labels Labels) Labels { - constrainedLabels := getLabelsFromPool() - for l, v := range labels { - if i, ok := indexOf(l, desc.variableLabels.labelNames()); ok { - v = desc.variableLabels[i].Constrain(v) - } +var labelsPool = &sync.Pool{ + New: func() interface{} { + return make(Labels) + }, +} - constrainedLabels[l] = v +func constrainLabels(desc *Desc, labels Labels) (Labels, func()) { + if len(desc.variableLabels.labelConstraints) == 0 { + // Fast path when there's no constraints + return labels, func() {} } - return constrainedLabels + constrainedLabels := labelsPool.Get().(Labels) + for l, v := range labels { + constrainedLabels[l] = desc.variableLabels.constrain(l, v) + } + + return constrainedLabels, func() { + for k := range constrainedLabels { + delete(constrainedLabels, k) + } + labelsPool.Put(constrainedLabels) + } } func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) []string { + if len(desc.variableLabels.labelConstraints) == 0 { + // Fast path when there's no constraints + return lvs + } + constrainedValues := make([]string, len(lvs)) var iCurry, iLVs int for i := 0; i < len(lvs)+len(curry); i++ { @@ -692,8 +695,11 @@ func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) [ continue } - if i < len(desc.variableLabels) { - constrainedValues[iLVs] = desc.variableLabels[i].Constrain(lvs[iLVs]) + if i < len(desc.variableLabels.names) { + constrainedValues[iLVs] = desc.variableLabels.constrain( + desc.variableLabels.names[i], + lvs[iLVs], + ) } else { constrainedValues[iLVs] = lvs[iLVs] } diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go index 2b5bca4b..cee360db 100644 --- a/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -215,8 +215,9 @@ type Counter struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` + CreatedTimestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created_timestamp,json=createdTimestamp" json:"created_timestamp,omitempty"` } func (x *Counter) Reset() { @@ -265,6 +266,13 @@ func (x *Counter) GetExemplar() *Exemplar { return nil } +func (x *Counter) GetCreatedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.CreatedTimestamp + } + return nil +} + type Quantile struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -325,9 +333,10 @@ type Summary struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` - Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + CreatedTimestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=created_timestamp,json=createdTimestamp" json:"created_timestamp,omitempty"` } func (x *Summary) Reset() { @@ -383,6 +392,13 @@ func (x *Summary) GetQuantile() []*Quantile { return nil } +func (x *Summary) GetCreatedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.CreatedTimestamp + } + return nil +} + type Untyped struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -439,7 +455,8 @@ type Histogram struct { SampleCountFloat *float64 `protobuf:"fixed64,4,opt,name=sample_count_float,json=sampleCountFloat" json:"sample_count_float,omitempty"` // Overrides sample_count if > 0. SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` // Buckets for the conventional histogram. - Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` // Ordered in increasing order of upper_bound, +Inf bucket is optional. + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` // Ordered in increasing order of upper_bound, +Inf bucket is optional. + CreatedTimestamp *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_timestamp,json=createdTimestamp" json:"created_timestamp,omitempty"` // schema defines the bucket schema. Currently, valid numbers are -4 <= n <= 8. // They are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and // then each power of two is divided into 2^n logarithmic buckets. @@ -457,6 +474,9 @@ type Histogram struct { NegativeDelta []int64 `protobuf:"zigzag64,10,rep,name=negative_delta,json=negativeDelta" json:"negative_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). NegativeCount []float64 `protobuf:"fixed64,11,rep,name=negative_count,json=negativeCount" json:"negative_count,omitempty"` // Absolute count of each bucket. // Positive buckets for the native histogram. + // Use a no-op span (offset 0, length 0) for a native histogram without any + // observations yet and with a zero_threshold of 0. Otherwise, it would be + // indistinguishable from a classic histogram. PositiveSpan []*BucketSpan `protobuf:"bytes,12,rep,name=positive_span,json=positiveSpan" json:"positive_span,omitempty"` // Use either "positive_delta" or "positive_count", the former for // regular histograms with integer counts, the latter for float @@ -525,6 +545,13 @@ func (x *Histogram) GetBucket() []*Bucket { return nil } +func (x *Histogram) GetCreatedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.CreatedTimestamp + } + return nil +} + func (x *Histogram) GetSchema() int32 { if x != nil && x.Schema != nil { return *x.Schema @@ -972,137 +999,151 @@ var file_io_prometheus_client_metrics_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x47, 0x61, 0x75, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, - 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, - 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x87, 0x01, 0x0a, - 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, + 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x12, + 0x47, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3c, 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x53, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, + 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x12, 0x47, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x1f, 0x0a, 0x07, 0x55, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xac, 0x05, 0x0a, 0x09, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x09, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, - 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x1f, 0x0a, 0x07, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x04, 0x0a, 0x09, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, - 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x7a, 0x65, 0x72, - 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x7a, 0x65, - 0x72, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x7a, 0x65, 0x72, - 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, - 0x6f, 0x61, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x73, 0x70, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, - 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x12, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x74, - 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, - 0x6e, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, - 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x01, - 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x6d, 0x75, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0f, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, - 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, - 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, - 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, 0x0a, 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x53, 0x70, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x72, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, - 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, - 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, - 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x61, - 0x75, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x70, - 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x61, 0x75, 0x67, 0x65, 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x12, 0x37, 0x0a, - 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, - 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x37, 0x0a, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x52, - 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, + 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x47, + 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x25, 0x0a, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x7a, 0x65, 0x72, 0x6f, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x7a, 0x65, 0x72, 0x6f, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, + 0x45, 0x0a, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, + 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0d, + 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x25, 0x0a, + 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x09, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, - 0x65, 0x6c, 0x70, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, - 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, - 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2a, - 0x62, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, - 0x55, 0x47, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x13, - 0x0a, 0x0f, 0x47, 0x41, 0x55, 0x47, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, - 0x4d, 0x10, 0x05, 0x42, 0x52, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, - 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5a, 0x3a, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, - 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, - 0x67, 0x6f, 0x3b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, - 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x12, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, + 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x06, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, + 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x34, 0x0a, 0x16, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x14, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, + 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x72, 0x22, 0x3c, 0x0a, 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x22, 0x91, 0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x12, 0x35, 0x0a, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, + 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, 0x72, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x61, 0x75, + 0x67, 0x65, 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, + 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, + 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x37, 0x0a, 0x07, 0x75, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x52, 0x07, 0x75, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, + 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x09, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x65, 0x6c, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x12, + 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, + 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2a, 0x62, 0x0a, 0x0a, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, 0x55, 0x47, 0x45, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x02, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x48, + 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x47, 0x41, + 0x55, 0x47, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x05, 0x42, + 0x52, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, 0x67, 0x6f, 0x3b, 0x69, + 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, } var ( @@ -1137,26 +1178,29 @@ var file_io_prometheus_client_metrics_proto_goTypes = []interface{}{ } var file_io_prometheus_client_metrics_proto_depIdxs = []int32{ 10, // 0: io.prometheus.client.Counter.exemplar:type_name -> io.prometheus.client.Exemplar - 4, // 1: io.prometheus.client.Summary.quantile:type_name -> io.prometheus.client.Quantile - 8, // 2: io.prometheus.client.Histogram.bucket:type_name -> io.prometheus.client.Bucket - 9, // 3: io.prometheus.client.Histogram.negative_span:type_name -> io.prometheus.client.BucketSpan - 9, // 4: io.prometheus.client.Histogram.positive_span:type_name -> io.prometheus.client.BucketSpan - 10, // 5: io.prometheus.client.Bucket.exemplar:type_name -> io.prometheus.client.Exemplar - 1, // 6: io.prometheus.client.Exemplar.label:type_name -> io.prometheus.client.LabelPair - 13, // 7: io.prometheus.client.Exemplar.timestamp:type_name -> google.protobuf.Timestamp - 1, // 8: io.prometheus.client.Metric.label:type_name -> io.prometheus.client.LabelPair - 2, // 9: io.prometheus.client.Metric.gauge:type_name -> io.prometheus.client.Gauge - 3, // 10: io.prometheus.client.Metric.counter:type_name -> io.prometheus.client.Counter - 5, // 11: io.prometheus.client.Metric.summary:type_name -> io.prometheus.client.Summary - 6, // 12: io.prometheus.client.Metric.untyped:type_name -> io.prometheus.client.Untyped - 7, // 13: io.prometheus.client.Metric.histogram:type_name -> io.prometheus.client.Histogram - 0, // 14: io.prometheus.client.MetricFamily.type:type_name -> io.prometheus.client.MetricType - 11, // 15: io.prometheus.client.MetricFamily.metric:type_name -> io.prometheus.client.Metric - 16, // [16:16] is the sub-list for method output_type - 16, // [16:16] is the sub-list for method input_type - 16, // [16:16] is the sub-list for extension type_name - 16, // [16:16] is the sub-list for extension extendee - 0, // [0:16] is the sub-list for field type_name + 13, // 1: io.prometheus.client.Counter.created_timestamp:type_name -> google.protobuf.Timestamp + 4, // 2: io.prometheus.client.Summary.quantile:type_name -> io.prometheus.client.Quantile + 13, // 3: io.prometheus.client.Summary.created_timestamp:type_name -> google.protobuf.Timestamp + 8, // 4: io.prometheus.client.Histogram.bucket:type_name -> io.prometheus.client.Bucket + 13, // 5: io.prometheus.client.Histogram.created_timestamp:type_name -> google.protobuf.Timestamp + 9, // 6: io.prometheus.client.Histogram.negative_span:type_name -> io.prometheus.client.BucketSpan + 9, // 7: io.prometheus.client.Histogram.positive_span:type_name -> io.prometheus.client.BucketSpan + 10, // 8: io.prometheus.client.Bucket.exemplar:type_name -> io.prometheus.client.Exemplar + 1, // 9: io.prometheus.client.Exemplar.label:type_name -> io.prometheus.client.LabelPair + 13, // 10: io.prometheus.client.Exemplar.timestamp:type_name -> google.protobuf.Timestamp + 1, // 11: io.prometheus.client.Metric.label:type_name -> io.prometheus.client.LabelPair + 2, // 12: io.prometheus.client.Metric.gauge:type_name -> io.prometheus.client.Gauge + 3, // 13: io.prometheus.client.Metric.counter:type_name -> io.prometheus.client.Counter + 5, // 14: io.prometheus.client.Metric.summary:type_name -> io.prometheus.client.Summary + 6, // 15: io.prometheus.client.Metric.untyped:type_name -> io.prometheus.client.Untyped + 7, // 16: io.prometheus.client.Metric.histogram:type_name -> io.prometheus.client.Histogram + 0, // 17: io.prometheus.client.MetricFamily.type:type_name -> io.prometheus.client.MetricType + 11, // 18: io.prometheus.client.MetricFamily.metric:type_name -> io.prometheus.client.Metric + 19, // [19:19] is the sub-list for method output_type + 19, // [19:19] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_io_prometheus_client_metrics_proto_init() } diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index 90639781..0ca86a3d 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -22,7 +22,7 @@ import ( dto "github.com/prometheus/client_model/go" - "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/matttproud/golang_protobuf_extensions/v2/pbutil" "github.com/prometheus/common/model" ) diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go index 7f611ffa..ca214060 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -18,7 +18,7 @@ import ( "io" "net/http" - "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/matttproud/golang_protobuf_extensions/v2/pbutil" "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" "google.golang.org/protobuf/encoding/prototext" diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common index 0ce7ea46..062a2818 100644 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -61,7 +61,7 @@ PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_ SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.53.3 +GOLANGCI_LINT_VERSION ?= v1.54.2 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_notype.go b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go index 13d74e39..134767d6 100644 --- a/vendor/github.com/prometheus/procfs/fs_statfs_notype.go +++ b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build netbsd || openbsd || solaris || windows || nostatfs -// +build netbsd openbsd solaris windows nostatfs +//go:build !freebsd && !linux +// +build !freebsd,!linux package procfs diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_type.go b/vendor/github.com/prometheus/procfs/fs_statfs_type.go index bee15144..80df79c3 100644 --- a/vendor/github.com/prometheus/procfs/fs_statfs_type.go +++ b/vendor/github.com/prometheus/procfs/fs_statfs_type.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !netbsd && !openbsd && !solaris && !windows && !nostatfs -// +build !netbsd,!openbsd,!solaris,!windows,!nostatfs +//go:build freebsd || linux +// +build freebsd linux package procfs diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go index 852c8c4a..9d8af6db 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -44,6 +44,14 @@ const ( fieldTransport11TCPLen = 13 fieldTransport11UDPLen = 10 + + // kernel version >= 4.14 MaxLen + // See: https://elixir.bootlin.com/linux/v6.4.8/source/net/sunrpc/xprtrdma/xprt_rdma.h#L393 + fieldTransport11RDMAMaxLen = 28 + + // kernel version <= 4.2 MinLen + // See: https://elixir.bootlin.com/linux/v4.2.8/source/net/sunrpc/xprtrdma/xprt_rdma.h#L331 + fieldTransport11RDMAMinLen = 20 ) // A Mount is a device mount parsed from /proc/[pid]/mountstats. @@ -233,6 +241,33 @@ type NFSTransportStats struct { // A running counter, incremented on each request as the current size of the // pending queue. CumulativePendingQueue uint64 + + // Stats below only available with stat version 1.1. + // Transport over RDMA + + // accessed when sending a call + ReadChunkCount uint64 + WriteChunkCount uint64 + ReplyChunkCount uint64 + TotalRdmaRequest uint64 + + // rarely accessed error counters + PullupCopyCount uint64 + HardwayRegisterCount uint64 + FailedMarshalCount uint64 + BadReplyCount uint64 + MrsRecovered uint64 + MrsOrphaned uint64 + MrsAllocated uint64 + EmptySendctxQ uint64 + + // accessed when receiving a reply + TotalRdmaReply uint64 + FixupCopyCount uint64 + ReplyWaitsForSend uint64 + LocalInvNeeded uint64 + NomsgCallCount uint64 + BcallCount uint64 } // parseMountStats parses a /proc/[pid]/mountstats file and returns a slice @@ -587,14 +622,17 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats expectedLength = fieldTransport11TCPLen } else if protocol == "udp" { expectedLength = fieldTransport11UDPLen + } else if protocol == "rdma" { + expectedLength = fieldTransport11RDMAMinLen } else { return nil, fmt.Errorf("%w: invalid NFS protocol \"%s\" in stats 1.1 statement: %v", ErrFileParse, protocol, ss) } - if len(ss) != expectedLength { - return nil, fmt.Errorf("%w: invalid NFS transport stats 1.1 statement: %v", ErrFileParse, ss) + if (len(ss) != expectedLength && (protocol == "tcp" || protocol == "udp")) || + (protocol == "rdma" && len(ss) < expectedLength) { + return nil, fmt.Errorf("%w: invalid NFS transport stats 1.1 statement: %v, protocol: %v", ErrFileParse, ss, protocol) } default: - return nil, fmt.Errorf("%s: Unrecognized NFS transport stats version: %q", ErrFileParse, statVersion) + return nil, fmt.Errorf("%s: Unrecognized NFS transport stats version: %q, protocol: %v", ErrFileParse, statVersion, protocol) } // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay @@ -604,7 +642,9 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats // Note: slice length must be set to length of v1.1 stats to avoid a panic when // only v1.0 stats are present. // See: https://github.com/prometheus/node_exporter/issues/571. - ns := make([]uint64, fieldTransport11TCPLen) + // + // Note: NFS Over RDMA slice length is fieldTransport11RDMAMaxLen + ns := make([]uint64, fieldTransport11RDMAMaxLen+3) for i, s := range ss { n, err := strconv.ParseUint(s, 10, 64) if err != nil { @@ -622,9 +662,14 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats // we set them to 0 here. if protocol == "udp" { ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) + } else if protocol == "tcp" { + ns = append(ns[:fieldTransport11TCPLen], make([]uint64, fieldTransport11RDMAMaxLen-fieldTransport11TCPLen+3)...) + } else if protocol == "rdma" { + ns = append(ns[:fieldTransport10TCPLen], append(make([]uint64, 3), ns[fieldTransport10TCPLen:]...)...) } return &NFSTransportStats{ + // NFS xprt over tcp or udp Protocol: protocol, Port: ns[0], Bind: ns[1], @@ -636,8 +681,32 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats BadTransactionIDs: ns[7], CumulativeActiveRequests: ns[8], CumulativeBacklog: ns[9], - MaximumRPCSlotsUsed: ns[10], - CumulativeSendingQueue: ns[11], - CumulativePendingQueue: ns[12], + + // NFS xprt over tcp or udp + // And statVersion 1.1 + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + + // NFS xprt over rdma + // And stat Version 1.1 + ReadChunkCount: ns[13], + WriteChunkCount: ns[14], + ReplyChunkCount: ns[15], + TotalRdmaRequest: ns[16], + PullupCopyCount: ns[17], + HardwayRegisterCount: ns[18], + FailedMarshalCount: ns[19], + BadReplyCount: ns[20], + MrsRecovered: ns[21], + MrsOrphaned: ns[22], + MrsAllocated: ns[23], + EmptySendctxQ: ns[24], + TotalRdmaReply: ns[25], + FixupCopyCount: ns[26], + ReplyWaitsForSend: ns[27], + LocalInvNeeded: ns[28], + NomsgCallCount: ns[29], + BcallCount: ns[30], }, nil } diff --git a/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/vendor/github.com/prometheus/procfs/proc_fdinfo.go index 4b7933e4..fa761b35 100644 --- a/vendor/github.com/prometheus/procfs/proc_fdinfo.go +++ b/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -26,6 +26,7 @@ var ( rPos = regexp.MustCompile(`^pos:\s+(\d+)$`) rFlags = regexp.MustCompile(`^flags:\s+(\d+)$`) rMntID = regexp.MustCompile(`^mnt_id:\s+(\d+)$`) + rIno = regexp.MustCompile(`^ino:\s+(\d+)$`) rInotify = regexp.MustCompile(`^inotify`) rInotifyParts = regexp.MustCompile(`^inotify\s+wd:([0-9a-f]+)\s+ino:([0-9a-f]+)\s+sdev:([0-9a-f]+)(?:\s+mask:([0-9a-f]+))?`) ) @@ -40,6 +41,8 @@ type ProcFDInfo struct { Flags string // Mount point ID MntID string + // Inode number + Ino string // List of inotify lines (structured) in the fdinfo file (kernel 3.8+ only) InotifyInfos []InotifyInfo } @@ -51,7 +54,7 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { return nil, err } - var text, pos, flags, mntid string + var text, pos, flags, mntid, ino string var inotify []InotifyInfo scanner := bufio.NewScanner(bytes.NewReader(data)) @@ -63,6 +66,8 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { flags = rFlags.FindStringSubmatch(text)[1] } else if rMntID.MatchString(text) { mntid = rMntID.FindStringSubmatch(text)[1] + } else if rIno.MatchString(text) { + ino = rIno.FindStringSubmatch(text)[1] } else if rInotify.MatchString(text) { newInotify, err := parseInotifyInfo(text) if err != nil { @@ -77,6 +82,7 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { Pos: pos, Flags: flags, MntID: mntid, + Ino: ino, InotifyInfos: inotify, } diff --git a/vendor/github.com/prometheus/procfs/proc_maps.go b/vendor/github.com/prometheus/procfs/proc_maps.go index 727549a1..7e75c286 100644 --- a/vendor/github.com/prometheus/procfs/proc_maps.go +++ b/vendor/github.com/prometheus/procfs/proc_maps.go @@ -63,17 +63,17 @@ type ProcMap struct { // parseDevice parses the device token of a line and converts it to a dev_t // (mkdev) like structure. func parseDevice(s string) (uint64, error) { - toks := strings.Split(s, ":") - if len(toks) < 2 { - return 0, fmt.Errorf("%w: unexpected number of fields, expected: 2, got: %q", ErrFileParse, len(toks)) + i := strings.Index(s, ":") + if i == -1 { + return 0, fmt.Errorf("%w: expected separator `:` in %s", ErrFileParse, s) } - major, err := strconv.ParseUint(toks[0], 16, 0) + major, err := strconv.ParseUint(s[0:i], 16, 0) if err != nil { return 0, err } - minor, err := strconv.ParseUint(toks[1], 16, 0) + minor, err := strconv.ParseUint(s[i+1:], 16, 0) if err != nil { return 0, err } @@ -93,17 +93,17 @@ func parseAddress(s string) (uintptr, error) { // parseAddresses parses the start-end address. func parseAddresses(s string) (uintptr, uintptr, error) { - toks := strings.Split(s, "-") - if len(toks) < 2 { - return 0, 0, fmt.Errorf("%w: invalid address", ErrFileParse) + idx := strings.Index(s, "-") + if idx == -1 { + return 0, 0, fmt.Errorf("%w: expected separator `-` in %s", ErrFileParse, s) } - saddr, err := parseAddress(toks[0]) + saddr, err := parseAddress(s[0:idx]) if err != nil { return 0, 0, err } - eaddr, err := parseAddress(toks[1]) + eaddr, err := parseAddress(s[idx+1:]) if err != nil { return 0, 0, err } diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index c055d075..46307f57 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -23,7 +23,7 @@ import ( ) // ProcStatus provides status information about the process, -// read from /proc/[pid]/stat. +// read from /proc/[pid]/status. type ProcStatus struct { // The process ID. PID int @@ -32,6 +32,8 @@ type ProcStatus struct { // Thread group ID. TGID int + // List of Pid namespace. + NSpids []uint64 // Peak virtual memory size. VmPeak uint64 // nolint:revive @@ -127,6 +129,8 @@ func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintByt copy(s.UIDs[:], strings.Split(vString, "\t")) case "Gid": copy(s.GIDs[:], strings.Split(vString, "\t")) + case "NSpid": + s.NSpids = calcNSPidsList(vString) case "VmPeak": s.VmPeak = vUintBytes case "VmSize": @@ -200,3 +204,18 @@ func calcCpusAllowedList(cpuString string) []uint64 { sort.Slice(g, func(i, j int) bool { return g[i] < g[j] }) return g } + +func calcNSPidsList(nspidsString string) []uint64 { + s := strings.Split(nspidsString, " ") + var nspids []uint64 + + for _, nspid := range s { + nspid, _ := strconv.ParseUint(nspid, 10, 64) + if nspid == 0 { + continue + } + nspids = append(nspids, nspid) + } + + return nspids +} diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_aix_nocgo.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_aix_nocgo.go index 1a291532..a77b4dbb 100644 --- a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_aix_nocgo.go +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_aix_nocgo.go @@ -5,15 +5,12 @@ package cpu import ( "context" - "regexp" "strconv" "strings" "github.com/shirou/gopsutil/v3/internal/common" ) -var whiteSpaces = regexp.MustCompile(`\s+`) - func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { if percpu { return []TimesStat{}, common.ErrNotImplementedError @@ -28,8 +25,8 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { } ret := TimesStat{CPU: "cpu-total"} - h := whiteSpaces.Split(lines[len(lines)-3], -1) // headers - v := whiteSpaces.Split(lines[len(lines)-2], -1) // values + h := strings.Fields(lines[len(lines)-3]) // headers + v := strings.Fields(lines[len(lines)-2]) // values for i, header := range h { if t, err := strconv.ParseFloat(v[i], 64); err == nil { switch header { @@ -58,14 +55,14 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) { ret := InfoStat{} for _, line := range strings.Split(string(out), "\n") { if strings.HasPrefix(line, "Number Of Processors:") { - p := whiteSpaces.Split(line, 4) + p := strings.Fields(line) if len(p) > 3 { if t, err := strconv.ParseUint(p[3], 10, 64); err == nil { ret.Cores = int32(t) } } } else if strings.HasPrefix(line, "Processor Clock Speed:") { - p := whiteSpaces.Split(line, 5) + p := strings.Fields(line) if len(p) > 4 { if t, err := strconv.ParseFloat(p[3], 64); err == nil { switch strings.ToUpper(p[4]) { diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_fallback.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_fallback.go index 6d7007ff..089f603c 100644 --- a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_fallback.go +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_fallback.go @@ -1,5 +1,5 @@ -//go:build !darwin && !linux && !freebsd && !openbsd && !solaris && !windows && !dragonfly && !plan9 && !aix -// +build !darwin,!linux,!freebsd,!openbsd,!solaris,!windows,!dragonfly,!plan9,!aix +//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !solaris && !windows && !dragonfly && !plan9 && !aix +// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!solaris,!windows,!dragonfly,!plan9,!aix package cpu diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_linux.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_linux.go index b5a20e36..da467e2d 100644 --- a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_linux.go +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_linux.go @@ -309,7 +309,7 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) { func parseStatLine(line string) (*TimesStat, error) { fields := strings.Fields(line) - if len(fields) == 0 { + if len(fields) < 8 { return nil, errors.New("stat does not contain cpu info") } diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd.go new file mode 100644 index 00000000..1f66be34 --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd.go @@ -0,0 +1,119 @@ +//go:build netbsd +// +build netbsd + +package cpu + +import ( + "context" + "fmt" + "runtime" + "unsafe" + + "github.com/shirou/gopsutil/v3/internal/common" + "github.com/tklauser/go-sysconf" + "golang.org/x/sys/unix" +) + +const ( + // sys/sysctl.h + ctlKern = 1 // "high kernel": proc, limits + ctlHw = 6 // CTL_HW + kernCpTime = 51 // KERN_CPTIME +) + +var ClocksPerSec = float64(100) + +func init() { + clkTck, err := sysconf.Sysconf(sysconf.SC_CLK_TCK) + // ignore errors + if err == nil { + ClocksPerSec = float64(clkTck) + } +} + +func Times(percpu bool) ([]TimesStat, error) { + return TimesWithContext(context.Background(), percpu) +} + +func TimesWithContext(ctx context.Context, percpu bool) (ret []TimesStat, err error) { + if !percpu { + mib := []int32{ctlKern, kernCpTime} + buf, _, err := common.CallSyscall(mib) + if err != nil { + return ret, err + } + times := (*cpuTimes)(unsafe.Pointer(&buf[0])) + stat := TimesStat{ + CPU: "cpu-total", + User: float64(times.User), + Nice: float64(times.Nice), + System: float64(times.Sys), + Idle: float64(times.Idle), + Irq: float64(times.Intr), + } + return []TimesStat{stat}, nil + } + + ncpu, err := unix.SysctlUint32("hw.ncpu") + if err != nil { + return + } + + var i uint32 + for i = 0; i < ncpu; i++ { + mib := []int32{ctlKern, kernCpTime, int32(i)} + buf, _, err := common.CallSyscall(mib) + if err != nil { + return ret, err + } + + stats := (*cpuTimes)(unsafe.Pointer(&buf[0])) + ret = append(ret, TimesStat{ + CPU: fmt.Sprintf("cpu%d", i), + User: float64(stats.User), + Nice: float64(stats.Nice), + System: float64(stats.Sys), + Idle: float64(stats.Idle), + Irq: float64(stats.Intr), + }) + } + + return ret, nil +} + +// Returns only one (minimal) CPUInfoStat on NetBSD +func Info() ([]InfoStat, error) { + return InfoWithContext(context.Background()) +} + +func InfoWithContext(ctx context.Context) ([]InfoStat, error) { + var ret []InfoStat + var err error + + c := InfoStat{} + + mhz, err := unix.Sysctl("machdep.dmi.processor-frequency") + if err != nil { + return nil, err + } + _, err = fmt.Sscanf(mhz, "%f", &c.Mhz) + if err != nil { + return nil, err + } + + ncpu, err := unix.SysctlUint32("hw.ncpuonline") + if err != nil { + return nil, err + } + c.Cores = int32(ncpu) + + if c.ModelName, err = unix.Sysctl("machdep.dmi.processor-version"); err != nil { + return nil, err + } + + return append(ret, c), nil +} + +func CountsWithContext(ctx context.Context, logical bool) (int, error) { + return runtime.NumCPU(), nil +} diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_amd64.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_amd64.go new file mode 100644 index 00000000..57e14528 --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_amd64.go @@ -0,0 +1,9 @@ +package cpu + +type cpuTimes struct { + User uint64 + Nice uint64 + Sys uint64 + Intr uint64 + Idle uint64 +} diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_arm64.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_arm64.go new file mode 100644 index 00000000..57e14528 --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_netbsd_arm64.go @@ -0,0 +1,9 @@ +package cpu + +type cpuTimes struct { + User uint64 + Nice uint64 + Sys uint64 + Intr uint64 + Idle uint64 +} diff --git a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_solaris.go b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_solaris.go index f828c843..4231ad16 100644 --- a/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_solaris.go +++ b/vendor/github.com/shirou/gopsutil/v3/cpu/cpu_solaris.go @@ -36,6 +36,8 @@ func Times(percpu bool) ([]TimesStat, error) { return TimesWithContext(context.Background(), percpu) } +var kstatSplit = regexp.MustCompile(`[:\s]+`) + func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { kstatSysOut, err := invoke.CommandWithContext(ctx, "kstat", "-p", "cpu_stat:*:*:/^idle$|^user$|^kernel$|^iowait$|^swap$/") if err != nil { @@ -47,9 +49,8 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { kern := make(map[float64]float64) iowt := make(map[float64]float64) // swap := make(map[float64]float64) - re := regexp.MustCompile(`[:\s]+`) for _, line := range strings.Split(string(kstatSysOut), "\n") { - fields := re.Split(line, -1) + fields := kstatSplit.Split(line, -1) if fields[0] != "cpu_stat" { continue } diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_aix_nocgo.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_aix_nocgo.go index 4f93c752..17e2b9c8 100644 --- a/vendor/github.com/shirou/gopsutil/v3/disk/disk_aix_nocgo.go +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_aix_nocgo.go @@ -12,7 +12,6 @@ import ( "golang.org/x/sys/unix" ) -var whiteSpaces = regexp.MustCompile(`\s+`) var startBlank = regexp.MustCompile(`^\s+`) var ignoreFSType = map[string]bool{"procfs": true} @@ -60,7 +59,7 @@ func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, erro if startBlank.MatchString(line) { line = "localhost" + line } - p := whiteSpaces.Split(lines[idx], 6) + p := strings.Fields(lines[idx]) if len(p) < 5 || ignoreFSType[p[colidx["vfs"]]] { continue } diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_fallback.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_fallback.go index 47687334..36525f69 100644 --- a/vendor/github.com/shirou/gopsutil/v3/disk/disk_fallback.go +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_fallback.go @@ -1,5 +1,5 @@ -//go:build !darwin && !linux && !freebsd && !openbsd && !windows && !solaris && !aix -// +build !darwin,!linux,!freebsd,!openbsd,!windows,!solaris,!aix +//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !windows && !solaris && !aix +// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!windows,!solaris,!aix package disk diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_linux.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_linux.go index 5015c34a..d96109fa 100644 --- a/vendor/github.com/shirou/gopsutil/v3/disk/disk_linux.go +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_linux.go @@ -5,11 +5,9 @@ package disk import ( "bufio" - "bytes" "context" "errors" "fmt" - "io/ioutil" "os" "path" "path/filepath" @@ -486,32 +484,42 @@ func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOC return ret, nil } -func SerialNumberWithContext(ctx context.Context, name string) (string, error) { - var stat unix.Stat_t - err := unix.Stat(name, &stat) - if err != nil { - return "", err - } - major := unix.Major(uint64(stat.Rdev)) - minor := unix.Minor(uint64(stat.Rdev)) - - // Try to get the serial from udev data +func udevData(ctx context.Context, major uint32, minor uint32, name string) (string, error) { udevDataPath := common.HostRunWithContext(ctx, fmt.Sprintf("udev/data/b%d:%d", major, minor)) - if udevdata, err := ioutil.ReadFile(udevDataPath); err == nil { - scanner := bufio.NewScanner(bytes.NewReader(udevdata)) + if f, err := os.Open(udevDataPath); err == nil { + defer f.Close() + scanner := bufio.NewScanner(f) for scanner.Scan() { - values := strings.Split(scanner.Text(), "=") - if len(values) == 2 && values[0] == "E:ID_SERIAL" { + values := strings.SplitN(scanner.Text(), "=", 3) + if len(values) == 2 && values[0] == name { return values[1], nil } } + return "", scanner.Err() + } else if !os.IsNotExist(err) { + return "", err + } + return "", nil +} + +func SerialNumberWithContext(ctx context.Context, name string) (string, error) { + var stat unix.Stat_t + if err := unix.Stat(name, &stat); err != nil { + return "", err + } + major := unix.Major(stat.Rdev) + minor := unix.Minor(stat.Rdev) + + sserial, _ := udevData(ctx, major, minor, "E:ID_SERIAL") + if sserial != "" { + return sserial, nil } // Try to get the serial from sysfs, look at the disk device (minor 0) directly // because if it is a partition it is not going to contain any device information devicePath := common.HostSysWithContext(ctx, fmt.Sprintf("dev/block/%d:0/device", major)) - model, _ := ioutil.ReadFile(filepath.Join(devicePath, "model")) - serial, _ := ioutil.ReadFile(filepath.Join(devicePath, "serial")) + model, _ := os.ReadFile(filepath.Join(devicePath, "model")) + serial, _ := os.ReadFile(filepath.Join(devicePath, "serial")) if len(model) > 0 && len(serial) > 0 { return fmt.Sprintf("%s_%s", string(model), string(serial)), nil } @@ -521,16 +529,26 @@ func SerialNumberWithContext(ctx context.Context, name string) (string, error) { func LabelWithContext(ctx context.Context, name string) (string, error) { // Try label based on devicemapper name dmname_filename := common.HostSysWithContext(ctx, fmt.Sprintf("block/%s/dm/name", name)) - - if !common.PathExists(dmname_filename) { - return "", nil + // Could errors.Join errs with Go >= 1.20 + if common.PathExists(dmname_filename) { + dmname, err := os.ReadFile(dmname_filename) + if err == nil { + return strings.TrimSpace(string(dmname)), nil + } } + // Try udev data + var stat unix.Stat_t + if err := unix.Stat(common.HostDevWithContext(ctx, name), &stat); err != nil { + return "", err + } + major := unix.Major(stat.Rdev) + minor := unix.Minor(stat.Rdev) - dmname, err := ioutil.ReadFile(dmname_filename) + label, err := udevData(ctx, major, minor, "E:ID_FS_LABEL") if err != nil { return "", err } - return strings.TrimSpace(string(dmname)), nil + return label, nil } func getFsType(stat unix.Statfs_t) string { diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd.go new file mode 100644 index 00000000..5976efad --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd.go @@ -0,0 +1,152 @@ +//go:build netbsd +// +build netbsd + +package disk + +import ( + "context" + "unsafe" + + "github.com/shirou/gopsutil/v3/internal/common" + "golang.org/x/sys/unix" +) + +const ( + // see sys/fstypes.h and `man 5 statvfs` + MNT_RDONLY = 0x00000001 /* read only filesystem */ + MNT_SYNCHRONOUS = 0x00000002 /* file system written synchronously */ + MNT_NOEXEC = 0x00000004 /* can't exec from filesystem */ + MNT_NOSUID = 0x00000008 /* don't honor setuid bits on fs */ + MNT_NODEV = 0x00000010 /* don't interpret special files */ + MNT_ASYNC = 0x00000040 /* file system written asynchronously */ + MNT_NOATIME = 0x04000000 /* Never update access times in fs */ + MNT_SOFTDEP = 0x80000000 /* Use soft dependencies */ +) + +func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, error) { + var ret []PartitionStat + + flag := uint64(1) // ST_WAIT/MNT_WAIT, see sys/fstypes.h + + // get required buffer size + emptyBufSize := 0 + r, _, err := unix.Syscall( + 483, // SYS___getvfsstat90 syscall + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(&emptyBufSize)), + uintptr(unsafe.Pointer(&flag)), + ) + if err != 0 { + return ret, err + } + mountedFsCount := uint64(r) + + // calculate the buffer size + bufSize := sizeOfStatvfs * mountedFsCount + buf := make([]Statvfs, mountedFsCount) + + // request agian to get desired mount data + _, _, err = unix.Syscall( + 483, // SYS___getvfsstat90 syscall + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufSize)), + uintptr(unsafe.Pointer(&flag)), + ) + if err != 0 { + return ret, err + } + + for _, stat := range buf { + opts := []string{"rw"} + if stat.Flag&MNT_RDONLY != 0 { + opts = []string{"rw"} + } + if stat.Flag&MNT_SYNCHRONOUS != 0 { + opts = append(opts, "sync") + } + if stat.Flag&MNT_NOEXEC != 0 { + opts = append(opts, "noexec") + } + if stat.Flag&MNT_NOSUID != 0 { + opts = append(opts, "nosuid") + } + if stat.Flag&MNT_NODEV != 0 { + opts = append(opts, "nodev") + } + if stat.Flag&MNT_ASYNC != 0 { + opts = append(opts, "async") + } + if stat.Flag&MNT_SOFTDEP != 0 { + opts = append(opts, "softdep") + } + if stat.Flag&MNT_NOATIME != 0 { + opts = append(opts, "noatime") + } + + d := PartitionStat{ + Device: common.ByteToString([]byte(stat.Mntfromname[:])), + Mountpoint: common.ByteToString([]byte(stat.Mntonname[:])), + Fstype: common.ByteToString([]byte(stat.Fstypename[:])), + Opts: opts, + } + + ret = append(ret, d) + } + + return ret, nil +} + +func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOCountersStat, error) { + ret := make(map[string]IOCountersStat) + return ret, common.ErrNotImplementedError +} + +func UsageWithContext(ctx context.Context, path string) (*UsageStat, error) { + stat := Statvfs{} + flag := uint64(1) // ST_WAIT/MNT_WAIT, see sys/fstypes.h + + _path, e := unix.BytePtrFromString(path) + if e != nil { + return nil, e + } + + _, _, err := unix.Syscall( + 484, // SYS___statvfs190, see sys/syscall.h + uintptr(unsafe.Pointer(_path)), + uintptr(unsafe.Pointer(&stat)), + uintptr(unsafe.Pointer(&flag)), + ) + if err != 0 { + return nil, err + } + + // frsize is the real block size on NetBSD. See discuss here: https://bugzilla.samba.org/show_bug.cgi?id=11810 + bsize := stat.Frsize + ret := &UsageStat{ + Path: path, + Fstype: getFsType(stat), + Total: (uint64(stat.Blocks) * uint64(bsize)), + Free: (uint64(stat.Bavail) * uint64(bsize)), + InodesTotal: (uint64(stat.Files)), + InodesFree: (uint64(stat.Ffree)), + } + + ret.InodesUsed = (ret.InodesTotal - ret.InodesFree) + ret.InodesUsedPercent = (float64(ret.InodesUsed) / float64(ret.InodesTotal)) * 100.0 + ret.Used = (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(bsize) + ret.UsedPercent = (float64(ret.Used) / float64(ret.Total)) * 100.0 + + return ret, nil +} + +func getFsType(stat Statvfs) string { + return common.ByteToString(stat.Fstypename[:]) +} + +func SerialNumberWithContext(ctx context.Context, name string) (string, error) { + return "", common.ErrNotImplementedError +} + +func LabelWithContext(ctx context.Context, name string) (string, error) { + return "", common.ErrNotImplementedError +} diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_amd64.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_amd64.go new file mode 100644 index 00000000..c21421cf --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_amd64.go @@ -0,0 +1,45 @@ +//go:build netbsd && amd64 +// +build netbsd,amd64 + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs types_netbsd.go + +package disk + +const ( + sizeOfStatvfs = 0xce0 +) + +type ( + Statvfs struct { + Flag uint64 + Bsize uint64 + Frsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx _Ctype_struct___0 + Fsid uint64 + Namemax uint64 + Owner uint32 + Spare [4]uint64 + Fstypename [32]uint8 + Mntonname [1024]uint8 + Mntfromname [1024]uint8 + Mntfromlabel [1024]uint8 + } +) + +type _Ctype_struct___0 struct { + FsidVal [2]int32 +} diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_arm64.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_arm64.go new file mode 100644 index 00000000..dfe48f81 --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_netbsd_arm64.go @@ -0,0 +1,45 @@ +//go:build netbsd && arm64 +// +build netbsd,arm64 + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs types_netbsd.go + +package disk + +const ( + sizeOfStatvfs = 0xce0 +) + +type ( + Statvfs struct { + Flag uint64 + Bsize uint64 + Frsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx _Ctype_struct___0 + Fsid uint64 + Namemax uint64 + Owner uint32 + Spare [4]uint64 + Fstypename [32]uint8 + Mntonname [1024]uint8 + Mntfromname [1024]uint8 + Mntfromlabel [1024]uint8 + } +) + +type _Ctype_struct___0 struct { + FsidVal [2]int32 +} diff --git a/vendor/github.com/shirou/gopsutil/v3/disk/disk_solaris.go b/vendor/github.com/shirou/gopsutil/v3/disk/disk_solaris.go index 934d651f..5d6ea865 100644 --- a/vendor/github.com/shirou/gopsutil/v3/disk/disk_solaris.go +++ b/vendor/github.com/shirou/gopsutil/v3/disk/disk_solaris.go @@ -83,6 +83,8 @@ func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, erro return ret, err } +var kstatSplit = regexp.MustCompile(`[:\s]+`) + func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOCountersStat, error) { var issolaris bool if runtime.GOOS == "illumos" { @@ -107,7 +109,6 @@ func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOC writesarr := make(map[string]uint64) rtimearr := make(map[string]uint64) wtimearr := make(map[string]uint64) - re := regexp.MustCompile(`[:\s]+`) // in case the name is "/dev/sda1", then convert to "sda1" for i, name := range names { @@ -115,7 +116,7 @@ func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOC } for _, line := range lines { - fields := re.Split(line, -1) + fields := kstatSplit.Split(line, -1) if len(fields) == 0 { continue } diff --git a/vendor/github.com/shirou/gopsutil/v3/internal/common/common.go b/vendor/github.com/shirou/gopsutil/v3/internal/common/common.go index 7a31d251..99ed6a58 100644 --- a/vendor/github.com/shirou/gopsutil/v3/internal/common/common.go +++ b/vendor/github.com/shirou/gopsutil/v3/internal/common/common.go @@ -14,7 +14,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/url" "os" "os/exec" @@ -87,7 +86,7 @@ func (i FakeInvoke) Command(name string, arg ...string) ([]byte, error) { fpath += "_" + i.Suffix } if PathExists(fpath) { - return ioutil.ReadFile(fpath) + return os.ReadFile(fpath) } return []byte{}, fmt.Errorf("could not find testdata: %s", fpath) } @@ -100,7 +99,7 @@ var ErrNotImplementedError = errors.New("not implemented yet") // ReadFile reads contents from a file func ReadFile(filename string) (string, error) { - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filename) if err != nil { return "", err } diff --git a/vendor/github.com/shirou/gopsutil/v3/internal/common/common_netbsd.go b/vendor/github.com/shirou/gopsutil/v3/internal/common/common_netbsd.go new file mode 100644 index 00000000..efbc710a --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/internal/common/common_netbsd.go @@ -0,0 +1,66 @@ +//go:build netbsd +// +build netbsd + +package common + +import ( + "os" + "os/exec" + "strings" + "unsafe" + + "golang.org/x/sys/unix" +) + +func DoSysctrl(mib string) ([]string, error) { + cmd := exec.Command("sysctl", "-n", mib) + cmd.Env = getSysctrlEnv(os.Environ()) + out, err := cmd.Output() + if err != nil { + return []string{}, err + } + v := strings.Replace(string(out), "{ ", "", 1) + v = strings.Replace(string(v), " }", "", 1) + values := strings.Fields(string(v)) + + return values, nil +} + +func CallSyscall(mib []int32) ([]byte, uint64, error) { + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + + // get required buffer size + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + var b []byte + return b, length, err + } + if length == 0 { + var b []byte + return b, length, err + } + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} diff --git a/vendor/github.com/shirou/gopsutil/v3/mem/mem.go b/vendor/github.com/shirou/gopsutil/v3/mem/mem.go index ff960dac..edaf268b 100644 --- a/vendor/github.com/shirou/gopsutil/v3/mem/mem.go +++ b/vendor/github.com/shirou/gopsutil/v3/mem/mem.go @@ -50,6 +50,7 @@ type VirtualMemoryStat struct { // https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s2-proc-meminfo.html // https://www.kernel.org/doc/Documentation/filesystems/proc.txt // https://www.kernel.org/doc/Documentation/vm/overcommit-accounting + // https://www.kernel.org/doc/Documentation/vm/transhuge.txt Buffers uint64 `json:"buffers"` Cached uint64 `json:"cached"` WriteBack uint64 `json:"writeBack"` @@ -78,6 +79,7 @@ type VirtualMemoryStat struct { HugePagesRsvd uint64 `json:"hugePagesRsvd"` HugePagesSurp uint64 `json:"hugePagesSurp"` HugePageSize uint64 `json:"hugePageSize"` + AnonHugePages uint64 `json:"anonHugePages"` } type SwapMemoryStat struct { diff --git a/vendor/github.com/shirou/gopsutil/v3/mem/mem_aix_nocgo.go b/vendor/github.com/shirou/gopsutil/v3/mem/mem_aix_nocgo.go index fc9e4922..cc6a76d2 100644 --- a/vendor/github.com/shirou/gopsutil/v3/mem/mem_aix_nocgo.go +++ b/vendor/github.com/shirou/gopsutil/v3/mem/mem_aix_nocgo.go @@ -5,15 +5,12 @@ package mem import ( "context" - "regexp" "strconv" "strings" "github.com/shirou/gopsutil/v3/internal/common" ) -var whiteSpaces = regexp.MustCompile(`\s+`) - func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { vmem, swap, err := callSVMon(ctx) if err != nil { @@ -49,7 +46,7 @@ func callSVMon(ctx context.Context) (*VirtualMemoryStat, *SwapMemoryStat, error) swap := &SwapMemoryStat{} for _, line := range strings.Split(string(out), "\n") { if strings.HasPrefix(line, "memory") { - p := whiteSpaces.Split(line, 7) + p := strings.Fields(line) if len(p) > 2 { if t, err := strconv.ParseUint(p[1], 10, 64); err == nil { vmem.Total = t * pagesize @@ -65,7 +62,7 @@ func callSVMon(ctx context.Context) (*VirtualMemoryStat, *SwapMemoryStat, error) } } } else if strings.HasPrefix(line, "pg space") { - p := whiteSpaces.Split(line, 4) + p := strings.Fields(line) if len(p) > 3 { if t, err := strconv.ParseUint(p[2], 10, 64); err == nil { swap.Total = t * pagesize diff --git a/vendor/github.com/shirou/gopsutil/v3/mem/mem_bsd.go b/vendor/github.com/shirou/gopsutil/v3/mem/mem_bsd.go index ce930fbe..ef867d74 100644 --- a/vendor/github.com/shirou/gopsutil/v3/mem/mem_bsd.go +++ b/vendor/github.com/shirou/gopsutil/v3/mem/mem_bsd.go @@ -1,5 +1,5 @@ -//go:build freebsd || openbsd -// +build freebsd openbsd +//go:build freebsd || openbsd || netbsd +// +build freebsd openbsd netbsd package mem diff --git a/vendor/github.com/shirou/gopsutil/v3/mem/mem_fallback.go b/vendor/github.com/shirou/gopsutil/v3/mem/mem_fallback.go index 0b6c528f..697fd870 100644 --- a/vendor/github.com/shirou/gopsutil/v3/mem/mem_fallback.go +++ b/vendor/github.com/shirou/gopsutil/v3/mem/mem_fallback.go @@ -1,5 +1,5 @@ -//go:build !darwin && !linux && !freebsd && !openbsd && !solaris && !windows && !plan9 && !aix -// +build !darwin,!linux,!freebsd,!openbsd,!solaris,!windows,!plan9,!aix +//go:build !darwin && !linux && !freebsd && !openbsd && !solaris && !windows && !plan9 && !aix && !netbsd +// +build !darwin,!linux,!freebsd,!openbsd,!solaris,!windows,!plan9,!aix,!netbsd package mem diff --git a/vendor/github.com/shirou/gopsutil/v3/mem/mem_linux.go b/vendor/github.com/shirou/gopsutil/v3/mem/mem_linux.go index 93533172..214a91e4 100644 --- a/vendor/github.com/shirou/gopsutil/v3/mem/mem_linux.go +++ b/vendor/github.com/shirou/gopsutil/v3/mem/mem_linux.go @@ -311,6 +311,12 @@ func fillFromMeminfoWithContext(ctx context.Context) (*VirtualMemoryStat, *Virtu return ret, retEx, err } ret.HugePageSize = t * 1024 + case "AnonHugePages": + t, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return ret, retEx, err + } + ret.AnonHugePages = t * 1024 } } diff --git a/vendor/github.com/shirou/gopsutil/v3/mem/mem_netbsd.go b/vendor/github.com/shirou/gopsutil/v3/mem/mem_netbsd.go new file mode 100644 index 00000000..d1f54eca --- /dev/null +++ b/vendor/github.com/shirou/gopsutil/v3/mem/mem_netbsd.go @@ -0,0 +1,87 @@ +//go:build netbsd +// +build netbsd + +package mem + +import ( + "context" + "errors" + "fmt" + + "golang.org/x/sys/unix" +) + +func GetPageSize() (uint64, error) { + return GetPageSizeWithContext(context.Background()) +} + +func GetPageSizeWithContext(ctx context.Context) (uint64, error) { + uvmexp, err := unix.SysctlUvmexp("vm.uvmexp2") + if err != nil { + return 0, err + } + return uint64(uvmexp.Pagesize), nil +} + +func VirtualMemory() (*VirtualMemoryStat, error) { + return VirtualMemoryWithContext(context.Background()) +} + +func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { + uvmexp, err := unix.SysctlUvmexp("vm.uvmexp2") + if err != nil { + return nil, err + } + p := uint64(uvmexp.Pagesize) + + ret := &VirtualMemoryStat{ + Total: uint64(uvmexp.Npages) * p, + Free: uint64(uvmexp.Free) * p, + Active: uint64(uvmexp.Active) * p, + Inactive: uint64(uvmexp.Inactive) * p, + Cached: 0, // not available + Wired: uint64(uvmexp.Wired) * p, + } + + ret.Available = ret.Inactive + ret.Cached + ret.Free + ret.Used = ret.Total - ret.Available + ret.UsedPercent = float64(ret.Used) / float64(ret.Total) * 100.0 + + // Get buffers from vm.bufmem sysctl + ret.Buffers, err = unix.SysctlUint64("vm.bufmem") + if err != nil { + return nil, err + } + + return ret, nil +} + +// Return swapctl summary info +func SwapMemory() (*SwapMemoryStat, error) { + return SwapMemoryWithContext(context.Background()) +} + +func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { + out, err := invoke.CommandWithContext(ctx, "swapctl", "-sk") + if err != nil { + return &SwapMemoryStat{}, nil + } + + line := string(out) + var total, used, free uint64 + + _, err = fmt.Sscanf(line, + "total: %d 1K-blocks allocated, %d used, %d available", + &total, &used, &free) + if err != nil { + return nil, errors.New("failed to parse swapctl output") + } + + percent := float64(used) / float64(total) * 100 + return &SwapMemoryStat{ + Total: total * 1024, + Used: used * 1024, + Free: free * 1024, + UsedPercent: percent, + }, nil +} diff --git a/vendor/github.com/shirou/gopsutil/v3/net/net_linux.go b/vendor/github.com/shirou/gopsutil/v3/net/net_linux.go index de0ea734..6e8ce67f 100644 --- a/vendor/github.com/shirou/gopsutil/v3/net/net_linux.go +++ b/vendor/github.com/shirou/gopsutil/v3/net/net_linux.go @@ -10,7 +10,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net" "os" "strconv" @@ -643,7 +642,7 @@ func (p *process) getUids(ctx context.Context) ([]int32, error) { func (p *process) fillFromStatus(ctx context.Context) error { pid := p.Pid statPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "status") - contents, err := ioutil.ReadFile(statPath) + contents, err := os.ReadFile(statPath) if err != nil { return err } @@ -784,7 +783,7 @@ func processInetWithContext(ctx context.Context, file string, kind netConnection // This minimizes duplicates in the returned connections // For more info: // https://github.com/shirou/gopsutil/pull/361 - contents, err := ioutil.ReadFile(file) + contents, err := os.ReadFile(file) if err != nil { return nil, err } @@ -845,7 +844,7 @@ func processUnix(file string, kind netConnectionKindType, inodes map[string][]in // This minimizes duplicates in the returned connections // For more info: // https://github.com/shirou/gopsutil/pull/361 - contents, err := ioutil.ReadFile(file) + contents, err := os.ReadFile(file) if err != nil { return nil, err } diff --git a/vendor/github.com/shirou/gopsutil/v3/net/net_solaris.go b/vendor/github.com/shirou/gopsutil/v3/net/net_solaris.go index 7f1f5c86..79d8ac30 100644 --- a/vendor/github.com/shirou/gopsutil/v3/net/net_solaris.go +++ b/vendor/github.com/shirou/gopsutil/v3/net/net_solaris.go @@ -23,6 +23,8 @@ func IOCounters(pernic bool) ([]IOCountersStat, error) { return IOCountersWithContext(context.Background(), pernic) } +var kstatSplit = regexp.MustCompile(`[:\s]+`) + func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat, error) { // collect all the net class's links with below statistics filterstr := "/^(?!vnic)/::phys:/^rbytes64$|^ipackets64$|^idrops64$|^ierrors$|^obytes64$|^opackets64$|^odrops64$|^oerrors$/" @@ -47,9 +49,8 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat, odrops64arr := make(map[string]uint64) oerrorsarr := make(map[string]uint64) - re := regexp.MustCompile(`[:\s]+`) for _, line := range lines { - fields := re.Split(line, -1) + fields := kstatSplit.Split(line, -1) interfaceName := fields[0] instance := fields[1] switch fields[3] { diff --git a/vendor/github.com/shirou/gopsutil/v3/process/process_freebsd.go b/vendor/github.com/shirou/gopsutil/v3/process/process_freebsd.go index 85134b7e..40b10e14 100644 --- a/vendor/github.com/shirou/gopsutil/v3/process/process_freebsd.go +++ b/vendor/github.com/shirou/gopsutil/v3/process/process_freebsd.go @@ -286,11 +286,11 @@ func (p *Process) ChildrenWithContext(ctx context.Context) ([]*Process, error) { } func (p *Process) ConnectionsWithContext(ctx context.Context) ([]net.ConnectionStat, error) { - return nil, common.ErrNotImplementedError + return net.ConnectionsPidWithContext(ctx, "all", p.Pid) } func (p *Process) ConnectionsMaxWithContext(ctx context.Context, max int) ([]net.ConnectionStat, error) { - return nil, common.ErrNotImplementedError + return net.ConnectionsPidMaxWithContext(ctx, "all", p.Pid, max) } func ProcessesWithContext(ctx context.Context) ([]*Process, error) { diff --git a/vendor/github.com/shirou/gopsutil/v3/process/process_linux.go b/vendor/github.com/shirou/gopsutil/v3/process/process_linux.go index 37cb7ca4..f7989cd2 100644 --- a/vendor/github.com/shirou/gopsutil/v3/process/process_linux.go +++ b/vendor/github.com/shirou/gopsutil/v3/process/process_linux.go @@ -9,7 +9,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "math" "os" "path/filepath" @@ -136,7 +135,7 @@ func (p *Process) ForegroundWithContext(ctx context.Context) (bool, error) { // see https://github.com/shirou/gopsutil/issues/596#issuecomment-432707831 for implementation details pid := p.Pid statPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "stat") - contents, err := ioutil.ReadFile(statPath) + contents, err := os.ReadFile(statPath) if err != nil { return false, err } @@ -391,7 +390,7 @@ func (p *Process) MemoryMapsWithContext(ctx context.Context, grouped bool) (*[]M smapsPath = smapsRollupPath } } - contents, err := ioutil.ReadFile(smapsPath) + contents, err := os.ReadFile(smapsPath) if err != nil { return nil, err } @@ -484,7 +483,7 @@ func (p *Process) MemoryMapsWithContext(ctx context.Context, grouped bool) (*[]M func (p *Process) EnvironWithContext(ctx context.Context) ([]string, error) { environPath := common.HostProcWithContext(ctx, strconv.Itoa(int(p.Pid)), "environ") - environContent, err := ioutil.ReadFile(environPath) + environContent, err := os.ReadFile(environPath) if err != nil { return nil, err } @@ -668,7 +667,7 @@ func (p *Process) fillFromExeWithContext(ctx context.Context) (string, error) { func (p *Process) fillFromCmdlineWithContext(ctx context.Context) (string, error) { pid := p.Pid cmdPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "cmdline") - cmdline, err := ioutil.ReadFile(cmdPath) + cmdline, err := os.ReadFile(cmdPath) if err != nil { return "", err } @@ -682,7 +681,7 @@ func (p *Process) fillFromCmdlineWithContext(ctx context.Context) (string, error func (p *Process) fillSliceFromCmdlineWithContext(ctx context.Context) ([]string, error) { pid := p.Pid cmdPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "cmdline") - cmdline, err := ioutil.ReadFile(cmdPath) + cmdline, err := os.ReadFile(cmdPath) if err != nil { return nil, err } @@ -705,7 +704,7 @@ func (p *Process) fillSliceFromCmdlineWithContext(ctx context.Context) ([]string func (p *Process) fillFromIOWithContext(ctx context.Context) (*IOCountersStat, error) { pid := p.Pid ioPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "io") - ioline, err := ioutil.ReadFile(ioPath) + ioline, err := os.ReadFile(ioPath) if err != nil { return nil, err } @@ -741,7 +740,7 @@ func (p *Process) fillFromIOWithContext(ctx context.Context) (*IOCountersStat, e func (p *Process) fillFromStatmWithContext(ctx context.Context) (*MemoryInfoStat, *MemoryInfoExStat, error) { pid := p.Pid memPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "statm") - contents, err := ioutil.ReadFile(memPath) + contents, err := os.ReadFile(memPath) if err != nil { return nil, nil, err } @@ -802,7 +801,7 @@ func (p *Process) fillNameWithContext(ctx context.Context) error { func (p *Process) fillFromCommWithContext(ctx context.Context) error { pid := p.Pid statPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "comm") - contents, err := ioutil.ReadFile(statPath) + contents, err := os.ReadFile(statPath) if err != nil { return err } @@ -819,7 +818,7 @@ func (p *Process) fillFromStatus() error { func (p *Process) fillFromStatusWithContext(ctx context.Context) error { pid := p.Pid statPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "status") - contents, err := ioutil.ReadFile(statPath) + contents, err := os.ReadFile(statPath) if err != nil { return err } @@ -1026,7 +1025,7 @@ func (p *Process) fillFromTIDStatWithContext(ctx context.Context, tid int32) (ui statPath = common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "task", strconv.Itoa(int(tid)), "stat") } - contents, err := ioutil.ReadFile(statPath) + contents, err := os.ReadFile(statPath) if err != nil { return 0, 0, nil, 0, 0, 0, nil, err } diff --git a/vendor/github.com/shirou/gopsutil/v3/process/process_solaris.go b/vendor/github.com/shirou/gopsutil/v3/process/process_solaris.go index ad1c3cfc..dd4bd476 100644 --- a/vendor/github.com/shirou/gopsutil/v3/process/process_solaris.go +++ b/vendor/github.com/shirou/gopsutil/v3/process/process_solaris.go @@ -3,7 +3,6 @@ package process import ( "bytes" "context" - "io/ioutil" "os" "strconv" "strings" @@ -232,7 +231,7 @@ func (p *Process) fillFromPathAOutWithContext(ctx context.Context) (string, erro func (p *Process) fillFromExecnameWithContext(ctx context.Context) (string, error) { pid := p.Pid execNamePath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "execname") - exe, err := ioutil.ReadFile(execNamePath) + exe, err := os.ReadFile(execNamePath) if err != nil { return "", err } @@ -242,7 +241,7 @@ func (p *Process) fillFromExecnameWithContext(ctx context.Context) (string, erro func (p *Process) fillFromCmdlineWithContext(ctx context.Context) (string, error) { pid := p.Pid cmdPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "cmdline") - cmdline, err := ioutil.ReadFile(cmdPath) + cmdline, err := os.ReadFile(cmdPath) if err != nil { return "", err } @@ -259,7 +258,7 @@ func (p *Process) fillFromCmdlineWithContext(ctx context.Context) (string, error func (p *Process) fillSliceFromCmdlineWithContext(ctx context.Context) ([]string, error) { pid := p.Pid cmdPath := common.HostProcWithContext(ctx, strconv.Itoa(int(pid)), "cmdline") - cmdline, err := ioutil.ReadFile(cmdPath) + cmdline, err := os.ReadFile(cmdPath) if err != nil { return nil, err } diff --git a/vendor/github.com/sosodev/duration/.gitignore b/vendor/github.com/sosodev/duration/.gitignore new file mode 100644 index 00000000..485dee64 --- /dev/null +++ b/vendor/github.com/sosodev/duration/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/vendor/github.com/sosodev/duration/LICENSE b/vendor/github.com/sosodev/duration/LICENSE new file mode 100644 index 00000000..0e660e6f --- /dev/null +++ b/vendor/github.com/sosodev/duration/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Kyle McGough + +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/sosodev/duration/duration.go b/vendor/github.com/sosodev/duration/duration.go new file mode 100644 index 00000000..17235535 --- /dev/null +++ b/vendor/github.com/sosodev/duration/duration.go @@ -0,0 +1,301 @@ +package duration + +import ( + "errors" + "fmt" + "math" + "strconv" + "time" + "unicode" +) + +// Duration holds all the smaller units that make up the duration +type Duration struct { + Years float64 + Months float64 + Weeks float64 + Days float64 + Hours float64 + Minutes float64 + Seconds float64 + Negative bool +} + +const ( + parsingPeriod = iota + parsingTime + + hoursPerDay = 24 + hoursPerWeek = hoursPerDay * 7 + hoursPerMonth = hoursPerYear / 12 + hoursPerYear = hoursPerDay * 365 + + nsPerSecond = 1000000000 + nsPerMinute = nsPerSecond * 60 + nsPerHour = nsPerMinute * 60 + nsPerDay = nsPerHour * hoursPerDay + nsPerWeek = nsPerHour * hoursPerWeek + nsPerMonth = nsPerHour * hoursPerMonth + nsPerYear = nsPerHour * hoursPerYear +) + +var ( + // ErrUnexpectedInput is returned when an input in the duration string does not match expectations + ErrUnexpectedInput = errors.New("unexpected input") +) + +// Parse attempts to parse the given duration string into a *Duration, +// if parsing fails an error is returned instead +func Parse(d string) (*Duration, error) { + state := parsingPeriod + duration := &Duration{} + num := "" + var err error + + for _, char := range d { + switch char { + case '-': + duration.Negative = true + case 'P': + state = parsingPeriod + case 'T': + state = parsingTime + case 'Y': + if state != parsingPeriod { + return nil, ErrUnexpectedInput + } + + duration.Years, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + case 'M': + if state == parsingPeriod { + duration.Months, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + } else if state == parsingTime { + duration.Minutes, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + } + case 'W': + if state != parsingPeriod { + return nil, ErrUnexpectedInput + } + + duration.Weeks, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + case 'D': + if state != parsingPeriod { + return nil, ErrUnexpectedInput + } + + duration.Days, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + case 'H': + if state != parsingTime { + return nil, ErrUnexpectedInput + } + + duration.Hours, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + case 'S': + if state != parsingTime { + return nil, ErrUnexpectedInput + } + + duration.Seconds, err = strconv.ParseFloat(num, 64) + if err != nil { + return nil, err + } + num = "" + default: + if unicode.IsNumber(char) || char == '.' { + num += string(char) + continue + } + + return nil, ErrUnexpectedInput + } + } + + return duration, nil +} + +// FromTimeDuration converts the given time.Duration into duration.Duration. +// Note that for *Duration's with period values of a month or year that the duration becomes a bit fuzzy +// since obviously those things vary month to month and year to year +func FromTimeDuration(d time.Duration) *Duration { + duration := &Duration{} + if d == 0 { + return duration + } + + if d < 0 { + d = -d + duration.Negative = true + } + + if d.Hours() >= hoursPerYear { + duration.Years = math.Floor(d.Hours() / hoursPerYear) + d -= time.Duration(duration.Years) * nsPerYear + } + if d.Hours() >= hoursPerMonth { + duration.Months = math.Floor(d.Hours() / hoursPerMonth) + d -= time.Duration(duration.Months) * nsPerMonth + } + if d.Hours() >= hoursPerWeek { + duration.Weeks = math.Floor(d.Hours() / hoursPerWeek) + d -= time.Duration(duration.Weeks) * nsPerWeek + } + if d.Hours() >= hoursPerDay { + duration.Days = math.Floor(d.Hours() / hoursPerDay) + d -= time.Duration(duration.Days) * nsPerDay + } + if d.Hours() >= 1 { + duration.Hours = math.Floor(d.Hours()) + d -= time.Duration(duration.Hours) * nsPerHour + } + if d.Minutes() >= 1 { + duration.Minutes = math.Floor(d.Minutes()) + d -= time.Duration(duration.Minutes) * nsPerMinute + } + duration.Seconds = d.Seconds() + + return duration +} + +// Format formats the given time.Duration into an ISO 8601 duration string (e.g. P1DT6H5M), +// negative durations are prefixed with a minus sign, for a zero duration "PT0S" is returned. +// Note that for *Duration's with period values of a month or year that the duration becomes a bit fuzzy +// since obviously those things vary month to month and year to year +func Format(d time.Duration) string { + return FromTimeDuration(d).String() +} + +// ToTimeDuration converts the *Duration to the standard library's time.Duration. +// Note that for *Duration's with period values of a month or year that the duration becomes a bit fuzzy +// since obviously those things vary month to month and year to year +func (duration *Duration) ToTimeDuration() time.Duration { + var timeDuration time.Duration + + // zero checks are here to avoid unnecessary math operations, on a durations such as `PT5M` + if duration.Years != 0 { + timeDuration += time.Duration(math.Round(duration.Years * nsPerYear)) + } + if duration.Months != 0 { + timeDuration += time.Duration(math.Round(duration.Months * nsPerMonth)) + } + if duration.Weeks != 0 { + timeDuration += time.Duration(math.Round(duration.Weeks * nsPerWeek)) + } + if duration.Days != 0 { + timeDuration += time.Duration(math.Round(duration.Days * nsPerDay)) + } + if duration.Hours != 0 { + timeDuration += time.Duration(math.Round(duration.Hours * nsPerHour)) + } + if duration.Minutes != 0 { + timeDuration += time.Duration(math.Round(duration.Minutes * nsPerMinute)) + } + if duration.Seconds != 0 { + timeDuration += time.Duration(math.Round(duration.Seconds * nsPerSecond)) + } + if duration.Negative { + timeDuration = -timeDuration + } + + return timeDuration +} + +// String returns the ISO8601 duration string for the *Duration +func (duration *Duration) String() string { + d := "P" + hasTime := false + + appendD := func(designator string, value float64, isTime bool) { + if !hasTime && isTime { + d += "T" + hasTime = true + } + + d += strconv.FormatFloat(value, 'f', -1, 64) + designator + } + + if duration.Years != 0 { + appendD("Y", duration.Years, false) + } + + if duration.Months != 0 { + appendD("M", duration.Months, false) + } + + if duration.Weeks != 0 { + appendD("W", duration.Weeks, false) + } + + if duration.Days != 0 { + appendD("D", duration.Days, false) + } + + if duration.Hours != 0 { + appendD("H", duration.Hours, true) + } + + if duration.Minutes != 0 { + appendD("M", duration.Minutes, true) + } + + if duration.Seconds != 0 { + appendD("S", duration.Seconds, true) + } + + // if the duration is zero, return "PT0S" + if d == "P" { + d += "T0S" + } + + if duration.Negative { + return "-" + d + } + + return d +} + +func (duration Duration) MarshalJSON() ([]byte, error) { + return []byte("\"" + duration.String() + "\""), nil +} + +func (duration *Duration) UnmarshalJSON(source []byte) error { + strVal := string(source) + if len(strVal) < 2 { + return fmt.Errorf("invalid ISO 8601 duration: %s", strVal) + } + strVal = strVal[1 : len(strVal)-1] + + if strVal == "null" { + return nil + } + + parsed, err := Parse(strVal) + if err != nil { + return fmt.Errorf("invalid ISO 8601 duration: %s", strVal) + } + *duration = *parsed + return nil +} diff --git a/vendor/github.com/sosodev/duration/readme.md b/vendor/github.com/sosodev/duration/readme.md new file mode 100644 index 00000000..ec987dc5 --- /dev/null +++ b/vendor/github.com/sosodev/duration/readme.md @@ -0,0 +1,54 @@ +# duration + +[![Go Reference](https://pkg.go.dev/badge/github.com/sosodev/duration.svg)](https://pkg.go.dev/github.com/sosodev/duration) + +It's a Go module for parsing [ISO 8601 durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) and converting them to the often much more useful `time.Duration`. + +## why? + +ISO 8601 is a pretty common standard and sometimes these durations show up in the wild. + +## installation + +`go get github.com/sosodev/duration` + +## [usage](https://go.dev/play/p/Nz5akjy1c6W) + +```go +package main + +import ( + "fmt" + "time" + "github.com/sosodev/duration" +) + +func main() { + d, err := duration.Parse("P3Y6M4DT12H30M5.5S") + if err != nil { + panic(err) + } + + fmt.Println(d.Years) // 3 + fmt.Println(d.Months) // 6 + fmt.Println(d.Days) // 4 + fmt.Println(d.Hours) // 12 + fmt.Println(d.Minutes) // 30 + fmt.Println(d.Seconds) // 5.5 + + d, err = duration.Parse("T33.3S") + if err != nil { + panic(err) + } + + fmt.Println(d.ToTimeDuration() == time.Second*33+time.Millisecond*300) // true +} +``` + +## correctness + +This module aims to implement the ISO 8601 duration specification correctly. It properly supports fractional units and has unit tests +that assert the correctness of it's parsing and conversion to a `time.Duration`. + +With that said durations with months or years specified will be converted to `time.Duration` with a little fuzziness. Since I +couldn't find a standard value, and they obviously vary, for those I used `2.628e+15` nanoseconds for a month and `3.154e+16` nanoseconds for a year. diff --git a/vendor/github.com/tklauser/go-sysconf/.cirrus.yml b/vendor/github.com/tklauser/go-sysconf/.cirrus.yml index 1b27f196..45cab03e 100644 --- a/vendor/github.com/tklauser/go-sysconf/.cirrus.yml +++ b/vendor/github.com/tklauser/go-sysconf/.cirrus.yml @@ -1,6 +1,6 @@ env: CIRRUS_CLONE_DEPTH: 1 - GO_VERSION: go1.20 + GO_VERSION: go1.21.3 freebsd_12_task: freebsd_instance: diff --git a/vendor/github.com/tklauser/go-sysconf/sysconf_linux.go b/vendor/github.com/tklauser/go-sysconf/sysconf_linux.go index 5fb49ac7..9af70070 100644 --- a/vendor/github.com/tklauser/go-sysconf/sysconf_linux.go +++ b/vendor/github.com/tklauser/go-sysconf/sysconf_linux.go @@ -6,7 +6,6 @@ package sysconf import ( "bufio" - "io/ioutil" "os" "runtime" "strconv" @@ -26,7 +25,7 @@ const ( ) func readProcFsInt64(path string, fallback int64) int64 { - data, err := ioutil.ReadFile(path) + data, err := os.ReadFile(path) if err != nil { return fallback } @@ -86,10 +85,16 @@ func getNprocsProcStat() (int64, error) { s := bufio.NewScanner(f) for s.Scan() { if line := strings.TrimSpace(s.Text()); strings.HasPrefix(line, "cpu") { - l := strings.SplitN(line, " ", 2) - _, err := strconv.ParseInt(l[0][3:], 10, 64) - if err == nil { - count++ + cpu, _, found := strings.Cut(line, " ") + if found { + // skip first line with accumulated values + if cpu == "cpu" { + continue + } + _, err := strconv.ParseInt(cpu[len("cpu"):], 10, 64) + if err == nil { + count++ + } } } else { // The current format of /proc/stat has all the @@ -98,6 +103,9 @@ func getNprocsProcStat() (int64, error) { break } } + if err := s.Err(); err != nil { + return -1, err + } return count, nil } diff --git a/vendor/github.com/tklauser/go-sysconf/sysconf_netbsd.go b/vendor/github.com/tklauser/go-sysconf/sysconf_netbsd.go index 325d4a6a..40f6c345 100644 --- a/vendor/github.com/tklauser/go-sysconf/sysconf_netbsd.go +++ b/vendor/github.com/tklauser/go-sysconf/sysconf_netbsd.go @@ -25,10 +25,10 @@ const ( _POSIX2_UPE = -1 ) -var ( - clktck int64 - clktckOnce sync.Once -) +var clktck struct { + sync.Once + v int64 +} func sysconfPOSIX(name int) (int64, error) { // NetBSD does not define all _POSIX_* values used in sysconf_posix.go @@ -42,7 +42,6 @@ func sysconf(name int) (int64, error) { // Duplicate the relevant values here. switch name { - // 1003.1 case SC_ARG_MAX: return sysctl32("kern.argmax"), nil @@ -55,13 +54,14 @@ func sysconf(name int) (int64, error) { } return -1, nil case SC_CLK_TCK: - clktckOnce.Do(func() { - clktck = -1 + // TODO: use sync.OnceValue once Go 1.21 is the minimal supported version + clktck.Do(func() { + clktck.v = -1 if ci, err := unix.SysctlClockinfo("kern.clockrate"); err == nil { - clktck = int64(ci.Hz) + clktck.v = int64(ci.Hz) } }) - return clktck, nil + return clktck.v, nil case SC_NGROUPS_MAX: return sysctl32("kern.ngroups"), nil case SC_JOB_CONTROL: diff --git a/vendor/github.com/tklauser/numcpus/.cirrus.yml b/vendor/github.com/tklauser/numcpus/.cirrus.yml index 69c6ced5..9ea6787b 100644 --- a/vendor/github.com/tklauser/numcpus/.cirrus.yml +++ b/vendor/github.com/tklauser/numcpus/.cirrus.yml @@ -1,6 +1,6 @@ env: CIRRUS_CLONE_DEPTH: 1 - GO_VERSION: go1.20 + GO_VERSION: go1.21.3 freebsd_12_task: freebsd_instance: diff --git a/vendor/github.com/tklauser/numcpus/numcpus_linux.go b/vendor/github.com/tklauser/numcpus/numcpus_linux.go index 1a30525b..7e75cb06 100644 --- a/vendor/github.com/tklauser/numcpus/numcpus_linux.go +++ b/vendor/github.com/tklauser/numcpus/numcpus_linux.go @@ -15,7 +15,6 @@ package numcpus import ( - "io/ioutil" "os" "path/filepath" "strconv" @@ -35,7 +34,7 @@ func getFromCPUAffinity() (int, error) { } func readCPURange(file string) (int, error) { - buf, err := ioutil.ReadFile(filepath.Join(sysfsCPUBasePath, file)) + buf, err := os.ReadFile(filepath.Join(sysfsCPUBasePath, file)) if err != nil { return 0, err } @@ -48,16 +47,16 @@ func parseCPURange(cpus string) (int, error) { if len(cpuRange) == 0 { continue } - rangeOp := strings.SplitN(cpuRange, "-", 2) - first, err := strconv.ParseUint(rangeOp[0], 10, 32) + from, to, found := strings.Cut(cpuRange, "-") + first, err := strconv.ParseUint(from, 10, 32) if err != nil { return 0, err } - if len(rangeOp) == 1 { + if !found { n++ continue } - last, err := strconv.ParseUint(rangeOp[1], 10, 32) + last, err := strconv.ParseUint(to, 10, 32) if err != nil { return 0, err } @@ -89,7 +88,7 @@ func getConfigured() (int, error) { } func getKernelMax() (int, error) { - buf, err := ioutil.ReadFile(filepath.Join(sysfsCPUBasePath, "kernel_max")) + buf, err := os.ReadFile(filepath.Join(sysfsCPUBasePath, "kernel_max")) if err != nil { return 0, err } diff --git a/vendor/github.com/vektah/gqlparser/v2/ast/path.go b/vendor/github.com/vektah/gqlparser/v2/ast/path.go index be1a9e4e..4f5c6748 100644 --- a/vendor/github.com/vektah/gqlparser/v2/ast/path.go +++ b/vendor/github.com/vektah/gqlparser/v2/ast/path.go @@ -18,6 +18,9 @@ var _ PathElement = PathIndex(0) var _ PathElement = PathName("") func (path Path) String() string { + if path == nil { + return "" + } var str bytes.Buffer for i, v := range path { switch v := v.(type) { diff --git a/vendor/github.com/vektah/gqlparser/v2/ast/selection.go b/vendor/github.com/vektah/gqlparser/v2/ast/selection.go index b93558e5..c927a4d3 100644 --- a/vendor/github.com/vektah/gqlparser/v2/ast/selection.go +++ b/vendor/github.com/vektah/gqlparser/v2/ast/selection.go @@ -11,9 +11,9 @@ func (*Field) isSelection() {} func (*FragmentSpread) isSelection() {} func (*InlineFragment) isSelection() {} -func (s *Field) GetPosition() *Position { return s.Position } +func (f *Field) GetPosition() *Position { return f.Position } func (s *FragmentSpread) GetPosition() *Position { return s.Position } -func (s *InlineFragment) GetPosition() *Position { return s.Position } +func (f *InlineFragment) GetPosition() *Position { return f.Position } type Field struct { Alias string @@ -36,6 +36,6 @@ type Argument struct { Comment *CommentGroup } -func (s *Field) ArgumentMap(vars map[string]interface{}) map[string]interface{} { - return arg2map(s.Definition.Arguments, s.Arguments, vars) +func (f *Field) ArgumentMap(vars map[string]interface{}) map[string]interface{} { + return arg2map(f.Definition.Arguments, f.Arguments, vars) } diff --git a/vendor/github.com/vektah/gqlparser/v2/gqlerror/error.go b/vendor/github.com/vektah/gqlparser/v2/gqlerror/error.go index 79e9e0d1..ba624fbc 100644 --- a/vendor/github.com/vektah/gqlparser/v2/gqlerror/error.go +++ b/vendor/github.com/vektah/gqlparser/v2/gqlerror/error.go @@ -11,7 +11,7 @@ import ( // Error is the standard graphql error type described in https://spec.graphql.org/draft/#sec-Errors type Error struct { - err error `json:"-"` + Err error `json:"-"` Message string `json:"message"` Path ast.Path `json:"path,omitempty"` Locations []Location `json:"locations,omitempty"` @@ -64,12 +64,19 @@ func (err *Error) Error() string { return res.String() } -func (err Error) pathString() string { +func (err *Error) pathString() string { return err.Path.String() } -func (err Error) Unwrap() error { - return err.err +func (err *Error) Unwrap() error { + return err.Err +} + +func (err *Error) AsError() error { + if err == nil { + return nil + } + return err } func (errs List) Error() string { @@ -100,16 +107,35 @@ func (errs List) As(target interface{}) bool { } func WrapPath(path ast.Path, err error) *Error { + if err == nil { + return nil + } return &Error{ - err: err, + Err: err, Message: err.Error(), Path: path, } } func Wrap(err error) *Error { + if err == nil { + return nil + } return &Error{ - err: err, + Err: err, + Message: err.Error(), + } +} + +func WrapIfUnwrapped(err error) *Error { + if err == nil { + return nil + } + if gqlErr, ok := err.(*Error); ok { + return gqlErr + } + return &Error{ + Err: err, Message: err.Error(), } } diff --git a/vendor/github.com/vektah/gqlparser/v2/gqlparser.go b/vendor/github.com/vektah/gqlparser/v2/gqlparser.go index 3a6e2d13..d404fd0b 100644 --- a/vendor/github.com/vektah/gqlparser/v2/gqlparser.go +++ b/vendor/github.com/vektah/gqlparser/v2/gqlparser.go @@ -11,15 +11,15 @@ import ( ) func LoadSchema(str ...*ast.Source) (*ast.Schema, error) { - ast, err := validator.LoadSchema(append([]*ast.Source{validator.Prelude}, str...)...) + schema, err := validator.LoadSchema(append([]*ast.Source{validator.Prelude}, str...)...) gqlErr, ok := err.(*gqlerror.Error) if ok { - return ast, gqlErr + return schema, gqlErr } if err != nil { - return ast, gqlerror.Wrap(err) + return schema, gqlerror.Wrap(err) } - return ast, nil + return schema, nil } func MustLoadSchema(str ...*ast.Source) *ast.Schema { diff --git a/vendor/github.com/vektah/gqlparser/v2/lexer/lexer.go b/vendor/github.com/vektah/gqlparser/v2/lexer/lexer.go index cc85f22c..3fd6b4c0 100644 --- a/vendor/github.com/vektah/gqlparser/v2/lexer/lexer.go +++ b/vendor/github.com/vektah/gqlparser/v2/lexer/lexer.go @@ -55,7 +55,7 @@ func (s *Lexer) makeValueToken(kind Type, value string) (Token, error) { }, nil } -func (s *Lexer) makeError(format string, args ...interface{}) (Token, error) { +func (s *Lexer) makeError(format string, args ...interface{}) (Token, *gqlerror.Error) { column := s.endRunes - s.lineStartRunes + 1 return Token{ Kind: Invalid, @@ -74,8 +74,7 @@ func (s *Lexer) makeError(format string, args ...interface{}) (Token, error) { // This skips over whitespace and comments until it finds the next lexable // token, then lexes punctuators immediately or calls the appropriate helper // function for more complicated tokens. -func (s *Lexer) ReadToken() (token Token, err error) { - +func (s *Lexer) ReadToken() (Token, error) { s.ws() s.start = s.end s.startRunes = s.endRunes diff --git a/vendor/github.com/vektah/gqlparser/v2/parser/query.go b/vendor/github.com/vektah/gqlparser/v2/parser/query.go index 9d378fe7..a7840b27 100644 --- a/vendor/github.com/vektah/gqlparser/v2/parser/query.go +++ b/vendor/github.com/vektah/gqlparser/v2/parser/query.go @@ -120,7 +120,7 @@ func (p *parser) parseOptionalSelectionSet() SelectionSet { selections = append(selections, p.parseSelection()) }) - return SelectionSet(selections) + return selections } func (p *parser) parseRequiredSelectionSet() SelectionSet { @@ -134,7 +134,7 @@ func (p *parser) parseRequiredSelectionSet() SelectionSet { selections = append(selections, p.parseSelection()) }) - return SelectionSet(selections) + return selections } func (p *parser) parseSelection() Selection { diff --git a/vendor/github.com/vektah/gqlparser/v2/parser/schema.go b/vendor/github.com/vektah/gqlparser/v2/parser/schema.go index ca3e480e..9b13d0ca 100644 --- a/vendor/github.com/vektah/gqlparser/v2/parser/schema.go +++ b/vendor/github.com/vektah/gqlparser/v2/parser/schema.go @@ -6,35 +6,35 @@ import ( "github.com/vektah/gqlparser/v2/lexer" ) -func ParseSchema(source *Source) (*SchemaDocument, error) { - p := parser{ - lexer: lexer.New(source), - } - ast, err := p.parseSchemaDocument(), p.err - if err != nil { - return nil, err - } - - for _, def := range ast.Definitions { - def.BuiltIn = source.BuiltIn - } - for _, def := range ast.Extensions { - def.BuiltIn = source.BuiltIn - } - - return ast, nil -} - func ParseSchemas(inputs ...*Source) (*SchemaDocument, error) { - ast := &SchemaDocument{} + sd := &SchemaDocument{} for _, input := range inputs { inputAst, err := ParseSchema(input) if err != nil { return nil, err } - ast.Merge(inputAst) + sd.Merge(inputAst) } - return ast, nil + return sd, nil +} + +func ParseSchema(source *Source) (*SchemaDocument, error) { + p := parser{ + lexer: lexer.New(source), + } + sd, err := p.parseSchemaDocument(), p.err + if err != nil { + return nil, err + } + + for _, def := range sd.Definitions { + def.BuiltIn = source.BuiltIn + } + for _, def := range sd.Extensions { + def.BuiltIn = source.BuiltIn + } + + return sd, nil } func (p *parser) parseSchemaDocument() *SchemaDocument { diff --git a/vendor/github.com/vektah/gqlparser/v2/validator/schema.go b/vendor/github.com/vektah/gqlparser/v2/validator/schema.go index a1977949..5eacdf90 100644 --- a/vendor/github.com/vektah/gqlparser/v2/validator/schema.go +++ b/vendor/github.com/vektah/gqlparser/v2/validator/schema.go @@ -12,14 +12,15 @@ import ( ) func LoadSchema(inputs ...*Source) (*Schema, error) { - ast, err := parser.ParseSchemas(inputs...) + sd, err := parser.ParseSchemas(inputs...) + if err != nil { - return nil, err + return nil, gqlerror.WrapIfUnwrapped(err) } - return ValidateSchemaDocument(ast) + return ValidateSchemaDocument(sd) } -func ValidateSchemaDocument(ast *SchemaDocument) (*Schema, error) { +func ValidateSchemaDocument(sd *SchemaDocument) (*Schema, error) { schema := Schema{ Types: map[string]*Definition{}, Directives: map[string]*DirectiveDefinition{}, @@ -27,16 +28,16 @@ func ValidateSchemaDocument(ast *SchemaDocument) (*Schema, error) { Implements: map[string][]*Definition{}, } - for i, def := range ast.Definitions { + for i, def := range sd.Definitions { if schema.Types[def.Name] != nil { return nil, gqlerror.ErrorPosf(def.Position, "Cannot redeclare type %s.", def.Name) } - schema.Types[def.Name] = ast.Definitions[i] + schema.Types[def.Name] = sd.Definitions[i] } - defs := append(DefinitionList{}, ast.Definitions...) + defs := append(DefinitionList{}, sd.Definitions...) - for _, ext := range ast.Extensions { + for _, ext := range sd.Extensions { def := schema.Types[ext.Name] if def == nil { schema.Types[ext.Name] = &Definition{ @@ -80,7 +81,7 @@ func ValidateSchemaDocument(ast *SchemaDocument) (*Schema, error) { } } - for i, dir := range ast.Directives { + for i, dir := range sd.Directives { if schema.Directives[dir.Name] != nil { // While the spec says SDL must not (§3.5) explicitly define builtin // scalars, it may (§3.13) define builtin directives. Here we check for @@ -99,16 +100,16 @@ func ValidateSchemaDocument(ast *SchemaDocument) (*Schema, error) { return nil, gqlerror.ErrorPosf(dir.Position, "Cannot redeclare directive %s.", dir.Name) } } - schema.Directives[dir.Name] = ast.Directives[i] + schema.Directives[dir.Name] = sd.Directives[i] } - if len(ast.Schema) > 1 { - return nil, gqlerror.ErrorPosf(ast.Schema[1].Position, "Cannot have multiple schema entry points, consider schema extensions instead.") + if len(sd.Schema) > 1 { + return nil, gqlerror.ErrorPosf(sd.Schema[1].Position, "Cannot have multiple schema entry points, consider schema extensions instead.") } - if len(ast.Schema) == 1 { - schema.Description = ast.Schema[0].Description - for _, entrypoint := range ast.Schema[0].OperationTypes { + if len(sd.Schema) == 1 { + schema.Description = sd.Schema[0].Description + for _, entrypoint := range sd.Schema[0].OperationTypes { def := schema.Types[entrypoint.Type] if def == nil { return nil, gqlerror.ErrorPosf(entrypoint.Position, "Schema root %s refers to a type %s that does not exist.", entrypoint.Operation, entrypoint.Type) @@ -124,7 +125,7 @@ func ValidateSchemaDocument(ast *SchemaDocument) (*Schema, error) { } } - for _, ext := range ast.SchemaExtension { + for _, ext := range sd.SchemaExtension { for _, entrypoint := range ext.OperationTypes { def := schema.Types[entrypoint.Type] if def == nil { @@ -152,7 +153,7 @@ func ValidateSchemaDocument(ast *SchemaDocument) (*Schema, error) { // Inferred root operation type names should be performed only when a `schema` directive is // **not** provided, when it is, `Mutation` and `Subscription` becomes valid types and are not // assigned as a root operation on the schema. - if len(ast.Schema) == 0 { + if len(sd.Schema) == 0 { if schema.Query == nil && schema.Types["Query"] != nil { schema.Query = schema.Types["Query"] } diff --git a/vendor/github.com/vektah/gqlparser/v2/validator/walk.go b/vendor/github.com/vektah/gqlparser/v2/validator/walk.go index 6ee69e4c..1e34f037 100644 --- a/vendor/github.com/vektah/gqlparser/v2/validator/walk.go +++ b/vendor/github.com/vektah/gqlparser/v2/validator/walk.go @@ -277,7 +277,7 @@ func (w *Walker) walkSelection(parentDef *ast.Definition, it ast.Selection) { w.walkDirectives(nextParentDef, it.Directives, ast.LocationFragmentSpread) if def != nil && !w.validatedFragmentSpreads[def.Name] { - // prevent inifinite recursion + // prevent infinite recursion w.validatedFragmentSpreads[def.Name] = true w.walkSelectionSet(nextParentDef, def.SelectionSet) } diff --git a/vendor/go.uber.org/zap/.golangci.yml b/vendor/go.uber.org/zap/.golangci.yml new file mode 100644 index 00000000..fbc6df79 --- /dev/null +++ b/vendor/go.uber.org/zap/.golangci.yml @@ -0,0 +1,77 @@ +output: + # Make output more digestible with quickfix in vim/emacs/etc. + sort-results: true + print-issued-lines: false + +linters: + # We'll track the golangci-lint default linters manually + # instead of letting them change without our control. + disable-all: true + enable: + # golangci-lint defaults: + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - unused + + # Our own extras: + - gofmt + - nolintlint # lints nolint directives + - revive + +linters-settings: + govet: + # These govet checks are disabled by default, but they're useful. + enable: + - niliness + - reflectvaluecompare + - sortslice + - unusedwrite + + errcheck: + exclude-functions: + # These methods can not fail. + # They operate on an in-memory buffer. + - (*go.uber.org/zap/buffer.Buffer).Write + - (*go.uber.org/zap/buffer.Buffer).WriteByte + - (*go.uber.org/zap/buffer.Buffer).WriteString + + - (*go.uber.org/zap/zapio.Writer).Close + - (*go.uber.org/zap/zapio.Writer).Sync + - (*go.uber.org/zap/zapio.Writer).Write + # Write to zapio.Writer cannot fail, + # so io.WriteString on it cannot fail. + - io.WriteString(*go.uber.org/zap/zapio.Writer) + + # Writing a plain string to a fmt.State cannot fail. + - io.WriteString(fmt.State) + +issues: + # Print all issues reported by all linters. + max-issues-per-linter: 0 + max-same-issues: 0 + + # Don't ignore some of the issues that golangci-lint considers okay. + # This includes documenting all exported entities. + exclude-use-default: false + + exclude-rules: + # Don't warn on unused parameters. + # Parameter names are useful; replacing them with '_' is undesirable. + - linters: [revive] + text: 'unused-parameter: parameter \S+ seems to be unused, consider removing or renaming it as _' + + # staticcheck already has smarter checks for empty blocks. + # revive's empty-block linter has false positives. + # For example, as of writing this, the following is not allowed. + # for foo() { } + - linters: [revive] + text: 'empty-block: this block is empty, you can remove it' + + # Ignore logger.Sync() errcheck failures in example_test.go + # since those are intended to be uncomplicated examples. + - linters: [errcheck] + path: example_test.go + text: 'Error return value of `logger.Sync` is not checked' diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md index fe57bc08..11b46597 100644 --- a/vendor/go.uber.org/zap/CHANGELOG.md +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -1,7 +1,18 @@ # Changelog All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## 1.26.0 (14 Sep 2023) +Enhancements: +* [#1319][]: Add `WithLazy` method to `Logger` which lazily evaluates the structured +context. +* [#1350][]: String encoding is much (~50%) faster now. + +Thanks to @jquirke, @cdvr1993 for their contributions to this release. + +[#1319]: https://github.com/uber-go/zap/pull/1319 +[#1350]: https://github.com/uber-go/zap/pull/1350 ## 1.25.0 (1 Aug 2023) @@ -48,7 +59,6 @@ Enhancements: [#1147]: https://github.com/uber-go/zap/pull/1147 [#1155]: https://github.com/uber-go/zap/pull/1155 - ## 1.22.0 (8 Aug 2022) Enhancements: @@ -197,6 +207,16 @@ Enhancements: Thanks to @ash2k, @FMLS, @jimmystewpot, @Oncilla, @tsoslow, @tylitianrui, @withshubh, and @wziww for their contributions to this release. +[#865]: https://github.com/uber-go/zap/pull/865 +[#867]: https://github.com/uber-go/zap/pull/867 +[#881]: https://github.com/uber-go/zap/pull/881 +[#903]: https://github.com/uber-go/zap/pull/903 +[#912]: https://github.com/uber-go/zap/pull/912 +[#913]: https://github.com/uber-go/zap/pull/913 +[#928]: https://github.com/uber-go/zap/pull/928 +[#931]: https://github.com/uber-go/zap/pull/931 +[#936]: https://github.com/uber-go/zap/pull/936 + ## 1.16.0 (1 Sep 2020) Bugfixes: @@ -218,6 +238,17 @@ Enhancements: Thanks to @SteelPhase, @tmshn, @lixingwang, @wyxloading, @moul, @segevfiner, @andy-retailnext and @jcorbin for their contributions to this release. +[#629]: https://github.com/uber-go/zap/pull/629 +[#697]: https://github.com/uber-go/zap/pull/697 +[#828]: https://github.com/uber-go/zap/pull/828 +[#835]: https://github.com/uber-go/zap/pull/835 +[#843]: https://github.com/uber-go/zap/pull/843 +[#844]: https://github.com/uber-go/zap/pull/844 +[#852]: https://github.com/uber-go/zap/pull/852 +[#854]: https://github.com/uber-go/zap/pull/854 +[#861]: https://github.com/uber-go/zap/pull/861 +[#862]: https://github.com/uber-go/zap/pull/862 + ## 1.15.0 (23 Apr 2020) Bugfixes: @@ -234,6 +265,11 @@ Enhancements: Thanks to @danielbprice for their contributions to this release. +[#804]: https://github.com/uber-go/zap/pull/804 +[#812]: https://github.com/uber-go/zap/pull/812 +[#806]: https://github.com/uber-go/zap/pull/806 +[#813]: https://github.com/uber-go/zap/pull/813 + ## 1.14.1 (14 Mar 2020) Bugfixes: @@ -246,6 +282,10 @@ Bugfixes: Thanks to @YashishDua for their contributions to this release. +[#791]: https://github.com/uber-go/zap/pull/791 +[#795]: https://github.com/uber-go/zap/pull/795 +[#799]: https://github.com/uber-go/zap/pull/799 + ## 1.14.0 (20 Feb 2020) Enhancements: @@ -256,6 +296,11 @@ Enhancements: Thanks to @caibirdme for their contributions to this release. +[#771]: https://github.com/uber-go/zap/pull/771 +[#773]: https://github.com/uber-go/zap/pull/773 +[#775]: https://github.com/uber-go/zap/pull/775 +[#786]: https://github.com/uber-go/zap/pull/786 + ## 1.13.0 (13 Nov 2019) Enhancements: @@ -264,11 +309,15 @@ Enhancements: Thanks to @jbizzle for their contributions to this release. +[#758]: https://github.com/uber-go/zap/pull/758 + ## 1.12.0 (29 Oct 2019) Enhancements: * [#751][]: Migrate to Go modules. +[#751]: https://github.com/uber-go/zap/pull/751 + ## 1.11.0 (21 Oct 2019) Enhancements: @@ -277,6 +326,9 @@ Enhancements: Thanks to @juicemia, @uhthomas for their contributions to this release. +[#725]: https://github.com/uber-go/zap/pull/725 +[#736]: https://github.com/uber-go/zap/pull/736 + ## 1.10.0 (29 Apr 2019) Bugfixes: @@ -294,12 +346,20 @@ Enhancements: Thanks to @iaroslav-ciupin, @lelenanam, @joa, @NWilson for their contributions to this release. +[#657]: https://github.com/uber-go/zap/pull/657 +[#706]: https://github.com/uber-go/zap/pull/706 +[#610]: https://github.com/uber-go/zap/pull/610 +[#675]: https://github.com/uber-go/zap/pull/675 +[#704]: https://github.com/uber-go/zap/pull/704 + ## v1.9.1 (06 Aug 2018) Bugfixes: * [#614][]: MapObjectEncoder should not ignore empty slices. +[#614]: https://github.com/uber-go/zap/pull/614 + ## v1.9.0 (19 Jul 2018) Enhancements: @@ -309,6 +369,10 @@ Enhancements: Thanks to @nfarah86, @AlekSi, @JeanMertz, @philippgille, @etsangsplk, and @dimroc for their contributions to this release. +[#602]: https://github.com/uber-go/zap/pull/602 +[#572]: https://github.com/uber-go/zap/pull/572 +[#606]: https://github.com/uber-go/zap/pull/606 + ## v1.8.0 (13 Apr 2018) Enhancements: @@ -322,11 +386,18 @@ Bugfixes: Thanks to @DiSiqueira and @djui for their contributions to this release. +[#508]: https://github.com/uber-go/zap/pull/508 +[#518]: https://github.com/uber-go/zap/pull/518 +[#577]: https://github.com/uber-go/zap/pull/577 +[#574]: https://github.com/uber-go/zap/pull/574 + ## v1.7.1 (25 Sep 2017) Bugfixes: * [#504][]: Store strings when using AddByteString with the map encoder. +[#504]: https://github.com/uber-go/zap/pull/504 + ## v1.7.0 (21 Sep 2017) Enhancements: @@ -334,6 +405,8 @@ Enhancements: * [#487][]: Add `NewStdLogAt`, which extends `NewStdLog` by allowing the user to specify the level of the logged messages. +[#487]: https://github.com/uber-go/zap/pull/487 + ## v1.6.0 (30 Aug 2017) Enhancements: @@ -342,6 +415,9 @@ Enhancements: * [#490][]: Add a `ContextMap` method to observer logs for simpler field validation in tests. +[#490]: https://github.com/uber-go/zap/pull/490 +[#491]: https://github.com/uber-go/zap/pull/491 + ## v1.5.0 (22 Jul 2017) Enhancements: @@ -355,6 +431,11 @@ Bugfixes: Thanks to @richard-tunein and @pavius for their contributions to this release. +[#477]: https://github.com/uber-go/zap/pull/477 +[#465]: https://github.com/uber-go/zap/pull/465 +[#460]: https://github.com/uber-go/zap/pull/460 +[#470]: https://github.com/uber-go/zap/pull/470 + ## v1.4.1 (08 Jun 2017) This release fixes two bugs. @@ -364,6 +445,9 @@ Bugfixes: * [#435][]: Support a variety of case conventions when unmarshaling levels. * [#444][]: Fix a panic in the observer. +[#435]: https://github.com/uber-go/zap/pull/435 +[#444]: https://github.com/uber-go/zap/pull/444 + ## v1.4.0 (12 May 2017) This release adds a few small features and is fully backward-compatible. @@ -376,6 +460,10 @@ Enhancements: * [#431][]: Make `zap.AtomicLevel` implement `fmt.Stringer`, which makes a variety of operations a bit simpler. +[#424]: https://github.com/uber-go/zap/pull/424 +[#425]: https://github.com/uber-go/zap/pull/425 +[#431]: https://github.com/uber-go/zap/pull/431 + ## v1.3.0 (25 Apr 2017) This release adds an enhancement to zap's testing helpers as well as the @@ -387,6 +475,9 @@ Enhancements: particularly useful when testing the `SugaredLogger`. * [#416][]: Make `AtomicLevel` implement `encoding.TextMarshaler`. +[#415]: https://github.com/uber-go/zap/pull/415 +[#416]: https://github.com/uber-go/zap/pull/416 + ## v1.2.0 (13 Apr 2017) This release adds a gRPC compatibility wrapper. It is fully backward-compatible. @@ -396,6 +487,8 @@ Enhancements: * [#402][]: Add a `zapgrpc` package that wraps zap's Logger and implements `grpclog.Logger`. +[#402]: https://github.com/uber-go/zap/pull/402 + ## v1.1.0 (31 Mar 2017) This release fixes two bugs and adds some enhancements to zap's testing helpers. @@ -413,6 +506,10 @@ Enhancements: Thanks to @moitias for contributing to this release. +[#385]: https://github.com/uber-go/zap/pull/385 +[#396]: https://github.com/uber-go/zap/pull/396 +[#386]: https://github.com/uber-go/zap/pull/386 + ## v1.0.0 (14 Mar 2017) This is zap's first stable release. All exported APIs are now final, and no @@ -458,6 +555,20 @@ Enhancements: Thanks to @suyash, @htrendev, @flisky, @Ulexus, and @skipor for their contributions to this release. +[#366]: https://github.com/uber-go/zap/pull/366 +[#364]: https://github.com/uber-go/zap/pull/364 +[#371]: https://github.com/uber-go/zap/pull/371 +[#362]: https://github.com/uber-go/zap/pull/362 +[#369]: https://github.com/uber-go/zap/pull/369 +[#347]: https://github.com/uber-go/zap/pull/347 +[#373]: https://github.com/uber-go/zap/pull/373 +[#348]: https://github.com/uber-go/zap/pull/348 +[#327]: https://github.com/uber-go/zap/pull/327 +[#376]: https://github.com/uber-go/zap/pull/376 +[#346]: https://github.com/uber-go/zap/pull/346 +[#365]: https://github.com/uber-go/zap/pull/365 +[#372]: https://github.com/uber-go/zap/pull/372 + ## v1.0.0-rc.3 (7 Mar 2017) This is the third release candidate for zap's stable release. There are no @@ -479,6 +590,11 @@ Enhancements: Thanks to @ansel1 and @suyash for their contributions to this release. +[#339]: https://github.com/uber-go/zap/pull/339 +[#307]: https://github.com/uber-go/zap/pull/307 +[#353]: https://github.com/uber-go/zap/pull/353 +[#311]: https://github.com/uber-go/zap/pull/311 + ## v1.0.0-rc.2 (21 Feb 2017) This is the second release candidate for zap's stable release. It includes two @@ -516,6 +632,15 @@ Enhancements: Thanks to @skipor and @chapsuk for their contributions to this release. +[#316]: https://github.com/uber-go/zap/pull/316 +[#309]: https://github.com/uber-go/zap/pull/309 +[#317]: https://github.com/uber-go/zap/pull/317 +[#321]: https://github.com/uber-go/zap/pull/321 +[#325]: https://github.com/uber-go/zap/pull/325 +[#333]: https://github.com/uber-go/zap/pull/333 +[#326]: https://github.com/uber-go/zap/pull/326 +[#300]: https://github.com/uber-go/zap/pull/300 + ## v1.0.0-rc.1 (14 Feb 2017) This is the first release candidate for zap's stable release. There are multiple @@ -544,95 +669,3 @@ backward compatibility concerns and all functionality is new. Early zap adopters should pin to the 0.1.x minor version until they're ready to upgrade to the upcoming stable release. - -[#316]: https://github.com/uber-go/zap/pull/316 -[#309]: https://github.com/uber-go/zap/pull/309 -[#317]: https://github.com/uber-go/zap/pull/317 -[#321]: https://github.com/uber-go/zap/pull/321 -[#325]: https://github.com/uber-go/zap/pull/325 -[#333]: https://github.com/uber-go/zap/pull/333 -[#326]: https://github.com/uber-go/zap/pull/326 -[#300]: https://github.com/uber-go/zap/pull/300 -[#339]: https://github.com/uber-go/zap/pull/339 -[#307]: https://github.com/uber-go/zap/pull/307 -[#353]: https://github.com/uber-go/zap/pull/353 -[#311]: https://github.com/uber-go/zap/pull/311 -[#366]: https://github.com/uber-go/zap/pull/366 -[#364]: https://github.com/uber-go/zap/pull/364 -[#371]: https://github.com/uber-go/zap/pull/371 -[#362]: https://github.com/uber-go/zap/pull/362 -[#369]: https://github.com/uber-go/zap/pull/369 -[#347]: https://github.com/uber-go/zap/pull/347 -[#373]: https://github.com/uber-go/zap/pull/373 -[#348]: https://github.com/uber-go/zap/pull/348 -[#327]: https://github.com/uber-go/zap/pull/327 -[#376]: https://github.com/uber-go/zap/pull/376 -[#346]: https://github.com/uber-go/zap/pull/346 -[#365]: https://github.com/uber-go/zap/pull/365 -[#372]: https://github.com/uber-go/zap/pull/372 -[#385]: https://github.com/uber-go/zap/pull/385 -[#396]: https://github.com/uber-go/zap/pull/396 -[#386]: https://github.com/uber-go/zap/pull/386 -[#402]: https://github.com/uber-go/zap/pull/402 -[#415]: https://github.com/uber-go/zap/pull/415 -[#416]: https://github.com/uber-go/zap/pull/416 -[#424]: https://github.com/uber-go/zap/pull/424 -[#425]: https://github.com/uber-go/zap/pull/425 -[#431]: https://github.com/uber-go/zap/pull/431 -[#435]: https://github.com/uber-go/zap/pull/435 -[#444]: https://github.com/uber-go/zap/pull/444 -[#477]: https://github.com/uber-go/zap/pull/477 -[#465]: https://github.com/uber-go/zap/pull/465 -[#460]: https://github.com/uber-go/zap/pull/460 -[#470]: https://github.com/uber-go/zap/pull/470 -[#487]: https://github.com/uber-go/zap/pull/487 -[#490]: https://github.com/uber-go/zap/pull/490 -[#491]: https://github.com/uber-go/zap/pull/491 -[#504]: https://github.com/uber-go/zap/pull/504 -[#508]: https://github.com/uber-go/zap/pull/508 -[#518]: https://github.com/uber-go/zap/pull/518 -[#577]: https://github.com/uber-go/zap/pull/577 -[#574]: https://github.com/uber-go/zap/pull/574 -[#602]: https://github.com/uber-go/zap/pull/602 -[#572]: https://github.com/uber-go/zap/pull/572 -[#606]: https://github.com/uber-go/zap/pull/606 -[#614]: https://github.com/uber-go/zap/pull/614 -[#657]: https://github.com/uber-go/zap/pull/657 -[#706]: https://github.com/uber-go/zap/pull/706 -[#610]: https://github.com/uber-go/zap/pull/610 -[#675]: https://github.com/uber-go/zap/pull/675 -[#704]: https://github.com/uber-go/zap/pull/704 -[#725]: https://github.com/uber-go/zap/pull/725 -[#736]: https://github.com/uber-go/zap/pull/736 -[#751]: https://github.com/uber-go/zap/pull/751 -[#758]: https://github.com/uber-go/zap/pull/758 -[#771]: https://github.com/uber-go/zap/pull/771 -[#773]: https://github.com/uber-go/zap/pull/773 -[#775]: https://github.com/uber-go/zap/pull/775 -[#786]: https://github.com/uber-go/zap/pull/786 -[#791]: https://github.com/uber-go/zap/pull/791 -[#795]: https://github.com/uber-go/zap/pull/795 -[#799]: https://github.com/uber-go/zap/pull/799 -[#804]: https://github.com/uber-go/zap/pull/804 -[#812]: https://github.com/uber-go/zap/pull/812 -[#806]: https://github.com/uber-go/zap/pull/806 -[#813]: https://github.com/uber-go/zap/pull/813 -[#629]: https://github.com/uber-go/zap/pull/629 -[#697]: https://github.com/uber-go/zap/pull/697 -[#828]: https://github.com/uber-go/zap/pull/828 -[#835]: https://github.com/uber-go/zap/pull/835 -[#843]: https://github.com/uber-go/zap/pull/843 -[#844]: https://github.com/uber-go/zap/pull/844 -[#852]: https://github.com/uber-go/zap/pull/852 -[#854]: https://github.com/uber-go/zap/pull/854 -[#861]: https://github.com/uber-go/zap/pull/861 -[#862]: https://github.com/uber-go/zap/pull/862 -[#865]: https://github.com/uber-go/zap/pull/865 -[#867]: https://github.com/uber-go/zap/pull/867 -[#881]: https://github.com/uber-go/zap/pull/881 -[#903]: https://github.com/uber-go/zap/pull/903 -[#912]: https://github.com/uber-go/zap/pull/912 -[#913]: https://github.com/uber-go/zap/pull/913 -[#928]: https://github.com/uber-go/zap/pull/928 -[#931]: https://github.com/uber-go/zap/pull/931 -[#936]: https://github.com/uber-go/zap/pull/936 diff --git a/vendor/go.uber.org/zap/Makefile b/vendor/go.uber.org/zap/Makefile index 518c3fa6..eb1cee53 100644 --- a/vendor/go.uber.org/zap/Makefile +++ b/vendor/go.uber.org/zap/Makefile @@ -1,64 +1,62 @@ -export GOBIN ?= $(shell pwd)/bin +# Directory containing the Makefile. +PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +export GOBIN ?= $(PROJECT_ROOT)/bin +export PATH := $(GOBIN):$(PATH) -REVIVE = $(GOBIN)/revive -STATICCHECK = $(GOBIN)/staticcheck GOVULNCHECK = $(GOBIN)/govulncheck BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem # Directories containing independent Go modules. -# -# We track coverage only for the main module. MODULE_DIRS = . ./exp ./benchmarks ./zapgrpc/internal/test -# Many Go tools take file globs or directories as arguments instead of packages. -GO_FILES := $(shell \ - find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ - -o -name '*.go' -print | cut -b3-) +# Directories that we want to track coverage for. +COVER_DIRS = . ./exp .PHONY: all all: lint test .PHONY: lint -lint: $(REVIVE) $(STATICCHECK) - @rm -rf lint.log - @echo "Checking formatting..." - @gofmt -d -s $(GO_FILES) 2>&1 | tee lint.log - @echo "Checking vet..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go vet ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking lint..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && \ - $(REVIVE) -set_exit_status ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking staticcheck..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && $(STATICCHECK) ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking for unresolved FIXMEs..." - @git grep -i fixme | grep -v -e Makefile | tee -a lint.log - @echo "Checking for license headers..." - @./checklicense.sh | tee -a lint.log - @[ ! -s lint.log ] - @echo "Checking 'go mod tidy'..." - @make tidy - @if ! git diff --quiet; then \ - echo "'go mod tidy' resulted in changes or working tree is dirty:"; \ - git --no-pager diff; \ - fi +lint: golangci-lint tidy-lint license-lint -$(REVIVE): - cd tools && go install github.com/mgechev/revive +.PHONY: golangci-lint +golangci-lint: + @$(foreach mod,$(MODULE_DIRS), \ + (cd $(mod) && \ + echo "[lint] golangci-lint: $(mod)" && \ + golangci-lint run --path-prefix $(mod)) &&) true + +.PHONY: tidy +tidy: + @$(foreach dir,$(MODULE_DIRS), \ + (cd $(dir) && go mod tidy) &&) true + +.PHONY: tidy-lint +tidy-lint: + @$(foreach mod,$(MODULE_DIRS), \ + (cd $(mod) && \ + echo "[lint] tidy: $(mod)" && \ + go mod tidy && \ + git diff --exit-code -- go.mod go.sum) &&) true + + +.PHONY: license-lint +license-lint: + ./checklicense.sh $(GOVULNCHECK): cd tools && go install golang.org/x/vuln/cmd/govulncheck -$(STATICCHECK): - cd tools && go install honnef.co/go/tools/cmd/staticcheck - .PHONY: test test: @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go test -race ./...) &&) true .PHONY: cover cover: - go test -race -coverprofile=cover.out -coverpkg=./... ./... - go tool cover -html=cover.out -o cover.html + @$(foreach dir,$(COVER_DIRS), ( \ + cd $(dir) && \ + go test -race -coverprofile=cover.out -coverpkg=./... ./... \ + && go tool cover -html=cover.out -o cover.html) &&) true .PHONY: bench BENCH ?= . @@ -73,10 +71,6 @@ updatereadme: rm -f README.md cat .readme.tmpl | go run internal/readme/readme.go > README.md -.PHONY: tidy -tidy: - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go mod tidy) &&) true - .PHONY: vulncheck vulncheck: $(GOVULNCHECK) - $(GOVULNCHECK) ./... \ No newline at end of file + $(GOVULNCHECK) ./... diff --git a/vendor/go.uber.org/zap/array.go b/vendor/go.uber.org/zap/array.go index 5be3704a..abfccb56 100644 --- a/vendor/go.uber.org/zap/array.go +++ b/vendor/go.uber.org/zap/array.go @@ -21,6 +21,7 @@ package zap import ( + "fmt" "time" "go.uber.org/zap/zapcore" @@ -94,11 +95,137 @@ func Int8s(key string, nums []int8) Field { return Array(key, int8s(nums)) } +// Objects constructs a field with the given key, holding a list of the +// provided objects that can be marshaled by Zap. +// +// Note that these objects must implement zapcore.ObjectMarshaler directly. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the Request type, not its pointer (*Request). +// If it's on the pointer, use ObjectValues. +// +// Given an object that implements MarshalLogObject on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Author struct{ ... } +// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var authors []Author = ... +// logger.Info("loading article", zap.Objects("authors", authors)) +// +// Similarly, given a type that implements MarshalLogObject on its pointer +// receiver, you can log a slice of pointers to that object with Objects like +// so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +// +// If instead, you have a slice of values of such an object, use the +// ObjectValues constructor. +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { + return Array(key, objects[T](values)) +} + +type objects[T zapcore.ObjectMarshaler] []T + +func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + if err := arr.AppendObject(o); err != nil { + return err + } + } + return nil +} + +// ObjectMarshalerPtr is a constraint that specifies that the given type +// implements zapcore.ObjectMarshaler on a pointer receiver. +type ObjectMarshalerPtr[T any] interface { + *T + zapcore.ObjectMarshaler +} + +// ObjectValues constructs a field with the given key, holding a list of the +// provided objects, where pointers to these objects can be marshaled by Zap. +// +// Note that pointers to these objects must implement zapcore.ObjectMarshaler. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the *Request type, not the value (Request). +// If it's on the value, use Objects. +// +// Given an object that implements MarshalLogObject on the pointer receiver, +// you can log a slice of those objects with ObjectValues like so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +// +// If instead, you have a slice of pointers of such an object, use the Objects +// field constructor. +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { + return Array(key, objectValues[T, P](values)) +} + +type objectValues[T any, P ObjectMarshalerPtr[T]] []T + +func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range os { + // It is necessary for us to explicitly reference the "P" type. + // We cannot simply pass "&os[i]" to AppendObject because its type + // is "*T", which the type system does not consider as + // implementing ObjectMarshaler. + // Only the type "P" satisfies ObjectMarshaler, which we have + // to convert "*T" to explicitly. + var p P = &os[i] + if err := arr.AppendObject(p); err != nil { + return err + } + } + return nil +} + // Strings constructs a field that carries a slice of strings. func Strings(key string, ss []string) Field { return Array(key, stringArray(ss)) } +// Stringers constructs a field with the given key, holding a list of the +// output provided by the value's String method +// +// Given an object that implements String on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Request struct{ ... } +// func (a Request) String() string +// +// var requests []Request = ... +// logger.Info("sending requests", zap.Stringers("requests", requests)) +// +// Note that these objects must implement fmt.Stringer directly. +// That is, if you're trying to marshal a []Request, the String method +// must be declared on the Request type, not its pointer (*Request). +func Stringers[T fmt.Stringer](key string, values []T) Field { + return Array(key, stringers[T](values)) +} + +type stringers[T fmt.Stringer] []T + +func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + arr.AppendString(o.String()) + } + return nil +} + // Times constructs a field that carries a slice of time.Times. func Times(key string, ts []time.Time) Field { return Array(key, times(ts)) diff --git a/vendor/go.uber.org/zap/array_go118.go b/vendor/go.uber.org/zap/array_go118.go deleted file mode 100644 index d0d2c49d..00000000 --- a/vendor/go.uber.org/zap/array_go118.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2022 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. - -//go:build go1.18 -// +build go1.18 - -package zap - -import ( - "fmt" - - "go.uber.org/zap/zapcore" -) - -// Objects constructs a field with the given key, holding a list of the -// provided objects that can be marshaled by Zap. -// -// Note that these objects must implement zapcore.ObjectMarshaler directly. -// That is, if you're trying to marshal a []Request, the MarshalLogObject -// method must be declared on the Request type, not its pointer (*Request). -// If it's on the pointer, use ObjectValues. -// -// Given an object that implements MarshalLogObject on the value receiver, you -// can log a slice of those objects with Objects like so: -// -// type Author struct{ ... } -// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var authors []Author = ... -// logger.Info("loading article", zap.Objects("authors", authors)) -// -// Similarly, given a type that implements MarshalLogObject on its pointer -// receiver, you can log a slice of pointers to that object with Objects like -// so: -// -// type Request struct{ ... } -// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var requests []*Request = ... -// logger.Info("sending requests", zap.Objects("requests", requests)) -// -// If instead, you have a slice of values of such an object, use the -// ObjectValues constructor. -// -// var requests []Request = ... -// logger.Info("sending requests", zap.ObjectValues("requests", requests)) -func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { - return Array(key, objects[T](values)) -} - -type objects[T zapcore.ObjectMarshaler] []T - -func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, o := range os { - if err := arr.AppendObject(o); err != nil { - return err - } - } - return nil -} - -// ObjectMarshalerPtr is a constraint that specifies that the given type -// implements zapcore.ObjectMarshaler on a pointer receiver. -type ObjectMarshalerPtr[T any] interface { - *T - zapcore.ObjectMarshaler -} - -// ObjectValues constructs a field with the given key, holding a list of the -// provided objects, where pointers to these objects can be marshaled by Zap. -// -// Note that pointers to these objects must implement zapcore.ObjectMarshaler. -// That is, if you're trying to marshal a []Request, the MarshalLogObject -// method must be declared on the *Request type, not the value (Request). -// If it's on the value, use Objects. -// -// Given an object that implements MarshalLogObject on the pointer receiver, -// you can log a slice of those objects with ObjectValues like so: -// -// type Request struct{ ... } -// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var requests []Request = ... -// logger.Info("sending requests", zap.ObjectValues("requests", requests)) -// -// If instead, you have a slice of pointers of such an object, use the Objects -// field constructor. -// -// var requests []*Request = ... -// logger.Info("sending requests", zap.Objects("requests", requests)) -func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { - return Array(key, objectValues[T, P](values)) -} - -type objectValues[T any, P ObjectMarshalerPtr[T]] []T - -func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for i := range os { - // It is necessary for us to explicitly reference the "P" type. - // We cannot simply pass "&os[i]" to AppendObject because its type - // is "*T", which the type system does not consider as - // implementing ObjectMarshaler. - // Only the type "P" satisfies ObjectMarshaler, which we have - // to convert "*T" to explicitly. - var p P = &os[i] - if err := arr.AppendObject(p); err != nil { - return err - } - } - return nil -} - -// Stringers constructs a field with the given key, holding a list of the -// output provided by the value's String method -// -// Given an object that implements String on the value receiver, you -// can log a slice of those objects with Objects like so: -// -// type Request struct{ ... } -// func (a Request) String() string -// -// var requests []Request = ... -// logger.Info("sending requests", zap.Stringers("requests", requests)) -// -// Note that these objects must implement fmt.Stringer directly. -// That is, if you're trying to marshal a []Request, the String method -// must be declared on the Request type, not its pointer (*Request). -func Stringers[T fmt.Stringer](key string, values []T) Field { - return Array(key, stringers[T](values)) -} - -type stringers[T fmt.Stringer] []T - -func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, o := range os { - arr.AppendString(o.String()) - } - return nil -} diff --git a/vendor/go.uber.org/zap/buffer/buffer.go b/vendor/go.uber.org/zap/buffer/buffer.go index 9e929cd9..27fb5cd5 100644 --- a/vendor/go.uber.org/zap/buffer/buffer.go +++ b/vendor/go.uber.org/zap/buffer/buffer.go @@ -42,6 +42,11 @@ func (b *Buffer) AppendByte(v byte) { b.bs = append(b.bs, v) } +// AppendBytes writes a single byte to the Buffer. +func (b *Buffer) AppendBytes(v []byte) { + b.bs = append(b.bs, v...) +} + // AppendString writes a string to the Buffer. func (b *Buffer) AppendString(s string) { b.bs = append(b.bs, s...) diff --git a/vendor/go.uber.org/zap/error.go b/vendor/go.uber.org/zap/error.go index 38cb768d..45f7b838 100644 --- a/vendor/go.uber.org/zap/error.go +++ b/vendor/go.uber.org/zap/error.go @@ -61,9 +61,12 @@ func (errs errArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { // allocating, pool the wrapper type. elem := _errArrayElemPool.Get() elem.error = errs[i] - arr.AppendObject(elem) + err := arr.AppendObject(elem) elem.error = nil _errArrayElemPool.Put(elem) + if err != nil { + return err + } } return nil } diff --git a/vendor/go.uber.org/zap/field.go b/vendor/go.uber.org/zap/field.go index 7f22c534..c8dd3358 100644 --- a/vendor/go.uber.org/zap/field.go +++ b/vendor/go.uber.org/zap/field.go @@ -25,6 +25,7 @@ import ( "math" "time" + "go.uber.org/zap/internal/stacktrace" "go.uber.org/zap/zapcore" ) @@ -374,7 +375,7 @@ func StackSkip(key string, skip int) Field { // from expanding the zapcore.Field union struct to include a byte slice. Since // taking a stacktrace is already so expensive (~10us), the extra allocation // is okay. - return String(key, takeStacktrace(skip+1)) // skip StackSkip + return String(key, stacktrace.Take(skip+1)) // skip StackSkip } // Duration constructs a field with the given key and value. The encoder @@ -410,6 +411,26 @@ func Inline(val zapcore.ObjectMarshaler) Field { } } +// Dict constructs a field containing the provided key-value pairs. +// It acts similar to [Object], but with the fields specified as arguments. +func Dict(key string, val ...Field) Field { + return dictField(key, val) +} + +// We need a function with the signature (string, T) for zap.Any. +func dictField(key string, val []Field) Field { + return Object(key, dictObject(val)) +} + +type dictObject []Field + +func (d dictObject) MarshalLogObject(enc zapcore.ObjectEncoder) error { + for _, f := range d { + f.AddTo(enc) + } + return nil +} + // We discovered an issue where zap.Any can cause a performance degradation // when used in new goroutines. // @@ -462,6 +483,8 @@ func Any(key string, value interface{}) Field { c = anyFieldC[zapcore.ObjectMarshaler](Object) case zapcore.ArrayMarshaler: c = anyFieldC[zapcore.ArrayMarshaler](Array) + case []Field: + c = anyFieldC[[]Field](dictField) case bool: c = anyFieldC[bool](Bool) case *bool: diff --git a/vendor/go.uber.org/zap/http_handler.go b/vendor/go.uber.org/zap/http_handler.go index 632b6831..2be8f651 100644 --- a/vendor/go.uber.org/zap/http_handler.go +++ b/vendor/go.uber.org/zap/http_handler.go @@ -69,6 +69,13 @@ import ( // // curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if err := lvl.serveHTTP(w, r); err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "internal error: %v", err) + } +} + +func (lvl AtomicLevel) serveHTTP(w http.ResponseWriter, r *http.Request) error { type errorResponse struct { Error string `json:"error"` } @@ -80,19 +87,20 @@ func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - enc.Encode(payload{Level: lvl.Level()}) + return enc.Encode(payload{Level: lvl.Level()}) + case http.MethodPut: requestedLvl, err := decodePutRequest(r.Header.Get("Content-Type"), r) if err != nil { w.WriteHeader(http.StatusBadRequest) - enc.Encode(errorResponse{Error: err.Error()}) - return + return enc.Encode(errorResponse{Error: err.Error()}) } lvl.SetLevel(requestedLvl) - enc.Encode(payload{Level: lvl.Level()}) + return enc.Encode(payload{Level: lvl.Level()}) + default: w.WriteHeader(http.StatusMethodNotAllowed) - enc.Encode(errorResponse{ + return enc.Encode(errorResponse{ Error: "Only GET and PUT are supported.", }) } @@ -129,5 +137,4 @@ func decodePutJSON(body io.Reader) (zapcore.Level, error) { return 0, errors.New("must specify logging level") } return *pld.Level, nil - } diff --git a/vendor/go.uber.org/zap/stacktrace.go b/vendor/go.uber.org/zap/internal/stacktrace/stack.go similarity index 75% rename from vendor/go.uber.org/zap/stacktrace.go rename to vendor/go.uber.org/zap/internal/stacktrace/stack.go index 1f152eb1..82af7551 100644 --- a/vendor/go.uber.org/zap/stacktrace.go +++ b/vendor/go.uber.org/zap/internal/stacktrace/stack.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2023 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 @@ -18,7 +18,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package zap +// Package stacktrace provides support for gathering stack traces +// efficiently. +package stacktrace import ( "runtime" @@ -28,13 +30,14 @@ import ( "go.uber.org/zap/internal/pool" ) -var _stacktracePool = pool.New(func() *stacktrace { - return &stacktrace{ +var _stackPool = pool.New(func() *Stack { + return &Stack{ storage: make([]uintptr, 64), } }) -type stacktrace struct { +// Stack is a captured stack trace. +type Stack struct { pcs []uintptr // program counters; always a subslice of storage frames *runtime.Frames @@ -48,30 +51,30 @@ type stacktrace struct { storage []uintptr } -// stacktraceDepth specifies how deep of a stack trace should be captured. -type stacktraceDepth int +// Depth specifies how deep of a stack trace should be captured. +type Depth int const ( - // stacktraceFirst captures only the first frame. - stacktraceFirst stacktraceDepth = iota + // First captures only the first frame. + First Depth = iota - // stacktraceFull captures the entire call stack, allocating more + // Full captures the entire call stack, allocating more // storage for it if needed. - stacktraceFull + Full ) -// captureStacktrace captures a stack trace of the specified depth, skipping +// Capture captures a stack trace of the specified depth, skipping // the provided number of frames. skip=0 identifies the caller of -// captureStacktrace. +// Capture. // // The caller must call Free on the returned stacktrace after using it. -func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { - stack := _stacktracePool.Get() +func Capture(skip int, depth Depth) *Stack { + stack := _stackPool.Get() switch depth { - case stacktraceFirst: + case First: stack.pcs = stack.storage[:1] - case stacktraceFull: + case Full: stack.pcs = stack.storage } @@ -85,7 +88,7 @@ func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { // runtime.Callers truncates the recorded stacktrace if there is no // room in the provided slice. For the full stack trace, keep expanding // storage until there are fewer frames than there is room. - if depth == stacktraceFull { + if depth == Full { pcs := stack.pcs for numFrames == len(pcs) { pcs = make([]uintptr, len(pcs)*2) @@ -107,50 +110,54 @@ func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { // Free releases resources associated with this stacktrace // and returns it back to the pool. -func (st *stacktrace) Free() { +func (st *Stack) Free() { st.frames = nil st.pcs = nil - _stacktracePool.Put(st) + _stackPool.Put(st) } // Count reports the total number of frames in this stacktrace. // Count DOES NOT change as Next is called. -func (st *stacktrace) Count() int { +func (st *Stack) Count() int { return len(st.pcs) } // Next returns the next frame in the stack trace, // and a boolean indicating whether there are more after it. -func (st *stacktrace) Next() (_ runtime.Frame, more bool) { +func (st *Stack) Next() (_ runtime.Frame, more bool) { return st.frames.Next() } -func takeStacktrace(skip int) string { - stack := captureStacktrace(skip+1, stacktraceFull) +// Take returns a string representation of the current stacktrace. +// +// skip is the number of frames to skip before recording the stack trace. +// skip=0 identifies the caller of Take. +func Take(skip int) string { + stack := Capture(skip+1, Full) defer stack.Free() buffer := bufferpool.Get() defer buffer.Free() - stackfmt := newStackFormatter(buffer) + stackfmt := NewFormatter(buffer) stackfmt.FormatStack(stack) return buffer.String() } -// stackFormatter formats a stack trace into a readable string representation. -type stackFormatter struct { +// Formatter formats a stack trace into a readable string representation. +type Formatter struct { b *buffer.Buffer nonEmpty bool // whehther we've written at least one frame already } -// newStackFormatter builds a new stackFormatter. -func newStackFormatter(b *buffer.Buffer) stackFormatter { - return stackFormatter{b: b} +// NewFormatter builds a new Formatter. +func NewFormatter(b *buffer.Buffer) Formatter { + return Formatter{b: b} } // FormatStack formats all remaining frames in the provided stacktrace -- minus // the final runtime.main/runtime.goexit frame. -func (sf *stackFormatter) FormatStack(stack *stacktrace) { +func (sf *Formatter) FormatStack(stack *Stack) { // Note: On the last iteration, frames.Next() returns false, with a valid // frame, but we ignore this frame. The last frame is a runtime frame which // adds noise, since it's only either runtime.main or runtime.goexit. @@ -160,7 +167,7 @@ func (sf *stackFormatter) FormatStack(stack *stacktrace) { } // FormatFrame formats the given frame. -func (sf *stackFormatter) FormatFrame(frame runtime.Frame) { +func (sf *Formatter) FormatFrame(frame runtime.Frame) { if sf.nonEmpty { sf.b.AppendByte('\n') } diff --git a/vendor/go.uber.org/zap/logger.go b/vendor/go.uber.org/zap/logger.go index 0e954801..6205fe48 100644 --- a/vendor/go.uber.org/zap/logger.go +++ b/vendor/go.uber.org/zap/logger.go @@ -27,6 +27,7 @@ import ( "strings" "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/stacktrace" "go.uber.org/zap/zapcore" ) @@ -173,7 +174,8 @@ func (log *Logger) WithOptions(opts ...Option) *Logger { } // With creates a child logger and adds structured context to it. Fields added -// to the child don't affect the parent, and vice versa. +// to the child don't affect the parent, and vice versa. Any fields that +// require evaluation (such as Objects) are evaluated upon invocation of With. func (log *Logger) With(fields ...Field) *Logger { if len(fields) == 0 { return log @@ -183,6 +185,28 @@ func (log *Logger) With(fields ...Field) *Logger { return l } +// WithLazy creates a child logger and adds structured context to it lazily. +// +// The fields are evaluated only if the logger is further chained with [With] +// or is written to with any of the log level methods. +// Until that occurs, the logger may retain references to objects inside the fields, +// and logging will reflect the state of an object at the time of logging, +// not the time of WithLazy(). +// +// WithLazy provides a worthwhile performance optimization for contextual loggers +// when the likelihood of using the child logger is low, +// such as error paths and rarely taken branches. +// +// Similar to [With], fields added to the child don't affect the parent, and vice versa. +func (log *Logger) WithLazy(fields ...Field) *Logger { + if len(fields) == 0 { + return log + } + return log.WithOptions(WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewLazyWith(core, fields) + })) +} + // Level reports the minimum enabled level for this logger. // // For NopLoggers, this is [zapcore.InvalidLevel]. @@ -199,6 +223,8 @@ func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Log logs a message at the specified level. The message includes any fields // passed at the log site, as well as any fields accumulated on the logger. +// Any Fields that require evaluation (such as Objects) are evaluated upon +// invocation of Log. func (log *Logger) Log(lvl zapcore.Level, msg string, fields ...Field) { if ce := log.check(lvl, msg); ce != nil { ce.Write(fields...) @@ -288,8 +314,8 @@ func (log *Logger) Name() string { } func (log *Logger) clone() *Logger { - copy := *log - return © + clone := *log + return &clone } func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { @@ -360,17 +386,17 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Adding the caller or stack trace requires capturing the callers of // this function. We'll share information between these two. - stackDepth := stacktraceFirst + stackDepth := stacktrace.First if addStack { - stackDepth = stacktraceFull + stackDepth = stacktrace.Full } - stack := captureStacktrace(log.callerSkip+callerSkipOffset, stackDepth) + stack := stacktrace.Capture(log.callerSkip+callerSkipOffset, stackDepth) defer stack.Free() if stack.Count() == 0 { if log.addCaller { fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC()) - log.errorOutput.Sync() + _ = log.errorOutput.Sync() } return ce } @@ -391,7 +417,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { buffer := bufferpool.Get() defer buffer.Free() - stackfmt := newStackFormatter(buffer) + stackfmt := stacktrace.NewFormatter(buffer) // We've already extracted the first frame, so format that // separately and defer to stackfmt for the rest. diff --git a/vendor/go.uber.org/zap/sink.go b/vendor/go.uber.org/zap/sink.go index 478c9a10..499772a0 100644 --- a/vendor/go.uber.org/zap/sink.go +++ b/vendor/go.uber.org/zap/sink.go @@ -66,7 +66,8 @@ func newSinkRegistry() *sinkRegistry { factories: make(map[string]func(*url.URL) (Sink, error)), openFile: os.OpenFile, } - sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) + // Infallible operation: the registry is empty, so we can't have a conflict. + _ = sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) return sr } @@ -154,7 +155,7 @@ func (sr *sinkRegistry) newFileSinkFromPath(path string) (Sink, error) { case "stderr": return nopCloserSink{os.Stderr}, nil } - return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) + return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0o666) } func normalizeScheme(s string) (string, error) { diff --git a/vendor/go.uber.org/zap/writer.go b/vendor/go.uber.org/zap/writer.go index f08728e1..06768c67 100644 --- a/vendor/go.uber.org/zap/writer.go +++ b/vendor/go.uber.org/zap/writer.go @@ -48,21 +48,21 @@ import ( // os.Stdout and os.Stderr. When specified without a scheme, relative file // paths also work. func Open(paths ...string) (zapcore.WriteSyncer, func(), error) { - writers, close, err := open(paths) + writers, closeAll, err := open(paths) if err != nil { return nil, nil, err } writer := CombineWriteSyncers(writers...) - return writer, close, nil + return writer, closeAll, nil } func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { writers := make([]zapcore.WriteSyncer, 0, len(paths)) closers := make([]io.Closer, 0, len(paths)) - close := func() { + closeAll := func() { for _, c := range closers { - c.Close() + _ = c.Close() } } @@ -77,11 +77,11 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { closers = append(closers, sink) } if openErr != nil { - close() + closeAll() return nil, nil, openErr } - return writers, close, nil + return writers, closeAll, nil } // CombineWriteSyncers is a utility that combines multiple WriteSyncers into a diff --git a/vendor/go.uber.org/zap/zapcore/core.go b/vendor/go.uber.org/zap/zapcore/core.go index 9dfd6405..776e93f6 100644 --- a/vendor/go.uber.org/zap/zapcore/core.go +++ b/vendor/go.uber.org/zap/zapcore/core.go @@ -102,9 +102,9 @@ func (c *ioCore) Write(ent Entry, fields []Field) error { return err } if ent.Level > ErrorLevel { - // Since we may be crashing the program, sync the output. Ignore Sync - // errors, pending a clean solution to issue #370. - c.Sync() + // Since we may be crashing the program, sync the output. + // Ignore Sync errors, pending a clean solution to issue #370. + _ = c.Sync() } return nil } diff --git a/vendor/go.uber.org/zap/zapcore/entry.go b/vendor/go.uber.org/zap/zapcore/entry.go index 059844f9..459a5d7c 100644 --- a/vendor/go.uber.org/zap/zapcore/entry.go +++ b/vendor/go.uber.org/zap/zapcore/entry.go @@ -242,7 +242,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { // CheckedEntry is being used after it was returned to the pool, // the message may be an amalgamation from multiple call sites. fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", ce.Time, ce.Entry) - ce.ErrorOutput.Sync() + _ = ce.ErrorOutput.Sync() // ignore error } return } @@ -254,7 +254,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { } if err != nil && ce.ErrorOutput != nil { fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", ce.Time, err) - ce.ErrorOutput.Sync() + _ = ce.ErrorOutput.Sync() // ignore error } hook := ce.after diff --git a/vendor/go.uber.org/zap/zapcore/error.go b/vendor/go.uber.org/zap/zapcore/error.go index c67dd71d..c40df132 100644 --- a/vendor/go.uber.org/zap/zapcore/error.go +++ b/vendor/go.uber.org/zap/zapcore/error.go @@ -98,8 +98,11 @@ func (errs errArray) MarshalLogArray(arr ArrayEncoder) error { } el := newErrArrayElem(errs[i]) - arr.AppendObject(el) + err := arr.AppendObject(el) el.Free() + if err != nil { + return err + } } return nil } diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go index ce6838de..c8ab8697 100644 --- a/vendor/go.uber.org/zap/zapcore/json_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -486,73 +486,98 @@ func (enc *jsonEncoder) appendFloat(val float64, bitSize int) { // Unlike the standard library's encoder, it doesn't attempt to protect the // user from browser vulnerabilities or JSONP-related problems. func (enc *jsonEncoder) safeAddString(s string) { - for i := 0; i < len(s); { - if enc.tryAddRuneSelf(s[i]) { - i++ - continue - } - r, size := utf8.DecodeRuneInString(s[i:]) - if enc.tryAddRuneError(r, size) { - i++ - continue - } - enc.buf.AppendString(s[i : i+size]) - i += size - } + safeAppendStringLike( + (*buffer.Buffer).AppendString, + utf8.DecodeRuneInString, + enc.buf, + s, + ) } // safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. func (enc *jsonEncoder) safeAddByteString(s []byte) { + safeAppendStringLike( + (*buffer.Buffer).AppendBytes, + utf8.DecodeRune, + enc.buf, + s, + ) +} + +// safeAppendStringLike is a generic implementation of safeAddString and safeAddByteString. +// It appends a string or byte slice to the buffer, escaping all special characters. +func safeAppendStringLike[S []byte | string]( + // appendTo appends this string-like object to the buffer. + appendTo func(*buffer.Buffer, S), + // decodeRune decodes the next rune from the string-like object + // and returns its value and width in bytes. + decodeRune func(S) (rune, int), + buf *buffer.Buffer, + s S, +) { + // The encoding logic below works by skipping over characters + // that can be safely copied as-is, + // until a character is found that needs special handling. + // At that point, we copy everything we've seen so far, + // and then handle that special character. + // + // last is the index of the last byte that was copied to the buffer. + last := 0 for i := 0; i < len(s); { - if enc.tryAddRuneSelf(s[i]) { - i++ - continue - } - r, size := utf8.DecodeRune(s[i:]) - if enc.tryAddRuneError(r, size) { - i++ - continue - } - enc.buf.Write(s[i : i+size]) - i += size - } -} + if s[i] >= utf8.RuneSelf { + // Character >= RuneSelf may be part of a multi-byte rune. + // They need to be decoded before we can decide how to handle them. + r, size := decodeRune(s[i:]) + if r != utf8.RuneError || size != 1 { + // No special handling required. + // Skip over this rune and continue. + i += size + continue + } -// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. -func (enc *jsonEncoder) tryAddRuneSelf(b byte) bool { - if b >= utf8.RuneSelf { - return false - } - if b >= 0x20 && b != '\\' && b != '"' { - enc.buf.AppendByte(b) - return true - } - switch b { - case '\\', '"': - enc.buf.AppendByte('\\') - enc.buf.AppendByte(b) - case '\n': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('n') - case '\r': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('r') - case '\t': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('t') - default: - // Encode bytes < 0x20, except for the escape sequences above. - enc.buf.AppendString(`\u00`) - enc.buf.AppendByte(_hex[b>>4]) - enc.buf.AppendByte(_hex[b&0xF]) - } - return true -} + // Invalid UTF-8 sequence. + // Replace it with the Unicode replacement character. + appendTo(buf, s[last:i]) + buf.AppendString(`\ufffd`) -func (enc *jsonEncoder) tryAddRuneError(r rune, size int) bool { - if r == utf8.RuneError && size == 1 { - enc.buf.AppendString(`\ufffd`) - return true + i++ + last = i + } else { + // Character < RuneSelf is a single-byte UTF-8 rune. + if s[i] >= 0x20 && s[i] != '\\' && s[i] != '"' { + // No escaping necessary. + // Skip over this character and continue. + i++ + continue + } + + // This character needs to be escaped. + appendTo(buf, s[last:i]) + switch s[i] { + case '\\', '"': + buf.AppendByte('\\') + buf.AppendByte(s[i]) + case '\n': + buf.AppendByte('\\') + buf.AppendByte('n') + case '\r': + buf.AppendByte('\\') + buf.AppendByte('r') + case '\t': + buf.AppendByte('\\') + buf.AppendByte('t') + default: + // Encode bytes < 0x20, except for the escape sequences above. + buf.AppendString(`\u00`) + buf.AppendByte(_hex[s[i]>>4]) + buf.AppendByte(_hex[s[i]&0xF]) + } + + i++ + last = i + } } - return false + + // add remaining + appendTo(buf, s[last:]) } diff --git a/vendor/go.uber.org/zap/zapcore/lazy_with.go b/vendor/go.uber.org/zap/zapcore/lazy_with.go new file mode 100644 index 00000000..05288d6a --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/lazy_with.go @@ -0,0 +1,54 @@ +// Copyright (c) 2023 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. + +package zapcore + +import "sync" + +type lazyWithCore struct { + Core + sync.Once + fields []Field +} + +// NewLazyWith wraps a Core with a "lazy" Core that will only encode fields if +// the logger is written to (or is further chained in a lon-lazy manner). +func NewLazyWith(core Core, fields []Field) Core { + return &lazyWithCore{ + Core: core, + fields: fields, + } +} + +func (d *lazyWithCore) initOnce() { + d.Once.Do(func() { + d.Core = d.Core.With(d.fields) + }) +} + +func (d *lazyWithCore) With(fields []Field) Core { + d.initOnce() + return d.Core.With(fields) +} + +func (d *lazyWithCore) Check(e Entry, ce *CheckedEntry) *CheckedEntry { + d.initOnce() + return d.Core.Check(e, ce) +} diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s index f3b653a1..6713acca 100644 --- a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s +++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s @@ -199,8 +199,8 @@ TEXT ·mixBlocksSSE2(SB), 4, $0-32 MOVQ out+0(FP), DX MOVQ a+8(FP), AX MOVQ b+16(FP), BX - MOVQ a+24(FP), CX - MOVQ $128, BP + MOVQ c+24(FP), CX + MOVQ $128, DI loop: MOVOU 0(AX), X0 @@ -213,7 +213,7 @@ loop: ADDQ $16, BX ADDQ $16, CX ADDQ $16, DX - SUBQ $2, BP + SUBQ $2, DI JA loop RET @@ -222,8 +222,8 @@ TEXT ·xorBlocksSSE2(SB), 4, $0-32 MOVQ out+0(FP), DX MOVQ a+8(FP), AX MOVQ b+16(FP), BX - MOVQ a+24(FP), CX - MOVQ $128, BP + MOVQ c+24(FP), CX + MOVQ $128, DI loop: MOVOU 0(AX), X0 @@ -238,6 +238,6 @@ loop: ADDQ $16, BX ADDQ $16, CX ADDQ $16, DX - SUBQ $2, BP + SUBQ $2, DI JA loop RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go index 4f506f87..199c21d2 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.7 && amd64 && gc && !purego +//go:build amd64 && gc && !purego package blake2b diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s index 353bb7ca..9ae8206c 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.7 && amd64 && gc && !purego +//go:build amd64 && gc && !purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go deleted file mode 100644 index 1d0770ab..00000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2016 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. - -//go:build !go1.7 && amd64 && gc && !purego - -package blake2b - -import "golang.org/x/sys/cpu" - -func init() { - useSSE4 = cpu.X86.HasSSE41 -} - -//go:noescape -func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) - -func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { - if useSSE4 { - hashBlocksSSE4(h, c, flag, blocks) - } else { - hashBlocksGeneric(h, c, flag, blocks) - } -} diff --git a/vendor/golang.org/x/crypto/blake2b/register.go b/vendor/golang.org/x/crypto/blake2b/register.go index d9fcac3a..54e446e1 100644 --- a/vendor/golang.org/x/crypto/blake2b/register.go +++ b/vendor/golang.org/x/crypto/blake2b/register.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.9 - package blake2b import ( diff --git a/vendor/golang.org/x/crypto/cryptobyte/asn1.go b/vendor/golang.org/x/crypto/cryptobyte/asn1.go index 6fc2838a..2492f796 100644 --- a/vendor/golang.org/x/crypto/cryptobyte/asn1.go +++ b/vendor/golang.org/x/crypto/cryptobyte/asn1.go @@ -733,13 +733,14 @@ func (s *String) ReadOptionalASN1OctetString(out *[]byte, outPresent *bool, tag return true } -// ReadOptionalASN1Boolean sets *out to the value of the next ASN.1 BOOLEAN or, -// if the next bytes are not an ASN.1 BOOLEAN, to the value of defaultValue. -// It reports whether the operation was successful. -func (s *String) ReadOptionalASN1Boolean(out *bool, defaultValue bool) bool { +// ReadOptionalASN1Boolean attempts to read an optional ASN.1 BOOLEAN +// explicitly tagged with tag into out and advances. If no element with a +// matching tag is present, it sets "out" to defaultValue instead. It reports +// whether the read was successful. +func (s *String) ReadOptionalASN1Boolean(out *bool, tag asn1.Tag, defaultValue bool) bool { var present bool var child String - if !s.ReadOptionalASN1(&child, &present, asn1.BOOLEAN) { + if !s.ReadOptionalASN1(&child, &present, tag) { return false } @@ -748,7 +749,7 @@ func (s *String) ReadOptionalASN1Boolean(out *bool, defaultValue bool) bool { return true } - return s.ReadASN1Boolean(out) + return child.ReadASN1Boolean(out) } func (s *String) readASN1(out *String, outTag *asn1.Tag, skipHeader bool) bool { diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s index 8fb26aeb..1f539388 100644 --- a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s +++ b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s @@ -319,9 +319,9 @@ MOVQ rDi, _si(oState); \ MOVQ rDo, _so(oState) \ -// func keccakF1600(state *[25]uint64) +// func keccakF1600(a *[25]uint64) TEXT ·keccakF1600(SB), 0, $200-8 - MOVQ state+0(FP), rpState + MOVQ a+0(FP), rpState // Convert the user state into an internal state NOTQ _be(rpState) diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile deleted file mode 100644 index 85122459..00000000 --- a/vendor/golang.org/x/net/http2/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -# -# This Dockerfile builds a recent curl with HTTP/2 client support, using -# a recent nghttp2 build. -# -# See the Makefile for how to tag it. If Docker and that image is found, the -# Go tests use this curl binary for integration tests. -# - -FROM ubuntu:trusty - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y git-core build-essential wget - -RUN apt-get install -y --no-install-recommends \ - autotools-dev libtool pkg-config zlib1g-dev \ - libcunit1-dev libssl-dev libxml2-dev libevent-dev \ - automake autoconf - -# The list of packages nghttp2 recommends for h2load: -RUN apt-get install -y --no-install-recommends make binutils \ - autoconf automake autotools-dev \ - libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ - libev-dev libevent-dev libjansson-dev libjemalloc-dev \ - cython python3.4-dev python-setuptools - -# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: -ENV NGHTTP2_VER 895da9a -RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git - -WORKDIR /root/nghttp2 -RUN git reset --hard $NGHTTP2_VER -RUN autoreconf -i -RUN automake -RUN autoconf -RUN ./configure -RUN make -RUN make install - -WORKDIR /root -RUN wget https://curl.se/download/curl-7.45.0.tar.gz -RUN tar -zxvf curl-7.45.0.tar.gz -WORKDIR /root/curl-7.45.0 -RUN ./configure --with-ssl --with-nghttp2=/usr/local -RUN make -RUN make install -RUN ldconfig - -CMD ["-h"] -ENTRYPOINT ["/usr/local/bin/curl"] - diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile deleted file mode 100644 index 55fd826f..00000000 --- a/vendor/golang.org/x/net/http2/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -curlimage: - docker build -t gohttp2/curl . - diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go index a3067f8d..e6f55cbd 100644 --- a/vendor/golang.org/x/net/http2/databuffer.go +++ b/vendor/golang.org/x/net/http2/databuffer.go @@ -20,41 +20,44 @@ import ( // TODO: Benchmark to determine if the pools are necessary. The GC may have // improved enough that we can instead allocate chunks like this: // make([]byte, max(16<<10, expectedBytesRemaining)) -var ( - dataChunkSizeClasses = []int{ - 1 << 10, - 2 << 10, - 4 << 10, - 8 << 10, - 16 << 10, - } - dataChunkPools = [...]sync.Pool{ - {New: func() interface{} { return make([]byte, 1<<10) }}, - {New: func() interface{} { return make([]byte, 2<<10) }}, - {New: func() interface{} { return make([]byte, 4<<10) }}, - {New: func() interface{} { return make([]byte, 8<<10) }}, - {New: func() interface{} { return make([]byte, 16<<10) }}, - } -) +var dataChunkPools = [...]sync.Pool{ + {New: func() interface{} { return new([1 << 10]byte) }}, + {New: func() interface{} { return new([2 << 10]byte) }}, + {New: func() interface{} { return new([4 << 10]byte) }}, + {New: func() interface{} { return new([8 << 10]byte) }}, + {New: func() interface{} { return new([16 << 10]byte) }}, +} func getDataBufferChunk(size int64) []byte { - i := 0 - for ; i < len(dataChunkSizeClasses)-1; i++ { - if size <= int64(dataChunkSizeClasses[i]) { - break - } + switch { + case size <= 1<<10: + return dataChunkPools[0].Get().(*[1 << 10]byte)[:] + case size <= 2<<10: + return dataChunkPools[1].Get().(*[2 << 10]byte)[:] + case size <= 4<<10: + return dataChunkPools[2].Get().(*[4 << 10]byte)[:] + case size <= 8<<10: + return dataChunkPools[3].Get().(*[8 << 10]byte)[:] + default: + return dataChunkPools[4].Get().(*[16 << 10]byte)[:] } - return dataChunkPools[i].Get().([]byte) } func putDataBufferChunk(p []byte) { - for i, n := range dataChunkSizeClasses { - if len(p) == n { - dataChunkPools[i].Put(p) - return - } + switch len(p) { + case 1 << 10: + dataChunkPools[0].Put((*[1 << 10]byte)(p)) + case 2 << 10: + dataChunkPools[1].Put((*[2 << 10]byte)(p)) + case 4 << 10: + dataChunkPools[2].Put((*[4 << 10]byte)(p)) + case 8 << 10: + dataChunkPools[3].Put((*[8 << 10]byte)(p)) + case 16 << 10: + dataChunkPools[4].Put((*[16 << 10]byte)(p)) + default: + panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) } - panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) } // dataBuffer is an io.ReadWriter backed by a list of data chunks. diff --git a/vendor/golang.org/x/net/http2/go111.go b/vendor/golang.org/x/net/http2/go111.go deleted file mode 100644 index 5bf62b03..00000000 --- a/vendor/golang.org/x/net/http2/go111.go +++ /dev/null @@ -1,30 +0,0 @@ -// 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 file. - -//go:build go1.11 -// +build go1.11 - -package http2 - -import ( - "net/http/httptrace" - "net/textproto" -) - -func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { - return trace != nil && trace.WroteHeaderField != nil -} - -func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { - if trace != nil && trace.WroteHeaderField != nil { - trace.WroteHeaderField(k, []string{v}) - } -} - -func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { - if trace != nil { - return trace.Got1xxResponse - } - return nil -} diff --git a/vendor/golang.org/x/net/http2/go115.go b/vendor/golang.org/x/net/http2/go115.go deleted file mode 100644 index 908af1ab..00000000 --- a/vendor/golang.org/x/net/http2/go115.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 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. - -//go:build go1.15 -// +build go1.15 - -package http2 - -import ( - "context" - "crypto/tls" -) - -// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS -// connection. -func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { - dialer := &tls.Dialer{ - Config: cfg, - } - cn, err := dialer.DialContext(ctx, network, addr) - if err != nil { - return nil, err - } - tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed - return tlsCn, nil -} diff --git a/vendor/golang.org/x/net/http2/go118.go b/vendor/golang.org/x/net/http2/go118.go deleted file mode 100644 index aca4b2b3..00000000 --- a/vendor/golang.org/x/net/http2/go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 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. - -//go:build go1.18 -// +build go1.18 - -package http2 - -import ( - "crypto/tls" - "net" -) - -func tlsUnderlyingConn(tc *tls.Conn) net.Conn { - return tc.NetConn() -} diff --git a/vendor/golang.org/x/net/http2/not_go111.go b/vendor/golang.org/x/net/http2/not_go111.go deleted file mode 100644 index cc0baa81..00000000 --- a/vendor/golang.org/x/net/http2/not_go111.go +++ /dev/null @@ -1,21 +0,0 @@ -// 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 file. - -//go:build !go1.11 -// +build !go1.11 - -package http2 - -import ( - "net/http/httptrace" - "net/textproto" -) - -func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { return false } - -func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {} - -func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { - return nil -} diff --git a/vendor/golang.org/x/net/http2/not_go115.go b/vendor/golang.org/x/net/http2/not_go115.go deleted file mode 100644 index e6c04cf7..00000000 --- a/vendor/golang.org/x/net/http2/not_go115.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 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. - -//go:build !go1.15 -// +build !go1.15 - -package http2 - -import ( - "context" - "crypto/tls" -) - -// dialTLSWithContext opens a TLS connection. -func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { - cn, err := tls.Dial(network, addr, cfg) - if err != nil { - return nil, err - } - if err := cn.Handshake(); err != nil { - return nil, err - } - if cfg.InsecureSkipVerify { - return cn, nil - } - if err := cn.VerifyHostname(cfg.ServerName); err != nil { - return nil, err - } - return cn, nil -} diff --git a/vendor/golang.org/x/net/http2/not_go118.go b/vendor/golang.org/x/net/http2/not_go118.go deleted file mode 100644 index eab532c9..00000000 --- a/vendor/golang.org/x/net/http2/not_go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 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. - -//go:build !go1.18 -// +build !go1.18 - -package http2 - -import ( - "crypto/tls" - "net" -) - -func tlsUnderlyingConn(tc *tls.Conn) net.Conn { - return nil -} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 033b6e6d..ae94c640 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -581,9 +581,11 @@ type serverConn struct { advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client curClientStreams uint32 // number of open streams initiated by the client curPushedStreams uint32 // number of open streams initiated by server push + curHandlers uint32 // number of running handler goroutines maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes streams map[uint32]*stream + unstartedHandlers []unstartedHandler initialStreamSendWindowSize int32 maxFrameSize int32 peerMaxHeaderListSize uint32 // zero means unknown (default) @@ -981,6 +983,8 @@ func (sc *serverConn) serve() { return case gracefulShutdownMsg: sc.startGracefulShutdownInternal() + case handlerDoneMsg: + sc.handlerDone() default: panic("unknown timer") } @@ -1012,14 +1016,6 @@ func (sc *serverConn) serve() { } } -func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { - select { - case <-sc.doneServing: - case <-sharedCh: - close(privateCh) - } -} - type serverMessage int // Message values sent to serveMsgCh. @@ -1028,6 +1024,7 @@ var ( idleTimerMsg = new(serverMessage) shutdownTimerMsg = new(serverMessage) gracefulShutdownMsg = new(serverMessage) + handlerDoneMsg = new(serverMessage) ) func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } @@ -1900,9 +1897,11 @@ func (st *stream) copyTrailersToHandlerRequest() { // onReadTimeout is run on its own goroutine (from time.AfterFunc) // when the stream's ReadTimeout has fired. func (st *stream) onReadTimeout() { - // Wrap the ErrDeadlineExceeded to avoid callers depending on us - // returning the bare error. - st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded)) + if st.body != nil { + // Wrap the ErrDeadlineExceeded to avoid callers depending on us + // returning the bare error. + st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded)) + } } // onWriteTimeout is run on its own goroutine (from time.AfterFunc) @@ -2020,13 +2019,10 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { // (in Go 1.8), though. That's a more sane option anyway. if sc.hs.ReadTimeout != 0 { sc.conn.SetReadDeadline(time.Time{}) - if st.body != nil { - st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) - } + st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) } - go sc.runHandler(rw, req, handler) - return nil + return sc.scheduleHandler(id, rw, req, handler) } func (sc *serverConn) upgradeRequest(req *http.Request) { @@ -2046,6 +2042,10 @@ func (sc *serverConn) upgradeRequest(req *http.Request) { sc.conn.SetReadDeadline(time.Time{}) } + // This is the first request on the connection, + // so start the handler directly rather than going + // through scheduleHandler. + sc.curHandlers++ go sc.runHandler(rw, req, sc.handler.ServeHTTP) } @@ -2286,8 +2286,62 @@ func (sc *serverConn) newResponseWriter(st *stream, req *http.Request) *response return &responseWriter{rws: rws} } +type unstartedHandler struct { + streamID uint32 + rw *responseWriter + req *http.Request + handler func(http.ResponseWriter, *http.Request) +} + +// scheduleHandler starts a handler goroutine, +// or schedules one to start as soon as an existing handler finishes. +func (sc *serverConn) scheduleHandler(streamID uint32, rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) error { + sc.serveG.check() + maxHandlers := sc.advMaxStreams + if sc.curHandlers < maxHandlers { + sc.curHandlers++ + go sc.runHandler(rw, req, handler) + return nil + } + if len(sc.unstartedHandlers) > int(4*sc.advMaxStreams) { + return sc.countError("too_many_early_resets", ConnectionError(ErrCodeEnhanceYourCalm)) + } + sc.unstartedHandlers = append(sc.unstartedHandlers, unstartedHandler{ + streamID: streamID, + rw: rw, + req: req, + handler: handler, + }) + return nil +} + +func (sc *serverConn) handlerDone() { + sc.serveG.check() + sc.curHandlers-- + i := 0 + maxHandlers := sc.advMaxStreams + for ; i < len(sc.unstartedHandlers); i++ { + u := sc.unstartedHandlers[i] + if sc.streams[u.streamID] == nil { + // This stream was reset before its goroutine had a chance to start. + continue + } + if sc.curHandlers >= maxHandlers { + break + } + sc.curHandlers++ + go sc.runHandler(u.rw, u.req, u.handler) + sc.unstartedHandlers[i] = unstartedHandler{} // don't retain references + } + sc.unstartedHandlers = sc.unstartedHandlers[i:] + if len(sc.unstartedHandlers) == 0 { + sc.unstartedHandlers = nil + } +} + // Run on its own goroutine. func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + defer sc.sendServeMsg(handlerDoneMsg) didPanic := true defer func() { rw.rws.stream.cancelCtx() @@ -2495,7 +2549,6 @@ type responseWriterState struct { wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. sentHeader bool // have we sent the header frame? handlerDone bool // handler has finished - dirty bool // a Write failed; don't reuse this responseWriterState sentContentLen int64 // non-zero if handler set a Content-Length header wroteBytes int64 @@ -2615,7 +2668,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { date: date, }) if err != nil { - rws.dirty = true return 0, err } if endStream { @@ -2636,7 +2688,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { if len(p) > 0 || endStream { // only send a 0 byte DATA frame if we're ending the stream. if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { - rws.dirty = true return 0, err } } @@ -2648,9 +2699,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { trailers: rws.trailers, endStream: true, }) - if err != nil { - rws.dirty = true - } return len(p), err } return len(p), nil @@ -2866,14 +2914,12 @@ func (rws *responseWriterState) writeHeader(code int) { h.Del("Transfer-Encoding") } - if rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + rws.conn.writeHeaders(rws.stream, &writeResHeaders{ streamID: rws.stream.id, httpResCode: code, h: h, endStream: rws.handlerDone && !rws.hasTrailers(), - }) != nil { - rws.dirty = true - } + }) return } @@ -2938,19 +2984,10 @@ func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, func (w *responseWriter) handlerDone() { rws := w.rws - dirty := rws.dirty rws.handlerDone = true w.Flush() w.rws = nil - if !dirty { - // Only recycle the pool if all prior Write calls to - // the serverConn goroutine completed successfully. If - // they returned earlier due to resets from the peer - // there might still be write goroutines outstanding - // from the serverConn referencing the rws memory. See - // issue 20704. - responseWriterStatePool.Put(rws) - } + responseWriterStatePool.Put(rws) } // Push errors. @@ -3133,6 +3170,7 @@ func (sc *serverConn) startPush(msg *startPushRequest) { panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) } + sc.curHandlers++ go sc.runHandler(rw, req, sc.handler.ServeHTTP) return promisedID, nil } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index b0d482f9..df578b86 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -291,8 +291,7 @@ func (t *Transport) initConnPool() { // HTTP/2 server. type ClientConn struct { t *Transport - tconn net.Conn // usually *tls.Conn, except specialized impls - tconnClosed bool + tconn net.Conn // usually *tls.Conn, except specialized impls tlsState *tls.ConnectionState // nil only for specialized impls reused uint32 // whether conn is being reused; atomic singleUse bool // whether being used for a single http.Request @@ -1019,7 +1018,7 @@ func (cc *ClientConn) forceCloseConn() { if !ok { return } - if nc := tlsUnderlyingConn(tc); nc != nil { + if nc := tc.NetConn(); nc != nil { nc.Close() } } @@ -3202,3 +3201,34 @@ func traceFirstResponseByte(trace *httptrace.ClientTrace) { trace.GotFirstResponseByte() } } + +func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { + return trace != nil && trace.WroteHeaderField != nil +} + +func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { + if trace != nil && trace.WroteHeaderField != nil { + trace.WroteHeaderField(k, []string{v}) + } +} + +func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { + if trace != nil { + return trace.Got1xxResponse + } + return nil +} + +// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS +// connection. +func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { + dialer := &tls.Dialer{ + Config: cfg, + } + cn, err := dialer.DialContext(ctx, network, addr) + if err != nil { + return nil, err + } + tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed + return tlsCn, nil +} diff --git a/vendor/golang.org/x/net/idna/go118.go b/vendor/golang.org/x/net/idna/go118.go index c5c4338d..712f1ad8 100644 --- a/vendor/golang.org/x/net/idna/go118.go +++ b/vendor/golang.org/x/net/idna/go118.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.18 -// +build go1.18 package idna diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go index 64ccf85f..7b371788 100644 --- a/vendor/golang.org/x/net/idna/idna10.0.0.go +++ b/vendor/golang.org/x/net/idna/idna10.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.10 -// +build go1.10 // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go index ee1698ce..cc6a892a 100644 --- a/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.10 -// +build !go1.10 // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to diff --git a/vendor/golang.org/x/net/idna/pre_go118.go b/vendor/golang.org/x/net/idna/pre_go118.go index 3aaccab1..40e74bb3 100644 --- a/vendor/golang.org/x/net/idna/pre_go118.go +++ b/vendor/golang.org/x/net/idna/pre_go118.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.18 -// +build !go1.18 package idna diff --git a/vendor/golang.org/x/net/idna/tables10.0.0.go b/vendor/golang.org/x/net/idna/tables10.0.0.go index d1d62ef4..c6c2bf10 100644 --- a/vendor/golang.org/x/net/idna/tables10.0.0.go +++ b/vendor/golang.org/x/net/idna/tables10.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.10 && !go1.13 -// +build go1.10,!go1.13 package idna diff --git a/vendor/golang.org/x/net/idna/tables11.0.0.go b/vendor/golang.org/x/net/idna/tables11.0.0.go index 167efba7..76789393 100644 --- a/vendor/golang.org/x/net/idna/tables11.0.0.go +++ b/vendor/golang.org/x/net/idna/tables11.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.13 && !go1.14 -// +build go1.13,!go1.14 package idna diff --git a/vendor/golang.org/x/net/idna/tables12.0.0.go b/vendor/golang.org/x/net/idna/tables12.0.0.go index ab40f7bc..0600cd2a 100644 --- a/vendor/golang.org/x/net/idna/tables12.0.0.go +++ b/vendor/golang.org/x/net/idna/tables12.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.14 && !go1.16 -// +build go1.14,!go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go index 66701ead..2fb768ef 100644 --- a/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/vendor/golang.org/x/net/idna/tables13.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.16 && !go1.21 -// +build go1.16,!go1.21 package idna diff --git a/vendor/golang.org/x/net/idna/tables15.0.0.go b/vendor/golang.org/x/net/idna/tables15.0.0.go index 40033778..5ff05fe1 100644 --- a/vendor/golang.org/x/net/idna/tables15.0.0.go +++ b/vendor/golang.org/x/net/idna/tables15.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.21 -// +build go1.21 package idna diff --git a/vendor/golang.org/x/net/idna/tables9.0.0.go b/vendor/golang.org/x/net/idna/tables9.0.0.go index 4074b533..0f25e84c 100644 --- a/vendor/golang.org/x/net/idna/tables9.0.0.go +++ b/vendor/golang.org/x/net/idna/tables9.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build !go1.10 -// +build !go1.10 package idna diff --git a/vendor/golang.org/x/net/idna/trie12.0.0.go b/vendor/golang.org/x/net/idna/trie12.0.0.go index bb63f904..8a75b966 100644 --- a/vendor/golang.org/x/net/idna/trie12.0.0.go +++ b/vendor/golang.org/x/net/idna/trie12.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.16 -// +build !go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/trie13.0.0.go b/vendor/golang.org/x/net/idna/trie13.0.0.go index 7d68a8dc..fa45bb90 100644 --- a/vendor/golang.org/x/net/idna/trie13.0.0.go +++ b/vendor/golang.org/x/net/idna/trie13.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.16 -// +build go1.16 package idna diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/vendor/golang.org/x/net/internal/socket/cmsghdr.go index 4bdaaaf1..33a5bf59 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go index 0d30e0a0..68f438c8 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go index 4936e8a6..058ea8de 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm || mips || mipsle || 386 || ppc) && linux -// +build arm mips mipsle 386 ppc -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go index f6877f98..3ca0d3a0 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm64 || amd64 || loong64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && linux -// +build arm64 amd64 loong64 ppc64 ppc64le mips64 mips64le riscv64 s390x -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go index d3dbe1b8..6d0e426c 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go index 1d9f2ed6..7ca9cb7e 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go index 19d46789..0211f225 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/complete_dontwait.go b/vendor/golang.org/x/net/internal/socket/complete_dontwait.go index 5b1d50ae..2038f290 100644 --- a/vendor/golang.org/x/net/internal/socket/complete_dontwait.go +++ b/vendor/golang.org/x/net/internal/socket/complete_dontwait.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build darwin dragonfly freebsd linux netbsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go b/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go index be634095..70e6f448 100644 --- a/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go +++ b/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || windows || zos -// +build aix windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/empty.s b/vendor/golang.org/x/net/internal/socket/empty.s index 90ab4ca3..49d79791 100644 --- a/vendor/golang.org/x/net/internal/socket/empty.s +++ b/vendor/golang.org/x/net/internal/socket/empty.s @@ -3,6 +3,5 @@ // license that can be found in the LICENSE file. //go:build darwin && go1.12 -// +build darwin,go1.12 // This exists solely so we can linkname in symbols from syscall. diff --git a/vendor/golang.org/x/net/internal/socket/error_unix.go b/vendor/golang.org/x/net/internal/socket/error_unix.go index 78f41290..7a5cc5c4 100644 --- a/vendor/golang.org/x/net/internal/socket/error_unix.go +++ b/vendor/golang.org/x/net/internal/socket/error_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go index 2b8fbb3f..340e53fb 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm || mips || mipsle || 386 || ppc) && (darwin || dragonfly || freebsd || linux || netbsd || openbsd) -// +build arm mips mipsle 386 ppc -// +build darwin dragonfly freebsd linux netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go index 2e94e96f..26470c19 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm64 || amd64 || loong64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || zos) -// +build arm64 amd64 loong64 ppc64 ppc64le mips64 mips64le riscv64 s390x -// +build aix darwin dragonfly freebsd linux netbsd openbsd zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go index f7da2bc4..8859ce10 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/vendor/golang.org/x/net/internal/socket/iovec_stub.go index 14caf524..da886b03 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_stub.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go index 113e773c..4825b21e 100644 --- a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !linux && !netbsd -// +build !aix,!linux,!netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go index 41883c53..311fd2c7 100644 --- a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || linux || netbsd -// +build aix linux netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go index 25f6847f..ebff4f6e 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go index 5b8e00f1..62e6fe86 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd -// +build aix darwin dragonfly freebsd netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go index b4658fba..3dd07250 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm || mips || mipsle || 386 || ppc) && linux -// +build arm mips mipsle 386 ppc -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go index 42411aff..5af9ddd6 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm64 || amd64 || loong64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && linux -// +build arm64 amd64 loong64 ppc64 ppc64le mips64 mips64le riscv64 s390x -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go index 3098f5d7..e212b50f 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go index eb79151f..e8767764 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go b/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go index 324e9ee7..529db68e 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build s390x && zos -// +build s390x,zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/norace.go b/vendor/golang.org/x/net/internal/socket/norace.go index de0ad420..8af30ecf 100644 --- a/vendor/golang.org/x/net/internal/socket/norace.go +++ b/vendor/golang.org/x/net/internal/socket/norace.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !race -// +build !race package socket diff --git a/vendor/golang.org/x/net/internal/socket/race.go b/vendor/golang.org/x/net/internal/socket/race.go index f0a28a62..9afa9580 100644 --- a/vendor/golang.org/x/net/internal/socket/race.go +++ b/vendor/golang.org/x/net/internal/socket/race.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build race -// +build race package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go index 8f79b38f..04313907 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go index f7d0b0d2..7c0d7410 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go index 02f32855..e363fb5a 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go index dd785877..ff7a8baf 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/vendor/golang.org/x/net/internal/socket/sys_bsd.go index b258879d..e7664d48 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/sys_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || openbsd || solaris -// +build aix darwin dragonfly freebsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go index 5d99f237..d7627f87 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux.go b/vendor/golang.org/x/net/internal/socket/sys_linux.go index 76f5b8ae..08d49107 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && !s390x && !386 -// +build linux,!s390x,!386 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go index af964e61..1d182470 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build loong64 -// +build loong64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go index 5b128fbb..0e407d12 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 -// +build riscv64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go index 42b8f234..58d86548 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_posix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_stub.go b/vendor/golang.org/x/net/internal/socket/sys_stub.go index 7cfb349c..2e5b473c 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_stub.go +++ b/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go index de823932..93058db5 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go index 00691bd5..45bab004 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go @@ -3,7 +3,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go index 6a94fec2..b6fc15a1 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build loong64 -// +build loong64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go index c066272d..e67fc3cb 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build riscv64 -// +build riscv64 package socket diff --git a/vendor/golang.org/x/net/internal/socks/client.go b/vendor/golang.org/x/net/internal/socks/client.go new file mode 100644 index 00000000..3d6f516a --- /dev/null +++ b/vendor/golang.org/x/net/internal/socks/client.go @@ -0,0 +1,168 @@ +// 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 file. + +package socks + +import ( + "context" + "errors" + "io" + "net" + "strconv" + "time" +) + +var ( + noDeadline = time.Time{} + aLongTimeAgo = time.Unix(1, 0) +) + +func (d *Dialer) connect(ctx context.Context, c net.Conn, address string) (_ net.Addr, ctxErr error) { + host, port, err := splitHostPort(address) + if err != nil { + return nil, err + } + if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() { + c.SetDeadline(deadline) + defer c.SetDeadline(noDeadline) + } + if ctx != context.Background() { + errCh := make(chan error, 1) + done := make(chan struct{}) + defer func() { + close(done) + if ctxErr == nil { + ctxErr = <-errCh + } + }() + go func() { + select { + case <-ctx.Done(): + c.SetDeadline(aLongTimeAgo) + errCh <- ctx.Err() + case <-done: + errCh <- nil + } + }() + } + + b := make([]byte, 0, 6+len(host)) // the size here is just an estimate + b = append(b, Version5) + if len(d.AuthMethods) == 0 || d.Authenticate == nil { + b = append(b, 1, byte(AuthMethodNotRequired)) + } else { + ams := d.AuthMethods + if len(ams) > 255 { + return nil, errors.New("too many authentication methods") + } + b = append(b, byte(len(ams))) + for _, am := range ams { + b = append(b, byte(am)) + } + } + if _, ctxErr = c.Write(b); ctxErr != nil { + return + } + + if _, ctxErr = io.ReadFull(c, b[:2]); ctxErr != nil { + return + } + if b[0] != Version5 { + return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0]))) + } + am := AuthMethod(b[1]) + if am == AuthMethodNoAcceptableMethods { + return nil, errors.New("no acceptable authentication methods") + } + if d.Authenticate != nil { + if ctxErr = d.Authenticate(ctx, c, am); ctxErr != nil { + return + } + } + + b = b[:0] + b = append(b, Version5, byte(d.cmd), 0) + if ip := net.ParseIP(host); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + b = append(b, AddrTypeIPv4) + b = append(b, ip4...) + } else if ip6 := ip.To16(); ip6 != nil { + b = append(b, AddrTypeIPv6) + b = append(b, ip6...) + } else { + return nil, errors.New("unknown address type") + } + } else { + if len(host) > 255 { + return nil, errors.New("FQDN too long") + } + b = append(b, AddrTypeFQDN) + b = append(b, byte(len(host))) + b = append(b, host...) + } + b = append(b, byte(port>>8), byte(port)) + if _, ctxErr = c.Write(b); ctxErr != nil { + return + } + + if _, ctxErr = io.ReadFull(c, b[:4]); ctxErr != nil { + return + } + if b[0] != Version5 { + return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0]))) + } + if cmdErr := Reply(b[1]); cmdErr != StatusSucceeded { + return nil, errors.New("unknown error " + cmdErr.String()) + } + if b[2] != 0 { + return nil, errors.New("non-zero reserved field") + } + l := 2 + var a Addr + switch b[3] { + case AddrTypeIPv4: + l += net.IPv4len + a.IP = make(net.IP, net.IPv4len) + case AddrTypeIPv6: + l += net.IPv6len + a.IP = make(net.IP, net.IPv6len) + case AddrTypeFQDN: + if _, err := io.ReadFull(c, b[:1]); err != nil { + return nil, err + } + l += int(b[0]) + default: + return nil, errors.New("unknown address type " + strconv.Itoa(int(b[3]))) + } + if cap(b) < l { + b = make([]byte, l) + } else { + b = b[:l] + } + if _, ctxErr = io.ReadFull(c, b); ctxErr != nil { + return + } + if a.IP != nil { + copy(a.IP, b) + } else { + a.Name = string(b[:len(b)-2]) + } + a.Port = int(b[len(b)-2])<<8 | int(b[len(b)-1]) + return &a, nil +} + +func splitHostPort(address string) (string, int, error) { + host, port, err := net.SplitHostPort(address) + if err != nil { + return "", 0, err + } + portnum, err := strconv.Atoi(port) + if err != nil { + return "", 0, err + } + if 1 > portnum || portnum > 0xffff { + return "", 0, errors.New("port number out of range " + port) + } + return host, portnum, nil +} diff --git a/vendor/golang.org/x/net/internal/socks/socks.go b/vendor/golang.org/x/net/internal/socks/socks.go new file mode 100644 index 00000000..84fcc32b --- /dev/null +++ b/vendor/golang.org/x/net/internal/socks/socks.go @@ -0,0 +1,317 @@ +// 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 file. + +// Package socks provides a SOCKS version 5 client implementation. +// +// SOCKS protocol version 5 is defined in RFC 1928. +// Username/Password authentication for SOCKS version 5 is defined in +// RFC 1929. +package socks + +import ( + "context" + "errors" + "io" + "net" + "strconv" +) + +// A Command represents a SOCKS command. +type Command int + +func (cmd Command) String() string { + switch cmd { + case CmdConnect: + return "socks connect" + case cmdBind: + return "socks bind" + default: + return "socks " + strconv.Itoa(int(cmd)) + } +} + +// An AuthMethod represents a SOCKS authentication method. +type AuthMethod int + +// A Reply represents a SOCKS command reply code. +type Reply int + +func (code Reply) String() string { + switch code { + case StatusSucceeded: + return "succeeded" + case 0x01: + return "general SOCKS server failure" + case 0x02: + return "connection not allowed by ruleset" + case 0x03: + return "network unreachable" + case 0x04: + return "host unreachable" + case 0x05: + return "connection refused" + case 0x06: + return "TTL expired" + case 0x07: + return "command not supported" + case 0x08: + return "address type not supported" + default: + return "unknown code: " + strconv.Itoa(int(code)) + } +} + +// Wire protocol constants. +const ( + Version5 = 0x05 + + AddrTypeIPv4 = 0x01 + AddrTypeFQDN = 0x03 + AddrTypeIPv6 = 0x04 + + CmdConnect Command = 0x01 // establishes an active-open forward proxy connection + cmdBind Command = 0x02 // establishes a passive-open forward proxy connection + + AuthMethodNotRequired AuthMethod = 0x00 // no authentication required + AuthMethodUsernamePassword AuthMethod = 0x02 // use username/password + AuthMethodNoAcceptableMethods AuthMethod = 0xff // no acceptable authentication methods + + StatusSucceeded Reply = 0x00 +) + +// An Addr represents a SOCKS-specific address. +// Either Name or IP is used exclusively. +type Addr struct { + Name string // fully-qualified domain name + IP net.IP + Port int +} + +func (a *Addr) Network() string { return "socks" } + +func (a *Addr) String() string { + if a == nil { + return "" + } + port := strconv.Itoa(a.Port) + if a.IP == nil { + return net.JoinHostPort(a.Name, port) + } + return net.JoinHostPort(a.IP.String(), port) +} + +// A Conn represents a forward proxy connection. +type Conn struct { + net.Conn + + boundAddr net.Addr +} + +// BoundAddr returns the address assigned by the proxy server for +// connecting to the command target address from the proxy server. +func (c *Conn) BoundAddr() net.Addr { + if c == nil { + return nil + } + return c.boundAddr +} + +// A Dialer holds SOCKS-specific options. +type Dialer struct { + cmd Command // either CmdConnect or cmdBind + proxyNetwork string // network between a proxy server and a client + proxyAddress string // proxy server address + + // ProxyDial specifies the optional dial function for + // establishing the transport connection. + ProxyDial func(context.Context, string, string) (net.Conn, error) + + // AuthMethods specifies the list of request authentication + // methods. + // If empty, SOCKS client requests only AuthMethodNotRequired. + AuthMethods []AuthMethod + + // Authenticate specifies the optional authentication + // function. It must be non-nil when AuthMethods is not empty. + // It must return an error when the authentication is failed. + Authenticate func(context.Context, io.ReadWriter, AuthMethod) error +} + +// DialContext connects to the provided address on the provided +// network. +// +// The returned error value may be a net.OpError. When the Op field of +// net.OpError contains "socks", the Source field contains a proxy +// server address and the Addr field contains a command target +// address. +// +// See func Dial of the net package of standard library for a +// description of the network and address parameters. +func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if ctx == nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")} + } + var err error + var c net.Conn + if d.ProxyDial != nil { + c, err = d.ProxyDial(ctx, d.proxyNetwork, d.proxyAddress) + } else { + var dd net.Dialer + c, err = dd.DialContext(ctx, d.proxyNetwork, d.proxyAddress) + } + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + a, err := d.connect(ctx, c, address) + if err != nil { + c.Close() + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + return &Conn{Conn: c, boundAddr: a}, nil +} + +// DialWithConn initiates a connection from SOCKS server to the target +// network and address using the connection c that is already +// connected to the SOCKS server. +// +// It returns the connection's local address assigned by the SOCKS +// server. +func (d *Dialer) DialWithConn(ctx context.Context, c net.Conn, network, address string) (net.Addr, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if ctx == nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")} + } + a, err := d.connect(ctx, c, address) + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + return a, nil +} + +// Dial connects to the provided address on the provided network. +// +// Unlike DialContext, it returns a raw transport connection instead +// of a forward proxy connection. +// +// Deprecated: Use DialContext or DialWithConn instead. +func (d *Dialer) Dial(network, address string) (net.Conn, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + var err error + var c net.Conn + if d.ProxyDial != nil { + c, err = d.ProxyDial(context.Background(), d.proxyNetwork, d.proxyAddress) + } else { + c, err = net.Dial(d.proxyNetwork, d.proxyAddress) + } + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if _, err := d.DialWithConn(context.Background(), c, network, address); err != nil { + c.Close() + return nil, err + } + return c, nil +} + +func (d *Dialer) validateTarget(network, address string) error { + switch network { + case "tcp", "tcp6", "tcp4": + default: + return errors.New("network not implemented") + } + switch d.cmd { + case CmdConnect, cmdBind: + default: + return errors.New("command not implemented") + } + return nil +} + +func (d *Dialer) pathAddrs(address string) (proxy, dst net.Addr, err error) { + for i, s := range []string{d.proxyAddress, address} { + host, port, err := splitHostPort(s) + if err != nil { + return nil, nil, err + } + a := &Addr{Port: port} + a.IP = net.ParseIP(host) + if a.IP == nil { + a.Name = host + } + if i == 0 { + proxy = a + } else { + dst = a + } + } + return +} + +// NewDialer returns a new Dialer that dials through the provided +// proxy server's network and address. +func NewDialer(network, address string) *Dialer { + return &Dialer{proxyNetwork: network, proxyAddress: address, cmd: CmdConnect} +} + +const ( + authUsernamePasswordVersion = 0x01 + authStatusSucceeded = 0x00 +) + +// UsernamePassword are the credentials for the username/password +// authentication method. +type UsernamePassword struct { + Username string + Password string +} + +// Authenticate authenticates a pair of username and password with the +// proxy server. +func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, auth AuthMethod) error { + switch auth { + case AuthMethodNotRequired: + return nil + case AuthMethodUsernamePassword: + if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) > 255 { + return errors.New("invalid username/password") + } + b := []byte{authUsernamePasswordVersion} + b = append(b, byte(len(up.Username))) + b = append(b, up.Username...) + b = append(b, byte(len(up.Password))) + b = append(b, up.Password...) + // TODO(mikio): handle IO deadlines and cancelation if + // necessary + if _, err := rw.Write(b); err != nil { + return err + } + if _, err := io.ReadFull(rw, b[:2]); err != nil { + return err + } + if b[0] != authUsernamePasswordVersion { + return errors.New("invalid username/password version") + } + if b[1] != authStatusSucceeded { + return errors.New("username/password authentication failed") + } + return nil + } + return errors.New("unsupported authentication method " + strconv.Itoa(int(auth))) +} diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go index b7385dfd..c88da8cb 100644 --- a/vendor/golang.org/x/net/ipv4/control_bsd.go +++ b/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go index 0e748dbd..14ae2dae 100644 --- a/vendor/golang.org/x/net/ipv4/control_pktinfo.go +++ b/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || linux || solaris -// +build darwin linux solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go index f27322c3..3ba66116 100644 --- a/vendor/golang.org/x/net/ipv4/control_stub.go +++ b/vendor/golang.org/x/net/ipv4/control_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go index 2413e02f..2e765548 100644 --- a/vendor/golang.org/x/net/ipv4/control_unix.go +++ b/vendor/golang.org/x/net/ipv4/control_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go index cd4ee6e1..c2c4ce7f 100644 --- a/vendor/golang.org/x/net/ipv4/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go index 1bb370e2..91c685e8 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go index 53f0794e..2afd4b50 100644 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_posix.go index eb07c1c0..82e2c378 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go index cf036893..840108bf 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_aix.go b/vendor/golang.org/x/net/ipv4/sys_aix.go index 02730cdf..9244a68a 100644 --- a/vendor/golang.org/x/net/ipv4/sys_aix.go +++ b/vendor/golang.org/x/net/ipv4/sys_aix.go @@ -4,7 +4,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/vendor/golang.org/x/net/ipv4/sys_asmreq.go index 22322b38..645f254c 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || solaris || windows -// +build aix darwin dragonfly freebsd netbsd openbsd solaris windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go index fde64014..48cfb6db 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !netbsd && !openbsd && !solaris && !windows -// +build !aix,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go index 54eb9901..0b27b632 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || freebsd || linux -// +build darwin freebsd linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go index dcb15f25..303a5e2e 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !darwin && !freebsd && !linux -// +build !darwin,!freebsd,!linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf.go b/vendor/golang.org/x/net/ipv4/sys_bpf.go index fb11e324..1b4780df 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go index fc53a0d3..b1f779b4 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bsd.go b/vendor/golang.org/x/net/ipv4/sys_bsd.go index e191b2f1..b7b032d2 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build netbsd || openbsd -// +build netbsd openbsd package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go index 6a4e7abf..a295e15e 100644 --- a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || freebsd || linux || solaris -// +build darwin freebsd linux solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go index 157159fd..74bd454e 100644 --- a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !darwin && !freebsd && !linux && !solaris -// +build !darwin,!freebsd,!linux,!solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go index d5508516..20af4074 100644 --- a/vendor/golang.org/x/net/ipv4/sys_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go index b7f2d6e5..dd454025 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go @@ -3,7 +3,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go index e15c22c7..54f9e139 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build loong64 -// +build loong64 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go index e2edebdb..78374a52 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build riscv64 -// +build riscv64 package ipv4 diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go index 2733ddbe..a8f04e7b 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin -// +build darwin package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go index 9c90844a..51fbbb1f 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go index b7e8643f..eb28ce75 100644 --- a/vendor/golang.org/x/net/ipv6/control_stub.go +++ b/vendor/golang.org/x/net/ipv6/control_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go index 63e475db..9c73b864 100644 --- a/vendor/golang.org/x/net/ipv6/control_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go index 120bf877..2814534a 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_bsd.go +++ b/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go index d60136a9..c92c9b51 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go index b0692e43..be04e4d6 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go index cd0ff508..29b9ccf6 100644 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_posix.go index 37c62871..34dfed58 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go index 32fd8664..a09c3aaf 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_aix.go b/vendor/golang.org/x/net/ipv6/sys_aix.go index a47182af..93c8efc4 100644 --- a/vendor/golang.org/x/net/ipv6/sys_aix.go +++ b/vendor/golang.org/x/net/ipv6/sys_aix.go @@ -4,7 +4,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/vendor/golang.org/x/net/ipv6/sys_asmreq.go index 6ff9950d..5c9cb444 100644 --- a/vendor/golang.org/x/net/ipv6/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go index 485290cb..dc704946 100644 --- a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf.go b/vendor/golang.org/x/net/ipv6/sys_bpf.go index b5661fb8..e39f75f4 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go index cb006618..8532a8f5 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go index bde41a6c..9f3bc2af 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build dragonfly || netbsd || openbsd -// +build dragonfly netbsd openbsd package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go index 023488a4..b40f5c68 100644 --- a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || freebsd || linux || solaris || zos -// +build aix darwin freebsd linux solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go index acdf2e5c..6526aad5 100644 --- a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !freebsd && !linux && !solaris && !zos -// +build !aix,!darwin,!freebsd,!linux,!solaris,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go index 5807bba3..76602c34 100644 --- a/vendor/golang.org/x/net/ipv6/sys_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go index f604b0f3..668716df 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go @@ -3,7 +3,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go index 598fbfa0..6a53284d 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build loong64 -// +build loong64 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go index d4f78e40..13b34720 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build riscv64 -// +build riscv64 package ipv6 diff --git a/vendor/golang.org/x/net/proxy/dial.go b/vendor/golang.org/x/net/proxy/dial.go new file mode 100644 index 00000000..811c2e4e --- /dev/null +++ b/vendor/golang.org/x/net/proxy/dial.go @@ -0,0 +1,54 @@ +// 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 file. + +package proxy + +import ( + "context" + "net" +) + +// A ContextDialer dials using a context. +type ContextDialer interface { + DialContext(ctx context.Context, network, address string) (net.Conn, error) +} + +// Dial works like DialContext on net.Dialer but using a dialer returned by FromEnvironment. +// +// The passed ctx is only used for returning the Conn, not the lifetime of the Conn. +// +// Custom dialers (registered via RegisterDialerType) that do not implement ContextDialer +// can leak a goroutine for as long as it takes the underlying Dialer implementation to timeout. +// +// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed. +func Dial(ctx context.Context, network, address string) (net.Conn, error) { + d := FromEnvironment() + if xd, ok := d.(ContextDialer); ok { + return xd.DialContext(ctx, network, address) + } + return dialContext(ctx, d, network, address) +} + +// WARNING: this can leak a goroutine for as long as the underlying Dialer implementation takes to timeout +// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed. +func dialContext(ctx context.Context, d Dialer, network, address string) (net.Conn, error) { + var ( + conn net.Conn + done = make(chan struct{}, 1) + err error + ) + go func() { + conn, err = d.Dial(network, address) + close(done) + if conn != nil && ctx.Err() != nil { + conn.Close() + } + }() + select { + case <-ctx.Done(): + err = ctx.Err() + case <-done: + } + return conn, err +} diff --git a/vendor/golang.org/x/net/proxy/direct.go b/vendor/golang.org/x/net/proxy/direct.go new file mode 100644 index 00000000..3d66bdef --- /dev/null +++ b/vendor/golang.org/x/net/proxy/direct.go @@ -0,0 +1,31 @@ +// Copyright 2011 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 proxy + +import ( + "context" + "net" +) + +type direct struct{} + +// Direct implements Dialer by making network connections directly using net.Dial or net.DialContext. +var Direct = direct{} + +var ( + _ Dialer = Direct + _ ContextDialer = Direct +) + +// Dial directly invokes net.Dial with the supplied parameters. +func (direct) Dial(network, addr string) (net.Conn, error) { + return net.Dial(network, addr) +} + +// DialContext instantiates a net.Dialer and invokes its DialContext receiver with the supplied parameters. +func (direct) DialContext(ctx context.Context, network, addr string) (net.Conn, error) { + var d net.Dialer + return d.DialContext(ctx, network, addr) +} diff --git a/vendor/golang.org/x/net/proxy/per_host.go b/vendor/golang.org/x/net/proxy/per_host.go new file mode 100644 index 00000000..573fe79e --- /dev/null +++ b/vendor/golang.org/x/net/proxy/per_host.go @@ -0,0 +1,155 @@ +// Copyright 2011 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 proxy + +import ( + "context" + "net" + "strings" +) + +// A PerHost directs connections to a default Dialer unless the host name +// requested matches one of a number of exceptions. +type PerHost struct { + def, bypass Dialer + + bypassNetworks []*net.IPNet + bypassIPs []net.IP + bypassZones []string + bypassHosts []string +} + +// NewPerHost returns a PerHost Dialer that directs connections to either +// defaultDialer or bypass, depending on whether the connection matches one of +// the configured rules. +func NewPerHost(defaultDialer, bypass Dialer) *PerHost { + return &PerHost{ + def: defaultDialer, + bypass: bypass, + } +} + +// Dial connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + return p.dialerForRequest(host).Dial(network, addr) +} + +// DialContext connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + d := p.dialerForRequest(host) + if x, ok := d.(ContextDialer); ok { + return x.DialContext(ctx, network, addr) + } + return dialContext(ctx, d, network, addr) +} + +func (p *PerHost) dialerForRequest(host string) Dialer { + if ip := net.ParseIP(host); ip != nil { + for _, net := range p.bypassNetworks { + if net.Contains(ip) { + return p.bypass + } + } + for _, bypassIP := range p.bypassIPs { + if bypassIP.Equal(ip) { + return p.bypass + } + } + return p.def + } + + for _, zone := range p.bypassZones { + if strings.HasSuffix(host, zone) { + return p.bypass + } + if host == zone[1:] { + // For a zone ".example.com", we match "example.com" + // too. + return p.bypass + } + } + for _, bypassHost := range p.bypassHosts { + if bypassHost == host { + return p.bypass + } + } + return p.def +} + +// AddFromString parses a string that contains comma-separated values +// specifying hosts that should use the bypass proxy. Each value is either an +// IP address, a CIDR range, a zone (*.example.com) or a host name +// (localhost). A best effort is made to parse the string and errors are +// ignored. +func (p *PerHost) AddFromString(s string) { + hosts := strings.Split(s, ",") + for _, host := range hosts { + host = strings.TrimSpace(host) + if len(host) == 0 { + continue + } + if strings.Contains(host, "/") { + // We assume that it's a CIDR address like 127.0.0.0/8 + if _, net, err := net.ParseCIDR(host); err == nil { + p.AddNetwork(net) + } + continue + } + if ip := net.ParseIP(host); ip != nil { + p.AddIP(ip) + continue + } + if strings.HasPrefix(host, "*.") { + p.AddZone(host[1:]) + continue + } + p.AddHost(host) + } +} + +// AddIP specifies an IP address that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match an IP. +func (p *PerHost) AddIP(ip net.IP) { + p.bypassIPs = append(p.bypassIPs, ip) +} + +// AddNetwork specifies an IP range that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match. +func (p *PerHost) AddNetwork(net *net.IPNet) { + p.bypassNetworks = append(p.bypassNetworks, net) +} + +// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of +// "example.com" matches "example.com" and all of its subdomains. +func (p *PerHost) AddZone(zone string) { + if strings.HasSuffix(zone, ".") { + zone = zone[:len(zone)-1] + } + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } + p.bypassZones = append(p.bypassZones, zone) +} + +// AddHost specifies a host name that will use the bypass proxy. +func (p *PerHost) AddHost(host string) { + if strings.HasSuffix(host, ".") { + host = host[:len(host)-1] + } + p.bypassHosts = append(p.bypassHosts, host) +} diff --git a/vendor/golang.org/x/net/proxy/proxy.go b/vendor/golang.org/x/net/proxy/proxy.go new file mode 100644 index 00000000..9ff4b9a7 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/proxy.go @@ -0,0 +1,149 @@ +// Copyright 2011 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 proxy provides support for a variety of protocols to proxy network +// data. +package proxy // import "golang.org/x/net/proxy" + +import ( + "errors" + "net" + "net/url" + "os" + "sync" +) + +// A Dialer is a means to establish a connection. +// Custom dialers should also implement ContextDialer. +type Dialer interface { + // Dial connects to the given address via the proxy. + Dial(network, addr string) (c net.Conn, err error) +} + +// Auth contains authentication parameters that specific Dialers may require. +type Auth struct { + User, Password string +} + +// FromEnvironment returns the dialer specified by the proxy-related +// variables in the environment and makes underlying connections +// directly. +func FromEnvironment() Dialer { + return FromEnvironmentUsing(Direct) +} + +// FromEnvironmentUsing returns the dialer specify by the proxy-related +// variables in the environment and makes underlying connections +// using the provided forwarding Dialer (for instance, a *net.Dialer +// with desired configuration). +func FromEnvironmentUsing(forward Dialer) Dialer { + allProxy := allProxyEnv.Get() + if len(allProxy) == 0 { + return forward + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return forward + } + proxy, err := FromURL(proxyURL, forward) + if err != nil { + return forward + } + + noProxy := noProxyEnv.Get() + if len(noProxy) == 0 { + return proxy + } + + perHost := NewPerHost(proxy, forward) + perHost.AddFromString(noProxy) + return perHost +} + +// proxySchemes is a map from URL schemes to a function that creates a Dialer +// from a URL with such a scheme. +var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) + +// RegisterDialerType takes a URL scheme and a function to generate Dialers from +// a URL with that scheme and a forwarding Dialer. Registered schemes are used +// by FromURL. +func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { + if proxySchemes == nil { + proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) + } + proxySchemes[scheme] = f +} + +// FromURL returns a Dialer given a URL specification and an underlying +// Dialer for it to make network requests. +func FromURL(u *url.URL, forward Dialer) (Dialer, error) { + var auth *Auth + if u.User != nil { + auth = new(Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + switch u.Scheme { + case "socks5", "socks5h": + addr := u.Hostname() + port := u.Port() + if port == "" { + port = "1080" + } + return SOCKS5("tcp", net.JoinHostPort(addr, port), auth, forward) + } + + // If the scheme doesn't match any of the built-in schemes, see if it + // was registered by another package. + if proxySchemes != nil { + if f, ok := proxySchemes[u.Scheme]; ok { + return f(u, forward) + } + } + + return nil, errors.New("proxy: unknown scheme: " + u.Scheme) +} + +var ( + allProxyEnv = &envOnce{ + names: []string{"ALL_PROXY", "all_proxy"}, + } + noProxyEnv = &envOnce{ + names: []string{"NO_PROXY", "no_proxy"}, + } +) + +// envOnce looks up an environment variable (optionally by multiple +// names) once. It mitigates expensive lookups on some platforms +// (e.g. Windows). +// (Borrowed from net/http/transport.go) +type envOnce struct { + names []string + once sync.Once + val string +} + +func (e *envOnce) Get() string { + e.once.Do(e.init) + return e.val +} + +func (e *envOnce) init() { + for _, n := range e.names { + e.val = os.Getenv(n) + if e.val != "" { + return + } + } +} + +// reset is used by tests +func (e *envOnce) reset() { + e.once = sync.Once{} + e.val = "" +} diff --git a/vendor/golang.org/x/net/proxy/socks5.go b/vendor/golang.org/x/net/proxy/socks5.go new file mode 100644 index 00000000..c91651f9 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/socks5.go @@ -0,0 +1,42 @@ +// Copyright 2011 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 proxy + +import ( + "context" + "net" + + "golang.org/x/net/internal/socks" +) + +// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given +// address with an optional username and password. +// See RFC 1928 and RFC 1929. +func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) { + d := socks.NewDialer(network, address) + if forward != nil { + if f, ok := forward.(ContextDialer); ok { + d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) { + return f.DialContext(ctx, network, address) + } + } else { + d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) { + return dialContext(ctx, forward, network, address) + } + } + } + if auth != nil { + up := socks.UsernamePassword{ + Username: auth.User, + Password: auth.Password, + } + d.AuthMethods = []socks.AuthMethod{ + socks.AuthMethodNotRequired, + socks.AuthMethodUsernamePassword, + } + d.Authenticate = up.Authenticate + } + return d, nil +} diff --git a/vendor/golang.org/x/net/publicsuffix/data/children b/vendor/golang.org/x/net/publicsuffix/data/children index 1038c561ade4683e91b37e8298fc5ead7c306779..08261bffd196fd6942b4cebb5ff06e0ffe53808d 100644 GIT binary patch literal 2976 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 literal 2876 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 Z1B%rnr6^x|0)0GUL2F0Oqfew4{}2BS2s{7) diff --git a/vendor/golang.org/x/net/publicsuffix/data/nodes b/vendor/golang.org/x/net/publicsuffix/data/nodes index 34751cd5b9d1b14c3a0977e4fa4b04db058b241d..1dae6ede8f292889cb4252aa473312fea1bac46a 100644 GIT binary patch literal 46610 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

    kM-i?FIu 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 diff --git a/vendor/golang.org/x/net/publicsuffix/data/text b/vendor/golang.org/x/net/publicsuffix/data/text index 124dcd61..7e516413 100644 --- a/vendor/golang.org/x/net/publicsuffix/data/text +++ b/vendor/golang.org/x/net/publicsuffix/data/text @@ -1 +1 @@ -billustrationionjukudoyamakeupowiathletajimageandsoundandvision-riopretobishimagentositecnologiabiocelotenkawabipanasonicatfoodnetworkinggroupperbirdartcenterprisecloudaccesscamdvrcampaniabirkenesoddtangenovarahkkeravjuegoshikikiraraholtalenishikatakazakindependent-revieweirbirthplaceu-1bitbucketrzynishikatsuragirlyuzawabitternidiscoverybjarkoybjerkreimdbaltimore-og-romsdalp1bjugnishikawazukamishihoronobeautydalwaysdatabaseballangenkainanaejrietisalatinabenogatabitorderblackfridaybloombergbauernishimerabloxcms3-website-us-west-2blushakotanishinomiyashironocparachutingjovikarateu-2bmoattachmentsalangenishinoomotegovtattoolforgerockartuzybmsalon-1bmwellbeingzoneu-3bnrwesteuropenairbusantiquesaltdalomzaporizhzhedmarkaratsuginamikatagamilanotairesistanceu-4bondigitaloceanspacesaludishangrilanciabonnishinoshimatsusakahoginankokubunjindianapolis-a-bloggerbookonlinewjerseyboomlahppiacenzachpomorskienishiokoppegardiskussionsbereichattanooganordkapparaglidinglassassinationalheritageu-north-1boschaefflerdalondonetskarelianceu-south-1bostik-serveronagasukevje-og-hornnesalvadordalibabalatinord-aurdalipaywhirlondrinaplesknsalzburgleezextraspace-to-rentalstomakomaibarabostonakijinsekikogentappssejnyaarparalleluxembourglitcheltenham-radio-opensocialorenskogliwicebotanicalgardeno-staginglobodoes-itcouldbeworldisrechtranakamurataiwanairforcechireadthedocsxeroxfinitybotanicgardenishitosashimizunaminamiawajikindianmarketinglogowestfalenishiwakindielddanuorrindigenamsskoganeindustriabotanyanagawallonieruchomoscienceandindustrynissandiegoddabouncemerckmsdnipropetrovskjervoyageorgeorgiabounty-fullensakerrypropertiesamegawaboutiquebecommerce-shopselectaxihuanissayokkaichintaifun-dnsaliasamnangerboutireservditchyouriparasiteboyfriendoftheinternetflixjavaldaostathellevangerbozen-sudtirolottokorozawabozen-suedtirolouvreisenissedalovepoparisor-fronisshingucciprianiigataipeidsvollovesickariyakumodumeloyalistoragebplaceducatorprojectcmembersampalermomahaccapooguybrandywinevalleybrasiliadboxosascoli-picenorddalpusercontentcp4bresciaokinawashirosatobamagazineuesamsclubartowestus2brindisibenikitagataikikuchikumagayagawalmartgorybristoloseyouriparliamentjeldsundivtasvuodnakaniikawatanagurabritishcolumbialowiezaganiyodogawabroadcastlebtimnetzlgloomy-routerbroadwaybroke-itvedestrandivttasvuotnakanojohanamakindlefrakkestadiybrokerbrothermesaverdeatnulmemergencyachtsamsungloppennebrowsersafetymarketsandnessjoenl-ams-1brumunddalublindesnesandoybrunelastxn--0trq7p7nnbrusselsandvikcoromantovalle-daostavangerbruxellesanfranciscofreakunekobayashikaoirmemorialucaniabryanskodjedugit-pagespeedmobilizeroticagliaricoharuovatlassian-dev-builderscbglugsjcbnpparibashkiriabrynewmexicoacharterbuzzwfarmerseinebwhalingmbhartiffany-2bzhitomirbzzcodyn-vpndnsantacruzsantafedjeffersoncoffeedbackdropocznordlandrudupontariobranconavstackasaokamikoaniikappudownloadurbanamexhibitioncogretakamatsukawacollectioncolognewyorkshirebungoonordre-landurhamburgrimstadynamisches-dnsantamariakecolonialwilliamsburgripeeweeklylotterycoloradoplateaudnedalncolumbusheycommunexus-3community-prochowicecomobaravendbambleborkapsicilyonagoyauthgear-stagingivestbyglandroverhallair-traffic-controlleyombomloabaths-heilbronnoysunddnslivegarsheiheijibigawaustraliaustinnfshostrolekamisatokaizukameyamatotakadaustevollivornowtv-infolldalolipopmcdircompanychipstmncomparemarkerryhotelsantoandrepbodynaliasnesoddenmarkhangelskjakdnepropetrovskiervaapsteigenflfannefrankfurtjxn--12cfi8ixb8lutskashibatakashimarshallstatebankashiharacomsecaaskimitsubatamibuildingriwatarailwaycondoshichinohealth-carereformemsettlersanukindustriesteamfamberlevagangaviikanonjinfinitigotembaixadaconferenceconstructionconsuladogadollsaobernardomniweatherchanneluxuryconsultanthropologyconsultingroks-thisayamanobeokakegawacontactkmaxxn--12co0c3b4evalled-aostamayukinsuregruhostingrondarcontagematsubaravennaharimalborkashiwaracontemporaryarteducationalchikugodonnakaiwamizawashtenawsmppl-wawdev-myqnapcloudcontrolledogawarabikomaezakirunoopschlesischesaogoncartoonartdecologiacontractorskenconventureshinodearthickashiwazakiyosatokamachilloutsystemscloudsitecookingchannelsdvrdnsdojogaszkolancashirecifedexetercoolblogdnsfor-better-thanawassamukawatarikuzentakatairavpagecooperativano-frankivskygearapparochernigovernmentksatxn--1ck2e1bananarepublic-inquiryggeebinatsukigatajimidsundevelopmentatarantours3-external-1copenhagencyclopedichiropracticatholicaxiashorokanaiecoproductionsaotomeinforumzcorporationcorsicahcesuoloanswatch-and-clockercorvettenrissagaeroclubmedecincinnativeamericanantiquest-le-patron-k3sapporomuracosenzamamidorittoeigersundynathomebuiltwithdarkasserverrankoshigayaltakasugaintelligencecosidnshome-webservercellikescandypoppdaluzerncostumedicallynxn--1ctwolominamatargets-itlon-2couchpotatofriesardegnarutomobegetmyiparsardiniacouncilvivanovoldacouponsarlcozoracq-acranbrookuwanalyticsarpsborgrongausdalcrankyowariasahikawatchandclockasukabeauxartsandcraftsarufutsunomiyawakasaikaitabashijonawatecrdyndns-at-homedepotaruinterhostsolutionsasayamatta-varjjatmpartinternationalfirearmsaseboknowsitallcreditcardyndns-at-workshoppingrossetouchigasakitahiroshimansionsaskatchewancreditunioncremonashgabadaddjaguarqcxn--1lqs03ncrewhmessinarashinomutashinaintuitoyosatoyokawacricketnedalcrimeast-kazakhstanangercrotonecrownipartsassarinuyamashinazawacrsaudacruisesauheradyndns-blogsitextilegnicapetownnews-stagingroundhandlingroznycuisinellancasterculturalcentertainmentoyotapartysvardocuneocupcakecuritibabymilk3curvallee-d-aosteinkjerusalempresashibetsurugashimaringatlantajirinvestmentsavannahgacutegirlfriendyndns-freeboxoslocalzonecymrulvikasumigaurawa-mazowszexnetlifyinzairtrafficplexus-1cyonabarumesswithdnsaveincloudyndns-homednsaves-the-whalessandria-trani-barletta-andriatranibarlettaandriacyouthruherecipescaracaltanissettaishinomakilovecollegefantasyleaguernseyfembetsukumiyamazonawsglobalacceleratorahimeshimabaridagawatchesciencecentersciencehistoryfermockasuyamegurownproviderferraraferraris-a-catererferrerotikagoshimalopolskanlandyndns-picsaxofetsundyndns-remotewdyndns-ipasadenaroyfgujoinvilleitungsenfhvalerfidontexistmein-iservschulegallocalhostrodawarafieldyndns-serverdalfigueresindevicenzaolkuszczytnoipirangalsaceofilateliafilegear-augustowhoswholdingsmall-webthingscientistordalfilegear-debianfilegear-gbizfilegear-iefilegear-jpmorganfilegear-sg-1filminamiechizenfinalfinancefineartscrapper-sitefinlandyndns-weblikes-piedmonticellocus-4finnoyfirebaseappaviancarrdyndns-wikinkobearalvahkijoetsuldalvdalaskanittedallasalleasecuritytacticschoenbrunnfirenetoystre-slidrettozawafirenzefirestonefirewebpaascrappingulenfirmdaleikangerfishingoldpoint2thisamitsukefitjarvodkafjordyndns-workangerfitnessettlementozsdellogliastradingunmanxn--1qqw23afjalerfldrvalleeaosteflekkefjordyndns1flesberguovdageaidnunjargaflickragerogerscrysecretrosnubar0flierneflirfloginlinefloppythonanywhereggio-calabriafloraflorencefloridatsunangojomedicinakamagayahabackplaneapplinzis-a-celticsfanfloripadoval-daostavalleyfloristanohatakahamalselvendrellflorokunohealthcareerscwienflowerservehalflifeinsurancefltrani-andria-barletta-trani-andriaflynnhosting-clusterfnchiryukyuragifuchungbukharanzanfndynnschokokekschokoladenfnwkaszubytemarkatowicefoolfor-ourfor-somedio-campidano-mediocampidanomediofor-theaterforexrothachijolsterforgotdnservehttpbin-butterforli-cesena-forlicesenaforlillesandefjordynservebbscholarshipschoolbusinessebyforsaleirfjordynuniversityforsandasuolodingenfortalfortefortmissoulangevagrigentomologyeonggiehtavuoatnagahamaroygardencowayfortworthachinoheavyfosneservehumourfotraniandriabarlettatraniandriafoxfordecampobassociatest-iserveblogsytemp-dnserveirchitachinakagawashingtondchernivtsiciliafozfr-par-1fr-par-2franamizuhobby-sitefrancaiseharafranziskanerimalvikatsushikabedzin-addrammenuorochesterfredrikstadtvserveminecraftranoyfreeddnsfreebox-oservemp3freedesktopfizerfreemasonryfreemyiphosteurovisionfreesitefreetlservep2pgfoggiafreiburgushikamifuranorfolkebibleksvikatsuyamarugame-hostyhostingxn--2m4a15efrenchkisshikirkeneservepicservequakefreseniuscultureggio-emilia-romagnakasatsunairguardiannakadomarinebraskaunicommbankaufentigerfribourgfriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafriuliveneziagiuliafriulivgiuliafrlfroganservesarcasmatartanddesignfrognfrolandynv6from-akrehamnfrom-alfrom-arfrom-azurewebsiteshikagamiishibukawakepnoorfrom-capitalonewportransipharmacienservicesevastopolefrom-coalfrom-ctranslatedynvpnpluscountryestateofdelawareclaimschoolsztynsettsupportoyotomiyazakis-a-candidatefrom-dchitosetodayfrom-dediboxafrom-flandersevenassisienarvikautokeinoticeablewismillerfrom-gaulardalfrom-hichisochikuzenfrom-iafrom-idyroyrvikingruenoharafrom-ilfrom-in-berlindasewiiheyaizuwakamatsubushikusakadogawafrom-ksharpharmacyshawaiijimarcheapartmentshellaspeziafrom-kyfrom-lanshimokawafrom-mamurogawatsonfrom-mdfrom-medizinhistorischeshimokitayamattelekommunikationfrom-mifunefrom-mnfrom-modalenfrom-mshimonitayanagit-reposts-and-telecommunicationshimonosekikawafrom-mtnfrom-nchofunatoriginstantcloudfrontdoorfrom-ndfrom-nefrom-nhktistoryfrom-njshimosuwalkis-a-chefarsundyndns-mailfrom-nminamifuranofrom-nvalleedaostefrom-nynysagamiharafrom-ohdattorelayfrom-oketogolffanshimotsukefrom-orfrom-padualstackazoologicalfrom-pratogurafrom-ris-a-conservativegashimotsumayfirstockholmestrandfrom-schmidtre-gauldalfrom-sdscloudfrom-tnfrom-txn--2scrj9chonanbunkyonanaoshimakanegasakikugawaltervistailscaleforcefrom-utsiracusaikirovogradoyfrom-vald-aostarostwodzislawildlifestylefrom-vtransportefrom-wafrom-wiardwebview-assetshinichinanfrom-wvanylvenneslaskerrylogisticshinjournalismartlabelingfrom-wyfrosinonefrostalowa-wolawafroyal-commissionfruskydivingfujiiderafujikawaguchikonefujiminokamoenairkitapps-auction-rancherkasydneyfujinomiyadattowebhoptogakushimotoganefujiokayamandalfujisatoshonairlinedre-eikerfujisawafujishiroishidakabiratoridedyn-berlincolnfujitsuruokazakiryuohkurafujiyoshidavvenjargap-east-1fukayabeardubaiduckdnsncfdfukuchiyamadavvesiidappnodebalancertmgrazimutheworkpccwilliamhillfukudomigawafukuis-a-cpalacefukumitsubishigakisarazure-mobileirvikazteleportlligatransurlfukuokakamigaharafukuroishikarikaturindalfukusakishiwadazaifudaigokaseljordfukuyamagatakaharunusualpersonfunabashiriuchinadafunagatakahashimamakisofukushimangonnakatombetsumy-gatewayfunahashikamiamakusatsumasendaisenergyfundaciofunkfeuerfuoiskujukuriyamangyshlakasamatsudoomdnstracefuosskoczowinbar1furubirafurudonostiaafurukawajimaniwakuratefusodegaurafussaintlouis-a-anarchistoireggiocalabriafutabayamaguchinomihachimanagementrapaniizafutboldlygoingnowhere-for-morenakatsugawafuttsurutaharafuturecmshinjukumamotoyamashikefuturehostingfuturemailingfvghamurakamigoris-a-designerhandcraftedhandsonyhangglidinghangoutwentehannanmokuizumodenaklodzkochikuseihidorahannorthwesternmutualhanyuzenhapmircloudletshintokushimahappounzenharvestcelebrationhasamap-northeast-3hasaminami-alpshintomikasaharahashbangryhasudahasura-apphiladelphiaareadmyblogspotrdhasvikfh-muensterhatogayahoooshikamaishimofusartshinyoshitomiokamisunagawahatoyamazakitakatakanabeatshiojirishirifujiedahatsukaichikaiseiyoichimkentrendhostinghattfjelldalhayashimamotobusellfylkesbiblackbaudcdn-edgestackhero-networkisboringhazuminobushistoryhelplfinancialhelsinkitakyushuaiahembygdsforbundhemneshioyanaizuerichardlimanowarudahemsedalhepforgeblockshirahamatonbetsurgeonshalloffameiwamasoyheroyhetemlbfanhgtvaohigashiagatsumagoianiahigashichichibuskerudhigashihiroshimanehigashiizumozakitamigrationhigashikagawahigashikagurasoedahigashikawakitaaikitamotosunndalhigashikurumeeresinstaginghigashimatsushimarburghigashimatsuyamakitaakitadaitoigawahigashimurayamamotorcycleshirakokonoehigashinarusells-for-lesshiranukamitondabayashiogamagoriziahigashinehigashiomitamanortonsberghigashiosakasayamanakakogawahigashishirakawamatakanezawahigashisumiyoshikawaminamiaikitanakagusukumodernhigashitsunosegawahigashiurausukitashiobarahigashiyamatokoriyamanashifteditorxn--30rr7yhigashiyodogawahigashiyoshinogaris-a-doctorhippyhiraizumisatohnoshoohirakatashinagawahiranairportland-4-salernogiessennanjobojis-a-financialadvisor-aurdalhirarahiratsukaerusrcfastlylbanzaicloudappspotagerhirayaitakaokalmykiahistorichouseshiraois-a-geekhakassiahitachiomiyagildeskaliszhitachiotagonohejis-a-greenhitraeumtgeradegreehjartdalhjelmelandholeckodairaholidayholyhomegoodshiraokamitsuehomeiphilatelyhomelinkyard-cloudjiffyresdalhomelinuxn--32vp30hachiojiyahikobierzycehomeofficehomesecuritymacaparecidahomesecuritypchoseikarugamvikarlsoyhomesenseeringhomesklepphilipsynology-diskstationhomeunixn--3bst00minamiiserniahondahongooglecodebergentinghonjyoitakarazukaluganskharkivaporcloudhornindalhorsells-for-ustkanmakiwielunnerhortendofinternet-dnshiratakahagitapphoenixn--3ds443ghospitalhoteleshishikuis-a-guruhotelwithflightshisognehotmailhoyangerhoylandetakasagophonefosshisuifuettertdasnetzhumanitieshitaramahungryhurdalhurumajis-a-hard-workershizukuishimogosenhyllestadhyogoris-a-hunterhyugawarahyundaiwafuneis-into-carsiiitesilkharkovaresearchaeologicalvinklein-the-bandairtelebitbridgestoneenebakkeshibechambagricultureadymadealstahaugesunderseaportsinfolionetworkdalaheadjudygarlandis-into-cartoonsimple-urlis-into-gamesserlillyis-leetrentin-suedtirolis-lostre-toteneis-a-lawyeris-not-certifiedis-savedis-slickhersonis-uberleetrentino-a-adigeis-very-badajozis-a-liberalis-very-evillageis-very-goodyearis-very-niceis-very-sweetpepperugiais-with-thebandovre-eikerisleofmanaustdaljellybeanjenv-arubahccavuotnagaragusabaerobaticketsirdaljeonnamerikawauejetztrentino-aadigejevnakershusdecorativeartslupskhmelnytskyivarggatrentino-alto-adigejewelryjewishartgalleryjfkhplaystation-cloudyclusterjgorajlljls-sto1jls-sto2jls-sto3jmphotographysiojnjaworznospamproxyjoyentrentino-altoadigejoyokaichibajddarchitecturealtorlandjpnjprslzjurkotohiradomainstitutekotourakouhokutamamurakounosupabasembokukizunokunimilitarykouyamarylhurstjordalshalsenkouzushimasfjordenkozagawakozakis-a-llamarnardalkozowindowskrakowinnersnoasakatakkokamiminersokndalkpnkppspbarcelonagawakkanaibetsubamericanfamilyds3-fips-us-gov-west-1krasnikahokutokashikis-a-musiciankrasnodarkredstonekrelliankristiansandcatsolarssonkristiansundkrodsheradkrokstadelvalle-aostatic-accessolognekryminamiizukaminokawanishiaizubangekumanotteroykumatorinovecoregontrailroadkumejimashikis-a-nascarfankumenantokonamegatakatoris-a-nursells-itrentin-sud-tirolkunisakis-a-painteractivelvetrentin-sudtirolkunitachiaraindropilotsolundbecknx-serversellsyourhomeftphxn--3e0b707ekunitomigusukuleuvenetokigawakunneppuboliviajessheimpertrixcdn77-secureggioemiliaromagnamsosnowiechristiansburgminakamichiharakunstsammlungkunstunddesignkuokgroupimientaketomisatoolsomakurehabmerkurgankurobeeldengeluidkurogimimatakatsukis-a-patsfankuroisoftwarezzoologykuromatsunais-a-personaltrainerkuronkurotakikawasakis-a-photographerokussldkushirogawakustanais-a-playershiftcryptonomichigangwonkusupersalezajskomakiyosemitekutchanelkutnowruzhgorodeokuzumakis-a-republicanonoichinomiyakekvafjordkvalsundkvamscompute-1kvanangenkvinesdalkvinnheradkviteseidatingkvitsoykwpspdnsomnatalkzmisakis-a-soxfanmisasaguris-a-studentalmisawamisconfusedmishimasudamissilemisugitokuyamatsumaebashikshacknetrentino-sued-tirolmitakeharamitourismilemitoyoakemiuramiyazurecontainerdpolicemiyotamatsukuris-a-teacherkassyno-dshowamjondalenmonstermontrealestatefarmequipmentrentino-suedtirolmonza-brianzapposor-odalmonza-e-della-brianzaptokyotangotpantheonsitemonzabrianzaramonzaebrianzamonzaedellabrianzamoonscalebookinghostedpictetrentinoa-adigemordoviamoriyamatsumotofukemoriyoshiminamiashigaramormonmouthachirogatakamoriokakudamatsuemoroyamatsunomortgagemoscowiosor-varangermoseushimodatemosjoenmoskenesorfoldmossorocabalena-devicesorreisahayakawakamiichikawamisatottoris-a-techietis-a-landscaperspectakasakitchenmosvikomatsushimarylandmoteginowaniihamatamakinoharamoviemovimientolgamozilla-iotrentinoaadigemtranbytomaritimekeepingmuginozawaonsensiositemuikaminoyamaxunispacemukoebenhavnmulhouseoullensvanguardmunakatanemuncienciamuosattemupinbarclaycards3-sa-east-1murmanskomforbar2murotorcraftrentinoalto-adigemusashinoharamuseetrentinoaltoadigemuseumverenigingmusicargodaddyn-o-saurlandesortlandmutsuzawamy-wanggoupilemyactivedirectorymyamazeplaymyasustor-elvdalmycdmycloudnsoruminamimakis-a-rockstarachowicemydattolocalcertificationmyddnsgeekgalaxymydissentrentinos-tirolmydobissmarterthanyoumydrobofageologymydsoundcastronomy-vigorlicemyeffectrentinostirolmyfastly-terrariuminamiminowamyfirewalledreplittlestargardmyforuminamioguni5myfritzmyftpaccessouthcarolinaturalhistorymuseumcentermyhome-servermyjinomykolaivencloud66mymailermymediapchristmasakillucernemyokohamamatsudamypepinkommunalforbundmypetsouthwest1-uslivinghistorymyphotoshibalashovhadanorth-kazakhstanmypicturestaurantrentinosud-tirolmypsxn--3pxu8kommunemysecuritycamerakermyshopblocksowamyshopifymyspreadshopwarendalenugmythic-beastspectruminamisanrikubetsuppliesoomytis-a-bookkeepermaritimodspeedpartnermytuleap-partnersphinxn--41amyvnchromediatechnologymywirepaircraftingvollohmusashimurayamashikokuchuoplantationplantspjelkavikomorotsukagawaplatformsharis-a-therapistoiaplatter-appinokofuefukihaboromskogplatterpioneerplazaplcube-serversicherungplumbingoplurinacionalpodhalepodlasiellaktyubinskiptveterinairealmpmnpodzonepohlpoivronpokerpokrovskomvuxn--3hcrj9choyodobashichikashukujitawaraumalatvuopmicrosoftbankarmoypoliticarrierpolitiendapolkowicepoltavalle-d-aostaticspydebergpomorzeszowitdkongsbergponpesaro-urbino-pesarourbinopesaromasvuotnarusawapordenonepornporsangerporsangugeporsgrunnanyokoshibahikariwanumatakinouepoznanpraxis-a-bruinsfanprdpreservationpresidioprgmrprimetelemarkongsvingerprincipeprivatizehealthinsuranceprofesionalprogressivestfoldpromombetsupplypropertyprotectionprotonetrentinosued-tirolprudentialpruszkowithgoogleapiszprvcyberprzeworskogpulawypunyufuelveruminamiuonumassa-carrara-massacarraramassabuyshousesopotrentino-sud-tirolpupugliapussycateringebuzentsujiiepvhadselfiphdfcbankazunoticiashinkamigototalpvtrentinosuedtirolpwchungnamdalseidsbergmodellingmxn--11b4c3dray-dnsupdaterpzqhaebaruericssongdalenviknakayamaoris-a-cubicle-slavellinodeobjectshinshinotsurfashionstorebaselburguidefinimamateramochizukimobetsumidatlantichirurgiens-dentistes-en-franceqldqotoyohashimotoshimatsuzakis-an-accountantshowtimelbourneqponiatowadaqslgbtrentinsud-tirolqualifioappippueblockbusternopilawaquickconnectrentinsudtirolquicksytesrhtrentinsued-tirolquipelementsrltunestuff-4-saletunkonsulatrobeebyteappigboatsmolaquilanxessmushcdn77-sslingturystykaniepcetuscanytushuissier-justicetuvalleaostaverntuxfamilytwmailvestvagoyvevelstadvibo-valentiavibovalentiavideovillastufftoread-booksnestorfjordvinnicasadelamonedagestangevinnytsiavipsinaappiwatevirginiavirtual-uservecounterstrikevirtualcloudvirtualservervirtualuserveexchangevirtuelvisakuhokksundviterbolognagasakikonaikawagoevivianvivolkenkundenvixn--42c2d9avlaanderennesoyvladikavkazimierz-dolnyvladimirvlogintoyonezawavminanovologdanskonyveloftrentino-stirolvolvolkswagentstuttgartrentinsuedtirolvolyngdalvoorlopervossevangenvotevotingvotoyonovps-hostrowiecircustomer-ocimmobilienwixsitewloclawekoobindalwmcloudwmflabsurnadalwoodsidelmenhorstabackyardsurreyworse-thandawowithyoutuberspacekitagawawpdevcloudwpenginepoweredwphostedmailwpmucdnpixolinodeusercontentrentinosudtirolwpmudevcdnaccessokanagawawritesthisblogoipizzawroclawiwatsukiyonoshiroomgwtcirclerkstagewtfastvps-serverisignwuozuwzmiuwajimaxn--4gbriminingxn--4it168dxn--4it797kooris-a-libertarianxn--4pvxs4allxn--54b7fta0ccivilaviationredumbrellajollamericanexpressexyxn--55qw42gxn--55qx5dxn--5dbhl8dxn--5js045dxn--5rtp49civilisationrenderxn--5rtq34koperviklabudhabikinokawachinaganoharamcocottempurlxn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264civilizationthewifiatmallorcafederation-webspacexn--80aaa0cvacationsusonoxn--80adxhksuzakananiimiharuxn--80ao21axn--80aqecdr1axn--80asehdbarclays3-us-east-2xn--80aswgxn--80aukraanghkembuchikujobservableusercontentrevisohughestripperxn--8dbq2axn--8ltr62koryokamikawanehonbetsuwanouchijiwadeliveryxn--8pvr4uxn--8y0a063axn--90a1affinitylotterybnikeisenbahnxn--90a3academiamicable-modemoneyxn--90aeroportalabamagasakishimabaraffleentry-snowplowiczeladzxn--90aishobarakawaharaoxn--90amckinseyxn--90azhytomyrxn--9dbhblg6dietritonxn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byandexcloudxn--asky-iraxn--aurskog-hland-jnbarefootballooningjerstadgcapebretonamicrolightingjesdalombardiadembroideryonagunicloudiherokuappanamasteiermarkaracoldwarszawauthgearappspacehosted-by-previderxn--avery-yuasakuragawaxn--b-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbsuzukanazawaxn--bck1b9a5dre4civilwarmiasadoesntexisteingeekarpaczest-a-la-maisondre-landrayddns5yxn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyaotsurgeryxn--bjddar-ptargithubpreviewsaitohmannore-og-uvdalxn--blt-elabourxn--bmlo-graingerxn--bod-2naturalsciencesnaturellesuzukis-an-actorxn--bozen-sdtirol-2obanazawaxn--brnny-wuacademy-firewall-gatewayxn--brnnysund-m8accident-investigation-acornxn--brum-voagatroandinosaureportrentoyonakagyokutoyakomaganexn--btsfjord-9zaxn--bulsan-sdtirol-nsbaremetalpha-myqnapcloud9guacuiababia-goracleaningitpagexlimoldell-ogliastraderxn--c1avgxn--c2br7gxn--c3s14mincomcastreserve-onlinexn--cck2b3bargainstances3-us-gov-west-1xn--cckwcxetdxn--cesena-forl-mcbremangerxn--cesenaforl-i8axn--cg4bkis-an-actresshwindmillxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a2oxn--correios-e-telecomunicaes-ghc29axn--czr694barreaudiblebesbydgoszczecinemagnethnologyoriikaragandauthordalandroiddnss3-ap-southeast-2ix4432-balsan-suedtirolimiteddnskinggfakefurniturecreationavuotnaritakoelnayorovigotsukisosakitahatakahatakaishimoichinosekigaharaurskog-holandingitlaborxn--czrs0trogstadxn--czru2dxn--czrw28barrel-of-knowledgeappgafanquanpachicappacificurussiautomotivelandds3-ca-central-16-balsan-sudtirollagdenesnaaseinet-freaks3-ap-southeast-123websiteleaf-south-123webseiteckidsmynasushiobarackmazerbaijan-mayen-rootaribeiraogakibichuobiramusementdllpages3-ap-south-123sitewebhareidfjordvagsoyerhcloudd-dnsiskinkyolasiteastcoastaldefenceastus2038xn--d1acj3barrell-of-knowledgecomputerhistoryofscience-fictionfabricafjs3-us-west-1xn--d1alfaromeoxn--d1atromsakegawaxn--d5qv7z876clanbibaidarmeniaxn--davvenjrga-y4axn--djrs72d6uyxn--djty4kosaigawaxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4cldmailukowhitesnow-dnsangohtawaramotoineppubtlsanjotelulubin-brbambinagisobetsuitagajoburgjerdrumcprequalifymein-vigorgebetsukuibmdeveloperauniteroizumizakinderoyomitanobninskanzakiyokawaraustrheimatunduhrennebulsan-suedtirololitapunk123kotisivultrobjectselinogradimo-siemenscaledekaascolipiceno-ipifony-1337xn--eckvdtc9dxn--efvn9svalbardunloppaderbornxn--efvy88hagakhanamigawaxn--ehqz56nxn--elqq16hagebostadxn--eveni-0qa01gaxn--f6qx53axn--fct429kosakaerodromegallupaasdaburxn--fhbeiarnxn--finny-yuaxn--fiq228c5hsvchurchaseljeepsondriodejaneirockyotobetsuliguriaxn--fiq64barsycenterprisesakievennodesadistcgrouplidlugolekagaminord-frontierxn--fiqs8sveioxn--fiqz9svelvikoninjambylxn--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-cesena-fcbssvizzeraxn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandrapidsvn-repostorjcloud-ver-jpchowderxn--frna-woaraisaijosoyroroswedenxn--frya-hraxn--fzc2c9e2cleverappsannanxn--fzys8d69uvgmailxn--g2xx48clicketcloudcontrolapparmatsuuraxn--gckr3f0fauskedsmokorsetagayaseralingenoamishirasatogliattipschulserverxn--gecrj9clickrisinglesannohekinannestadraydnsanokaruizawaxn--ggaviika-8ya47haibarakitakamiizumisanofidelitysfjordxn--gildeskl-g0axn--givuotna-8yasakaiminatoyookaneyamazoexn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-an-anarchistoricalsocietysnesigdalxn--gmqw5axn--gnstigbestellen-zvbrplsbxn--45br5cylxn--gnstigliefern-wobihirosakikamijimatsushigexn--h-2failxn--h1aeghair-surveillancexn--h1ahnxn--h1alizxn--h2breg3eveneswidnicasacampinagrandebungotakadaemongolianxn--h2brj9c8clinichippubetsuikilatironporterxn--h3cuzk1digickoseis-a-linux-usershoujis-a-knightpointtohoboleslawieconomiastalbanshizuokamogawaxn--hbmer-xqaxn--hcesuolo-7ya35barsyonlinewhampshirealtychyattorneyagawakuyabukihokumakogeniwaizumiotsurugimbalsfjordeportexaskoyabeagleboardetroitskypecorivneatonoshoes3-eu-west-3utilitiesquare7xn--hebda8basicserversaillesjabbottateshinanomachildrensgardenhlfanhsbc66xn--hery-iraxn--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accident-prevention-aptibleangaviikadenaamesjevuemielnoboribetsuckswidnikkolobrzegersundxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-fyasugithubusercontentromsojamisonxn--io0a7is-an-artistgstagexn--j1adpkomonotogawaxn--j1aefbsbxn--1lqs71dyndns-office-on-the-webhostingrpassagensavonarviikamiokameokamakurazakiwakunigamihamadaxn--j1ael8basilicataniautoscanadaeguambulancentralus-2xn--j1amhakatanorthflankddiamondshinshiroxn--j6w193gxn--jlq480n2rgxn--jlq61u9w7basketballfinanzgorzeleccodespotenzakopanewspaperxn--jlster-byasuokannamihokkaidopaaskvollxn--jrpeland-54axn--jvr189miniserversusakis-a-socialistg-builderxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5xn--45brj9cistrondheimperiaxn--koluokta-7ya57hakodatexn--kprw13dxn--kpry57dxn--kput3is-an-engineeringxn--krager-gyatominamibosogndalxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdevcloudfunctionsimplesitexn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatsukanoyakagexn--kvnangen-k0axn--l-1fairwindswiebodzin-dslattuminamiyamashirokawanabeepilepsykkylvenicexn--l1accentureklamborghinikolaeventswinoujscienceandhistoryxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika-52batochigifts3-us-west-2xn--lesund-huaxn--lgbbat1ad8jdfaststackschulplattformetacentrumeteorappassenger-associationxn--lgrd-poacctrusteexn--lhppi-xqaxn--linds-pramericanartrvestnestudioxn--lns-qlavagiskexn--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-liacliniquedapliexn--lten-granexn--lury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddeswisstpetersburgxn--mgb9awbfbx-ostrowwlkpmguitarschwarzgwangjuifminamidaitomanchesterxn--mgba3a3ejtrycloudflarevistaplestudynamic-dnsrvaroyxn--mgba3a4f16axn--mgba3a4fra1-deloittevaksdalxn--mgba7c0bbn0axn--mgbaakc7dvfstdlibestadxn--mgbaam7a8hakonexn--mgbab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00batsfjordiscordsays3-website-ap-northeast-1xn--mgbai9azgqp6jejuniperxn--mgbayh7gpalmaseratis-an-entertainerxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgbcpq6gpa1axn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2fhskosherbrookegawaxn--mgbqly7c0a67fbclintonkotsukubankarumaifarmsteadrobaknoluoktachikawakayamadridvallee-aosteroyxn--mgbqly7cvafr-1xn--mgbt3dhdxn--mgbtf8flapymntrysiljanxn--mgbtx2bauhauspostman-echocolatemasekd1xn--mgbx4cd0abbvieeexn--mix082fbxoschweizxn--mix891fedorainfraclouderaxn--mjndalen-64axn--mk0axin-vpnclothingdustdatadetectjmaxxxn--12c1fe0bradescotlandrrxn--mk1bu44cn-northwest-1xn--mkru45is-bykleclerchoshibuyachiyodancexn--mlatvuopmi-s4axn--mli-tlavangenxn--mlselv-iuaxn--moreke-juaxn--mori-qsakurais-certifiedxn--mosjen-eyawaraxn--mot-tlazioxn--mre-og-romsdal-qqbuseranishiaritakurashikis-foundationxn--msy-ula0hakubaghdadultravelchannelxn--mtta-vrjjat-k7aflakstadaokagakicks-assnasaarlandxn--muost-0qaxn--mxtq1minisitexn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45q11citadelhicampinashikiminohostfoldnavyxn--nit225koshimizumakiyosunnydayxn--nmesjevuemie-tcbalestrandabergamoarekeymachineustarnbergxn--nnx388axn--nodessakyotanabelaudiopsysynology-dstreamlitappittsburghofficialxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeserveftplanetariuminamitanexn--nvuotna-hwaxn--nyqy26axn--o1achernihivgubsxn--o3cw4hakuis-a-democratravelersinsurancexn--o3cyx2axn--od0algxn--od0aq3belementorayoshiokanumazuryukuhashimojibxos3-website-ap-southeast-1xn--ogbpf8flatangerxn--oppegrd-ixaxn--ostery-fyawatahamaxn--osyro-wuaxn--otu796dxn--p1acfedorapeoplegoismailillehammerfeste-ipatriaxn--p1ais-gonexn--pgbs0dhlx3xn--porsgu-sta26fedoraprojectoyotsukaidoxn--pssu33lxn--pssy2uxn--q7ce6axn--q9jyb4cngreaterxn--qcka1pmcpenzaporizhzhiaxn--qqqt11minnesotaketakayamassivegridxn--qxa6axn--qxamsterdamnserverbaniaxn--rady-iraxn--rdal-poaxn--rde-ulaxn--rdy-0nabaris-into-animeetrentin-sued-tirolxn--rennesy-v1axn--rhkkervju-01afeiraquarelleasingujaratoyouraxn--rholt-mragowoltlab-democraciaxn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5naturbruksgymnxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny31hakusanagochihayaakasakawaiishopitsitexn--rovu88bellevuelosangeles3-website-ap-southeast-2xn--rros-granvindafjordxn--rskog-uuaxn--rst-0naturhistorischesxn--rsta-framercanvasxn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithaldenxn--s9brj9cnpyatigorskolecznagatorodoyxn--sandnessjen-ogbellunord-odalombardyn53xn--sandy-yuaxn--sdtirol-n2axn--seral-lraxn--ses554gxn--sgne-graphoxn--4dbgdty6citichernovtsyncloudrangedaluccarbonia-iglesias-carboniaiglesiascarboniaxn--skierv-utazasxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5natuurwetenschappenginexn--slt-elabcieszynh-servebeero-stageiseiroumuenchencoreapigeelvinckoshunantankmpspawnextdirectrentino-s-tirolxn--smla-hraxn--smna-gratangentlentapisa-geekosugexn--snase-nraxn--sndre-land-0cbeneventochiokinoshimaintenancebinordreisa-hockeynutazurestaticappspaceusercontentateyamaveroykenglandeltaitogitsumitakagiizeasypanelblagrarchaeologyeongbuk0emmafann-arboretumbriamallamaceiobbcg123homepagefrontappchizip61123minsidaarborteaches-yogasawaracingroks-theatree123hjemmesidealerimo-i-rana4u2-localhistorybolzano-altoadigeometre-experts-comptables3-ap-northeast-123miwebcambridgehirn4t3l3p0rtarumizusawabogadobeaemcloud-fr123paginaweberkeleyokosukanrabruzzombieidskoguchikushinonsenasakuchinotsuchiurakawafaicloudineat-url-o-g-i-naval-d-aosta-valleyokote164-b-datacentermezproxyzgoraetnabudejjudaicadaquest-mon-blogueurodirumaceratabuseating-organicbcn-north-123saitamakawabartheshopencraftrainingdyniajuedischesapeakebayernavigationavoi234lima-cityeats3-ap-northeast-20001wwwedeployokozeastasiamunemurorangecloudplatform0xn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbentleyurihonjournalistjohnikonanporovnobserverxn--srfold-byaxn--srreisa-q1axn--srum-gratis-a-bulls-fanxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbeppublishproxyusuharavocatanzarowegroweiboltashkentatamotorsitestingivingjemnes3-eu-central-1kappleadpages-12hpalmspringsakerxn--stre-toten-zcbeskidyn-ip24xn--t60b56axn--tckweddingxn--tiq49xqyjelasticbeanstalkhmelnitskiyamarumorimachidaxn--tjme-hraxn--tn0agrocerydxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol-rzbestbuyshoparenagareyamaizurugbyenvironmentalconservationflashdrivefsnillfjordiscordsezjampaleoceanographics3-website-eu-west-1xn--trentin-sdtirol-7vbetainaboxfuseekloges3-website-sa-east-1xn--trentino-sd-tirol-c3bhzcasertainaioirasebastopologyeongnamegawafflecellclstagemologicaliforniavoues3-eu-west-1xn--trentino-sdtirol-szbielawalbrzycharitypedreamhostersvp4xn--trentinosd-tirol-rzbiellaakesvuemieleccebizenakanotoddeninoheguriitatebayashiibahcavuotnagaivuotnagaokakyotambabybluebitelevisioncilla-speziaxarnetbank8s3-eu-west-2xn--trentinosdtirol-7vbieszczadygeyachimataijiiyamanouchikuhokuryugasakitaurayasudaxn--trentinsd-tirol-6vbievat-band-campaignieznombrendlyngengerdalces3-website-us-east-1xn--trentinsdtirol-nsbifukagawalesundiscountypeformelhusgardeninomiyakonojorpelandiscourses3-website-us-west-1xn--trgstad-r1axn--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvestre-slidrexn--uc0ay4axn--uist22halsakakinokiaxn--uisz3gxn--unjrga-rtarnobrzegyptianxn--unup4yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbtularvikonskowolayangroupiemontexn--valle-d-aoste-ehboehringerikexn--valleaoste-e7axn--valledaoste-ebbvadsoccerxn--vard-jraxn--vegrshei-c0axn--vermgensberater-ctb-hostingxn--vermgensberatung-pwbigvalledaostaobaomoriguchiharag-cloud-championshiphoplixboxenirasakincheonishiazaindependent-commissionishigouvicasinordeste-idclkarasjohkamikitayamatsurindependent-inquest-a-la-masionishiharaxn--vestvgy-ixa6oxn--vg-yiabkhaziaxn--vgan-qoaxn--vgsy-qoa0jelenia-goraxn--vgu402cnsantabarbaraxn--vhquvestre-totennishiawakuraxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861biharstadotsubetsugaruhrxn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1cntjomeldaluroyxn--wgbl6axn--xhq521bihorologyusuisservegame-serverxn--xkc2al3hye2axn--xkc2dl3a5ee0hammarfeastafricaravantaaxn--y9a3aquariumintereitrentino-sudtirolxn--yer-znaumburgxn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn--4dbrk0cexn--ystre-slidre-ujbikedaejeonbukarasjokarasuyamarriottatsunoceanographiquehimejindependent-inquiryuufcfanishiizunazukindependent-panelomoliseminemrxn--zbx025dxn--zf0ao64axn--zf0avxlxn--zfr164bilbaogashimadachicagoboavistanbulsan-sudtirolbia-tempio-olbiatempioolbialystokkeliwebredirectme-south-1xnbayxz \ No newline at end of file +birkenesoddtangentinglogoweirbitbucketrzynishikatakayamatta-varjjatjomembersaltdalovepopartysfjordiskussionsbereichatinhlfanishikatsuragitappassenger-associationishikawazukamiokameokamakurazakitaurayasudabitternidisrechtrainingloomy-routerbjarkoybjerkreimdbalsan-suedtirololitapunkapsienamsskoganeibmdeveloperauniteroirmemorialombardiadempresashibetsukumiyamagasakinderoyonagunicloudevelopmentaxiijimarriottayninhaccanthobby-siteval-d-aosta-valleyoriikaracolognebinatsukigataiwanumatajimidsundgcahcesuolocustomer-ocimperiautoscanalytics-gatewayonagoyaveroykenflfanpachihayaakasakawaiishopitsitemasekd1kappenginedre-eikerimo-siemenscaledekaascolipicenoboribetsucks3-eu-west-3utilities-16-balestrandabergentappsseekloges3-eu-west-123paginawebcamauction-acornfshostrodawaraktyubinskaunicommbank123kotisivultrobjectselinogradimo-i-rana4u2-localhostrolekanieruchomoscientistordal-o-g-i-nikolaevents3-ap-northeast-2-ddnsking123homepagefrontappchizip61123saitamakawababia-goracleaningheannakadomarineat-urlimanowarudakuneustarostwodzislawdev-myqnapcloudcontrolledgesuite-stagingdyniamusementdllclstagehirnikonantomobelementorayokosukanoyakumoliserniaurland-4-salernord-aurdalipaywhirlimiteddnslivelanddnss3-ap-south-123siteweberlevagangaviikanonji234lima-cityeats3-ap-southeast-123webseiteambulancechireadmyblogspotaribeiraogakicks-assurfakefurniturealmpmninoheguribigawaurskog-holandinggfarsundds3-ap-southeast-20001wwwedeployokote123hjemmesidealerdalaheadjuegoshikibichuobiraustevollimombetsupplyokoze164-balena-devices3-ca-central-123websiteleaf-south-12hparliamentatsunobninsk8s3-eu-central-1337bjugnishimerablackfridaynightjxn--11b4c3ditchyouripatriabloombergretaijindustriesteinkjerbloxcmsaludivtasvuodnakaiwanairlinekobayashimodatecnologiablushakotanishinomiyashironomniwebview-assetsalvadorbmoattachmentsamegawabmsamnangerbmwellbeingzonebnrweatherchannelsdvrdnsamparalleluxenishinoomotegotsukishiwadavvenjargamvikarpaczest-a-la-maisondre-landivttasvuotnakamai-stagingloppennebomlocalzonebonavstackartuzybondigitaloceanspacesamsclubartowest1-usamsunglugsmall-webspacebookonlineboomlaakesvuemielecceboschristmasakilatiron-riopretoeidsvollovesickaruizawabostik-serverrankoshigayachtsandvikcoromantovalle-d-aostakinouebostonakijinsekikogentlentapisa-geekarumaifmemsetkmaxxn--12c1fe0bradescotksatmpaviancapitalonebouncemerckmsdscloudiybounty-fullensakerrypropertiesangovtoyosatoyokawaboutiquebecologialaichaugiangmbhartiengiangminakamichiharaboutireservdrangedalpusercontentoyotapfizerboyfriendoftheinternetflixn--12cfi8ixb8lublindesnesanjosoyrovnoticiasannanishinoshimattelemarkasaokamikitayamatsurinfinitigopocznore-og-uvdalucaniabozen-sudtiroluccanva-appstmnishiokoppegardray-dnsupdaterbozen-suedtirolukowesteuropencraftoyotomiyazakinsurealtypeformesswithdnsannohekinanporovigonohejinternationaluroybplacedogawarabikomaezakirunordkappgfoggiabrandrayddns5ybrasiliadboxoslockerbresciaogashimadachicappadovaapstemp-dnswatchest-mon-blogueurodirumagazinebrindisiciliabroadwaybroke-itvedestrandraydnsanokashibatakashimashikiyosatokigawabrokerbrothermesserlifestylebtimnetzpisdnpharmaciensantamariakebrowsersafetymarketingmodumetacentrumeteorappharmacymruovatlassian-dev-builderschaefflerbrumunddalutskashiharabrusselsantoandreclaimsanukintlon-2bryanskiptveterinaireadthedocsaobernardovre-eikerbrynebwestus2bzhitomirbzzwhitesnowflakecommunity-prochowicecomodalenissandoycompanyaarphdfcbankasumigaurawa-mazowszexn--1ck2e1bambinagisobetsuldalpha-myqnapcloudaccess3-us-east-2ixboxeroxfinityolasiteastus2comparemarkerryhotelsaves-the-whalessandria-trani-barletta-andriatranibarlettaandriacomsecaasnesoddeno-stagingrondarcondoshifteditorxn--1ctwolominamatarnobrzegrongrossetouchijiwadedyn-berlincolnissayokoshibahikariyaltakazakinzais-a-bookkeepermarshallstatebankasuyalibabahccavuotnagaraholtaleniwaizumiotsurugashimaintenanceomutazasavonarviikaminoyamaxunispaceconferenceconstructionflashdrivefsncf-ipfsaxoconsuladobeio-static-accesscamdvrcampaniaconsultantranoyconsultingroundhandlingroznysaitohnoshookuwanakayamangyshlakdnepropetrovskanlandyndns-freeboxostrowwlkpmgrphilipsyno-dschokokekscholarshipschoolbusinessebycontactivetrailcontagematsubaravendbambleborkdalvdalcest-le-patron-rancherkasydneyukuhashimokawavoues3-sa-east-1contractorskenissedalcookingruecoolblogdnsfor-better-thanhhoarairforcentralus-1cooperativano-frankivskodjeephonefosschoolsztynsetransiphotographysiocoproductionschulplattforminamiechizenisshingucciprianiigatairaumalatvuopmicrolightinguidefinimaringatlancastercorsicafjschulservercosenzakopanecosidnshome-webservercellikescandypopensocialcouchpotatofrieschwarzgwangjuh-ohtawaramotoineppueblockbusternopilawacouncilcouponscrapper-sitecozoravennaharimalborkaszubytemarketscrappinguitarscrysecretrosnubananarepublic-inquiryurihonjoyenthickaragandaxarnetbankanzakiwielunnerepairbusanagochigasakishimabarakawaharaolbia-tempio-olbiatempioolbialowiezachpomorskiengiangjesdalolipopmcdirepbodyn53cqcxn--1lqs03niyodogawacrankyotobetsumidaknongujaratmallcrdyndns-homednscwhminamifuranocreditcardyndns-iphutholdingservehttpbincheonl-ams-1creditunionionjukujitawaravpagecremonashorokanaiecrewhoswholidaycricketnedalcrimeast-kazakhstanangercrotonecrowniphuyencrsvp4cruiseservehumourcuisinellair-traffic-controllagdenesnaaseinet-freakserveircasertainaircraftingvolloansnasaarlanduponthewifidelitypedreamhostersaotomeldaluxurycuneocupcakecuritibacgiangiangryggeecurvalled-aostargets-itranslatedyndns-mailcutegirlfriendyndns-office-on-the-webhoptogurafedoraprojectransurlfeirafembetsukuis-a-bruinsfanfermodenakasatsunairportrapaniizaferraraferraris-a-bulls-fanferrerotikagoshimalopolskanittedalfetsundyndns-wikimobetsumitakagildeskaliszkolamericanfamilydservemp3fgunmaniwamannorth-kazakhstanfhvalerfilegear-augustowiiheyakagefilegear-deatnuniversitysvardofilegear-gbizfilegear-iefilegear-jpmorgangwonporterfilegear-sg-1filminamiizukamiminefinalchikugokasellfyis-a-candidatefinancefinnoyfirebaseappiemontefirenetlifylkesbiblackbaudcdn-edgestackhero-networkinggroupowiathletajimabaria-vungtaudiopsysharpigboatshawilliamhillfirenzefirestonefireweblikes-piedmontravelersinsurancefirmdalegalleryfishingoldpoint2thisamitsukefitjarfitnessettsurugiminamimakis-a-catererfjalerfkatsushikabeebyteappilottonsberguovdageaidnunjargausdalflekkefjordyndns-workservep2phxn--1lqs71dyndns-remotewdyndns-picserveminecraftransporteflesbergushikamifuranorthflankatsuyamashikokuchuoflickragerokunohealthcareershellflierneflirfloginlinefloppythonanywherealtorfloraflorencefloripalmasfjordenfloristanohatajiris-a-celticsfanfloromskogxn--2m4a15eflowershimokitayamafltravinhlonganflynnhosting-clusterfncashgabadaddjabbottoyourafndyndns1fnwkzfolldalfoolfor-ourfor-somegurownproviderfor-theaterfordebianforexrotheworkpccwinbar0emmafann-arborlandd-dnsiskinkyowariasahikawarszawashtenawsmppl-wawsglobalacceleratorahimeshimakanegasakievennodebalancern4t3l3p0rtatarantours3-ap-northeast-123minsidaarborteaches-yogano-ipifony-123miwebaccelastx4432-b-datacenterprisesakijobservableusercontentateshinanomachintaifun-dnsdojournalistoloseyouriparisor-fronavuotnarashinoharaetnabudejjunipereggio-emilia-romagnaroyboltateyamajureggiocalabriakrehamnayoro0o0forgotdnshimonitayanagithubpreviewsaikisarazure-mobileirfjordynnservepicservequakeforli-cesena-forlicesenaforlillehammerfeste-ipimientaketomisatoolshimonosekikawaforsalegoismailillesandefjordynservebbservesarcasmileforsandasuolodingenfortalfortefosneshimosuwalkis-a-chefashionstorebaseljordyndns-serverisignfotrdynulvikatowicefoxn--2scrj9casinordlandurbanamexnetgamersapporomurafozfr-1fr-par-1fr-par-2franamizuhoboleslawiecommerce-shoppingyeongnamdinhachijohanamakisofukushimaoris-a-conservativegarsheiheijis-a-cparachutingfredrikstadynv6freedesktopazimuthaibinhphuocelotenkawakayamagnetcieszynh-servebeero-stageiseiroumugifuchungbukharag-cloud-championshiphoplixn--30rr7yfreemyiphosteurovisionredumbrellangevagrigentobishimadridvagsoygardenebakkeshibechambagricoharugbydgoszczecin-berlindasdaburfreesitefreetlshimotsukefreisennankokubunjis-a-cubicle-slavellinodeobjectshimotsumafrenchkisshikindleikangerfreseniushinichinanfriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafriuliveneziagiuliafriulivgiuliafrlfroganshinjotelulubin-vpncateringebunkyonanaoshimamateramockashiwarafrognfrolandynvpnpluservicesevastopolitiendafrom-akamaized-stagingfrom-alfrom-arfrom-azurewebsiteshikagamiishibuyabukihokuizumobaragusabaerobaticketshinjukuleuvenicefrom-campobassociatest-iserveblogsytenrissadistdlibestadultrentin-sudtirolfrom-coachaseljeducationcillahppiacenzaganfrom-ctrentin-sued-tirolfrom-dcatfooddagestangefrom-decagliarikuzentakataikillfrom-flapymntrentin-suedtirolfrom-gap-east-1from-higashiagatsumagoianiafrom-iafrom-idyroyrvikingulenfrom-ilfrom-in-the-bandairtelebitbridgestonemurorangecloudplatform0from-kshinkamigototalfrom-kyfrom-langsonyantakahamalselveruminamiminowafrom-malvikaufentigerfrom-mdfrom-mein-vigorlicefrom-mifunefrom-mnfrom-modshinshinotsurgeryfrom-mshinshirofrom-mtnfrom-ncatholicurus-4from-ndfrom-nefrom-nhs-heilbronnoysundfrom-njshintokushimafrom-nminamioguni5from-nvalledaostargithubusercontentrentino-a-adigefrom-nycaxiaskvollpagesardegnarutolgaulardalvivanovoldafrom-ohdancefrom-okegawassamukawataris-a-democratrentino-aadigefrom-orfrom-panasonichernovtsykkylvenneslaskerrylogisticsardiniafrom-pratohmamurogawatsonrenderfrom-ris-a-designerimarugame-hostyhostingfrom-schmidtre-gauldalfrom-sdfrom-tnfrom-txn--32vp30hachinoheavyfrom-utsiracusagaeroclubmedecin-addrammenuorodoyerfrom-val-daostavalleyfrom-vtrentino-alto-adigefrom-wafrom-wiardwebthingsjcbnpparibashkiriafrom-wvallee-aosteroyfrom-wyfrosinonefrostabackplaneapplebesbyengerdalp1froyal-commissionfruskydivingfujiiderafujikawaguchikonefujiminokamoenairtrafficplexus-2fujinomiyadapliefujiokazakinkobearalvahkikonaibetsubame-south-1fujisatoshoeshintomikasaharafujisawafujishiroishidakabiratoridediboxn--3bst00minamisanrikubetsupportrentino-altoadigefujitsuruokakamigaharafujiyoshidappnodearthainguyenfukayabeardubaikawagoefukuchiyamadatsunanjoburgfukudomigawafukuis-a-doctorfukumitsubishigakirkeneshinyoshitomiokamisatokamachippubetsuikitchenfukuokakegawafukuroishikariwakunigamigrationfukusakirovogradoyfukuyamagatakaharunusualpersonfunabashiriuchinadattorelayfunagatakahashimamakiryuohkurafunahashikamiamakusatsumasendaisenergyeongginowaniihamatamakinoharafundfunkfeuerfuoiskujukuriyamandalfuosskoczowindowskrakowinefurubirafurudonordreisa-hockeynutwentertainmentrentino-s-tirolfurukawajimangolffanshiojirishirifujiedafusoctrangfussagamiharafutabayamaguchinomihachimanagementrentino-stirolfutboldlygoingnowhere-for-more-og-romsdalfuttsurutashinais-a-financialadvisor-aurdalfuturecmshioyamelhushirahamatonbetsurnadalfuturehostingfuturemailingfvghakuis-a-gurunzenhakusandnessjoenhaldenhalfmoonscalebookinghostedpictetrentino-sud-tirolhalsakakinokiaham-radio-opinbar1hamburghammarfeastasiahamurakamigoris-a-hard-workershiraokamisunagawahanamigawahanawahandavvesiidanangodaddyn-o-saurealestatefarmerseinehandcrafteducatorprojectrentino-sudtirolhangglidinghangoutrentino-sued-tirolhannannestadhannosegawahanoipinkazohanyuzenhappouzshiratakahagianghasamap-northeast-3hasaminami-alpshishikuis-a-hunterhashbanghasudazaifudaigodogadobeioruntimedio-campidano-mediocampidanomediohasura-appinokokamikoaniikappudopaashisogndalhasvikazteleportrentino-suedtirolhatogayahoooshikamagayaitakamoriokakudamatsuehatoyamazakitahiroshimarcheapartmentshisuifuettertdasnetzhatsukaichikaiseiyoichipshitaramahattfjelldalhayashimamotobusells-for-lesshizukuishimoichilloutsystemscloudsitehazuminobushibukawahelplfinancialhelsinkitakamiizumisanofidonnakamurataitogliattinnhemneshizuokamitondabayashiogamagoriziahemsedalhepforgeblockshoujis-a-knightpointtokaizukamaishikshacknetrentinoa-adigehetemlbfanhigashichichibuzentsujiiehigashihiroshimanehigashiizumozakitakatakanabeautychyattorneyagawakkanaioirasebastopoleangaviikadenagahamaroyhigashikagawahigashikagurasoedahigashikawakitaaikitakyushunantankazunovecorebungoonow-dnshowahigashikurumeinforumzhigashimatsushimarnardalhigashimatsuyamakitaakitadaitoigawahigashimurayamamotorcycleshowtimeloyhigashinarusells-for-uhigashinehigashiomitamanoshiroomghigashiosakasayamanakakogawahigashishirakawamatakanezawahigashisumiyoshikawaminamiaikitamihamadahigashitsunospamproxyhigashiurausukitamotosunnydayhigashiyamatokoriyamanashiibaclieu-1higashiyodogawahigashiyoshinogaris-a-landscaperspectakasakitanakagusukumoldeliveryhippyhiraizumisatohokkaidontexistmein-iservschulecznakaniikawatanagurahirakatashinagawahiranais-a-lawyerhirarahiratsukaeruhirayaizuwakamatsubushikusakadogawahitachiomiyaginozawaonsensiositehitachiotaketakaokalmykiahitraeumtgeradegreehjartdalhjelmelandholyhomegoodshwinnersiiitesilkddiamondsimple-urlhomeipioneerhomelinkyard-cloudjiffyresdalhomelinuxn--3ds443ghomeofficehomesecuritymacaparecidahomesecuritypchiryukyuragiizehomesenseeringhomeskleppippugliahomeunixn--3e0b707ehondahonjyoitakarazukaluganskfh-muensterhornindalhorsells-itrentinoaadigehortendofinternet-dnsimplesitehospitalhotelwithflightsirdalhotmailhoyangerhoylandetakasagooglecodespotrentinoalto-adigehungyenhurdalhurumajis-a-liberalhyllestadhyogoris-a-libertarianhyugawarahyundaiwafuneis-very-evillasalleitungsenis-very-goodyearis-very-niceis-very-sweetpepperugiais-with-thebandoomdnstraceisk01isk02jenv-arubacninhbinhdinhktistoryjeonnamegawajetztrentinostiroljevnakerjewelryjgorajlljls-sto1jls-sto2jls-sto3jmpixolinodeusercontentrentinosud-tiroljnjcloud-ver-jpchitosetogitsuliguriajoyokaichibahcavuotnagaivuotnagaokakyotambabymilk3jozis-a-musicianjpnjprsolarvikhersonlanxessolundbeckhmelnitskiyamasoykosaigawakosakaerodromegalloabatobamaceratachikawafaicloudineencoreapigeekoseis-a-painterhostsolutionslupskhakassiakosheroykoshimizumakis-a-patsfankoshughesomakosugekotohiradomainstitutekotourakouhokumakogenkounosupersalevangerkouyamasudakouzushimatrixn--3pxu8khplaystation-cloudyclusterkozagawakozakis-a-personaltrainerkozowiosomnarviklabudhabikinokawachinaganoharamcocottekpnkppspbarcelonagawakepnord-odalwaysdatabaseballangenkainanaejrietisalatinabenogiehtavuoatnaamesjevuemielnombrendlyngen-rootaruibxos3-us-gov-west-1krasnikahokutokonamegatakatoris-a-photographerokussldkrasnodarkredstonekrelliankristiansandcatsoowitdkmpspawnextdirectrentinosudtirolkristiansundkrodsheradkrokstadelvaldaostavangerkropyvnytskyis-a-playershiftcryptonomichinomiyakekryminamiyamashirokawanabelaudnedalnkumamotoyamatsumaebashimofusakatakatsukis-a-republicanonoichinosekigaharakumanowtvaokumatorinokumejimatsumotofukekumenanyokkaichirurgiens-dentistes-en-francekundenkunisakis-a-rockstarachowicekunitachiaraisaijolsterkunitomigusukukis-a-socialistgstagekunneppubtlsopotrentinosued-tirolkuokgroupizzakurgankurobegetmyipirangalluplidlugolekagaminorddalkurogimimozaokinawashirosatochiokinoshimagentositempurlkuroisodegaurakuromatsunais-a-soxfankuronkurotakikawasakis-a-studentalkushirogawakustanais-a-teacherkassyncloudkusuppliesor-odalkutchanelkutnokuzumakis-a-techietipslzkvafjordkvalsundkvamsterdamnserverbaniakvanangenkvinesdalkvinnheradkviteseidatingkvitsoykwpspdnsor-varangermishimatsusakahogirlymisugitokorozawamitakeharamitourismartlabelingmitoyoakemiuramiyazurecontainerdpoliticaobangmiyotamatsukuris-an-actormjondalenmonzabrianzaramonzaebrianzamonzaedellabrianzamordoviamorenapolicemoriyamatsuuramoriyoshiminamiashigaramormonstermoroyamatsuzakis-an-actressmushcdn77-sslingmortgagemoscowithgoogleapiszmoseushimogosenmosjoenmoskenesorreisahayakawakamiichikawamisatottoris-an-anarchistjordalshalsenmossortlandmosviknx-serversusakiyosupabaseminemotegit-reposoruminanomoviemovimientokyotangotembaixadattowebhareidsbergmozilla-iotrentinosuedtirolmtranbytomaridagawalmartrentinsud-tirolmuikaminokawanishiaizubangemukoelnmunakatanemuosattemupkomatsushimassa-carrara-massacarraramassabuzzmurmanskomforbar2murotorcraftranakatombetsumy-gatewaymusashinodesakegawamuseumincomcastoripressorfoldmusicapetownnews-stagingmutsuzawamy-vigormy-wanggoupilemyactivedirectorymyamazeplaymyasustor-elvdalmycdmycloudnsoundcastorjdevcloudfunctionsokndalmydattolocalcertificationmyddnsgeekgalaxymydissentrentinsudtirolmydobissmarterthanyoumydrobofageometre-experts-comptablesowamydspectruminisitemyeffectrentinsued-tirolmyfastly-edgekey-stagingmyfirewalledreplittlestargardmyforuminterecifedextraspace-to-rentalstomakomaibaramyfritzmyftpaccesspeedpartnermyhome-servermyjinomykolaivencloud66mymailermymediapchoseikarugalsacemyokohamamatsudamypeplatformsharis-an-artistockholmestrandmypetsphinxn--41amyphotoshibajddarvodkafjordvaporcloudmypictureshinomypsxn--42c2d9amysecuritycamerakermyshopblockspjelkavikommunalforbundmyshopifymyspreadshopselectrentinsuedtirolmytabitordermythic-beastspydebergmytis-a-anarchistg-buildermytuleap-partnersquaresindevicenzamyvnchoshichikashukudoyamakeuppermywirecipescaracallypoivronpokerpokrovskommunepolkowicepoltavalle-aostavernpomorzeszowithyoutuberspacekitagawaponpesaro-urbino-pesarourbinopesaromasvuotnaritakurashikis-bykleclerchitachinakagawaltervistaipeigersundynamic-dnsarlpordenonepornporsangerporsangugeporsgrunnanpoznanpraxihuanprdprgmrprimetelprincipeprivatelinkomonowruzhgorodeoprivatizehealthinsuranceprofesionalprogressivegasrlpromonza-e-della-brianzaptokuyamatsushigepropertysnesrvarggatrevisogneprotectionprotonetroandindependent-inquest-a-la-masionprudentialpruszkowiwatsukiyonotaireserve-onlineprvcyonabarumbriaprzeworskogpunyufuelpupulawypussycatanzarowixsitepvhachirogatakahatakaishimojis-a-geekautokeinotteroypvtrogstadpwchowderpzqhadanorthwesternmutualqldqotoyohashimotoshimaqponiatowadaqslgbtroitskomorotsukagawaqualifioapplatter-applatterplcube-serverquangngais-certifiedugit-pagespeedmobilizeroticaltanissettailscaleforcequangninhthuanquangtritonoshonais-foundationquickconnectromsakuragawaquicksytestreamlitapplumbingouvaresearchitectesrhtrentoyonakagyokutoyakomakizunokunimimatakasugais-an-engineeringquipelementstrippertuscanytushungrytuvalle-daostamayukis-into-animeiwamizawatuxfamilytuyenquangbinhthuantwmailvestnesuzukis-gonevestre-slidreggio-calabriavestre-totennishiawakuravestvagoyvevelstadvibo-valentiaavibovalentiavideovinhphuchromedicinagatorogerssarufutsunomiyawakasaikaitakokonoevinnicarbonia-iglesias-carboniaiglesiascarboniavinnytsiavipsinaapplurinacionalvirginanmokurennebuvirtual-userveexchangevirtualservervirtualuserveftpodhalevisakurais-into-carsnoasakuholeckodairaviterboliviajessheimmobilienvivianvivoryvixn--45br5cylvlaanderennesoyvladikavkazimierz-dolnyvladimirvlogintoyonezawavmintsorocabalashovhachiojiyahikobierzycevologdanskoninjambylvolvolkswagencyouvolyngdalvoorlopervossevangenvotevotingvotoyonovps-hostrowiechungnamdalseidfjordynathomebuiltwithdarkhangelskypecorittogojomeetoystre-slidrettozawawmemergencyahabackdropalermochizukikirarahkkeravjuwmflabsvalbardunloppadualstackomvuxn--3hcrj9chonanbuskerudynamisches-dnsarpsborgripeeweeklylotterywoodsidellogliastradingworse-thanhphohochiminhadselbuyshouseshirakolobrzegersundongthapmircloudletshiranukamishihorowowloclawekonskowolawawpdevcloudwpenginepoweredwphostedmailwpmucdnipropetrovskygearappodlasiellaknoluoktagajobojis-an-entertainerwpmudevcdnaccessojamparaglidingwritesthisblogoipodzonewroclawmcloudwsseoullensvanguardianwtcp4wtfastlylbanzaicloudappspotagereporthruherecreationinomiyakonojorpelandigickarasjohkameyamatotakadawuozuerichardlillywzmiuwajimaxn--4it797konsulatrobeepsondriobranconagareyamaizuruhrxn--4pvxs4allxn--54b7fta0ccistrondheimpertrixcdn77-secureadymadealstahaugesunderxn--55qw42gxn--55qx5dxn--5dbhl8dxn--5js045dxn--5rtp49citadelhichisochimkentozsdell-ogliastraderxn--5rtq34kontuminamiuonumatsunoxn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264citicarrdrobakamaiorigin-stagingmxn--12co0c3b4evalleaostaobaomoriguchiharaffleentrycloudflare-ipfstcgroupaaskimitsubatamibulsan-suedtirolkuszczytnoopscbgrimstadrrxn--80aaa0cvacationsvchoyodobashichinohealth-carereforminamidaitomanaustdalxn--80adxhksveioxn--80ao21axn--80aqecdr1axn--80asehdbarclaycards3-us-west-1xn--80aswgxn--80aukraanghkeliwebpaaskoyabeagleboardxn--8dbq2axn--8ltr62konyvelohmusashimurayamassivegridxn--8pvr4uxn--8y0a063axn--90a1affinitylotterybnikeisencowayxn--90a3academiamicable-modemoneyxn--90aeroportsinfolionetworkangerxn--90aishobaraxn--90amckinseyxn--90azhytomyrxn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byanagawaxn--asky-iraxn--aurskog-hland-jnbarclays3-us-west-2xn--avery-yuasakurastoragexn--b-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbsvelvikongsbergxn--bck1b9a5dre4civilaviationfabricafederation-webredirectmediatechnologyeongbukashiwazakiyosembokutamamuraxn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyanaizuxn--bjddar-ptarumizusawaxn--blt-elabcienciamallamaceiobbcn-north-1xn--bmlo-graingerxn--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuacademy-firewall-gatewayxn--brnnysund-m8accident-investigation-aptibleadpagesquare7xn--brum-voagatrustkanazawaxn--btsfjord-9zaxn--bulsan-sdtirol-nsbarefootballooningjovikarasjoketokashikiyokawaraxn--c1avgxn--c2br7gxn--c3s14misakis-a-therapistoiaxn--cck2b3baremetalombardyn-vpndns3-website-ap-northeast-1xn--cckwcxetdxn--cesena-forl-mcbremangerxn--cesenaforl-i8axn--cg4bkis-into-cartoonsokamitsuexn--ciqpnxn--clchc0ea0b2g2a9gcdxn--czr694bargainstantcloudfrontdoorestauranthuathienhuebinordre-landiherokuapparochernigovernmentjeldsundiscordsays3-website-ap-southeast-1xn--czrs0trvaroyxn--czru2dxn--czrw28barrel-of-knowledgeapplinziitatebayashijonawatebizenakanojoetsumomodellinglassnillfjordiscordsezgoraxn--d1acj3barrell-of-knowledgecomputermezproxyzgorzeleccoffeedbackanagawarmiastalowa-wolayangroupars3-website-ap-southeast-2xn--d1alfaststacksevenassigdalxn--d1atrysiljanxn--d5qv7z876clanbibaiduckdnsaseboknowsitallxn--davvenjrga-y4axn--djrs72d6uyxn--djty4koobindalxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4cldmail-boxaxn--eckvdtc9dxn--efvn9svn-repostuff-4-salexn--efvy88haebaruericssongdalenviknaklodzkochikushinonsenasakuchinotsuchiurakawaxn--ehqz56nxn--elqq16hagakhanhhoabinhduongxn--eveni-0qa01gaxn--f6qx53axn--fct429kooris-a-nascarfanxn--fhbeiarnxn--finny-yuaxn--fiq228c5hsbcleverappsassarinuyamashinazawaxn--fiq64barsycenterprisecloudcontrolappgafanquangnamasteigenoamishirasatochigifts3-website-eu-west-1xn--fiqs8swidnicaravanylvenetogakushimotoganexn--fiqz9swidnikitagatakkomaganexn--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-cesena-fcbsswiebodzindependent-commissionxn--forlcesena-c8axn--fpcrj9c3dxn--frde-granexn--frna-woaxn--frya-hraxn--fzc2c9e2clickrisinglesjaguarxn--fzys8d69uvgmailxn--g2xx48clinicasacampinagrandebungotakadaemongolianishitosashimizunaminamiawajikintuitoyotsukaidownloadrudtvsaogoncapooguyxn--gckr3f0fastvps-serveronakanotoddenxn--gecrj9cliniquedaklakasamatsudoesntexisteingeekasserversicherungroks-theatrentin-sud-tirolxn--ggaviika-8ya47hagebostadxn--gildeskl-g0axn--givuotna-8yandexcloudxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-into-gamessinamsosnowieconomiasadojin-dslattuminamitanexn--gmqw5axn--gnstigbestellen-zvbrplsbxn--45brj9churcharterxn--gnstigliefern-wobihirosakikamijimayfirstorfjordxn--h-2failxn--h1ahnxn--h1alizxn--h2breg3eveneswinoujsciencexn--h2brj9c8clothingdustdatadetectrani-andria-barletta-trani-andriaxn--h3cuzk1dienbienxn--hbmer-xqaxn--hcesuolo-7ya35barsyonlinehimejiiyamanouchikujoinvilleirvikarasuyamashikemrevistathellequipmentjmaxxxjavald-aostatics3-website-sa-east-1xn--hebda8basicserversejny-2xn--hery-iraxn--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accident-prevention-k3swisstufftoread-booksnestudioxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-fyaotsusonoxn--io0a7is-leetrentinoaltoadigexn--j1adpohlxn--j1aefauskedsmokorsetagayaseralingenovaraxn--j1ael8basilicataniaxn--j1amhaibarakisosakitahatakamatsukawaxn--j6w193gxn--jlq480n2rgxn--jlster-byasakaiminatoyookananiimiharuxn--jrpeland-54axn--jvr189misasaguris-an-accountantsmolaquilaocais-a-linux-useranishiaritabashikaoizumizakitashiobaraxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5xn--45q11circlerkstagentsasayamaxn--koluokta-7ya57haiduongxn--kprw13dxn--kpry57dxn--kput3is-lostre-toteneis-a-llamarumorimachidaxn--krager-gyasugitlabbvieeexn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdfastly-terrariuminamiiseharaxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyasuokanmakiwakuratexn--kvnangen-k0axn--l-1fairwindsynology-diskstationxn--l1accentureklamborghinikkofuefukihabororosynology-dsuzakadnsaliastudynaliastrynxn--laheadju-7yatominamibosoftwarendalenugxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika-52basketballfinanzjaworznoticeableksvikaratsuginamikatagamilanotogawaxn--lesund-huaxn--lgbbat1ad8jejuxn--lgrd-poacctulaspeziaxn--lhppi-xqaxn--linds-pramericanexpresservegame-serverxn--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-liacn-northwest-1xn--lten-granvindafjordxn--lury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddesxn--mgb9awbfbsbxn--1qqw23axn--mgba3a3ejtunesuzukamogawaxn--mgba3a4f16axn--mgba3a4fra1-deloittexn--mgba7c0bbn0axn--mgbaakc7dvfsxn--mgbaam7a8haiphongonnakatsugawaxn--mgbab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00batsfjordiscountry-snowplowiczeladzlgleezeu-2xn--mgbai9azgqp6jelasticbeanstalkharkovalleeaostexn--mgbayh7gparasitexn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgbcpq6gpa1axn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2fhskopervikhmelnytskyivalleedaostexn--mgbqly7c0a67fbcngroks-thisayamanobeatsaudaxn--mgbqly7cvafricargoboavistanbulsan-sudtirolxn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bauhauspostman-echofunatoriginstances3-website-us-east-1xn--mgbx4cd0abkhaziaxn--mix082fbx-osewienxn--mix891fbxosexyxn--mjndalen-64axn--mk0axindependent-inquiryxn--mk1bu44cnpyatigorskjervoyagexn--mkru45is-not-certifiedxn--mlatvuopmi-s4axn--mli-tlavagiskexn--mlselv-iuaxn--moreke-juaxn--mori-qsakuratanxn--mosjen-eyatsukannamihokksundxn--mot-tlavangenxn--mre-og-romsdal-qqbuservecounterstrikexn--msy-ula0hair-surveillancexn--mtta-vrjjat-k7aflakstadaokayamazonaws-cloud9guacuiababybluebiteckidsmynasushiobaracingrok-freeddnsfreebox-osascoli-picenogatabuseating-organicbcgjerdrumcprequalifymelbourneasypanelblagrarq-authgear-stagingjerstadeltaishinomakilovecollegefantasyleaguenoharauthgearappspacehosted-by-previderehabmereitattoolforgerockyombolzano-altoadigeorgeorgiauthordalandroideporteatonamidorivnebetsukubankanumazuryomitanocparmautocodebergamoarekembuchikumagayagawafflecelloisirs3-external-180reggioemiliaromagnarusawaustrheimbalsan-sudtirolivingitpagexlivornobserveregruhostingivestbyglandroverhalladeskjakamaiedge-stagingivingjemnes3-eu-west-2038xn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--4dbgdty6ciscofreakamaihd-stagingriwataraindroppdalxn--nit225koryokamikawanehonbetsuwanouchikuhokuryugasakis-a-nursellsyourhomeftpiwatexn--nmesjevuemie-tcbalatinord-frontierxn--nnx388axn--nodessakurawebsozais-savedxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeservehalflifeinsurancexn--nvuotna-hwaxn--nyqy26axn--o1achernivtsicilynxn--4dbrk0cexn--o3cw4hakatanortonkotsunndalxn--o3cyx2axn--od0algardxn--od0aq3beneventodayusuharaxn--ogbpf8fldrvelvetromsohuissier-justicexn--oppegrd-ixaxn--ostery-fyatsushiroxn--osyro-wuaxn--otu796dxn--p1acfedjeezxn--p1ais-slickharkivallee-d-aostexn--pgbs0dhlx3xn--porsgu-sta26fedorainfraclouderaxn--pssu33lxn--pssy2uxn--q7ce6axn--q9jyb4cnsauheradyndns-at-homedepotenzamamicrosoftbankasukabedzin-brbalsfjordietgoryoshiokanravocats3-fips-us-gov-west-1xn--qcka1pmcpenzapposxn--qqqt11misconfusedxn--qxa6axn--qxamunexus-3xn--rady-iraxn--rdal-poaxn--rde-ulazioxn--rdy-0nabaris-uberleetrentinos-tirolxn--rennesy-v1axn--rhkkervju-01afedorapeoplefrakkestadyndns-webhostingujogaszxn--rholt-mragowoltlab-democraciaxn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5naturalxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byawaraxn--rny31hakodatexn--rovu88bentleyusuitatamotorsitestinglitchernihivgubs3-website-us-west-1xn--rros-graphicsxn--rskog-uuaxn--rst-0naturbruksgymnxn--rsta-framercanvasxn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byawatahamaxn--s-1faitheshopwarezzoxn--s9brj9cntraniandriabarlettatraniandriaxn--sandnessjen-ogbentrendhostingliwiceu-3xn--sandy-yuaxn--sdtirol-n2axn--seral-lraxn--ses554gxn--sgne-graphoxn--4gbriminiserverxn--skierv-utazurestaticappspaceusercontentunkongsvingerxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5navigationxn--slt-elabogadobeaemcloud-fr1xn--smla-hraxn--smna-gratangenxn--snase-nraxn--sndre-land-0cbeppublishproxyuufcfanirasakindependent-panelomonza-brianzaporizhzhedmarkarelianceu-4xn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbeskidyn-ip24xn--srfold-byaxn--srreisa-q1axn--srum-gratis-a-bloggerxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbestbuyshoparenagasakikuchikuseihicampinashikiminohostfoldnavyuzawaxn--stre-toten-zcbetainaboxfuselfipartindependent-reviewegroweibolognagasukeu-north-1xn--t60b56axn--tckweddingxn--tiq49xqyjelenia-goraxn--tjme-hraxn--tn0agrocerydxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol-rzbhzc66xn--trentin-sdtirol-7vbialystokkeymachineu-south-1xn--trentino-sd-tirol-c3bielawakuyachimataharanzanishiazaindielddanuorrindigenamerikawauevje-og-hornnes3-website-us-west-2xn--trentino-sdtirol-szbiella-speziaxn--trentinosd-tirol-rzbieszczadygeyachiyodaeguamfamscompute-1xn--trentinosdtirol-7vbievat-band-campaignieznoorstaplesakyotanabellunordeste-idclkarlsoyxn--trentinsd-tirol-6vbifukagawalbrzycharitydalomzaporizhzhiaxn--trentinsdtirol-nsbigv-infolkebiblegnicalvinklein-butterhcloudiscoursesalangenishigotpantheonsitexn--trgstad-r1axn--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atventuresinstagingxn--uc0ay4axn--uist22hakonexn--uisz3gxn--unjrga-rtashkenturindalxn--unup4yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbturystykaneyamazoexn--valle-d-aoste-ehboehringerikexn--valleaoste-e7axn--valledaoste-ebbvadsoccertmgreaterxn--vard-jraxn--vegrshei-c0axn--vermgensberater-ctb-hostingxn--vermgensberatung-pwbiharstadotsubetsugarulezajskiervaksdalondonetskarmoyxn--vestvgy-ixa6oxn--vg-yiabruzzombieidskogasawarackmazerbaijan-mayenbaidarmeniaxn--vgan-qoaxn--vgsy-qoa0jellybeanxn--vgu402coguchikuzenishiwakinvestmentsaveincloudyndns-at-workisboringsakershusrcfdyndns-blogsitexn--vhquvestfoldxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bihoronobeokagakikugawalesundiscoverdalondrinaplesknsalon-1xn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1communexn--wgbl6axn--xhq521bikedaejeonbuk0xn--xkc2al3hye2axn--xkc2dl3a5ee0hakubackyardshiraois-a-greenxn--y9a3aquarelleasingxn--yer-znavois-very-badxn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn--4it168dxn--ystre-slidre-ujbiofficialorenskoglobodoes-itcouldbeworldishangrilamdongnairkitapps-audibleasecuritytacticsxn--0trq7p7nnishiharaxn--zbx025dxn--zf0ao64axn--zf0avxlxn--zfr164bipartsaloonishiizunazukindustriaxnbayernxz \ No newline at end of file diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index 6bdadcc4..78d400fa 100644 --- a/vendor/golang.org/x/net/publicsuffix/table.go +++ b/vendor/golang.org/x/net/publicsuffix/table.go @@ -4,7 +4,7 @@ package publicsuffix import _ "embed" -const version = "publicsuffix.org's public_suffix_list.dat, git revision e248cbc92a527a166454afe9914c4c1b4253893f (2022-11-15T18:02:38Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision 63cbc63d470d7b52c35266aa96c4c98c96ec499c (2023-08-03T10:01:25Z)" const ( nodesBits = 40 @@ -26,7 +26,7 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1494 +const numTLD = 1474 // text is the combined text of all labels. // @@ -63,8 +63,8 @@ var nodes uint40String //go:embed data/children var children uint32String -// max children 718 (capacity 1023) -// max text offset 32976 (capacity 65535) -// max text length 36 (capacity 63) -// max hi 9656 (capacity 16383) -// max lo 9651 (capacity 16383) +// max children 743 (capacity 1023) +// max text offset 30876 (capacity 65535) +// max text length 31 (capacity 63) +// max hi 9322 (capacity 16383) +// max lo 9317 (capacity 16383) diff --git a/vendor/golang.org/x/sys/execabs/execabs.go b/vendor/golang.org/x/sys/execabs/execabs.go deleted file mode 100644 index 3bf40fdf..00000000 --- a/vendor/golang.org/x/sys/execabs/execabs.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2020 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 execabs is a drop-in replacement for os/exec -// that requires PATH lookups to find absolute paths. -// That is, execabs.Command("cmd") runs the same PATH lookup -// as exec.Command("cmd"), but if the result is a path -// which is relative, the Run and Start methods will report -// an error instead of running the executable. -// -// See https://blog.golang.org/path-security for more information -// about when it may be necessary or appropriate to use this package. -package execabs - -import ( - "context" - "fmt" - "os/exec" - "path/filepath" - "reflect" - "unsafe" -) - -// ErrNotFound is the error resulting if a path search failed to find an executable file. -// It is an alias for exec.ErrNotFound. -var ErrNotFound = exec.ErrNotFound - -// Cmd represents an external command being prepared or run. -// It is an alias for exec.Cmd. -type Cmd = exec.Cmd - -// Error is returned by LookPath when it fails to classify a file as an executable. -// It is an alias for exec.Error. -type Error = exec.Error - -// An ExitError reports an unsuccessful exit by a command. -// It is an alias for exec.ExitError. -type ExitError = exec.ExitError - -func relError(file, path string) error { - return fmt.Errorf("%s resolves to executable in current directory (.%c%s)", file, filepath.Separator, path) -} - -// LookPath searches for an executable named file in the directories -// named by the PATH environment variable. If file contains a slash, -// it is tried directly and the PATH is not consulted. The result will be -// an absolute path. -// -// LookPath differs from exec.LookPath in its handling of PATH lookups, -// which are used for file names without slashes. If exec.LookPath's -// PATH lookup would have returned an executable from the current directory, -// LookPath instead returns an error. -func LookPath(file string) (string, error) { - path, err := exec.LookPath(file) - if err != nil && !isGo119ErrDot(err) { - return "", err - } - if filepath.Base(file) == file && !filepath.IsAbs(path) { - return "", relError(file, path) - } - return path, nil -} - -func fixCmd(name string, cmd *exec.Cmd) { - if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) && !isGo119ErrFieldSet(cmd) { - // exec.Command was called with a bare binary name and - // exec.LookPath returned a path which is not absolute. - // Set cmd.lookPathErr and clear cmd.Path so that it - // cannot be run. - lookPathErr := (*error)(unsafe.Pointer(reflect.ValueOf(cmd).Elem().FieldByName("lookPathErr").Addr().Pointer())) - if *lookPathErr == nil { - *lookPathErr = relError(name, cmd.Path) - } - cmd.Path = "" - } -} - -// CommandContext is like Command but includes a context. -// -// The provided context is used to kill the process (by calling os.Process.Kill) -// if the context becomes done before the command completes on its own. -func CommandContext(ctx context.Context, name string, arg ...string) *exec.Cmd { - cmd := exec.CommandContext(ctx, name, arg...) - fixCmd(name, cmd) - return cmd - -} - -// Command returns the Cmd struct to execute the named program with the given arguments. -// See exec.Command for most details. -// -// Command differs from exec.Command in its handling of PATH lookups, -// which are used when the program name contains no slashes. -// If exec.Command would have returned an exec.Cmd configured to run an -// executable from the current directory, Command instead -// returns an exec.Cmd that will return an error from Start or Run. -func Command(name string, arg ...string) *exec.Cmd { - cmd := exec.Command(name, arg...) - fixCmd(name, cmd) - return cmd -} diff --git a/vendor/golang.org/x/sys/execabs/execabs_go118.go b/vendor/golang.org/x/sys/execabs/execabs_go118.go deleted file mode 100644 index 5627d70e..00000000 --- a/vendor/golang.org/x/sys/execabs/execabs_go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2022 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. - -//go:build !go1.19 - -package execabs - -import "os/exec" - -func isGo119ErrDot(err error) bool { - return false -} - -func isGo119ErrFieldSet(cmd *exec.Cmd) bool { - return false -} diff --git a/vendor/golang.org/x/sys/execabs/execabs_go119.go b/vendor/golang.org/x/sys/execabs/execabs_go119.go deleted file mode 100644 index d60ab1b4..00000000 --- a/vendor/golang.org/x/sys/execabs/execabs_go119.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 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. - -//go:build go1.19 - -package execabs - -import ( - "errors" - "os/exec" -) - -func isGo119ErrDot(err error) bool { - return errors.Is(err, exec.ErrDot) -} - -func isGo119ErrFieldSet(cmd *exec.Cmd) bool { - return cmd.Err != nil -} diff --git a/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/golang.org/x/sys/unix/fcntl.go index 58c6bfc7..6200876f 100644 --- a/vendor/golang.org/x/sys/unix/fcntl.go +++ b/vendor/golang.org/x/sys/unix/fcntl.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build dragonfly || freebsd || linux || netbsd || openbsd +//go:build dragonfly || freebsd || linux || netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 0d12c085..dbe680ea 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -231,3 +231,8 @@ func IoctlLoopGetStatus64(fd int) (*LoopInfo64, error) { func IoctlLoopSetStatus64(fd int, value *LoopInfo64) error { return ioctlPtr(fd, LOOP_SET_STATUS64, unsafe.Pointer(value)) } + +// IoctlLoopConfigure configures all loop device parameters in a single step +func IoctlLoopConfigure(fd int, value *LoopConfig) error { + return ioctlPtr(fd, LOOP_CONFIGURE, unsafe.Pointer(value)) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index cbe24150..c6492020 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -248,6 +248,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -283,10 +284,6 @@ struct ltchars { #include #endif -#ifndef MSG_FASTOPEN -#define MSG_FASTOPEN 0x20000000 -#endif - #ifndef PTRACE_GETREGS #define PTRACE_GETREGS 0xc #endif @@ -295,14 +292,6 @@ struct ltchars { #define PTRACE_SETREGS 0xd #endif -#ifndef SOL_NETLINK -#define SOL_NETLINK 270 -#endif - -#ifndef SOL_SMC -#define SOL_SMC 286 -#endif - #ifdef SOL_BLUETOOTH // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h // but it is already in bluetooth_linux.go @@ -319,10 +308,23 @@ struct ltchars { #undef TIPC_WAIT_FOREVER #define TIPC_WAIT_FOREVER 0xffffffff -// Copied from linux/l2tp.h -// Including linux/l2tp.h here causes conflicts between linux/in.h -// and netinet/in.h included via net/route.h above. -#define IPPROTO_L2TP 115 +// Copied from linux/netfilter/nf_nat.h +// Including linux/netfilter/nf_nat.h here causes conflicts between linux/in.h +// and netinet/in.h. +#define NF_NAT_RANGE_MAP_IPS (1 << 0) +#define NF_NAT_RANGE_PROTO_SPECIFIED (1 << 1) +#define NF_NAT_RANGE_PROTO_RANDOM (1 << 2) +#define NF_NAT_RANGE_PERSISTENT (1 << 3) +#define NF_NAT_RANGE_PROTO_RANDOM_FULLY (1 << 4) +#define NF_NAT_RANGE_PROTO_OFFSET (1 << 5) +#define NF_NAT_RANGE_NETMAP (1 << 6) +#define NF_NAT_RANGE_PROTO_RANDOM_ALL \ + (NF_NAT_RANGE_PROTO_RANDOM | NF_NAT_RANGE_PROTO_RANDOM_FULLY) +#define NF_NAT_RANGE_MASK \ + (NF_NAT_RANGE_MAP_IPS | NF_NAT_RANGE_PROTO_SPECIFIED | \ + NF_NAT_RANGE_PROTO_RANDOM | NF_NAT_RANGE_PERSISTENT | \ + NF_NAT_RANGE_PROTO_RANDOM_FULLY | NF_NAT_RANGE_PROTO_OFFSET | \ + NF_NAT_RANGE_NETMAP) // Copied from linux/hid.h. // Keep in sync with the size of the referenced fields. @@ -519,6 +521,7 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || + $2 == "LOOP_CONFIGURE" || $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || @@ -560,7 +563,7 @@ ccflags="$@" $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && + $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+|BPF_F_LINK)$/ && $2 ~ /^(BPF|DLT)_/ || $2 ~ /^AUDIT_/ || $2 ~ /^(CLOCK|TIMER)_/ || @@ -602,6 +605,9 @@ ccflags="$@" $2 ~ /^FSOPT_/ || $2 ~ /^WDIO[CFS]_/ || $2 ~ /^NFN/ || + $2 !~ /^NFT_META_IIFTYPE/ && + $2 ~ /^NFT_/ || + $2 ~ /^NF_NAT_/ || $2 ~ /^XDP_/ || $2 ~ /^RWF_/ || $2 ~ /^(HDIO|WIN|SMART)_/ || diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 6f328e3a..a00c3e54 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -316,7 +316,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { if err != nil { return "", err } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index a5e1c10e..0f85e29e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -61,15 +61,23 @@ func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) ( } //sys fchmodat(dirfd int, path string, mode uint32) (err error) +//sys fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior - // and check the flags. Otherwise the mode would be applied to the symlink - // destination which is not what the user expects. - if flags&^AT_SYMLINK_NOFOLLOW != 0 { - return EINVAL - } else if flags&AT_SYMLINK_NOFOLLOW != 0 { - return EOPNOTSUPP +func Fchmodat(dirfd int, path string, mode uint32, flags int) error { + // Linux fchmodat doesn't support the flags parameter, but fchmodat2 does. + // Try fchmodat2 if flags are specified. + if flags != 0 { + err := fchmodat2(dirfd, path, mode, flags) + if err == ENOSYS { + // fchmodat2 isn't available. If the flags are known to be valid, + // return EOPNOTSUPP to indicate that fchmodat doesn't support them. + if flags&^(AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) != 0 { + return EINVAL + } else if flags&(AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) != 0 { + return EOPNOTSUPP + } + } + return err } return fchmodat(dirfd, path, mode) } @@ -1302,7 +1310,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { return "", err } } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index d2882ee0..b25343c7 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -166,6 +166,20 @@ func Getresgid() (rgid, egid, sgid int) { //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL +//sys fcntl(fd int, cmd int, arg int) (n int, err error) +//sys fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) = SYS_FCNTL + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + return fcntl(int(fd), cmd, arg) +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, err := fcntlPtr(int(fd), cmd, unsafe.Pointer(lk)) + return err +} + //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 60c8142d..21974af0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -158,7 +158,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { if err != nil { return "", err } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } const ImplementsGetwd = true diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index d99d05f1..b473038c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -1104,7 +1104,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { return "", err } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 9c00cbf5..a5d3ff8d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -486,7 +486,6 @@ const ( BPF_F_ANY_ALIGNMENT = 0x2 BPF_F_BEFORE = 0x8 BPF_F_ID = 0x20 - BPF_F_LINK = 0x2000 BPF_F_NETFILTER_IP_DEFRAG = 0x1 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_REPLACE = 0x4 @@ -1802,6 +1801,7 @@ const ( LOCK_SH = 0x1 LOCK_UN = 0x8 LOOP_CLR_FD = 0x4c01 + LOOP_CONFIGURE = 0x4c0a LOOP_CTL_ADD = 0x4c80 LOOP_CTL_GET_FREE = 0x4c82 LOOP_CTL_REMOVE = 0x4c81 @@ -2127,6 +2127,60 @@ const ( NFNL_SUBSYS_QUEUE = 0x3 NFNL_SUBSYS_ULOG = 0x4 NFS_SUPER_MAGIC = 0x6969 + NFT_CHAIN_FLAGS = 0x7 + NFT_CHAIN_MAXNAMELEN = 0x100 + NFT_CT_MAX = 0x17 + NFT_DATA_RESERVED_MASK = 0xffffff00 + NFT_DATA_VALUE_MAXLEN = 0x40 + NFT_EXTHDR_OP_MAX = 0x4 + NFT_FIB_RESULT_MAX = 0x3 + NFT_INNER_MASK = 0xf + NFT_LOGLEVEL_MAX = 0x8 + NFT_NAME_MAXLEN = 0x100 + NFT_NG_MAX = 0x1 + NFT_OBJECT_CONNLIMIT = 0x5 + NFT_OBJECT_COUNTER = 0x1 + NFT_OBJECT_CT_EXPECT = 0x9 + NFT_OBJECT_CT_HELPER = 0x3 + NFT_OBJECT_CT_TIMEOUT = 0x7 + NFT_OBJECT_LIMIT = 0x4 + NFT_OBJECT_MAX = 0xa + NFT_OBJECT_QUOTA = 0x2 + NFT_OBJECT_SECMARK = 0x8 + NFT_OBJECT_SYNPROXY = 0xa + NFT_OBJECT_TUNNEL = 0x6 + NFT_OBJECT_UNSPEC = 0x0 + NFT_OBJ_MAXNAMELEN = 0x100 + NFT_OSF_MAXGENRELEN = 0x10 + NFT_QUEUE_FLAG_BYPASS = 0x1 + NFT_QUEUE_FLAG_CPU_FANOUT = 0x2 + NFT_QUEUE_FLAG_MASK = 0x3 + NFT_REG32_COUNT = 0x10 + NFT_REG32_SIZE = 0x4 + NFT_REG_MAX = 0x4 + NFT_REG_SIZE = 0x10 + NFT_REJECT_ICMPX_MAX = 0x3 + NFT_RT_MAX = 0x4 + NFT_SECMARK_CTX_MAXLEN = 0x100 + NFT_SET_MAXNAMELEN = 0x100 + NFT_SOCKET_MAX = 0x3 + NFT_TABLE_F_MASK = 0x3 + NFT_TABLE_MAXNAMELEN = 0x100 + NFT_TRACETYPE_MAX = 0x3 + NFT_TUNNEL_F_MASK = 0x7 + NFT_TUNNEL_MAX = 0x1 + NFT_TUNNEL_MODE_MAX = 0x2 + NFT_USERDATA_MAXLEN = 0x100 + NFT_XFRM_KEY_MAX = 0x6 + NF_NAT_RANGE_MAP_IPS = 0x1 + NF_NAT_RANGE_MASK = 0x7f + NF_NAT_RANGE_NETMAP = 0x40 + NF_NAT_RANGE_PERSISTENT = 0x8 + NF_NAT_RANGE_PROTO_OFFSET = 0x20 + NF_NAT_RANGE_PROTO_RANDOM = 0x4 + NF_NAT_RANGE_PROTO_RANDOM_ALL = 0x14 + NF_NAT_RANGE_PROTO_RANDOM_FULLY = 0x10 + NF_NAT_RANGE_PROTO_SPECIFIED = 0x2 NILFS_SUPER_MAGIC = 0x3434 NL0 = 0x0 NL1 = 0x100 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index faca7a55..1488d271 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -37,6 +37,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 88bfc288..9dc42410 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 4cbeff17..41b56173 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fcntl_trampoline_addr(SB)/4, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index b8a67b99..0d3a0751 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 1123f275..4019a656 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index af50a65c..c39f7776 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index 82badae3..ac4af24f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fcntl_trampoline_addr(SB)/4, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 8fb4ff36..57571d07 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index 24d7eecb..f77d5321 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index f469a83e..e62963e6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index 9a498a06..fae140b6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index c26ca2e1..00831354 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index 1f224aa4..9d1e0ff0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s @@ -213,6 +213,12 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_fcntl(SB) + RET +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_ppoll(SB) RET diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index bcc920dd..79029ed5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -2271,5 +2297,3 @@ func unveil(path *byte, flags *byte) (err error) { var libc_unveil_trampoline_addr uintptr //go:cgo_import_dynamic libc_unveil unveil "libc.so" - - diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index 87a79c70..da115f9a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 997bcd55..bbf8399f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -2671,6 +2671,7 @@ const ( BPF_PROG_TYPE_LSM = 0x1d BPF_PROG_TYPE_SK_LOOKUP = 0x1e BPF_PROG_TYPE_SYSCALL = 0x1f + BPF_PROG_TYPE_NETFILTER = 0x20 BPF_CGROUP_INET_INGRESS = 0x0 BPF_CGROUP_INET_EGRESS = 0x1 BPF_CGROUP_INET_SOCK_CREATE = 0x2 @@ -2715,6 +2716,11 @@ const ( BPF_PERF_EVENT = 0x29 BPF_TRACE_KPROBE_MULTI = 0x2a BPF_LSM_CGROUP = 0x2b + BPF_STRUCT_OPS = 0x2c + BPF_NETFILTER = 0x2d + BPF_TCX_INGRESS = 0x2e + BPF_TCX_EGRESS = 0x2f + BPF_TRACE_UPROBE_MULTI = 0x30 BPF_LINK_TYPE_UNSPEC = 0x0 BPF_LINK_TYPE_RAW_TRACEPOINT = 0x1 BPF_LINK_TYPE_TRACING = 0x2 @@ -2725,6 +2731,18 @@ const ( BPF_LINK_TYPE_PERF_EVENT = 0x7 BPF_LINK_TYPE_KPROBE_MULTI = 0x8 BPF_LINK_TYPE_STRUCT_OPS = 0x9 + BPF_LINK_TYPE_NETFILTER = 0xa + BPF_LINK_TYPE_TCX = 0xb + BPF_LINK_TYPE_UPROBE_MULTI = 0xc + BPF_PERF_EVENT_UNSPEC = 0x0 + BPF_PERF_EVENT_UPROBE = 0x1 + BPF_PERF_EVENT_URETPROBE = 0x2 + BPF_PERF_EVENT_KPROBE = 0x3 + BPF_PERF_EVENT_KRETPROBE = 0x4 + BPF_PERF_EVENT_TRACEPOINT = 0x5 + BPF_PERF_EVENT_EVENT = 0x6 + BPF_F_KPROBE_MULTI_RETURN = 0x1 + BPF_F_UPROBE_MULTI_RETURN = 0x1 BPF_ANY = 0x0 BPF_NOEXIST = 0x1 BPF_EXIST = 0x2 @@ -2742,6 +2760,8 @@ const ( BPF_F_MMAPABLE = 0x400 BPF_F_PRESERVE_ELEMS = 0x800 BPF_F_INNER_MAP = 0x1000 + BPF_F_LINK = 0x2000 + BPF_F_PATH_FD = 0x4000 BPF_STATS_RUN_TIME = 0x0 BPF_STACK_BUILD_ID_EMPTY = 0x0 BPF_STACK_BUILD_ID_VALID = 0x1 @@ -2762,6 +2782,7 @@ const ( BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_DONT_FRAGMENT = 0x4 BPF_F_SEQ_NUMBER = 0x8 + BPF_F_NO_TUNNEL_KEY = 0x10 BPF_F_TUNINFO_FLAGS = 0x10 BPF_F_INDEX_MASK = 0xffffffff BPF_F_CURRENT_CPU = 0xffffffff @@ -2778,6 +2799,8 @@ const ( BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 BPF_F_ADJ_ROOM_NO_CSUM_RESET = 0x20 BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 0x40 + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 0x80 + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 0x100 BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_F_SYSCTL_BASE_NAME = 0x1 @@ -2866,6 +2889,8 @@ const ( BPF_DEVCG_DEV_CHAR = 0x2 BPF_FIB_LOOKUP_DIRECT = 0x1 BPF_FIB_LOOKUP_OUTPUT = 0x2 + BPF_FIB_LOOKUP_SKIP_NEIGH = 0x4 + BPF_FIB_LOOKUP_TBID = 0x8 BPF_FIB_LKUP_RET_SUCCESS = 0x0 BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 @@ -2901,6 +2926,7 @@ const ( BPF_CORE_ENUMVAL_EXISTS = 0xa BPF_CORE_ENUMVAL_VALUE = 0xb BPF_CORE_TYPE_MATCHES = 0xc + BPF_F_TIMER_ABS = 0x1 ) const ( @@ -2979,6 +3005,12 @@ type LoopInfo64 struct { Encrypt_key [32]uint8 Init [2]uint64 } +type LoopConfig struct { + Fd uint32 + Size uint32 + Info LoopInfo64 + _ [8]uint64 +} type TIPCSocketAddr struct { Ref uint32 diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index fb6cfd04..ffb8708c 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -155,6 +155,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW //sys GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW //sys SetDefaultDllDirectories(directoryFlags uint32) (err error) +//sys AddDllDirectory(path *uint16) (cookie uintptr, err error) = kernel32.AddDllDirectory +//sys RemoveDllDirectory(cookie uintptr) (err error) = kernel32.RemoveDllDirectory //sys SetDllDirectory(path string) (err error) = kernel32.SetDllDirectoryW //sys GetVersion() (ver uint32, err error) //sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW @@ -192,6 +194,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW //sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW //sys SetEndOfFile(handle Handle) (err error) +//sys SetFileValidData(handle Handle, validDataLength int64) (err error) //sys GetSystemTimeAsFileTime(time *Filetime) //sys GetSystemTimePreciseAsFileTime(time *Filetime) //sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index db6282e0..e8791c82 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -184,6 +184,7 @@ var ( procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx") procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procAddDllDirectory = modkernel32.NewProc("AddDllDirectory") procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") procCancelIo = modkernel32.NewProc("CancelIo") procCancelIoEx = modkernel32.NewProc("CancelIoEx") @@ -330,6 +331,7 @@ var ( procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory") procReleaseMutex = modkernel32.NewProc("ReleaseMutex") procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procRemoveDllDirectory = modkernel32.NewProc("RemoveDllDirectory") procResetEvent = modkernel32.NewProc("ResetEvent") procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") procResumeThread = modkernel32.NewProc("ResumeThread") @@ -340,6 +342,7 @@ var ( procSetDefaultDllDirectories = modkernel32.NewProc("SetDefaultDllDirectories") procSetDllDirectoryW = modkernel32.NewProc("SetDllDirectoryW") procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") + procSetFileValidData = modkernel32.NewProc("SetFileValidData") procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") procSetErrorMode = modkernel32.NewProc("SetErrorMode") procSetEvent = modkernel32.NewProc("SetEvent") @@ -1605,6 +1608,15 @@ func GetIfEntry(pIfRow *MibIfRow) (errcode error) { return } +func AddDllDirectory(path *uint16) (cookie uintptr, err error) { + r0, _, e1 := syscall.Syscall(procAddDllDirectory.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + cookie = uintptr(r0) + if cookie == 0 { + err = errnoErr(e1) + } + return +} + func AssignProcessToJobObject(job Handle, process Handle) (err error) { r1, _, e1 := syscall.Syscall(procAssignProcessToJobObject.Addr(), 2, uintptr(job), uintptr(process), 0) if r1 == 0 { @@ -2879,6 +2891,14 @@ func RemoveDirectory(path *uint16) (err error) { return } +func RemoveDllDirectory(cookie uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procRemoveDllDirectory.Addr(), 1, uintptr(cookie), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func ResetEvent(event Handle) (err error) { r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) if r1 == 0 { @@ -2969,6 +2989,14 @@ func SetEndOfFile(handle Handle) (err error) { return } +func SetFileValidData(handle Handle, validDataLength int64) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileValidData.Addr(), 2, uintptr(handle), uintptr(validDataLength), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) if r1 == 0 { diff --git a/vendor/golang.org/x/time/rate/rate.go b/vendor/golang.org/x/time/rate/rate.go index f0e0cf3c..8f6c7f49 100644 --- a/vendor/golang.org/x/time/rate/rate.go +++ b/vendor/golang.org/x/time/rate/rate.go @@ -52,6 +52,8 @@ func Every(interval time.Duration) Limit { // or its associated context.Context is canceled. // // The methods AllowN, ReserveN, and WaitN consume n tokens. +// +// Limiter is safe for simultaneous use by multiple goroutines. type Limiter struct { mu sync.Mutex limit Limit diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go index 9fa5aa19..2c4c4e23 100644 --- a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go +++ b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go @@ -11,8 +11,6 @@ import ( "go/ast" "go/token" "sort" - - "golang.org/x/tools/internal/typeparams" ) // PathEnclosingInterval returns the node that encloses the source @@ -322,7 +320,7 @@ func childrenOf(n ast.Node) []ast.Node { children = append(children, n.Recv) } children = append(children, n.Name) - if tparams := typeparams.ForFuncType(n.Type); tparams != nil { + if tparams := n.Type.TypeParams; tparams != nil { children = append(children, tparams) } if n.Type.Params != nil { @@ -377,7 +375,7 @@ func childrenOf(n ast.Node) []ast.Node { tok(n.Lbrack, len("[")), tok(n.Rbrack, len("]"))) - case *typeparams.IndexListExpr: + case *ast.IndexListExpr: children = append(children, tok(n.Lbrack, len("[")), tok(n.Rbrack, len("]"))) @@ -588,7 +586,7 @@ func NodeDescription(n ast.Node) string { return "decrement statement" case *ast.IndexExpr: return "index expression" - case *typeparams.IndexListExpr: + case *ast.IndexListExpr: return "index list expression" case *ast.InterfaceType: return "interface type" diff --git a/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go index f430b21b..58934f76 100644 --- a/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go +++ b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go @@ -9,8 +9,6 @@ import ( "go/ast" "reflect" "sort" - - "golang.org/x/tools/internal/typeparams" ) // An ApplyFunc is invoked by Apply for each node n, even if n is nil, @@ -252,7 +250,7 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast. a.apply(n, "X", nil, n.X) a.apply(n, "Index", nil, n.Index) - case *typeparams.IndexListExpr: + case *ast.IndexListExpr: a.apply(n, "X", nil, n.X) a.applyList(n, "Indices") @@ -293,7 +291,7 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast. a.apply(n, "Fields", nil, n.Fields) case *ast.FuncType: - if tparams := typeparams.ForFuncType(n); tparams != nil { + if tparams := n.TypeParams; tparams != nil { a.apply(n, "TypeParams", nil, tparams) } a.apply(n, "Params", nil, n.Params) @@ -408,7 +406,7 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast. case *ast.TypeSpec: a.apply(n, "Doc", nil, n.Doc) a.apply(n, "Name", nil, n.Name) - if tparams := typeparams.ForTypeSpec(n); tparams != nil { + if tparams := n.TypeParams; tparams != nil { a.apply(n, "TypeParams", nil, tparams) } a.apply(n, "Type", nil, n.Type) diff --git a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go index 15025f64..763d1880 100644 --- a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go +++ b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go @@ -8,7 +8,6 @@ import ( "fmt" "go/build" "io" - "io/ioutil" "os" "path" "path/filepath" @@ -76,7 +75,7 @@ func FakeContext(pkgs map[string]map[string]string) *build.Context { if !ok { return nil, fmt.Errorf("file not found: %s", filename) } - return ioutil.NopCloser(strings.NewReader(content)), nil + return io.NopCloser(strings.NewReader(content)), nil } ctxt.IsAbsPath = func(path string) bool { path = filepath.ToSlash(path) diff --git a/vendor/golang.org/x/tools/go/buildutil/overlay.go b/vendor/golang.org/x/tools/go/buildutil/overlay.go index bdbfd931..7e371658 100644 --- a/vendor/golang.org/x/tools/go/buildutil/overlay.go +++ b/vendor/golang.org/x/tools/go/buildutil/overlay.go @@ -10,7 +10,6 @@ import ( "fmt" "go/build" "io" - "io/ioutil" "path/filepath" "strconv" "strings" @@ -33,7 +32,7 @@ func OverlayContext(orig *build.Context, overlay map[string][]byte) *build.Conte // TODO(dominikh): Implement IsDir, HasSubdir and ReadDir rc := func(data []byte) (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewBuffer(data)), nil + return io.NopCloser(bytes.NewBuffer(data)), nil } copy := *orig // make a copy diff --git a/vendor/golang.org/x/tools/go/internal/cgo/cgo.go b/vendor/golang.org/x/tools/go/internal/cgo/cgo.go index 3fce4800..697974bb 100644 --- a/vendor/golang.org/x/tools/go/internal/cgo/cgo.go +++ b/vendor/golang.org/x/tools/go/internal/cgo/cgo.go @@ -57,20 +57,18 @@ import ( "go/build" "go/parser" "go/token" - "io/ioutil" "log" "os" + "os/exec" "path/filepath" "regexp" "strings" - - exec "golang.org/x/sys/execabs" ) // ProcessFiles invokes the cgo preprocessor on bp.CgoFiles, parses // the output and returns the resulting ASTs. func ProcessFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) { - tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C") + tmpdir, err := os.MkdirTemp("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C") if err != nil { return nil, err } diff --git a/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go b/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go index 7d94bbc1..b5bb95a6 100644 --- a/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go +++ b/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go @@ -8,7 +8,7 @@ import ( "errors" "fmt" "go/build" - exec "golang.org/x/sys/execabs" + "os/exec" "strings" ) diff --git a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go index 18a002f8..333676b7 100644 --- a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go +++ b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go @@ -8,42 +8,46 @@ package packagesdriver import ( "context" "fmt" - "go/types" "strings" "golang.org/x/tools/internal/gocommand" ) -var debug = false - -func GetSizesGolist(ctx context.Context, inv gocommand.Invocation, gocmdRunner *gocommand.Runner) (types.Sizes, error) { +func GetSizesForArgsGolist(ctx context.Context, inv gocommand.Invocation, gocmdRunner *gocommand.Runner) (string, string, error) { inv.Verb = "list" inv.Args = []string{"-f", "{{context.GOARCH}} {{context.Compiler}}", "--", "unsafe"} stdout, stderr, friendlyErr, rawErr := gocmdRunner.RunRaw(ctx, inv) var goarch, compiler string if rawErr != nil { - if rawErrMsg := rawErr.Error(); strings.Contains(rawErrMsg, "cannot find main module") || strings.Contains(rawErrMsg, "go.mod file not found") { - // User's running outside of a module. All bets are off. Get GOARCH and guess compiler is gc. + rawErrMsg := rawErr.Error() + if strings.Contains(rawErrMsg, "cannot find main module") || + strings.Contains(rawErrMsg, "go.mod file not found") { + // User's running outside of a module. + // All bets are off. Get GOARCH and guess compiler is gc. // TODO(matloob): Is this a problem in practice? inv.Verb = "env" inv.Args = []string{"GOARCH"} envout, enverr := gocmdRunner.Run(ctx, inv) if enverr != nil { - return nil, enverr + return "", "", enverr } goarch = strings.TrimSpace(envout.String()) compiler = "gc" + } else if friendlyErr != nil { + return "", "", friendlyErr } else { - return nil, friendlyErr + // This should be unreachable, but be defensive + // in case RunRaw's error results are inconsistent. + return "", "", rawErr } } else { fields := strings.Fields(stdout.String()) if len(fields) < 2 { - return nil, fmt.Errorf("could not parse GOARCH and Go compiler in format \" \":\nstdout: <<%s>>\nstderr: <<%s>>", + return "", "", fmt.Errorf("could not parse GOARCH and Go compiler in format \" \":\nstdout: <<%s>>\nstderr: <<%s>>", stdout.String(), stderr.String()) } goarch = fields[0] compiler = fields[1] } - return types.SizesFor(compiler, goarch), nil + return compiler, goarch, nil } diff --git a/vendor/golang.org/x/tools/go/loader/loader.go b/vendor/golang.org/x/tools/go/loader/loader.go index edf62c2c..013c0f50 100644 --- a/vendor/golang.org/x/tools/go/loader/loader.go +++ b/vendor/golang.org/x/tools/go/loader/loader.go @@ -23,7 +23,7 @@ import ( "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/go/internal/cgo" - "golang.org/x/tools/internal/typeparams" + "golang.org/x/tools/internal/versions" ) var ignoreVendor build.ImportMode @@ -1033,13 +1033,14 @@ func (imp *importer) newPackageInfo(path, dir string) *PackageInfo { Defs: make(map[*ast.Ident]types.Object), Uses: make(map[*ast.Ident]types.Object), Implicits: make(map[ast.Node]types.Object), + Instances: make(map[*ast.Ident]types.Instance), Scopes: make(map[ast.Node]*types.Scope), Selections: make(map[*ast.SelectorExpr]*types.Selection), }, errorFunc: imp.conf.TypeChecker.Error, dir: dir, } - typeparams.InitInstanceInfo(&info.Info) + versions.InitFileVersions(&info.Info) // Copy the types.Config so we can vary it across PackageInfos. tc := imp.conf.TypeChecker diff --git a/vendor/golang.org/x/tools/go/packages/doc.go b/vendor/golang.org/x/tools/go/packages/doc.go index da4ab89f..b2a0b7c6 100644 --- a/vendor/golang.org/x/tools/go/packages/doc.go +++ b/vendor/golang.org/x/tools/go/packages/doc.go @@ -5,12 +5,32 @@ /* Package packages loads Go packages for inspection and analysis. -The Load function takes as input a list of patterns and return a list of Package -structs describing individual packages matched by those patterns. -The LoadMode controls the amount of detail in the loaded packages. +The [Load] function takes as input a list of patterns and returns a +list of [Package] values describing individual packages matched by those +patterns. +A [Config] specifies configuration options, the most important of which is +the [LoadMode], which controls the amount of detail in the loaded packages. -Load passes most patterns directly to the underlying build tool, -but all patterns with the prefix "query=", where query is a +Load passes most patterns directly to the underlying build tool. +The default build tool is the go command. +Its supported patterns are described at +https://pkg.go.dev/cmd/go#hdr-Package_lists_and_patterns. + +Load may be used in Go projects that use alternative build systems, by +installing an appropriate "driver" program for the build system and +specifying its location in the GOPACKAGESDRIVER environment variable. +For example, +https://github.com/bazelbuild/rules_go/wiki/Editor-and-tool-integration +explains how to use the driver for Bazel. +The driver program is responsible for interpreting patterns in its +preferred notation and reporting information about the packages that +they identify. +(See driverRequest and driverResponse types for the JSON +schema used by the protocol. +Though the protocol is supported, these types are currently unexported; +see #64608 for a proposal to publish them.) + +Regardless of driver, all patterns with the prefix "query=", where query is a non-empty string of letters from [a-z], are reserved and may be interpreted as query operators. @@ -35,7 +55,7 @@ The Package struct provides basic information about the package, including - Imports, a map from source import strings to the Packages they name; - Types, the type information for the package's exported symbols; - Syntax, the parsed syntax trees for the package's source code; and - - TypeInfo, the result of a complete type-check of the package syntax trees. + - TypesInfo, the result of a complete type-check of the package syntax trees. (See the documentation for type Package for the complete list of fields and more detailed descriptions.) @@ -64,7 +84,7 @@ reported about the loaded packages. See the documentation for type LoadMode for details. Most tools should pass their command-line arguments (after any flags) -uninterpreted to the loader, so that the loader can interpret them +uninterpreted to [Load], so that it can interpret them according to the conventions of the underlying build system. See the Example function for typical usage. */ diff --git a/vendor/golang.org/x/tools/go/packages/external.go b/vendor/golang.org/x/tools/go/packages/external.go index 7242a0a7..7db1d129 100644 --- a/vendor/golang.org/x/tools/go/packages/external.go +++ b/vendor/golang.org/x/tools/go/packages/external.go @@ -12,8 +12,8 @@ import ( "bytes" "encoding/json" "fmt" - exec "golang.org/x/sys/execabs" "os" + "os/exec" "strings" ) diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 58230038..cd375fbc 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -9,10 +9,9 @@ import ( "context" "encoding/json" "fmt" - "go/types" - "io/ioutil" "log" "os" + "os/exec" "path" "path/filepath" "reflect" @@ -22,7 +21,6 @@ import ( "sync" "unicode" - exec "golang.org/x/sys/execabs" "golang.org/x/tools/go/internal/packagesdriver" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/packagesinternal" @@ -153,10 +151,10 @@ func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) { if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 { sizeswg.Add(1) go func() { - var sizes types.Sizes - sizes, sizeserr = packagesdriver.GetSizesGolist(ctx, state.cfgInvocation(), cfg.gocmdRunner) - // types.SizesFor always returns nil or a *types.StdSizes. - response.dr.Sizes, _ = sizes.(*types.StdSizes) + compiler, arch, err := packagesdriver.GetSizesForArgsGolist(ctx, state.cfgInvocation(), cfg.gocmdRunner) + sizeserr = err + response.dr.Compiler = compiler + response.dr.Arch = arch sizeswg.Done() }() } @@ -210,62 +208,6 @@ extractQueries: } } - // Only use go/packages' overlay processing if we're using a Go version - // below 1.16. Otherwise, go list handles it. - if goVersion, err := state.getGoVersion(); err == nil && goVersion < 16 { - modifiedPkgs, needPkgs, err := state.processGolistOverlay(response) - if err != nil { - return nil, err - } - - var containsCandidates []string - if len(containFiles) > 0 { - containsCandidates = append(containsCandidates, modifiedPkgs...) - containsCandidates = append(containsCandidates, needPkgs...) - } - if err := state.addNeededOverlayPackages(response, needPkgs); err != nil { - return nil, err - } - // Check candidate packages for containFiles. - if len(containFiles) > 0 { - for _, id := range containsCandidates { - pkg, ok := response.seenPackages[id] - if !ok { - response.addPackage(&Package{ - ID: id, - Errors: []Error{{ - Kind: ListError, - Msg: fmt.Sprintf("package %s expected but not seen", id), - }}, - }) - continue - } - for _, f := range containFiles { - for _, g := range pkg.GoFiles { - if sameFile(f, g) { - response.addRoot(id) - } - } - } - } - } - // Add root for any package that matches a pattern. This applies only to - // packages that are modified by overlays, since they are not added as - // roots automatically. - for _, pattern := range restPatterns { - match := matchPattern(pattern) - for _, pkgID := range modifiedPkgs { - pkg, ok := response.seenPackages[pkgID] - if !ok { - continue - } - if match(pkg.PkgPath) { - response.addRoot(pkg.ID) - } - } - } - } - sizeswg.Wait() if sizeserr != nil { return nil, sizeserr @@ -273,24 +215,6 @@ extractQueries: return response.dr, nil } -func (state *golistState) addNeededOverlayPackages(response *responseDeduper, pkgs []string) error { - if len(pkgs) == 0 { - return nil - } - dr, err := state.createDriverResponse(pkgs...) - if err != nil { - return err - } - for _, pkg := range dr.Packages { - response.addPackage(pkg) - } - _, needPkgs, err := state.processGolistOverlay(response) - if err != nil { - return err - } - return state.addNeededOverlayPackages(response, needPkgs) -} - func (state *golistState) runContainsQueries(response *responseDeduper, queries []string) error { for _, query := range queries { // TODO(matloob): Do only one query per directory. @@ -1110,7 +1034,7 @@ func (state *golistState) writeOverlays() (filename string, cleanup func(), err if len(state.cfg.Overlay) == 0 { return "", func() {}, nil } - dir, err := ioutil.TempDir("", "gopackages-*") + dir, err := os.MkdirTemp("", "gopackages-*") if err != nil { return "", nil, err } @@ -1129,7 +1053,7 @@ func (state *golistState) writeOverlays() (filename string, cleanup func(), err // Create a unique filename for the overlaid files, to avoid // creating nested directories. noSeparator := strings.Join(strings.Split(filepath.ToSlash(k), "/"), "") - f, err := ioutil.TempFile(dir, fmt.Sprintf("*-%s", noSeparator)) + f, err := os.CreateTemp(dir, fmt.Sprintf("*-%s", noSeparator)) if err != nil { return "", func() {}, err } @@ -1147,7 +1071,7 @@ func (state *golistState) writeOverlays() (filename string, cleanup func(), err } // Write out the overlay file that contains the filepath mappings. filename = filepath.Join(dir, "overlay.json") - if err := ioutil.WriteFile(filename, b, 0665); err != nil { + if err := os.WriteFile(filename, b, 0665); err != nil { return "", func() {}, err } return filename, cleanup, nil diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go index 9576b472..d823c474 100644 --- a/vendor/golang.org/x/tools/go/packages/golist_overlay.go +++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go @@ -6,314 +6,11 @@ package packages import ( "encoding/json" - "fmt" - "go/parser" - "go/token" - "os" "path/filepath" - "regexp" - "sort" - "strconv" - "strings" "golang.org/x/tools/internal/gocommand" ) -// processGolistOverlay provides rudimentary support for adding -// files that don't exist on disk to an overlay. The results can be -// sometimes incorrect. -// TODO(matloob): Handle unsupported cases, including the following: -// - determining the correct package to add given a new import path -func (state *golistState) processGolistOverlay(response *responseDeduper) (modifiedPkgs, needPkgs []string, err error) { - havePkgs := make(map[string]string) // importPath -> non-test package ID - needPkgsSet := make(map[string]bool) - modifiedPkgsSet := make(map[string]bool) - - pkgOfDir := make(map[string][]*Package) - for _, pkg := range response.dr.Packages { - // This is an approximation of import path to id. This can be - // wrong for tests, vendored packages, and a number of other cases. - havePkgs[pkg.PkgPath] = pkg.ID - dir, err := commonDir(pkg.GoFiles) - if err != nil { - return nil, nil, err - } - if dir != "" { - pkgOfDir[dir] = append(pkgOfDir[dir], pkg) - } - } - - // If no new imports are added, it is safe to avoid loading any needPkgs. - // Otherwise, it's hard to tell which package is actually being loaded - // (due to vendoring) and whether any modified package will show up - // in the transitive set of dependencies (because new imports are added, - // potentially modifying the transitive set of dependencies). - var overlayAddsImports bool - - // If both a package and its test package are created by the overlay, we - // need the real package first. Process all non-test files before test - // files, and make the whole process deterministic while we're at it. - var overlayFiles []string - for opath := range state.cfg.Overlay { - overlayFiles = append(overlayFiles, opath) - } - sort.Slice(overlayFiles, func(i, j int) bool { - iTest := strings.HasSuffix(overlayFiles[i], "_test.go") - jTest := strings.HasSuffix(overlayFiles[j], "_test.go") - if iTest != jTest { - return !iTest // non-tests are before tests. - } - return overlayFiles[i] < overlayFiles[j] - }) - for _, opath := range overlayFiles { - contents := state.cfg.Overlay[opath] - base := filepath.Base(opath) - dir := filepath.Dir(opath) - var pkg *Package // if opath belongs to both a package and its test variant, this will be the test variant - var testVariantOf *Package // if opath is a test file, this is the package it is testing - var fileExists bool - isTestFile := strings.HasSuffix(opath, "_test.go") - pkgName, ok := extractPackageName(opath, contents) - if !ok { - // Don't bother adding a file that doesn't even have a parsable package statement - // to the overlay. - continue - } - // If all the overlay files belong to a different package, change the - // package name to that package. - maybeFixPackageName(pkgName, isTestFile, pkgOfDir[dir]) - nextPackage: - for _, p := range response.dr.Packages { - if pkgName != p.Name && p.ID != "command-line-arguments" { - continue - } - for _, f := range p.GoFiles { - if !sameFile(filepath.Dir(f), dir) { - continue - } - // Make sure to capture information on the package's test variant, if needed. - if isTestFile && !hasTestFiles(p) { - // TODO(matloob): Are there packages other than the 'production' variant - // of a package that this can match? This shouldn't match the test main package - // because the file is generated in another directory. - testVariantOf = p - continue nextPackage - } else if !isTestFile && hasTestFiles(p) { - // We're examining a test variant, but the overlaid file is - // a non-test file. Because the overlay implementation - // (currently) only adds a file to one package, skip this - // package, so that we can add the file to the production - // variant of the package. (https://golang.org/issue/36857 - // tracks handling overlays on both the production and test - // variant of a package). - continue nextPackage - } - if pkg != nil && p != pkg && pkg.PkgPath == p.PkgPath { - // We have already seen the production version of the - // for which p is a test variant. - if hasTestFiles(p) { - testVariantOf = pkg - } - } - pkg = p - if filepath.Base(f) == base { - fileExists = true - } - } - } - // The overlay could have included an entirely new package or an - // ad-hoc package. An ad-hoc package is one that we have manually - // constructed from inadequate `go list` results for a file= query. - // It will have the ID command-line-arguments. - if pkg == nil || pkg.ID == "command-line-arguments" { - // Try to find the module or gopath dir the file is contained in. - // Then for modules, add the module opath to the beginning. - pkgPath, ok, err := state.getPkgPath(dir) - if err != nil { - return nil, nil, err - } - if !ok { - break - } - var forTest string // only set for x tests - isXTest := strings.HasSuffix(pkgName, "_test") - if isXTest { - forTest = pkgPath - pkgPath += "_test" - } - id := pkgPath - if isTestFile { - if isXTest { - id = fmt.Sprintf("%s [%s.test]", pkgPath, forTest) - } else { - id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath) - } - } - if pkg != nil { - // TODO(rstambler): We should change the package's path and ID - // here. The only issue is that this messes with the roots. - } else { - // Try to reclaim a package with the same ID, if it exists in the response. - for _, p := range response.dr.Packages { - if reclaimPackage(p, id, opath, contents) { - pkg = p - break - } - } - // Otherwise, create a new package. - if pkg == nil { - pkg = &Package{ - PkgPath: pkgPath, - ID: id, - Name: pkgName, - Imports: make(map[string]*Package), - } - response.addPackage(pkg) - havePkgs[pkg.PkgPath] = id - // Add the production package's sources for a test variant. - if isTestFile && !isXTest && testVariantOf != nil { - pkg.GoFiles = append(pkg.GoFiles, testVariantOf.GoFiles...) - pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, testVariantOf.CompiledGoFiles...) - // Add the package under test and its imports to the test variant. - pkg.forTest = testVariantOf.PkgPath - for k, v := range testVariantOf.Imports { - pkg.Imports[k] = &Package{ID: v.ID} - } - } - if isXTest { - pkg.forTest = forTest - } - } - } - } - if !fileExists { - pkg.GoFiles = append(pkg.GoFiles, opath) - // TODO(matloob): Adding the file to CompiledGoFiles can exhibit the wrong behavior - // if the file will be ignored due to its build tags. - pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, opath) - modifiedPkgsSet[pkg.ID] = true - } - imports, err := extractImports(opath, contents) - if err != nil { - // Let the parser or type checker report errors later. - continue - } - for _, imp := range imports { - // TODO(rstambler): If the package is an x test and the import has - // a test variant, make sure to replace it. - if _, found := pkg.Imports[imp]; found { - continue - } - overlayAddsImports = true - id, ok := havePkgs[imp] - if !ok { - var err error - id, err = state.resolveImport(dir, imp) - if err != nil { - return nil, nil, err - } - } - pkg.Imports[imp] = &Package{ID: id} - // Add dependencies to the non-test variant version of this package as well. - if testVariantOf != nil { - testVariantOf.Imports[imp] = &Package{ID: id} - } - } - } - - // toPkgPath guesses the package path given the id. - toPkgPath := func(sourceDir, id string) (string, error) { - if i := strings.IndexByte(id, ' '); i >= 0 { - return state.resolveImport(sourceDir, id[:i]) - } - return state.resolveImport(sourceDir, id) - } - - // Now that new packages have been created, do another pass to determine - // the new set of missing packages. - for _, pkg := range response.dr.Packages { - for _, imp := range pkg.Imports { - if len(pkg.GoFiles) == 0 { - return nil, nil, fmt.Errorf("cannot resolve imports for package %q with no Go files", pkg.PkgPath) - } - pkgPath, err := toPkgPath(filepath.Dir(pkg.GoFiles[0]), imp.ID) - if err != nil { - return nil, nil, err - } - if _, ok := havePkgs[pkgPath]; !ok { - needPkgsSet[pkgPath] = true - } - } - } - - if overlayAddsImports { - needPkgs = make([]string, 0, len(needPkgsSet)) - for pkg := range needPkgsSet { - needPkgs = append(needPkgs, pkg) - } - } - modifiedPkgs = make([]string, 0, len(modifiedPkgsSet)) - for pkg := range modifiedPkgsSet { - modifiedPkgs = append(modifiedPkgs, pkg) - } - return modifiedPkgs, needPkgs, err -} - -// resolveImport finds the ID of a package given its import path. -// In particular, it will find the right vendored copy when in GOPATH mode. -func (state *golistState) resolveImport(sourceDir, importPath string) (string, error) { - env, err := state.getEnv() - if err != nil { - return "", err - } - if env["GOMOD"] != "" { - return importPath, nil - } - - searchDir := sourceDir - for { - vendorDir := filepath.Join(searchDir, "vendor") - exists, ok := state.vendorDirs[vendorDir] - if !ok { - info, err := os.Stat(vendorDir) - exists = err == nil && info.IsDir() - state.vendorDirs[vendorDir] = exists - } - - if exists { - vendoredPath := filepath.Join(vendorDir, importPath) - if info, err := os.Stat(vendoredPath); err == nil && info.IsDir() { - // We should probably check for .go files here, but shame on anyone who fools us. - path, ok, err := state.getPkgPath(vendoredPath) - if err != nil { - return "", err - } - if ok { - return path, nil - } - } - } - - // We know we've hit the top of the filesystem when we Dir / and get /, - // or C:\ and get C:\, etc. - next := filepath.Dir(searchDir) - if next == searchDir { - break - } - searchDir = next - } - return importPath, nil -} - -func hasTestFiles(p *Package) bool { - for _, f := range p.GoFiles { - if strings.HasSuffix(f, "_test.go") { - return true - } - } - return false -} - // determineRootDirs returns a mapping from absolute directories that could // contain code to their corresponding import path prefixes. func (state *golistState) determineRootDirs() (map[string]string, error) { @@ -384,192 +81,3 @@ func (state *golistState) determineRootDirsGOPATH() (map[string]string, error) { } return m, nil } - -func extractImports(filename string, contents []byte) ([]string, error) { - f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.ImportsOnly) // TODO(matloob): reuse fileset? - if err != nil { - return nil, err - } - var res []string - for _, imp := range f.Imports { - quotedPath := imp.Path.Value - path, err := strconv.Unquote(quotedPath) - if err != nil { - return nil, err - } - res = append(res, path) - } - return res, nil -} - -// reclaimPackage attempts to reuse a package that failed to load in an overlay. -// -// If the package has errors and has no Name, GoFiles, or Imports, -// then it's possible that it doesn't yet exist on disk. -func reclaimPackage(pkg *Package, id string, filename string, contents []byte) bool { - // TODO(rstambler): Check the message of the actual error? - // It differs between $GOPATH and module mode. - if pkg.ID != id { - return false - } - if len(pkg.Errors) != 1 { - return false - } - if pkg.Name != "" || pkg.ExportFile != "" { - return false - } - if len(pkg.GoFiles) > 0 || len(pkg.CompiledGoFiles) > 0 || len(pkg.OtherFiles) > 0 { - return false - } - if len(pkg.Imports) > 0 { - return false - } - pkgName, ok := extractPackageName(filename, contents) - if !ok { - return false - } - pkg.Name = pkgName - pkg.Errors = nil - return true -} - -func extractPackageName(filename string, contents []byte) (string, bool) { - // TODO(rstambler): Check the message of the actual error? - // It differs between $GOPATH and module mode. - f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.PackageClauseOnly) // TODO(matloob): reuse fileset? - if err != nil { - return "", false - } - return f.Name.Name, true -} - -// commonDir returns the directory that all files are in, "" if files is empty, -// or an error if they aren't in the same directory. -func commonDir(files []string) (string, error) { - seen := make(map[string]bool) - for _, f := range files { - seen[filepath.Dir(f)] = true - } - if len(seen) > 1 { - return "", fmt.Errorf("files (%v) are in more than one directory: %v", files, seen) - } - for k := range seen { - // seen has only one element; return it. - return k, nil - } - return "", nil // no files -} - -// It is possible that the files in the disk directory dir have a different package -// name from newName, which is deduced from the overlays. If they all have a different -// package name, and they all have the same package name, then that name becomes -// the package name. -// It returns true if it changes the package name, false otherwise. -func maybeFixPackageName(newName string, isTestFile bool, pkgsOfDir []*Package) { - names := make(map[string]int) - for _, p := range pkgsOfDir { - names[p.Name]++ - } - if len(names) != 1 { - // some files are in different packages - return - } - var oldName string - for k := range names { - oldName = k - } - if newName == oldName { - return - } - // We might have a case where all of the package names in the directory are - // the same, but the overlay file is for an x test, which belongs to its - // own package. If the x test does not yet exist on disk, we may not yet - // have its package name on disk, but we should not rename the packages. - // - // We use a heuristic to determine if this file belongs to an x test: - // The test file should have a package name whose package name has a _test - // suffix or looks like "newName_test". - maybeXTest := strings.HasPrefix(oldName+"_test", newName) || strings.HasSuffix(newName, "_test") - if isTestFile && maybeXTest { - return - } - for _, p := range pkgsOfDir { - p.Name = newName - } -} - -// This function is copy-pasted from -// https://github.com/golang/go/blob/9706f510a5e2754595d716bd64be8375997311fb/src/cmd/go/internal/search/search.go#L360. -// It should be deleted when we remove support for overlays from go/packages. -// -// NOTE: This does not handle any ./... or ./ style queries, as this function -// doesn't know the working directory. -// -// matchPattern(pattern)(name) reports whether -// name matches pattern. Pattern is a limited glob -// pattern in which '...' means 'any string' and there -// is no other special syntax. -// Unfortunately, there are two special cases. Quoting "go help packages": -// -// First, /... at the end of the pattern can match an empty string, -// so that net/... matches both net and packages in its subdirectories, like net/http. -// Second, any slash-separated pattern element containing a wildcard never -// participates in a match of the "vendor" element in the path of a vendored -// package, so that ./... does not match packages in subdirectories of -// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. -// Note, however, that a directory named vendor that itself contains code -// is not a vendored package: cmd/vendor would be a command named vendor, -// and the pattern cmd/... matches it. -func matchPattern(pattern string) func(name string) bool { - // Convert pattern to regular expression. - // The strategy for the trailing /... is to nest it in an explicit ? expression. - // The strategy for the vendor exclusion is to change the unmatchable - // vendor strings to a disallowed code point (vendorChar) and to use - // "(anything but that codepoint)*" as the implementation of the ... wildcard. - // This is a bit complicated but the obvious alternative, - // namely a hand-written search like in most shell glob matchers, - // is too easy to make accidentally exponential. - // Using package regexp guarantees linear-time matching. - - const vendorChar = "\x00" - - if strings.Contains(pattern, vendorChar) { - return func(name string) bool { return false } - } - - re := regexp.QuoteMeta(pattern) - re = replaceVendor(re, vendorChar) - switch { - case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`): - re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)` - case re == vendorChar+`/\.\.\.`: - re = `(/vendor|/` + vendorChar + `/\.\.\.)` - case strings.HasSuffix(re, `/\.\.\.`): - re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?` - } - re = strings.ReplaceAll(re, `\.\.\.`, `[^`+vendorChar+`]*`) - - reg := regexp.MustCompile(`^` + re + `$`) - - return func(name string) bool { - if strings.Contains(name, vendorChar) { - return false - } - return reg.MatchString(replaceVendor(name, vendorChar)) - } -} - -// replaceVendor returns the result of replacing -// non-trailing vendor path elements in x with repl. -func replaceVendor(x, repl string) string { - if !strings.Contains(x, "vendor") { - return x - } - elem := strings.Split(x, "/") - for i := 0; i < len(elem)-1; i++ { - if elem[i] == "vendor" { - elem[i] = repl - } - } - return strings.Join(elem, "/") -} diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go index da1a27ee..81e9e6a7 100644 --- a/vendor/golang.org/x/tools/go/packages/packages.go +++ b/vendor/golang.org/x/tools/go/packages/packages.go @@ -16,7 +16,6 @@ import ( "go/token" "go/types" "io" - "io/ioutil" "log" "os" "path/filepath" @@ -28,8 +27,8 @@ import ( "golang.org/x/tools/go/gcexportdata" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/packagesinternal" - "golang.org/x/tools/internal/typeparams" "golang.org/x/tools/internal/typesinternal" + "golang.org/x/tools/internal/versions" ) // A LoadMode controls the amount of detail to return when loading. @@ -220,8 +219,10 @@ type driverResponse struct { // lists of multiple drivers, go/packages will fall back to the next driver. NotHandled bool - // Sizes, if not nil, is the types.Sizes to use when type checking. - Sizes *types.StdSizes + // Compiler and Arch are the arguments pass of types.SizesFor + // to get a types.Sizes to use when type checking. + Compiler string + Arch string // Roots is the set of package IDs that make up the root packages. // We have to encode this separately because when we encode a single package @@ -257,31 +258,52 @@ type driverResponse struct { // proceeding with further analysis. The PrintErrors function is // provided for convenient display of all errors. func Load(cfg *Config, patterns ...string) ([]*Package, error) { - l := newLoader(cfg) - response, err := defaultDriver(&l.Config, patterns...) + ld := newLoader(cfg) + response, external, err := defaultDriver(&ld.Config, patterns...) if err != nil { return nil, err } - l.sizes = response.Sizes - return l.refine(response) + + ld.sizes = types.SizesFor(response.Compiler, response.Arch) + if ld.sizes == nil && ld.Config.Mode&(NeedTypes|NeedTypesSizes|NeedTypesInfo) != 0 { + // Type size information is needed but unavailable. + if external { + // An external driver may fail to populate the Compiler/GOARCH fields, + // especially since they are relatively new (see #63700). + // Provide a sensible fallback in this case. + ld.sizes = types.SizesFor("gc", runtime.GOARCH) + if ld.sizes == nil { // gccgo-only arch + ld.sizes = types.SizesFor("gc", "amd64") + } + } else { + // Go list should never fail to deliver accurate size information. + // Reject the whole Load since the error is the same for every package. + return nil, fmt.Errorf("can't determine type sizes for compiler %q on GOARCH %q", + response.Compiler, response.Arch) + } + } + + return ld.refine(response) } // defaultDriver is a driver that implements go/packages' fallback behavior. // It will try to request to an external driver, if one exists. If there's // no external driver, or the driver returns a response with NotHandled set, // defaultDriver will fall back to the go list driver. -func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) { - driver := findExternalDriver(cfg) - if driver == nil { - driver = goListDriver +// The boolean result indicates that an external driver handled the request. +func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, bool, error) { + if driver := findExternalDriver(cfg); driver != nil { + response, err := driver(cfg, patterns...) + if err != nil { + return nil, false, err + } else if !response.NotHandled { + return response, true, nil + } + // (fall through) } - response, err := driver(cfg, patterns...) - if err != nil { - return response, err - } else if response.NotHandled { - return goListDriver(cfg, patterns...) - } - return response, nil + + response, err := goListDriver(cfg, patterns...) + return response, false, err } // A Package describes a loaded Go package. @@ -410,12 +432,6 @@ func init() { packagesinternal.GetDepsErrors = func(p interface{}) []*packagesinternal.PackageError { return p.(*Package).depsErrors } - packagesinternal.GetGoCmdRunner = func(config interface{}) *gocommand.Runner { - return config.(*Config).gocmdRunner - } - packagesinternal.SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) { - config.(*Config).gocmdRunner = runner - } packagesinternal.SetModFile = func(config interface{}, value string) { config.(*Config).modFile = value } @@ -552,7 +568,7 @@ type loaderPackage struct { type loader struct { pkgs map[string]*loaderPackage Config - sizes types.Sizes + sizes types.Sizes // non-nil if needed by mode parseCache map[string]*parseValue parseCacheMu sync.Mutex exportMu sync.Mutex // enforces mutual exclusion of exportdata operations @@ -677,39 +693,38 @@ func (ld *loader) refine(response *driverResponse) ([]*Package, error) { } } - // Materialize the import graph. + if ld.Mode&NeedImports != 0 { + // Materialize the import graph. - const ( - white = 0 // new - grey = 1 // in progress - black = 2 // complete - ) + const ( + white = 0 // new + grey = 1 // in progress + black = 2 // complete + ) - // visit traverses the import graph, depth-first, - // and materializes the graph as Packages.Imports. - // - // Valid imports are saved in the Packages.Import map. - // Invalid imports (cycles and missing nodes) are saved in the importErrors map. - // Thus, even in the presence of both kinds of errors, the Import graph remains a DAG. - // - // visit returns whether the package needs src or has a transitive - // dependency on a package that does. These are the only packages - // for which we load source code. - var stack []*loaderPackage - var visit func(lpkg *loaderPackage) bool - var srcPkgs []*loaderPackage - visit = func(lpkg *loaderPackage) bool { - switch lpkg.color { - case black: - return lpkg.needsrc - case grey: - panic("internal error: grey node") - } - lpkg.color = grey - stack = append(stack, lpkg) // push - stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports - // If NeedImports isn't set, the imports fields will all be zeroed out. - if ld.Mode&NeedImports != 0 { + // visit traverses the import graph, depth-first, + // and materializes the graph as Packages.Imports. + // + // Valid imports are saved in the Packages.Import map. + // Invalid imports (cycles and missing nodes) are saved in the importErrors map. + // Thus, even in the presence of both kinds of errors, + // the Import graph remains a DAG. + // + // visit returns whether the package needs src or has a transitive + // dependency on a package that does. These are the only packages + // for which we load source code. + var stack []*loaderPackage + var visit func(lpkg *loaderPackage) bool + visit = func(lpkg *loaderPackage) bool { + switch lpkg.color { + case black: + return lpkg.needsrc + case grey: + panic("internal error: grey node") + } + lpkg.color = grey + stack = append(stack, lpkg) // push + stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports lpkg.Imports = make(map[string]*Package, len(stubs)) for importPath, ipkg := range stubs { var importErr error @@ -733,40 +748,39 @@ func (ld *loader) refine(response *driverResponse) ([]*Package, error) { } lpkg.Imports[importPath] = imp.Package } - } - if lpkg.needsrc { - srcPkgs = append(srcPkgs, lpkg) - } - if ld.Mode&NeedTypesSizes != 0 { - lpkg.TypesSizes = ld.sizes - } - stack = stack[:len(stack)-1] // pop - lpkg.color = black - return lpkg.needsrc - } + // Complete type information is required for the + // immediate dependencies of each source package. + if lpkg.needsrc && ld.Mode&NeedTypes != 0 { + for _, ipkg := range lpkg.Imports { + ld.pkgs[ipkg.ID].needtypes = true + } + } - if ld.Mode&NeedImports == 0 { - // We do this to drop the stub import packages that we are not even going to try to resolve. - for _, lpkg := range initial { - lpkg.Imports = nil + // NeedTypeSizes causes TypeSizes to be set even + // on packages for which types aren't needed. + if ld.Mode&NeedTypesSizes != 0 { + lpkg.TypesSizes = ld.sizes + } + stack = stack[:len(stack)-1] // pop + lpkg.color = black + + return lpkg.needsrc } - } else { + // For each initial package, create its import DAG. for _, lpkg := range initial { visit(lpkg) } - } - if ld.Mode&NeedImports != 0 && ld.Mode&NeedTypes != 0 { - for _, lpkg := range srcPkgs { - // Complete type information is required for the - // immediate dependencies of each source package. - for _, ipkg := range lpkg.Imports { - imp := ld.pkgs[ipkg.ID] - imp.needtypes = true - } + + } else { + // !NeedImports: drop the stub (ID-only) import packages + // that we are not even going to try to resolve. + for _, lpkg := range initial { + lpkg.Imports = nil } } + // Load type data and syntax if needed, starting at // the initial packages (roots of the import DAG). if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 { @@ -1000,10 +1014,11 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { Defs: make(map[*ast.Ident]types.Object), Uses: make(map[*ast.Ident]types.Object), Implicits: make(map[ast.Node]types.Object), + Instances: make(map[*ast.Ident]types.Instance), Scopes: make(map[ast.Node]*types.Scope), Selections: make(map[*ast.SelectorExpr]*types.Selection), } - typeparams.InitInstanceInfo(lpkg.TypesInfo) + versions.InitFileVersions(lpkg.TypesInfo) lpkg.TypesSizes = ld.sizes importer := importerFunc(func(path string) (*types.Package, error) { @@ -1041,7 +1056,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { IgnoreFuncBodies: ld.Mode&NeedDeps == 0 && !lpkg.initial, Error: appendError, - Sizes: ld.sizes, + Sizes: ld.sizes, // may be nil } if lpkg.Module != nil && lpkg.Module.GoVersion != "" { typesinternal.SetGoVersion(tc, "go"+lpkg.Module.GoVersion) @@ -1125,7 +1140,7 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) { var err error if src == nil { ioLimit <- true // wait - src, err = ioutil.ReadFile(filename) + src, err = os.ReadFile(filename) <-ioLimit // signal } if err != nil { diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go index c725d839..11d5c8c3 100644 --- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -26,10 +26,8 @@ package objectpath import ( "fmt" "go/types" - "sort" "strconv" "strings" - _ "unsafe" "golang.org/x/tools/internal/typeparams" ) @@ -122,17 +120,7 @@ func For(obj types.Object) (Path, error) { // An Encoder amortizes the cost of encoding the paths of multiple objects. // The zero value of an Encoder is ready to use. type Encoder struct { - scopeMemo map[*types.Scope][]types.Object // memoization of scopeObjects - namedMethodsMemo map[*types.Named][]*types.Func // memoization of namedMethods() - skipMethodSorting bool -} - -// Exposed to gopls via golang.org/x/tools/internal/typesinternal -// TODO(golang/go#61443): eliminate this parameter one way or the other. -// -//go:linkname skipMethodSorting -func skipMethodSorting(enc *Encoder) { - enc.skipMethodSorting = true + scopeMemo map[*types.Scope][]types.Object // memoization of scopeObjects } // For returns the path to an object relative to its package, @@ -235,7 +223,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { // Reject obviously non-viable cases. switch obj := obj.(type) { case *types.TypeName: - if _, ok := obj.Type().(*typeparams.TypeParam); !ok { + if _, ok := obj.Type().(*types.TypeParam); !ok { // With the exception of type parameters, only package-level type names // have a path. return "", fmt.Errorf("no path for %v", obj) @@ -295,7 +283,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { } } else { if named, _ := T.(*types.Named); named != nil { - if r := findTypeParam(obj, typeparams.ForNamed(named), path, nil); r != nil { + if r := findTypeParam(obj, named.TypeParams(), path, nil); r != nil { // generic named type return Path(r), nil } @@ -324,31 +312,18 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { // Inspect declared methods of defined types. if T, ok := o.Type().(*types.Named); ok { path = append(path, opType) - if !enc.skipMethodSorting { - // Note that method index here is always with respect - // to canonical ordering of methods, regardless of how - // they appear in the underlying type. - for i, m := range enc.namedMethods(T) { - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return Path(path2), nil // found declared method - } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { - return Path(r), nil - } + // The method index here is always with respect + // to the underlying go/types data structures, + // which ultimately derives from source order + // and must be preserved by export data. + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + path2 := appendOpArg(path, opMethod, i) + if m == obj { + return Path(path2), nil // found declared method } - } else { - // This branch must match the logic in the branch above, using go/types - // APIs without sorting. - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return Path(path2), nil // found declared method - } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { - return Path(r), nil - } + if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { + return Path(r), nil } } } @@ -444,22 +419,13 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) { path = append(path, name...) path = append(path, opType) - if !enc.skipMethodSorting { - for i, m := range enc.namedMethods(named) { - if m == meth { - path = appendOpArg(path, opMethod, i) - return Path(path), true - } - } - } else { - // This branch must match the logic of the branch above, using go/types - // APIs without sorting. - for i := 0; i < named.NumMethods(); i++ { - m := named.Method(i) - if m == meth { - path = appendOpArg(path, opMethod, i) - return Path(path), true - } + // Method indices are w.r.t. the go/types data structures, + // ultimately deriving from source order, + // which is preserved by export data. + for i := 0; i < named.NumMethods(); i++ { + if named.Method(i) == meth { + path = appendOpArg(path, opMethod, i) + return Path(path), true } } @@ -496,7 +462,7 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName] } return find(obj, T.Elem(), append(path, opElem), seen) case *types.Signature: - if r := findTypeParam(obj, typeparams.ForSignature(T), path, seen); r != nil { + if r := findTypeParam(obj, T.TypeParams(), path, seen); r != nil { return r } if r := find(obj, T.Params(), append(path, opParams), seen); r != nil { @@ -539,7 +505,7 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName] } } return nil - case *typeparams.TypeParam: + case *types.TypeParam: name := T.Obj() if name == obj { return append(path, opObj) @@ -559,7 +525,7 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName] panic(T) } -func findTypeParam(obj types.Object, list *typeparams.TypeParamList, path []byte, seen map[*types.TypeName]bool) []byte { +func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, seen map[*types.TypeName]bool) []byte { for i := 0; i < list.Len(); i++ { tparam := list.At(i) path2 := appendOpArg(path, opTypeParam, i) @@ -572,17 +538,11 @@ func findTypeParam(obj types.Object, list *typeparams.TypeParamList, path []byte // Object returns the object denoted by path p within the package pkg. func Object(pkg *types.Package, p Path) (types.Object, error) { - return object(pkg, p, false) -} - -// Note: the skipMethodSorting parameter must match the value of -// Encoder.skipMethodSorting used during encoding. -func object(pkg *types.Package, p Path, skipMethodSorting bool) (types.Object, error) { - if p == "" { + pathstr := string(p) + if pathstr == "" { return nil, fmt.Errorf("empty path") } - pathstr := string(p) var pkgobj, suffix string if dot := strings.IndexByte(pathstr, opType); dot < 0 { pkgobj = pathstr @@ -602,7 +562,7 @@ func object(pkg *types.Package, p Path, skipMethodSorting bool) (types.Object, e } // abstraction of *types.{Named,Signature} type hasTypeParams interface { - TypeParams() *typeparams.TypeParamList + TypeParams() *types.TypeParamList } // abstraction of *types.{Named,TypeParam} type hasObj interface { @@ -704,7 +664,7 @@ func object(pkg *types.Package, p Path, skipMethodSorting bool) (types.Object, e t = tparams.At(index) case opConstraint: - tparam, ok := t.(*typeparams.TypeParam) + tparam, ok := t.(*types.TypeParam) if !ok { return nil, fmt.Errorf("cannot apply %q to %s (got %T, want type parameter)", code, t, t) } @@ -744,12 +704,7 @@ func object(pkg *types.Package, p Path, skipMethodSorting bool) (types.Object, e if index >= t.NumMethods() { return nil, fmt.Errorf("method index %d out of range [0-%d)", index, t.NumMethods()) } - if skipMethodSorting { - obj = t.Method(index) - } else { - methods := namedMethods(t) // (unmemoized) - obj = methods[index] // Id-ordered - } + obj = t.Method(index) default: return nil, fmt.Errorf("cannot apply %q to %s (got %T, want interface or named)", code, t, t) @@ -776,33 +731,6 @@ func object(pkg *types.Package, p Path, skipMethodSorting bool) (types.Object, e return obj, nil // success } -// namedMethods returns the methods of a Named type in ascending Id order. -func namedMethods(named *types.Named) []*types.Func { - methods := make([]*types.Func, named.NumMethods()) - for i := range methods { - methods[i] = named.Method(i) - } - sort.Slice(methods, func(i, j int) bool { - return methods[i].Id() < methods[j].Id() - }) - return methods -} - -// namedMethods is a memoization of the namedMethods function. Callers must not modify the result. -func (enc *Encoder) namedMethods(named *types.Named) []*types.Func { - m := enc.namedMethodsMemo - if m == nil { - m = make(map[*types.Named][]*types.Func) - enc.namedMethodsMemo = m - } - methods, ok := m[named] - if !ok { - methods = namedMethods(named) // allocates and sorts - m[named] = methods - } - return methods -} - // scopeObjects is a memoization of scope objects. // Callers must not modify the result. func (enc *Encoder) scopeObjects(scope *types.Scope) []types.Object { diff --git a/vendor/golang.org/x/tools/imports/forward.go b/vendor/golang.org/x/tools/imports/forward.go index d2547c74..cb6db889 100644 --- a/vendor/golang.org/x/tools/imports/forward.go +++ b/vendor/golang.org/x/tools/imports/forward.go @@ -7,8 +7,8 @@ package imports // import "golang.org/x/tools/imports" import ( - "io/ioutil" "log" + "os" "golang.org/x/tools/internal/gocommand" intimp "golang.org/x/tools/internal/imports" @@ -44,7 +44,7 @@ var LocalPrefix string func Process(filename string, src []byte, opt *Options) ([]byte, error) { var err error if src == nil { - src, err = ioutil.ReadFile(filename) + src, err = os.ReadFile(filename) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/tools/internal/event/keys/util.go b/vendor/golang.org/x/tools/internal/event/keys/util.go new file mode 100644 index 00000000..c0e8e731 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/keys/util.go @@ -0,0 +1,21 @@ +// Copyright 2023 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 keys + +import ( + "sort" + "strings" +) + +// Join returns a canonical join of the keys in S: +// a sorted comma-separated string list. +func Join[S ~[]T, T ~string](s S) string { + strs := make([]string, 0, len(s)) + for _, v := range s { + strs = append(strs, string(v)) + } + sort.Strings(strs) + return strings.Join(strs, ",") +} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go deleted file mode 100644 index c40c7e93..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2016 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 fastwalk provides a faster version of [filepath.Walk] for file system -// scanning tools. -package fastwalk - -import ( - "errors" - "os" - "path/filepath" - "runtime" - "sync" -) - -// ErrTraverseLink is used as a return value from WalkFuncs to indicate that the -// symlink named in the call may be traversed. -var ErrTraverseLink = errors.New("fastwalk: traverse symlink, assuming target is a directory") - -// ErrSkipFiles is a used as a return value from WalkFuncs to indicate that the -// callback should not be called for any other files in the current directory. -// Child directories will still be traversed. -var ErrSkipFiles = errors.New("fastwalk: skip remaining files in directory") - -// Walk is a faster implementation of [filepath.Walk]. -// -// [filepath.Walk]'s design necessarily calls [os.Lstat] on each file, -// even if the caller needs less info. -// Many tools need only the type of each file. -// On some platforms, this information is provided directly by the readdir -// system call, avoiding the need to stat each file individually. -// fastwalk_unix.go contains a fork of the syscall routines. -// -// See golang.org/issue/16399. -// -// Walk walks the file tree rooted at root, calling walkFn for -// each file or directory in the tree, including root. -// -// If Walk returns [filepath.SkipDir], the directory is skipped. -// -// Unlike [filepath.Walk]: -// - file stat calls must be done by the user. -// The only provided metadata is the file type, which does not include -// any permission bits. -// - multiple goroutines stat the filesystem concurrently. The provided -// walkFn must be safe for concurrent use. -// - Walk can follow symlinks if walkFn returns the TraverseLink -// sentinel error. It is the walkFn's responsibility to prevent -// Walk from going into symlink cycles. -func Walk(root string, walkFn func(path string, typ os.FileMode) error) error { - // TODO(bradfitz): make numWorkers configurable? We used a - // minimum of 4 to give the kernel more info about multiple - // things we want, in hopes its I/O scheduling can take - // advantage of that. Hopefully most are in cache. Maybe 4 is - // even too low of a minimum. Profile more. - numWorkers := 4 - if n := runtime.NumCPU(); n > numWorkers { - numWorkers = n - } - - // Make sure to wait for all workers to finish, otherwise - // walkFn could still be called after returning. This Wait call - // runs after close(e.donec) below. - var wg sync.WaitGroup - defer wg.Wait() - - w := &walker{ - fn: walkFn, - enqueuec: make(chan walkItem, numWorkers), // buffered for performance - workc: make(chan walkItem, numWorkers), // buffered for performance - donec: make(chan struct{}), - - // buffered for correctness & not leaking goroutines: - resc: make(chan error, numWorkers), - } - defer close(w.donec) - - for i := 0; i < numWorkers; i++ { - wg.Add(1) - go w.doWork(&wg) - } - todo := []walkItem{{dir: root}} - out := 0 - for { - workc := w.workc - var workItem walkItem - if len(todo) == 0 { - workc = nil - } else { - workItem = todo[len(todo)-1] - } - select { - case workc <- workItem: - todo = todo[:len(todo)-1] - out++ - case it := <-w.enqueuec: - todo = append(todo, it) - case err := <-w.resc: - out-- - if err != nil { - return err - } - if out == 0 && len(todo) == 0 { - // It's safe to quit here, as long as the buffered - // enqueue channel isn't also readable, which might - // happen if the worker sends both another unit of - // work and its result before the other select was - // scheduled and both w.resc and w.enqueuec were - // readable. - select { - case it := <-w.enqueuec: - todo = append(todo, it) - default: - return nil - } - } - } - } -} - -// doWork reads directories as instructed (via workc) and runs the -// user's callback function. -func (w *walker) doWork(wg *sync.WaitGroup) { - defer wg.Done() - for { - select { - case <-w.donec: - return - case it := <-w.workc: - select { - case <-w.donec: - return - case w.resc <- w.walk(it.dir, !it.callbackDone): - } - } - } -} - -type walker struct { - fn func(path string, typ os.FileMode) error - - donec chan struct{} // closed on fastWalk's return - workc chan walkItem // to workers - enqueuec chan walkItem // from workers - resc chan error // from workers -} - -type walkItem struct { - dir string - callbackDone bool // callback already called; don't do it again -} - -func (w *walker) enqueue(it walkItem) { - select { - case w.enqueuec <- it: - case <-w.donec: - } -} - -func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error { - joined := dirName + string(os.PathSeparator) + baseName - if typ == os.ModeDir { - w.enqueue(walkItem{dir: joined}) - return nil - } - - err := w.fn(joined, typ) - if typ == os.ModeSymlink { - if err == ErrTraverseLink { - // Set callbackDone so we don't call it twice for both the - // symlink-as-symlink and the symlink-as-directory later: - w.enqueue(walkItem{dir: joined, callbackDone: true}) - return nil - } - if err == filepath.SkipDir { - // Permit SkipDir on symlinks too. - return nil - } - } - return err -} - -func (w *walker) walk(root string, runUserCallback bool) error { - if runUserCallback { - err := w.fn(root, os.ModeDir) - if err == filepath.SkipDir { - return nil - } - if err != nil { - return err - } - } - - return readDir(root, w.onDirEnt) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_darwin.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_darwin.go deleted file mode 100644 index 0ca55e0d..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_darwin.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2022 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. - -//go:build darwin && cgo -// +build darwin,cgo - -package fastwalk - -/* -#include - -// fastwalk_readdir_r wraps readdir_r so that we don't have to pass a dirent** -// result pointer which triggers CGO's "Go pointer to Go pointer" check unless -// we allocat the result dirent* with malloc. -// -// fastwalk_readdir_r returns 0 on success, -1 upon reaching the end of the -// directory, or a positive error number to indicate failure. -static int fastwalk_readdir_r(DIR *fd, struct dirent *entry) { - struct dirent *result; - int ret = readdir_r(fd, entry, &result); - if (ret == 0 && result == NULL) { - ret = -1; // EOF - } - return ret; -} -*/ -import "C" - -import ( - "os" - "syscall" - "unsafe" -) - -func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { - fd, err := openDir(dirName) - if err != nil { - return &os.PathError{Op: "opendir", Path: dirName, Err: err} - } - defer C.closedir(fd) - - skipFiles := false - var dirent syscall.Dirent - for { - ret := int(C.fastwalk_readdir_r(fd, (*C.struct_dirent)(unsafe.Pointer(&dirent)))) - if ret != 0 { - if ret == -1 { - break // EOF - } - if ret == int(syscall.EINTR) { - continue - } - return &os.PathError{Op: "readdir", Path: dirName, Err: syscall.Errno(ret)} - } - if dirent.Ino == 0 { - continue - } - typ := dtToType(dirent.Type) - if skipFiles && typ.IsRegular() { - continue - } - name := (*[len(syscall.Dirent{}.Name)]byte)(unsafe.Pointer(&dirent.Name))[:] - name = name[:dirent.Namlen] - for i, c := range name { - if c == 0 { - name = name[:i] - break - } - } - // Check for useless names before allocating a string. - if string(name) == "." || string(name) == ".." { - continue - } - if err := fn(dirName, string(name), typ); err != nil { - if err != ErrSkipFiles { - return err - } - skipFiles = true - } - } - - return nil -} - -func dtToType(typ uint8) os.FileMode { - switch typ { - case syscall.DT_BLK: - return os.ModeDevice - case syscall.DT_CHR: - return os.ModeDevice | os.ModeCharDevice - case syscall.DT_DIR: - return os.ModeDir - case syscall.DT_FIFO: - return os.ModeNamedPipe - case syscall.DT_LNK: - return os.ModeSymlink - case syscall.DT_REG: - return 0 - case syscall.DT_SOCK: - return os.ModeSocket - } - return ^os.FileMode(0) -} - -// openDir wraps opendir(3) and handles any EINTR errors. The returned *DIR -// needs to be closed with closedir(3). -func openDir(path string) (*C.DIR, error) { - name, err := syscall.BytePtrFromString(path) - if err != nil { - return nil, err - } - for { - fd, err := C.opendir((*C.char)(unsafe.Pointer(name))) - if err != syscall.EINTR { - return fd, err - } - } -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go deleted file mode 100644 index d58595db..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 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. - -//go:build freebsd || openbsd || netbsd -// +build freebsd openbsd netbsd - -package fastwalk - -import "syscall" - -func direntInode(dirent *syscall.Dirent) uint64 { - return uint64(dirent.Fileno) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go deleted file mode 100644 index d3922890..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 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. - -//go:build (linux || (darwin && !cgo)) && !appengine -// +build linux darwin,!cgo -// +build !appengine - -package fastwalk - -import "syscall" - -func direntInode(dirent *syscall.Dirent) uint64 { - return dirent.Ino -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go deleted file mode 100644 index 38a4db6a..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go +++ /dev/null @@ -1,14 +0,0 @@ -// 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 file. - -//go:build (darwin && !cgo) || freebsd || openbsd || netbsd -// +build darwin,!cgo freebsd openbsd netbsd - -package fastwalk - -import "syscall" - -func direntNamlen(dirent *syscall.Dirent) uint64 { - return uint64(dirent.Namlen) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go deleted file mode 100644 index c82e57df..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go +++ /dev/null @@ -1,29 +0,0 @@ -// 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 file. - -//go:build linux && !appengine -// +build linux,!appengine - -package fastwalk - -import ( - "bytes" - "syscall" - "unsafe" -) - -func direntNamlen(dirent *syscall.Dirent) uint64 { - const fixedHdr = uint16(unsafe.Offsetof(syscall.Dirent{}.Name)) - nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0])) - const nameBufLen = uint16(len(nameBuf)) - limit := dirent.Reclen - fixedHdr - if limit > nameBufLen { - limit = nameBufLen - } - nameLen := bytes.IndexByte(nameBuf[:limit], 0) - if nameLen < 0 { - panic("failed to find terminating 0 byte in dirent") - } - return uint64(nameLen) -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go deleted file mode 100644 index 085d3116..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2016 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. - -//go:build appengine || (!linux && !darwin && !freebsd && !openbsd && !netbsd) -// +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd - -package fastwalk - -import ( - "io/ioutil" - "os" -) - -// readDir calls fn for each directory entry in dirName. -// It does not descend into directories or follow symlinks. -// If fn returns a non-nil error, readDir returns with that error -// immediately. -func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { - fis, err := ioutil.ReadDir(dirName) - if err != nil { - return err - } - skipFiles := false - for _, fi := range fis { - if fi.Mode().IsRegular() && skipFiles { - continue - } - if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil { - if err == ErrSkipFiles { - skipFiles = true - continue - } - return err - } - } - return nil -} diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go deleted file mode 100644 index f12f1a73..00000000 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2016 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. - -//go:build (linux || freebsd || openbsd || netbsd || (darwin && !cgo)) && !appengine -// +build linux freebsd openbsd netbsd darwin,!cgo -// +build !appengine - -package fastwalk - -import ( - "fmt" - "os" - "syscall" - "unsafe" -) - -const blockSize = 8 << 10 - -// unknownFileMode is a sentinel (and bogus) os.FileMode -// value used to represent a syscall.DT_UNKNOWN Dirent.Type. -const unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice - -func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { - fd, err := open(dirName, 0, 0) - if err != nil { - return &os.PathError{Op: "open", Path: dirName, Err: err} - } - defer syscall.Close(fd) - - // The buffer must be at least a block long. - buf := make([]byte, blockSize) // stack-allocated; doesn't escape - bufp := 0 // starting read position in buf - nbuf := 0 // end valid data in buf - skipFiles := false - for { - if bufp >= nbuf { - bufp = 0 - nbuf, err = readDirent(fd, buf) - if err != nil { - return os.NewSyscallError("readdirent", err) - } - if nbuf <= 0 { - return nil - } - } - consumed, name, typ := parseDirEnt(buf[bufp:nbuf]) - bufp += consumed - if name == "" || name == "." || name == ".." { - continue - } - // Fallback for filesystems (like old XFS) that don't - // support Dirent.Type and have DT_UNKNOWN (0) there - // instead. - if typ == unknownFileMode { - fi, err := os.Lstat(dirName + "/" + name) - if err != nil { - // It got deleted in the meantime. - if os.IsNotExist(err) { - continue - } - return err - } - typ = fi.Mode() & os.ModeType - } - if skipFiles && typ.IsRegular() { - continue - } - if err := fn(dirName, name, typ); err != nil { - if err == ErrSkipFiles { - skipFiles = true - continue - } - return err - } - } -} - -func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) { - // golang.org/issue/37269 - dirent := &syscall.Dirent{} - copy((*[unsafe.Sizeof(syscall.Dirent{})]byte)(unsafe.Pointer(dirent))[:], buf) - if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v { - panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v)) - } - if len(buf) < int(dirent.Reclen) { - panic(fmt.Sprintf("buf size %d < record length %d", len(buf), dirent.Reclen)) - } - consumed = int(dirent.Reclen) - if direntInode(dirent) == 0 { // File absent in directory. - return - } - switch dirent.Type { - case syscall.DT_REG: - typ = 0 - case syscall.DT_DIR: - typ = os.ModeDir - case syscall.DT_LNK: - typ = os.ModeSymlink - case syscall.DT_BLK: - typ = os.ModeDevice - case syscall.DT_FIFO: - typ = os.ModeNamedPipe - case syscall.DT_SOCK: - typ = os.ModeSocket - case syscall.DT_UNKNOWN: - typ = unknownFileMode - default: - // Skip weird things. - // It's probably a DT_WHT (http://lwn.net/Articles/325369/) - // or something. Revisit if/when this package is moved outside - // of goimports. goimports only cares about regular files, - // symlinks, and directories. - return - } - - nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0])) - nameLen := direntNamlen(dirent) - - // Special cases for common things: - if nameLen == 1 && nameBuf[0] == '.' { - name = "." - } else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' { - name = ".." - } else { - name = string(nameBuf[:nameLen]) - } - return -} - -// According to https://golang.org/doc/go1.14#runtime -// A consequence of the implementation of preemption is that on Unix systems, including Linux and macOS -// systems, programs built with Go 1.14 will receive more signals than programs built with earlier releases. -// -// This causes syscall.Open and syscall.ReadDirent sometimes fail with EINTR errors. -// We need to retry in this case. -func open(path string, mode int, perm uint32) (fd int, err error) { - for { - fd, err := syscall.Open(path, mode, perm) - if err != syscall.EINTR { - return fd, err - } - } -} - -func readDirent(fd int, buf []byte) (n int, err error) { - for { - nbuf, err := syscall.ReadDirent(fd, buf) - if err != syscall.EINTR { - return nbuf, err - } - } -} diff --git a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go index b1223713..2d078ccb 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go @@ -29,7 +29,6 @@ import ( "go/token" "go/types" "io" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -221,7 +220,7 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func switch hdr { case "$$B\n": var data []byte - data, err = ioutil.ReadAll(buf) + data, err = io.ReadAll(buf) if err != nil { break } diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index 6103dd71..2ee8c701 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -24,7 +24,6 @@ import ( "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/internal/tokeninternal" - "golang.org/x/tools/internal/typeparams" ) // IExportShallow encodes "shallow" export data for the specified package. @@ -481,7 +480,7 @@ func (p *iexporter) doDecl(obj types.Object) { } // Function. - if typeparams.ForSignature(sig).Len() == 0 { + if sig.TypeParams().Len() == 0 { w.tag('F') } else { w.tag('G') @@ -494,7 +493,7 @@ func (p *iexporter) doDecl(obj types.Object) { // // While importing the type parameters, tparamList computes and records // their export name, so that it can be later used when writing the index. - if tparams := typeparams.ForSignature(sig); tparams.Len() > 0 { + if tparams := sig.TypeParams(); tparams.Len() > 0 { w.tparamList(obj.Name(), tparams, obj.Pkg()) } w.signature(sig) @@ -507,14 +506,14 @@ func (p *iexporter) doDecl(obj types.Object) { case *types.TypeName: t := obj.Type() - if tparam, ok := t.(*typeparams.TypeParam); ok { + if tparam, ok := t.(*types.TypeParam); ok { w.tag('P') w.pos(obj.Pos()) constraint := tparam.Constraint() if p.version >= iexportVersionGo1_18 { implicit := false if iface, _ := constraint.(*types.Interface); iface != nil { - implicit = typeparams.IsImplicit(iface) + implicit = iface.IsImplicit() } w.bool(implicit) } @@ -535,17 +534,17 @@ func (p *iexporter) doDecl(obj types.Object) { panic(internalErrorf("%s is not a defined type", t)) } - if typeparams.ForNamed(named).Len() == 0 { + if named.TypeParams().Len() == 0 { w.tag('T') } else { w.tag('U') } w.pos(obj.Pos()) - if typeparams.ForNamed(named).Len() > 0 { + if named.TypeParams().Len() > 0 { // While importing the type parameters, tparamList computes and records // their export name, so that it can be later used when writing the index. - w.tparamList(obj.Name(), typeparams.ForNamed(named), obj.Pkg()) + w.tparamList(obj.Name(), named.TypeParams(), obj.Pkg()) } underlying := obj.Type().Underlying() @@ -565,7 +564,7 @@ func (p *iexporter) doDecl(obj types.Object) { // Receiver type parameters are type arguments of the receiver type, so // their name must be qualified before exporting recv. - if rparams := typeparams.RecvTypeParams(sig); rparams.Len() > 0 { + if rparams := sig.RecvTypeParams(); rparams.Len() > 0 { prefix := obj.Name() + "." + m.Name() for i := 0; i < rparams.Len(); i++ { rparam := rparams.At(i) @@ -740,19 +739,19 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { } switch t := t.(type) { case *types.Named: - if targs := typeparams.NamedTypeArgs(t); targs.Len() > 0 { + if targs := t.TypeArgs(); targs.Len() > 0 { w.startType(instanceType) // TODO(rfindley): investigate if this position is correct, and if it // matters. w.pos(t.Obj().Pos()) w.typeList(targs, pkg) - w.typ(typeparams.NamedTypeOrigin(t), pkg) + w.typ(t.Origin(), pkg) return } w.startType(definedType) w.qualifiedType(t.Obj()) - case *typeparams.TypeParam: + case *types.TypeParam: w.startType(typeParamType) w.qualifiedType(t.Obj()) @@ -868,7 +867,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { w.signature(sig) } - case *typeparams.Union: + case *types.Union: w.startType(unionType) nt := t.Len() w.uint64(uint64(nt)) @@ -948,14 +947,14 @@ func (w *exportWriter) signature(sig *types.Signature) { } } -func (w *exportWriter) typeList(ts *typeparams.TypeList, pkg *types.Package) { +func (w *exportWriter) typeList(ts *types.TypeList, pkg *types.Package) { w.uint64(uint64(ts.Len())) for i := 0; i < ts.Len(); i++ { w.typ(ts.At(i), pkg) } } -func (w *exportWriter) tparamList(prefix string, list *typeparams.TypeParamList, pkg *types.Package) { +func (w *exportWriter) tparamList(prefix string, list *types.TypeParamList, pkg *types.Package) { ll := uint64(list.Len()) w.uint64(ll) for i := 0; i < list.Len(); i++ { @@ -973,7 +972,7 @@ const blankMarker = "$" // differs from its actual object name: it is prefixed with a qualifier, and // blank type parameter names are disambiguated by their index in the type // parameter list. -func tparamExportName(prefix string, tparam *typeparams.TypeParam) string { +func tparamExportName(prefix string, tparam *types.TypeParam) string { assert(prefix != "") name := tparam.Obj().Name() if name == "_" { diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go index 8e64cf64..9bde15e3 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go @@ -22,7 +22,6 @@ import ( "strings" "golang.org/x/tools/go/types/objectpath" - "golang.org/x/tools/internal/typeparams" ) type intReader struct { @@ -321,7 +320,7 @@ func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte // Therefore, we defer calling SetConstraint there, and call it here instead // after all types are complete. for _, d := range p.later { - typeparams.SetTypeParamConstraint(d.t, d.constraint) + d.t.SetConstraint(d.constraint) } for _, typ := range p.interfaceList { @@ -339,7 +338,7 @@ func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte } type setConstraintArgs struct { - t *typeparams.TypeParam + t *types.TypeParam constraint types.Type } @@ -549,7 +548,7 @@ func (r *importReader) obj(name string) { r.declare(types.NewConst(pos, r.currPkg, name, typ, val)) case 'F', 'G': - var tparams []*typeparams.TypeParam + var tparams []*types.TypeParam if tag == 'G' { tparams = r.tparamList() } @@ -566,7 +565,7 @@ func (r *importReader) obj(name string) { r.declare(obj) if tag == 'U' { tparams := r.tparamList() - typeparams.SetForNamed(named, tparams) + named.SetTypeParams(tparams) } underlying := r.p.typAt(r.uint64(), named).Underlying() @@ -583,12 +582,12 @@ func (r *importReader) obj(name string) { // typeparams being used in the method sig/body). base := baseType(recv.Type()) assert(base != nil) - targs := typeparams.NamedTypeArgs(base) - var rparams []*typeparams.TypeParam + targs := base.TypeArgs() + var rparams []*types.TypeParam if targs.Len() > 0 { - rparams = make([]*typeparams.TypeParam, targs.Len()) + rparams = make([]*types.TypeParam, targs.Len()) for i := range rparams { - rparams[i] = targs.At(i).(*typeparams.TypeParam) + rparams[i] = targs.At(i).(*types.TypeParam) } } msig := r.signature(recv, rparams, nil) @@ -606,7 +605,7 @@ func (r *importReader) obj(name string) { } name0 := tparamName(name) tn := types.NewTypeName(pos, r.currPkg, name0, nil) - t := typeparams.NewTypeParam(tn, nil) + t := types.NewTypeParam(tn, nil) // To handle recursive references to the typeparam within its // bound, save the partial type in tparamIndex before reading the bounds. @@ -622,7 +621,7 @@ func (r *importReader) obj(name string) { if iface == nil { errorf("non-interface constraint marked implicit") } - typeparams.MarkImplicit(iface) + iface.MarkImplicit() } // The constraint type may not be complete, if we // are in the middle of a type recursion involving type @@ -966,7 +965,7 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { // The imported instantiated type doesn't include any methods, so // we must always use the methods of the base (orig) type. // TODO provide a non-nil *Environment - t, _ := typeparams.Instantiate(nil, baseType, targs, false) + t, _ := types.Instantiate(nil, baseType, targs, false) // Workaround for golang/go#61561. See the doc for instanceList for details. r.p.instanceList = append(r.p.instanceList, t) @@ -976,11 +975,11 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { if r.p.version < iexportVersionGenerics { errorf("unexpected instantiation type") } - terms := make([]*typeparams.Term, r.uint64()) + terms := make([]*types.Term, r.uint64()) for i := range terms { - terms[i] = typeparams.NewTerm(r.bool(), r.typ()) + terms[i] = types.NewTerm(r.bool(), r.typ()) } - return typeparams.NewUnion(terms) + return types.NewUnion(terms) } } @@ -1008,23 +1007,23 @@ func (r *importReader) objectPathObject() types.Object { return obj } -func (r *importReader) signature(recv *types.Var, rparams []*typeparams.TypeParam, tparams []*typeparams.TypeParam) *types.Signature { +func (r *importReader) signature(recv *types.Var, rparams []*types.TypeParam, tparams []*types.TypeParam) *types.Signature { params := r.paramList() results := r.paramList() variadic := params.Len() > 0 && r.bool() - return typeparams.NewSignatureType(recv, rparams, tparams, params, results, variadic) + return types.NewSignatureType(recv, rparams, tparams, params, results, variadic) } -func (r *importReader) tparamList() []*typeparams.TypeParam { +func (r *importReader) tparamList() []*types.TypeParam { n := r.uint64() if n == 0 { return nil } - xs := make([]*typeparams.TypeParam, n) + xs := make([]*types.TypeParam, n) for i := range xs { // Note: the standard library importer is tolerant of nil types here, // though would panic in SetTypeParams. - xs[i] = r.typ().(*typeparams.TypeParam) + xs[i] = r.typ().(*types.TypeParam) } return xs } diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go index 53cf66da..55312522 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -13,6 +13,7 @@ import ( "io" "log" "os" + "os/exec" "reflect" "regexp" "runtime" @@ -21,8 +22,6 @@ import ( "sync" "time" - exec "golang.org/x/sys/execabs" - "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/keys" "golang.org/x/tools/internal/event/label" @@ -85,6 +84,7 @@ func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stde // RunRaw runs the invocation, serializing requests only if they fight over // go.mod changes. +// Postcondition: both error results have same nilness. func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { ctx, done := event.Start(ctx, "gocommand.Runner.RunRaw", invLabels(inv)...) defer done() @@ -95,23 +95,24 @@ func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer stdout, stderr, friendlyErr, err := runner.runConcurrent(ctx, inv) // If we encounter a load concurrency error, we need to retry serially. - if friendlyErr == nil || !modConcurrencyError.MatchString(friendlyErr.Error()) { - return stdout, stderr, friendlyErr, err - } - event.Error(ctx, "Load concurrency error, will retry serially", err) + if friendlyErr != nil && modConcurrencyError.MatchString(friendlyErr.Error()) { + event.Error(ctx, "Load concurrency error, will retry serially", err) + + // Run serially by calling runPiped. + stdout.Reset() + stderr.Reset() + friendlyErr, err = runner.runPiped(ctx, inv, stdout, stderr) + } - // Run serially by calling runPiped. - stdout.Reset() - stderr.Reset() - friendlyErr, err = runner.runPiped(ctx, inv, stdout, stderr) return stdout, stderr, friendlyErr, err } +// Postcondition: both error results have same nilness. func (runner *Runner) runConcurrent(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { // Wait for 1 worker to become available. select { case <-ctx.Done(): - return nil, nil, nil, ctx.Err() + return nil, nil, ctx.Err(), ctx.Err() case runner.inFlight <- struct{}{}: defer func() { <-runner.inFlight }() } @@ -121,6 +122,7 @@ func (runner *Runner) runConcurrent(ctx context.Context, inv Invocation) (*bytes return stdout, stderr, friendlyErr, err } +// Postcondition: both error results have same nilness. func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stderr io.Writer) (error, error) { // Make sure the runner is always initialized. runner.initialize() @@ -129,7 +131,7 @@ func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stde // runPiped commands. select { case <-ctx.Done(): - return nil, ctx.Err() + return ctx.Err(), ctx.Err() case runner.serialized <- struct{}{}: defer func() { <-runner.serialized }() } @@ -139,7 +141,7 @@ func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stde for i := 0; i < maxInFlight; i++ { select { case <-ctx.Done(): - return nil, ctx.Err() + return ctx.Err(), ctx.Err() case runner.inFlight <- struct{}{}: // Make sure we always "return" any workers we took. defer func() { <-runner.inFlight }() @@ -172,6 +174,7 @@ type Invocation struct { Logf func(format string, args ...interface{}) } +// Postcondition: both error results have same nilness. func (i *Invocation) runWithFriendlyError(ctx context.Context, stdout, stderr io.Writer) (friendlyError error, rawError error) { rawError = i.run(ctx, stdout, stderr) if rawError != nil { diff --git a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go index 452e342c..52f74e64 100644 --- a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go +++ b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go @@ -9,13 +9,12 @@ package gopathwalk import ( "bufio" "bytes" + "io/fs" "log" "os" "path/filepath" "strings" "time" - - "golang.org/x/tools/internal/fastwalk" ) // Options controls the behavior of a Walk call. @@ -45,21 +44,18 @@ type Root struct { } // Walk walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. -// For each package found, add will be called (concurrently) with the absolute +// For each package found, add will be called with the absolute // paths of the containing source directory and the package directory. -// add will be called concurrently. func Walk(roots []Root, add func(root Root, dir string), opts Options) { WalkSkip(roots, add, func(Root, string) bool { return false }, opts) } // WalkSkip walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. -// For each package found, add will be called (concurrently) with the absolute +// For each package found, add will be called with the absolute // paths of the containing source directory and the package directory. -// For each directory that will be scanned, skip will be called (concurrently) +// For each directory that will be scanned, skip will be called // with the absolute paths of the containing source directory and the directory. // If skip returns false on a directory it will be processed. -// add will be called concurrently. -// skip will be called concurrently. func WalkSkip(roots []Root, add func(root Root, dir string), skip func(root Root, dir string) bool, opts Options) { for _, root := range roots { walkDir(root, add, skip, opts) @@ -78,14 +74,25 @@ func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) if opts.Logf != nil { opts.Logf("scanning %s", root.Path) } + w := &walker{ - root: root, - add: add, - skip: skip, - opts: opts, + root: root, + add: add, + skip: skip, + opts: opts, + added: make(map[string]bool), } w.init() - if err := fastwalk.Walk(root.Path, w.walk); err != nil { + + // Add a trailing path separator to cause filepath.WalkDir to traverse symlinks. + path := root.Path + if len(path) == 0 { + path = "." + string(filepath.Separator) + } else if !os.IsPathSeparator(path[len(path)-1]) { + path = path + string(filepath.Separator) + } + + if err := filepath.WalkDir(path, w.walk); err != nil { logf := opts.Logf if logf == nil { logf = log.Printf @@ -105,7 +112,10 @@ type walker struct { skip func(Root, string) bool // The callback that will be invoked for every dir. dir is skipped if it returns true. opts Options // Options passed to Walk by the user. - ignoredDirs []os.FileInfo // The ignored directories, loaded from .goimportsignore files. + pathSymlinks []os.FileInfo + ignoredDirs []string + + added map[string]bool } // init initializes the walker based on its Options @@ -121,13 +131,9 @@ func (w *walker) init() { for _, p := range ignoredPaths { full := filepath.Join(w.root.Path, p) - if fi, err := os.Stat(full); err == nil { - w.ignoredDirs = append(w.ignoredDirs, fi) - if w.opts.Logf != nil { - w.opts.Logf("Directory added to ignore list: %s", full) - } - } else if w.opts.Logf != nil { - w.opts.Logf("Error statting ignored directory: %v", err) + w.ignoredDirs = append(w.ignoredDirs, full) + if w.opts.Logf != nil { + w.opts.Logf("Directory added to ignore list: %s", full) } } } @@ -162,9 +168,9 @@ func (w *walker) getIgnoredDirs(path string) []string { } // shouldSkipDir reports whether the file should be skipped or not. -func (w *walker) shouldSkipDir(fi os.FileInfo, dir string) bool { +func (w *walker) shouldSkipDir(dir string) bool { for _, ignoredDir := range w.ignoredDirs { - if os.SameFile(fi, ignoredDir) { + if dir == ignoredDir { return true } } @@ -176,85 +182,150 @@ func (w *walker) shouldSkipDir(fi os.FileInfo, dir string) bool { } // walk walks through the given path. -func (w *walker) walk(path string, typ os.FileMode) error { - if typ.IsRegular() { - dir := filepath.Dir(path) - if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) { - // Doesn't make sense to have regular files - // directly in your $GOPATH/src or $GOROOT/src. - return fastwalk.ErrSkipFiles +// +// Errors are logged if w.opts.Logf is non-nil, but otherwise ignored: +// walk returns only nil or fs.SkipDir. +func (w *walker) walk(path string, d fs.DirEntry, err error) error { + if err != nil { + // We have no way to report errors back through Walk or WalkSkip, + // so just log and ignore them. + if w.opts.Logf != nil { + w.opts.Logf("%v", err) } + if d == nil { + // Nothing more to do: the error prevents us from knowing + // what path even represents. + return nil + } + } + + if d.Type().IsRegular() { if !strings.HasSuffix(path, ".go") { return nil } - w.add(w.root, dir) - return fastwalk.ErrSkipFiles + dir := filepath.Dir(path) + if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) { + // Doesn't make sense to have regular files + // directly in your $GOPATH/src or $GOROOT/src. + return nil + } + + if !w.added[dir] { + w.add(w.root, dir) + w.added[dir] = true + } + return nil } - if typ == os.ModeDir { + + if d.IsDir() { base := filepath.Base(path) if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" || (w.root.Type == RootGOROOT && w.opts.ModulesEnabled && base == "vendor") || (!w.opts.ModulesEnabled && base == "node_modules") { - return filepath.SkipDir + return fs.SkipDir } - fi, err := os.Lstat(path) - if err == nil && w.shouldSkipDir(fi, path) { - return filepath.SkipDir + if w.shouldSkipDir(path) { + return fs.SkipDir } return nil } - if typ == os.ModeSymlink { - base := filepath.Base(path) - if strings.HasPrefix(base, ".#") { - // Emacs noise. + + if d.Type()&os.ModeSymlink != 0 { + // TODO(bcmills): 'go list all' itself ignores symlinks within GOROOT/src + // and GOPATH/src. Do we really need to traverse them here? If so, why? + + fi, err := os.Stat(path) + if err != nil || !fi.IsDir() { + // Not a directory. Just walk the file (or broken link) and be done. + return w.walk(path, fs.FileInfoToDirEntry(fi), err) + } + + // Avoid walking symlink cycles: if we have already followed a symlink to + // this directory as a parent of itself, don't follow it again. + // + // This doesn't catch the first time through a cycle, but it also minimizes + // the number of extra stat calls we make if we *don't* encounter a cycle. + // Since we don't actually expect to encounter symlink cycles in practice, + // this seems like the right tradeoff. + for _, parent := range w.pathSymlinks { + if os.SameFile(fi, parent) { + return nil + } + } + + w.pathSymlinks = append(w.pathSymlinks, fi) + defer func() { + w.pathSymlinks = w.pathSymlinks[:len(w.pathSymlinks)-1] + }() + + // On some platforms the OS (or the Go os package) sometimes fails to + // resolve directory symlinks before a trailing slash + // (even though POSIX requires it to do so). + // + // On macOS that failure may be caused by a known libc/kernel bug; + // see https://go.dev/issue/59586. + // + // On Windows before Go 1.21, it may be caused by a bug in + // os.Lstat (fixed in https://go.dev/cl/463177). + // + // Since we need to handle this explicitly on broken platforms anyway, + // it is simplest to just always do that and not rely on POSIX pathname + // resolution to walk the directory (such as by calling WalkDir with + // a trailing slash appended to the path). + // + // Instead, we make a sequence of walk calls — directly and through + // recursive calls to filepath.WalkDir — simulating what WalkDir would do + // if the symlink were a regular directory. + + // First we call walk on the path as a directory + // (instead of a symlink). + err = w.walk(path, fs.FileInfoToDirEntry(fi), nil) + if err == fs.SkipDir { return nil + } else if err != nil { + // This should be impossible, but handle it anyway in case + // walk is changed to return other errors. + return err } - if w.shouldTraverse(path) { - return fastwalk.ErrTraverseLink + + // Now read the directory and walk its entries. + ents, err := os.ReadDir(path) + if err != nil { + // Report the ReadDir error, as filepath.WalkDir would do. + err = w.walk(path, fs.FileInfoToDirEntry(fi), err) + if err == fs.SkipDir { + return nil + } else if err != nil { + return err // Again, should be impossible. + } + // Fall through and iterate over whatever entries we did manage to get. } + + for _, d := range ents { + nextPath := filepath.Join(path, d.Name()) + if d.IsDir() { + // We want to walk the whole directory tree rooted at nextPath, + // not just the single entry for the directory. + err := filepath.WalkDir(nextPath, w.walk) + if err != nil && w.opts.Logf != nil { + w.opts.Logf("%v", err) + } + } else { + err := w.walk(nextPath, d, nil) + if err == fs.SkipDir { + // Skip the rest of the entries in the parent directory of nextPath + // (that is, path itself). + break + } else if err != nil { + return err // Again, should be impossible. + } + } + } + return nil } + + // Not a file, regular directory, or symlink; skip. return nil } - -// shouldTraverse reports whether the symlink fi, found in dir, -// should be followed. It makes sure symlinks were never visited -// before to avoid symlink loops. -func (w *walker) shouldTraverse(path string) bool { - ts, err := os.Stat(path) - if err != nil { - logf := w.opts.Logf - if logf == nil { - logf = log.Printf - } - logf("%v", err) - return false - } - if !ts.IsDir() { - return false - } - if w.shouldSkipDir(ts, filepath.Dir(path)) { - return false - } - // Check for symlink loops by statting each directory component - // and seeing if any are the same file as ts. - for { - parent := filepath.Dir(path) - if parent == path { - // Made it to the root without seeing a cycle. - // Use this symlink. - return true - } - parentInfo, err := os.Stat(parent) - if err != nil { - return false - } - if os.SameFile(ts, parentInfo) { - // Cycle. Don't traverse. - return false - } - path = parent - } - -} diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index d4f1b4e8..dd369c07 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -13,6 +13,7 @@ import ( "go/build" "go/parser" "go/token" + "io/fs" "io/ioutil" "os" "path" @@ -107,7 +108,7 @@ func parseOtherFiles(fset *token.FileSet, srcDir, filename string) []*ast.File { considerTests := strings.HasSuffix(filename, "_test.go") fileBase := filepath.Base(filename) - packageFileInfos, err := ioutil.ReadDir(srcDir) + packageFileInfos, err := os.ReadDir(srcDir) if err != nil { return nil } @@ -253,7 +254,7 @@ type pass struct { otherFiles []*ast.File // sibling files. // Intermediate state, generated by load. - existingImports map[string]*ImportInfo + existingImports map[string][]*ImportInfo allRefs references missingRefs references @@ -318,7 +319,7 @@ func (p *pass) importIdentifier(imp *ImportInfo) string { func (p *pass) load() ([]*ImportFix, bool) { p.knownPackages = map[string]*packageInfo{} p.missingRefs = references{} - p.existingImports = map[string]*ImportInfo{} + p.existingImports = map[string][]*ImportInfo{} // Load basic information about the file in question. p.allRefs = collectReferences(p.f) @@ -349,7 +350,7 @@ func (p *pass) load() ([]*ImportFix, bool) { } } for _, imp := range imports { - p.existingImports[p.importIdentifier(imp)] = imp + p.existingImports[p.importIdentifier(imp)] = append(p.existingImports[p.importIdentifier(imp)], imp) } // Find missing references. @@ -388,31 +389,33 @@ func (p *pass) fix() ([]*ImportFix, bool) { // Found everything, or giving up. Add the new imports and remove any unused. var fixes []*ImportFix - for _, imp := range p.existingImports { - // We deliberately ignore globals here, because we can't be sure - // they're in the same package. People do things like put multiple - // main packages in the same directory, and we don't want to - // remove imports if they happen to have the same name as a var in - // a different package. - if _, ok := p.allRefs[p.importIdentifier(imp)]; !ok { - fixes = append(fixes, &ImportFix{ - StmtInfo: *imp, - IdentName: p.importIdentifier(imp), - FixType: DeleteImport, - }) - continue - } + for _, identifierImports := range p.existingImports { + for _, imp := range identifierImports { + // We deliberately ignore globals here, because we can't be sure + // they're in the same package. People do things like put multiple + // main packages in the same directory, and we don't want to + // remove imports if they happen to have the same name as a var in + // a different package. + if _, ok := p.allRefs[p.importIdentifier(imp)]; !ok { + fixes = append(fixes, &ImportFix{ + StmtInfo: *imp, + IdentName: p.importIdentifier(imp), + FixType: DeleteImport, + }) + continue + } - // An existing import may need to update its import name to be correct. - if name := p.importSpecName(imp); name != imp.Name { - fixes = append(fixes, &ImportFix{ - StmtInfo: ImportInfo{ - Name: name, - ImportPath: imp.ImportPath, - }, - IdentName: p.importIdentifier(imp), - FixType: SetImportName, - }) + // An existing import may need to update its import name to be correct. + if name := p.importSpecName(imp); name != imp.Name { + fixes = append(fixes, &ImportFix{ + StmtInfo: ImportInfo{ + Name: name, + ImportPath: imp.ImportPath, + }, + IdentName: p.importIdentifier(imp), + FixType: SetImportName, + }) + } } } // Collecting fixes involved map iteration, so sort for stability. See @@ -1469,11 +1472,11 @@ func VendorlessPath(ipath string) string { func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, includeTest bool) (string, []string, error) { // Look for non-test, buildable .go files which could provide exports. - all, err := ioutil.ReadDir(dir) + all, err := os.ReadDir(dir) if err != nil { return "", nil, err } - var files []os.FileInfo + var files []fs.DirEntry for _, fi := range all { name := fi.Name() if !strings.HasSuffix(name, ".go") || (!includeTest && strings.HasSuffix(name, "_test.go")) { diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go index 977d2389..5f4d435d 100644 --- a/vendor/golang.org/x/tools/internal/imports/mod.go +++ b/vendor/golang.org/x/tools/internal/imports/mod.go @@ -9,7 +9,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "os" "path" "path/filepath" @@ -265,7 +264,7 @@ func (r *ModuleResolver) findPackage(importPath string) (*gocommand.ModuleJSON, } // Not cached. Read the filesystem. - pkgFiles, err := ioutil.ReadDir(pkgDir) + pkgFiles, err := os.ReadDir(pkgDir) if err != nil { continue } @@ -370,7 +369,7 @@ func (r *ModuleResolver) dirIsNestedModule(dir string, mod *gocommand.ModuleJSON func (r *ModuleResolver) modInfo(dir string) (modDir string, modName string) { readModName := func(modFile string) string { - modBytes, err := ioutil.ReadFile(modFile) + modBytes, err := os.ReadFile(modFile) if err != nil { return "" } diff --git a/vendor/golang.org/x/tools/internal/imports/zstdlib.go b/vendor/golang.org/x/tools/internal/imports/zstdlib.go index 31a75949..9f992c2b 100644 --- a/vendor/golang.org/x/tools/internal/imports/zstdlib.go +++ b/vendor/golang.org/x/tools/internal/imports/zstdlib.go @@ -93,6 +93,7 @@ var stdlib = map[string][]string{ "Compare", "Contains", "ContainsAny", + "ContainsFunc", "ContainsRune", "Count", "Cut", @@ -147,6 +148,11 @@ var stdlib = map[string][]string{ "TrimSpace", "TrimSuffix", }, + "cmp": { + "Compare", + "Less", + "Ordered", + }, "compress/bzip2": { "NewReader", "StructuralError", @@ -228,6 +234,7 @@ var stdlib = map[string][]string{ "Ring", }, "context": { + "AfterFunc", "Background", "CancelCauseFunc", "CancelFunc", @@ -239,8 +246,11 @@ var stdlib = map[string][]string{ "WithCancel", "WithCancelCause", "WithDeadline", + "WithDeadlineCause", "WithTimeout", + "WithTimeoutCause", "WithValue", + "WithoutCancel", }, "crypto": { "BLAKE2b_256", @@ -445,6 +455,7 @@ var stdlib = map[string][]string{ "XORBytes", }, "crypto/tls": { + "AlertError", "Certificate", "CertificateRequestInfo", "CertificateVerificationError", @@ -476,6 +487,7 @@ var stdlib = map[string][]string{ "LoadX509KeyPair", "NewLRUClientSessionCache", "NewListener", + "NewResumptionState", "NoClientCert", "PKCS1WithSHA1", "PKCS1WithSHA256", @@ -484,6 +496,27 @@ var stdlib = map[string][]string{ "PSSWithSHA256", "PSSWithSHA384", "PSSWithSHA512", + "ParseSessionState", + "QUICClient", + "QUICConfig", + "QUICConn", + "QUICEncryptionLevel", + "QUICEncryptionLevelApplication", + "QUICEncryptionLevelEarly", + "QUICEncryptionLevelHandshake", + "QUICEncryptionLevelInitial", + "QUICEvent", + "QUICEventKind", + "QUICHandshakeDone", + "QUICNoEvent", + "QUICRejectedEarlyData", + "QUICServer", + "QUICSessionTicketOptions", + "QUICSetReadSecret", + "QUICSetWriteSecret", + "QUICTransportParameters", + "QUICTransportParametersRequired", + "QUICWriteData", "RecordHeaderError", "RenegotiateFreelyAsClient", "RenegotiateNever", @@ -493,6 +526,7 @@ var stdlib = map[string][]string{ "RequireAndVerifyClientCert", "RequireAnyClientCert", "Server", + "SessionState", "SignatureScheme", "TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", @@ -523,6 +557,7 @@ var stdlib = map[string][]string{ "TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_RC4_128_SHA", "VerifyClientCertIfGiven", + "VersionName", "VersionSSL30", "VersionTLS10", "VersionTLS11", @@ -618,6 +653,7 @@ var stdlib = map[string][]string{ "PureEd25519", "RSA", "RevocationList", + "RevocationListEntry", "SHA1WithRSA", "SHA256WithRSA", "SHA256WithRSAPSS", @@ -1002,10 +1038,42 @@ var stdlib = map[string][]string{ "COMPRESS_LOOS", "COMPRESS_LOPROC", "COMPRESS_ZLIB", + "COMPRESS_ZSTD", "Chdr32", "Chdr64", "Class", "CompressionType", + "DF_1_CONFALT", + "DF_1_DIRECT", + "DF_1_DISPRELDNE", + "DF_1_DISPRELPND", + "DF_1_EDITED", + "DF_1_ENDFILTEE", + "DF_1_GLOBAL", + "DF_1_GLOBAUDIT", + "DF_1_GROUP", + "DF_1_IGNMULDEF", + "DF_1_INITFIRST", + "DF_1_INTERPOSE", + "DF_1_KMOD", + "DF_1_LOADFLTR", + "DF_1_NOCOMMON", + "DF_1_NODEFLIB", + "DF_1_NODELETE", + "DF_1_NODIRECT", + "DF_1_NODUMP", + "DF_1_NOHDR", + "DF_1_NOKSYMS", + "DF_1_NOOPEN", + "DF_1_NORELOC", + "DF_1_NOW", + "DF_1_ORIGIN", + "DF_1_PIE", + "DF_1_SINGLETON", + "DF_1_STUB", + "DF_1_SYMINTPOSE", + "DF_1_TRANS", + "DF_1_WEAKFILTER", "DF_BIND_NOW", "DF_ORIGIN", "DF_STATIC_TLS", @@ -1144,6 +1212,7 @@ var stdlib = map[string][]string{ "Dyn32", "Dyn64", "DynFlag", + "DynFlag1", "DynTag", "EI_ABIVERSION", "EI_CLASS", @@ -2111,6 +2180,7 @@ var stdlib = map[string][]string{ "R_PPC64_REL16_LO", "R_PPC64_REL24", "R_PPC64_REL24_NOTOC", + "R_PPC64_REL24_P9NOTOC", "R_PPC64_REL30", "R_PPC64_REL32", "R_PPC64_REL64", @@ -2848,6 +2918,7 @@ var stdlib = map[string][]string{ "MaxVarintLen16", "MaxVarintLen32", "MaxVarintLen64", + "NativeEndian", "PutUvarint", "PutVarint", "Read", @@ -2963,6 +3034,7 @@ var stdlib = map[string][]string{ }, "errors": { "As", + "ErrUnsupported", "Is", "Join", "New", @@ -2989,6 +3061,7 @@ var stdlib = map[string][]string{ "Arg", "Args", "Bool", + "BoolFunc", "BoolVar", "CommandLine", "ContinueOnError", @@ -3119,6 +3192,7 @@ var stdlib = map[string][]string{ "Inspect", "InterfaceType", "IsExported", + "IsGenerated", "KeyValueExpr", "LabeledStmt", "Lbl", @@ -3169,6 +3243,7 @@ var stdlib = map[string][]string{ "ArchChar", "Context", "Default", + "Directive", "FindOnly", "IgnoreVendor", "Import", @@ -3184,6 +3259,7 @@ var stdlib = map[string][]string{ "go/build/constraint": { "AndExpr", "Expr", + "GoVersion", "IsGoBuild", "IsPlusBuild", "NotExpr", @@ -3626,6 +3702,7 @@ var stdlib = map[string][]string{ "ErrBadHTML", "ErrBranchEnd", "ErrEndContext", + "ErrJSTemplate", "ErrNoSuchTemplate", "ErrOutputContext", "ErrPartialCharset", @@ -3870,6 +3947,8 @@ var stdlib = map[string][]string{ "FileInfo", "FileInfoToDirEntry", "FileMode", + "FormatDirEntry", + "FormatFileInfo", "Glob", "GlobFS", "ModeAppend", @@ -3942,6 +4021,78 @@ var stdlib = map[string][]string{ "SetPrefix", "Writer", }, + "log/slog": { + "Any", + "AnyValue", + "Attr", + "Bool", + "BoolValue", + "Debug", + "DebugContext", + "Default", + "Duration", + "DurationValue", + "Error", + "ErrorContext", + "Float64", + "Float64Value", + "Group", + "GroupValue", + "Handler", + "HandlerOptions", + "Info", + "InfoContext", + "Int", + "Int64", + "Int64Value", + "IntValue", + "JSONHandler", + "Kind", + "KindAny", + "KindBool", + "KindDuration", + "KindFloat64", + "KindGroup", + "KindInt64", + "KindLogValuer", + "KindString", + "KindTime", + "KindUint64", + "Level", + "LevelDebug", + "LevelError", + "LevelInfo", + "LevelKey", + "LevelVar", + "LevelWarn", + "Leveler", + "Log", + "LogAttrs", + "LogValuer", + "Logger", + "MessageKey", + "New", + "NewJSONHandler", + "NewLogLogger", + "NewRecord", + "NewTextHandler", + "Record", + "SetDefault", + "Source", + "SourceKey", + "String", + "StringValue", + "TextHandler", + "Time", + "TimeKey", + "TimeValue", + "Uint64", + "Uint64Value", + "Value", + "Warn", + "WarnContext", + "With", + }, "log/syslog": { "Dial", "LOG_ALERT", @@ -3977,6 +4128,13 @@ var stdlib = map[string][]string{ "Priority", "Writer", }, + "maps": { + "Clone", + "Copy", + "DeleteFunc", + "Equal", + "EqualFunc", + }, "math": { "Abs", "Acos", @@ -4371,6 +4529,7 @@ var stdlib = map[string][]string{ "ErrNoLocation", "ErrNotMultipart", "ErrNotSupported", + "ErrSchemeMismatch", "ErrServerClosed", "ErrShortBody", "ErrSkipAltProtocol", @@ -5084,6 +5243,8 @@ var stdlib = map[string][]string{ "NumCPU", "NumCgoCall", "NumGoroutine", + "PanicNilError", + "Pinner", "ReadMemStats", "ReadTrace", "SetBlockProfileRate", @@ -5172,6 +5333,37 @@ var stdlib = map[string][]string{ "Task", "WithRegion", }, + "slices": { + "BinarySearch", + "BinarySearchFunc", + "Clip", + "Clone", + "Compact", + "CompactFunc", + "Compare", + "CompareFunc", + "Contains", + "ContainsFunc", + "Delete", + "DeleteFunc", + "Equal", + "EqualFunc", + "Grow", + "Index", + "IndexFunc", + "Insert", + "IsSorted", + "IsSortedFunc", + "Max", + "MaxFunc", + "Min", + "MinFunc", + "Replace", + "Reverse", + "Sort", + "SortFunc", + "SortStableFunc", + }, "sort": { "Find", "Float64Slice", @@ -5242,6 +5434,7 @@ var stdlib = map[string][]string{ "Compare", "Contains", "ContainsAny", + "ContainsFunc", "ContainsRune", "Count", "Cut", @@ -5299,6 +5492,9 @@ var stdlib = map[string][]string{ "Mutex", "NewCond", "Once", + "OnceFunc", + "OnceValue", + "OnceValues", "Pool", "RWMutex", "WaitGroup", @@ -9135,10 +9331,12 @@ var stdlib = map[string][]string{ "SYS_AIO_CANCEL", "SYS_AIO_ERROR", "SYS_AIO_FSYNC", + "SYS_AIO_MLOCK", "SYS_AIO_READ", "SYS_AIO_RETURN", "SYS_AIO_SUSPEND", "SYS_AIO_SUSPEND_NOCANCEL", + "SYS_AIO_WAITCOMPLETE", "SYS_AIO_WRITE", "SYS_ALARM", "SYS_ARCH_PRCTL", @@ -9368,6 +9566,7 @@ var stdlib = map[string][]string{ "SYS_GET_MEMPOLICY", "SYS_GET_ROBUST_LIST", "SYS_GET_THREAD_AREA", + "SYS_GSSD_SYSCALL", "SYS_GTTY", "SYS_IDENTITYSVC", "SYS_IDLE", @@ -9411,8 +9610,24 @@ var stdlib = map[string][]string{ "SYS_KLDSYM", "SYS_KLDUNLOAD", "SYS_KLDUNLOADF", + "SYS_KMQ_NOTIFY", + "SYS_KMQ_OPEN", + "SYS_KMQ_SETATTR", + "SYS_KMQ_TIMEDRECEIVE", + "SYS_KMQ_TIMEDSEND", + "SYS_KMQ_UNLINK", "SYS_KQUEUE", "SYS_KQUEUE1", + "SYS_KSEM_CLOSE", + "SYS_KSEM_DESTROY", + "SYS_KSEM_GETVALUE", + "SYS_KSEM_INIT", + "SYS_KSEM_OPEN", + "SYS_KSEM_POST", + "SYS_KSEM_TIMEDWAIT", + "SYS_KSEM_TRYWAIT", + "SYS_KSEM_UNLINK", + "SYS_KSEM_WAIT", "SYS_KTIMER_CREATE", "SYS_KTIMER_DELETE", "SYS_KTIMER_GETOVERRUN", @@ -9504,11 +9719,14 @@ var stdlib = map[string][]string{ "SYS_NFSSVC", "SYS_NFSTAT", "SYS_NICE", + "SYS_NLM_SYSCALL", "SYS_NLSTAT", "SYS_NMOUNT", "SYS_NSTAT", "SYS_NTP_ADJTIME", "SYS_NTP_GETTIME", + "SYS_NUMA_GETAFFINITY", + "SYS_NUMA_SETAFFINITY", "SYS_OABI_SYSCALL_BASE", "SYS_OBREAK", "SYS_OLDFSTAT", @@ -9891,6 +10109,7 @@ var stdlib = map[string][]string{ "SYS___ACL_SET_FD", "SYS___ACL_SET_FILE", "SYS___ACL_SET_LINK", + "SYS___CAP_RIGHTS_GET", "SYS___CLONE", "SYS___DISABLE_THREADSIGNAL", "SYS___GETCWD", @@ -10574,6 +10793,7 @@ var stdlib = map[string][]string{ "Short", "T", "TB", + "Testing", "Verbose", }, "testing/fstest": { @@ -10603,6 +10823,9 @@ var stdlib = map[string][]string{ "SetupError", "Value", }, + "testing/slogtest": { + "TestHandler", + }, "text/scanner": { "Char", "Comment", @@ -10826,6 +11049,7 @@ var stdlib = map[string][]string{ "Cs", "Cuneiform", "Cypriot", + "Cypro_Minoan", "Cyrillic", "Dash", "Deprecated", @@ -10889,6 +11113,7 @@ var stdlib = map[string][]string{ "Kaithi", "Kannada", "Katakana", + "Kawi", "Kayah_Li", "Kharoshthi", "Khitan_Small_Script", @@ -10943,6 +11168,7 @@ var stdlib = map[string][]string{ "Myanmar", "N", "Nabataean", + "Nag_Mundari", "Nandinagari", "Nd", "New_Tai_Lue", @@ -10964,6 +11190,7 @@ var stdlib = map[string][]string{ "Old_Sogdian", "Old_South_Arabian", "Old_Turkic", + "Old_Uyghur", "Oriya", "Osage", "Osmanya", @@ -11038,6 +11265,7 @@ var stdlib = map[string][]string{ "Tai_Viet", "Takri", "Tamil", + "Tangsa", "Tangut", "Telugu", "Terminal_Punctuation", @@ -11052,6 +11280,7 @@ var stdlib = map[string][]string{ "ToLower", "ToTitle", "ToUpper", + "Toto", "TurkishCase", "Ugaritic", "Unified_Ideograph", @@ -11061,6 +11290,7 @@ var stdlib = map[string][]string{ "Vai", "Variation_Selector", "Version", + "Vithkuqi", "Wancho", "Warang_Citi", "White_Space", diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go index d9950b1f..44719de1 100644 --- a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go +++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go @@ -5,10 +5,6 @@ // Package packagesinternal exposes internal-only fields from go/packages. package packagesinternal -import ( - "golang.org/x/tools/internal/gocommand" -) - var GetForTest = func(p interface{}) string { return "" } var GetDepsErrors = func(p interface{}) []*PackageError { return nil } @@ -18,10 +14,6 @@ type PackageError struct { Err string // the error itself } -var GetGoCmdRunner = func(config interface{}) *gocommand.Runner { return nil } - -var SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {} - var TypecheckCgo int var DepsErrors int // must be set as a LoadMode to call GetDepsErrors var ForTest int // must be set as a LoadMode to call GetForTest diff --git a/vendor/golang.org/x/tools/internal/typeparams/common.go b/vendor/golang.org/x/tools/internal/typeparams/common.go index d0d0649f..cdab9885 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/common.go +++ b/vendor/golang.org/x/tools/internal/typeparams/common.go @@ -42,7 +42,7 @@ func UnpackIndexExpr(n ast.Node) (x ast.Expr, lbrack token.Pos, indices []ast.Ex switch e := n.(type) { case *ast.IndexExpr: return e.X, e.Lbrack, []ast.Expr{e.Index}, e.Rbrack - case *IndexListExpr: + case *ast.IndexListExpr: return e.X, e.Lbrack, e.Indices, e.Rbrack } return nil, token.NoPos, nil, token.NoPos @@ -63,7 +63,7 @@ func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack toke Rbrack: rbrack, } default: - return &IndexListExpr{ + return &ast.IndexListExpr{ X: x, Lbrack: lbrack, Indices: indices, @@ -74,7 +74,7 @@ func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack toke // IsTypeParam reports whether t is a type parameter. func IsTypeParam(t types.Type) bool { - _, ok := t.(*TypeParam) + _, ok := t.(*types.TypeParam) return ok } @@ -100,11 +100,11 @@ func OriginMethod(fn *types.Func) *types.Func { // Receiver is a *types.Interface. return fn } - if ForNamed(named).Len() == 0 { + if named.TypeParams().Len() == 0 { // Receiver base has no type parameters, so we can avoid the lookup below. return fn } - orig := NamedTypeOrigin(named) + orig := named.Origin() gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name()) // This is a fix for a gopls crash (#60628) due to a go/types bug (#60634). In: @@ -157,7 +157,7 @@ func OriginMethod(fn *types.Func) *types.Func { // // In this case, GenericAssignableTo reports that instantiations of Container // are assignable to the corresponding instantiation of Interface. -func GenericAssignableTo(ctxt *Context, V, T types.Type) bool { +func GenericAssignableTo(ctxt *types.Context, V, T types.Type) bool { // If V and T are not both named, or do not have matching non-empty type // parameter lists, fall back on types.AssignableTo. @@ -167,9 +167,9 @@ func GenericAssignableTo(ctxt *Context, V, T types.Type) bool { return types.AssignableTo(V, T) } - vtparams := ForNamed(VN) - ttparams := ForNamed(TN) - if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || NamedTypeArgs(VN).Len() != 0 || NamedTypeArgs(TN).Len() != 0 { + vtparams := VN.TypeParams() + ttparams := TN.TypeParams() + if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || VN.TypeArgs().Len() != 0 || TN.TypeArgs().Len() != 0 { return types.AssignableTo(V, T) } @@ -182,7 +182,7 @@ func GenericAssignableTo(ctxt *Context, V, T types.Type) bool { // Minor optimization: ensure we share a context across the two // instantiations below. if ctxt == nil { - ctxt = NewContext() + ctxt = types.NewContext() } var targs []types.Type @@ -190,12 +190,12 @@ func GenericAssignableTo(ctxt *Context, V, T types.Type) bool { targs = append(targs, vtparams.At(i)) } - vinst, err := Instantiate(ctxt, V, targs, true) + vinst, err := types.Instantiate(ctxt, V, targs, true) if err != nil { panic("type parameters should satisfy their own constraints") } - tinst, err := Instantiate(ctxt, T, targs, true) + tinst, err := types.Instantiate(ctxt, T, targs, true) if err != nil { return false } diff --git a/vendor/golang.org/x/tools/internal/typeparams/coretype.go b/vendor/golang.org/x/tools/internal/typeparams/coretype.go index 993135ec..7ea8840e 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/coretype.go +++ b/vendor/golang.org/x/tools/internal/typeparams/coretype.go @@ -81,13 +81,13 @@ func CoreType(T types.Type) types.Type { // restrictions may be arbitrarily complex. For example, consider the // following: // -// type A interface{ ~string|~[]byte } +// type A interface{ ~string|~[]byte } // -// type B interface{ int|string } +// type B interface{ int|string } // -// type C interface { ~string|~int } +// type C interface { ~string|~int } // -// type T[P interface{ A|B; C }] int +// type T[P interface{ A|B; C }] int // // In this example, the structural type restriction of P is ~string|int: A|B // expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, @@ -108,15 +108,15 @@ func CoreType(T types.Type) types.Type { // // _NormalTerms makes no guarantees about the order of terms, except that it // is deterministic. -func _NormalTerms(typ types.Type) ([]*Term, error) { +func _NormalTerms(typ types.Type) ([]*types.Term, error) { switch typ := typ.(type) { - case *TypeParam: + case *types.TypeParam: return StructuralTerms(typ) - case *Union: + case *types.Union: return UnionTermSet(typ) case *types.Interface: return InterfaceTermSet(typ) default: - return []*Term{NewTerm(false, typ)}, nil + return []*types.Term{types.NewTerm(false, typ)}, nil } } diff --git a/vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go b/vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go deleted file mode 100644 index 18212390..00000000 --- a/vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 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. - -//go:build !go1.18 -// +build !go1.18 - -package typeparams - -// Enabled reports whether type parameters are enabled in the current build -// environment. -const Enabled = false diff --git a/vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go b/vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go deleted file mode 100644 index d6714882..00000000 --- a/vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 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. - -//go:build go1.18 -// +build go1.18 - -package typeparams - -// Note: this constant is in a separate file as this is the only acceptable -// diff between the <1.18 API of this package and the 1.18 API. - -// Enabled reports whether type parameters are enabled in the current build -// environment. -const Enabled = true diff --git a/vendor/golang.org/x/tools/internal/typeparams/normalize.go b/vendor/golang.org/x/tools/internal/typeparams/normalize.go index 9c631b65..93c80fdc 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/normalize.go +++ b/vendor/golang.org/x/tools/internal/typeparams/normalize.go @@ -60,7 +60,7 @@ var ErrEmptyTypeSet = errors.New("empty type set") // // StructuralTerms makes no guarantees about the order of terms, except that it // is deterministic. -func StructuralTerms(tparam *TypeParam) ([]*Term, error) { +func StructuralTerms(tparam *types.TypeParam) ([]*types.Term, error) { constraint := tparam.Constraint() if constraint == nil { return nil, fmt.Errorf("%s has nil constraint", tparam) @@ -78,7 +78,7 @@ func StructuralTerms(tparam *TypeParam) ([]*Term, error) { // // See the documentation of StructuralTerms for more information on // normalization. -func InterfaceTermSet(iface *types.Interface) ([]*Term, error) { +func InterfaceTermSet(iface *types.Interface) ([]*types.Term, error) { return computeTermSet(iface) } @@ -88,11 +88,11 @@ func InterfaceTermSet(iface *types.Interface) ([]*Term, error) { // // See the documentation of StructuralTerms for more information on // normalization. -func UnionTermSet(union *Union) ([]*Term, error) { +func UnionTermSet(union *types.Union) ([]*types.Term, error) { return computeTermSet(union) } -func computeTermSet(typ types.Type) ([]*Term, error) { +func computeTermSet(typ types.Type) ([]*types.Term, error) { tset, err := computeTermSetInternal(typ, make(map[types.Type]*termSet), 0) if err != nil { return nil, err @@ -103,9 +103,9 @@ func computeTermSet(typ types.Type) ([]*Term, error) { if tset.terms.isAll() { return nil, nil } - var terms []*Term + var terms []*types.Term for _, term := range tset.terms { - terms = append(terms, NewTerm(term.tilde, term.typ)) + terms = append(terms, types.NewTerm(term.tilde, term.typ)) } return terms, nil } @@ -162,7 +162,7 @@ func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth in tset.terms = allTermlist for i := 0; i < u.NumEmbeddeds(); i++ { embedded := u.EmbeddedType(i) - if _, ok := embedded.Underlying().(*TypeParam); ok { + if _, ok := embedded.Underlying().(*types.TypeParam); ok { return nil, fmt.Errorf("invalid embedded type %T", embedded) } tset2, err := computeTermSetInternal(embedded, seen, depth+1) @@ -171,7 +171,7 @@ func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth in } tset.terms = tset.terms.intersect(tset2.terms) } - case *Union: + case *types.Union: // The term set of a union is the union of term sets of its terms. tset.terms = nil for i := 0; i < u.Len(); i++ { @@ -184,7 +184,7 @@ func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth in return nil, err } terms = tset2.terms - case *TypeParam, *Union: + case *types.TypeParam, *types.Union: // A stand-alone type parameter or union is not permitted as union // term. return nil, fmt.Errorf("invalid union term %T", t) @@ -199,7 +199,7 @@ func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth in return nil, fmt.Errorf("exceeded max term count %d", maxTermCount) } } - case *TypeParam: + case *types.TypeParam: panic("unreachable") default: // For all other types, the term set is just a single non-tilde term diff --git a/vendor/golang.org/x/tools/internal/typeparams/termlist.go b/vendor/golang.org/x/tools/internal/typeparams/termlist.go index 933106a2..cbd12f80 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/termlist.go +++ b/vendor/golang.org/x/tools/internal/typeparams/termlist.go @@ -30,7 +30,7 @@ func (xl termlist) String() string { var buf bytes.Buffer for i, x := range xl { if i > 0 { - buf.WriteString(" ∪ ") + buf.WriteString(" | ") } buf.WriteString(x.String()) } diff --git a/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go b/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go deleted file mode 100644 index 7ed86e17..00000000 --- a/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2021 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. - -//go:build !go1.18 -// +build !go1.18 - -package typeparams - -import ( - "go/ast" - "go/token" - "go/types" -) - -func unsupported() { - panic("type parameters are unsupported at this go version") -} - -// IndexListExpr is a placeholder type, as type parameters are not supported at -// this Go version. Its methods panic on use. -type IndexListExpr struct { - ast.Expr - X ast.Expr // expression - Lbrack token.Pos // position of "[" - Indices []ast.Expr // index expressions - Rbrack token.Pos // position of "]" -} - -// ForTypeSpec returns an empty field list, as type parameters on not supported -// at this Go version. -func ForTypeSpec(*ast.TypeSpec) *ast.FieldList { - return nil -} - -// ForFuncType returns an empty field list, as type parameters are not -// supported at this Go version. -func ForFuncType(*ast.FuncType) *ast.FieldList { - return nil -} - -// TypeParam is a placeholder type, as type parameters are not supported at -// this Go version. Its methods panic on use. -type TypeParam struct{ types.Type } - -func (*TypeParam) Index() int { unsupported(); return 0 } -func (*TypeParam) Constraint() types.Type { unsupported(); return nil } -func (*TypeParam) Obj() *types.TypeName { unsupported(); return nil } - -// TypeParamList is a placeholder for an empty type parameter list. -type TypeParamList struct{} - -func (*TypeParamList) Len() int { return 0 } -func (*TypeParamList) At(int) *TypeParam { unsupported(); return nil } - -// TypeList is a placeholder for an empty type list. -type TypeList struct{} - -func (*TypeList) Len() int { return 0 } -func (*TypeList) At(int) types.Type { unsupported(); return nil } - -// NewTypeParam is unsupported at this Go version, and panics. -func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { - unsupported() - return nil -} - -// SetTypeParamConstraint is unsupported at this Go version, and panics. -func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { - unsupported() -} - -// NewSignatureType calls types.NewSignature, panicking if recvTypeParams or -// typeParams is non-empty. -func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { - if len(recvTypeParams) != 0 || len(typeParams) != 0 { - panic("signatures cannot have type parameters at this Go version") - } - return types.NewSignature(recv, params, results, variadic) -} - -// ForSignature returns an empty slice. -func ForSignature(*types.Signature) *TypeParamList { - return nil -} - -// RecvTypeParams returns a nil slice. -func RecvTypeParams(sig *types.Signature) *TypeParamList { - return nil -} - -// IsComparable returns false, as no interfaces are type-restricted at this Go -// version. -func IsComparable(*types.Interface) bool { - return false -} - -// IsMethodSet returns true, as no interfaces are type-restricted at this Go -// version. -func IsMethodSet(*types.Interface) bool { - return true -} - -// IsImplicit returns false, as no interfaces are implicit at this Go version. -func IsImplicit(*types.Interface) bool { - return false -} - -// MarkImplicit does nothing, because this Go version does not have implicit -// interfaces. -func MarkImplicit(*types.Interface) {} - -// ForNamed returns an empty type parameter list, as type parameters are not -// supported at this Go version. -func ForNamed(*types.Named) *TypeParamList { - return nil -} - -// SetForNamed panics if tparams is non-empty. -func SetForNamed(_ *types.Named, tparams []*TypeParam) { - if len(tparams) > 0 { - unsupported() - } -} - -// NamedTypeArgs returns nil. -func NamedTypeArgs(*types.Named) *TypeList { - return nil -} - -// NamedTypeOrigin is the identity method at this Go version. -func NamedTypeOrigin(named *types.Named) *types.Named { - return named -} - -// Term holds information about a structural type restriction. -type Term struct { - tilde bool - typ types.Type -} - -func (m *Term) Tilde() bool { return m.tilde } -func (m *Term) Type() types.Type { return m.typ } -func (m *Term) String() string { - pre := "" - if m.tilde { - pre = "~" - } - return pre + m.typ.String() -} - -// NewTerm is unsupported at this Go version, and panics. -func NewTerm(tilde bool, typ types.Type) *Term { - return &Term{tilde, typ} -} - -// Union is a placeholder type, as type parameters are not supported at this Go -// version. Its methods panic on use. -type Union struct{ types.Type } - -func (*Union) Len() int { return 0 } -func (*Union) Term(i int) *Term { unsupported(); return nil } - -// NewUnion is unsupported at this Go version, and panics. -func NewUnion(terms []*Term) *Union { - unsupported() - return nil -} - -// InitInstanceInfo is a noop at this Go version. -func InitInstanceInfo(*types.Info) {} - -// Instance is a placeholder type, as type parameters are not supported at this -// Go version. -type Instance struct { - TypeArgs *TypeList - Type types.Type -} - -// GetInstances returns a nil map, as type parameters are not supported at this -// Go version. -func GetInstances(info *types.Info) map[*ast.Ident]Instance { return nil } - -// Context is a placeholder type, as type parameters are not supported at -// this Go version. -type Context struct{} - -// NewContext returns a placeholder Context instance. -func NewContext() *Context { - return &Context{} -} - -// Instantiate is unsupported on this Go version, and panics. -func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { - unsupported() - return nil, nil -} diff --git a/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go b/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go deleted file mode 100644 index cf301af1..00000000 --- a/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2021 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. - -//go:build go1.18 -// +build go1.18 - -package typeparams - -import ( - "go/ast" - "go/types" -) - -// IndexListExpr is an alias for ast.IndexListExpr. -type IndexListExpr = ast.IndexListExpr - -// ForTypeSpec returns n.TypeParams. -func ForTypeSpec(n *ast.TypeSpec) *ast.FieldList { - if n == nil { - return nil - } - return n.TypeParams -} - -// ForFuncType returns n.TypeParams. -func ForFuncType(n *ast.FuncType) *ast.FieldList { - if n == nil { - return nil - } - return n.TypeParams -} - -// TypeParam is an alias for types.TypeParam -type TypeParam = types.TypeParam - -// TypeParamList is an alias for types.TypeParamList -type TypeParamList = types.TypeParamList - -// TypeList is an alias for types.TypeList -type TypeList = types.TypeList - -// NewTypeParam calls types.NewTypeParam. -func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { - return types.NewTypeParam(name, constraint) -} - -// SetTypeParamConstraint calls tparam.SetConstraint(constraint). -func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { - tparam.SetConstraint(constraint) -} - -// NewSignatureType calls types.NewSignatureType. -func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { - return types.NewSignatureType(recv, recvTypeParams, typeParams, params, results, variadic) -} - -// ForSignature returns sig.TypeParams() -func ForSignature(sig *types.Signature) *TypeParamList { - return sig.TypeParams() -} - -// RecvTypeParams returns sig.RecvTypeParams(). -func RecvTypeParams(sig *types.Signature) *TypeParamList { - return sig.RecvTypeParams() -} - -// IsComparable calls iface.IsComparable(). -func IsComparable(iface *types.Interface) bool { - return iface.IsComparable() -} - -// IsMethodSet calls iface.IsMethodSet(). -func IsMethodSet(iface *types.Interface) bool { - return iface.IsMethodSet() -} - -// IsImplicit calls iface.IsImplicit(). -func IsImplicit(iface *types.Interface) bool { - return iface.IsImplicit() -} - -// MarkImplicit calls iface.MarkImplicit(). -func MarkImplicit(iface *types.Interface) { - iface.MarkImplicit() -} - -// ForNamed extracts the (possibly empty) type parameter object list from -// named. -func ForNamed(named *types.Named) *TypeParamList { - return named.TypeParams() -} - -// SetForNamed sets the type params tparams on n. Each tparam must be of -// dynamic type *types.TypeParam. -func SetForNamed(n *types.Named, tparams []*TypeParam) { - n.SetTypeParams(tparams) -} - -// NamedTypeArgs returns named.TypeArgs(). -func NamedTypeArgs(named *types.Named) *TypeList { - return named.TypeArgs() -} - -// NamedTypeOrigin returns named.Orig(). -func NamedTypeOrigin(named *types.Named) *types.Named { - return named.Origin() -} - -// Term is an alias for types.Term. -type Term = types.Term - -// NewTerm calls types.NewTerm. -func NewTerm(tilde bool, typ types.Type) *Term { - return types.NewTerm(tilde, typ) -} - -// Union is an alias for types.Union -type Union = types.Union - -// NewUnion calls types.NewUnion. -func NewUnion(terms []*Term) *Union { - return types.NewUnion(terms) -} - -// InitInstanceInfo initializes info to record information about type and -// function instances. -func InitInstanceInfo(info *types.Info) { - info.Instances = make(map[*ast.Ident]types.Instance) -} - -// Instance is an alias for types.Instance. -type Instance = types.Instance - -// GetInstances returns info.Instances. -func GetInstances(info *types.Info) map[*ast.Ident]Instance { - return info.Instances -} - -// Context is an alias for types.Context. -type Context = types.Context - -// NewContext calls types.NewContext. -func NewContext() *Context { - return types.NewContext() -} - -// Instantiate calls types.Instantiate. -func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { - return types.Instantiate(ctxt, typ, targs, validate) -} diff --git a/vendor/golang.org/x/tools/internal/typeparams/typeterm.go b/vendor/golang.org/x/tools/internal/typeparams/typeterm.go index 7ddee28d..7350bb70 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/typeterm.go +++ b/vendor/golang.org/x/tools/internal/typeparams/typeterm.go @@ -10,11 +10,10 @@ import "go/types" // A term describes elementary type sets: // -// ∅: (*term)(nil) == ∅ // set of no types (empty set) -// 𝓤: &term{} == 𝓤 // set of all types (𝓤niverse) -// T: &term{false, T} == {T} // set of type T -// ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t -// +// ∅: (*term)(nil) == ∅ // set of no types (empty set) +// 𝓤: &term{} == 𝓤 // set of all types (𝓤niverse) +// T: &term{false, T} == {T} // set of type T +// ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t type term struct { tilde bool // valid if typ != nil typ types.Type diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index 66e8b099..ce7d4351 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -11,8 +11,6 @@ import ( "go/types" "reflect" "unsafe" - - "golang.org/x/tools/go/types/objectpath" ) func SetUsesCgo(conf *types.Config) bool { @@ -52,17 +50,3 @@ func ReadGo116ErrorData(err types.Error) (code ErrorCode, start, end token.Pos, } var SetGoVersion = func(conf *types.Config, version string) bool { return false } - -// SkipEncoderMethodSorting marks the encoder as not requiring sorted methods, -// as an optimization for gopls (which guarantees the order of parsed source files). -// -// TODO(golang/go#61443): eliminate this parameter one way or the other. -// -//go:linkname SkipEncoderMethodSorting golang.org/x/tools/go/types/objectpath.skipMethodSorting -func SkipEncoderMethodSorting(enc *objectpath.Encoder) - -// ObjectpathObject is like objectpath.Object, but allows suppressing method -// sorting (which is not necessary for gopls). -// -//go:linkname ObjectpathObject golang.org/x/tools/go/types/objectpath.object -func ObjectpathObject(pkg *types.Package, p objectpath.Path, skipMethodSorting bool) (types.Object, error) diff --git a/vendor/golang.org/x/tools/internal/versions/gover.go b/vendor/golang.org/x/tools/internal/versions/gover.go new file mode 100644 index 00000000..bbabcd22 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/gover.go @@ -0,0 +1,172 @@ +// Copyright 2023 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. + +// This is a fork of internal/gover for use by x/tools until +// go1.21 and earlier are no longer supported by x/tools. + +package versions + +import "strings" + +// A gover is a parsed Go gover: major[.Minor[.Patch]][kind[pre]] +// The numbers are the original decimal strings to avoid integer overflows +// and since there is very little actual math. (Probably overflow doesn't matter in practice, +// but at the time this code was written, there was an existing test that used +// go1.99999999999, which does not fit in an int on 32-bit platforms. +// The "big decimal" representation avoids the problem entirely.) +type gover struct { + major string // decimal + minor string // decimal or "" + patch string // decimal or "" + kind string // "", "alpha", "beta", "rc" + pre string // decimal or "" +} + +// compare returns -1, 0, or +1 depending on whether +// x < y, x == y, or x > y, interpreted as toolchain versions. +// The versions x and y must not begin with a "go" prefix: just "1.21" not "go1.21". +// Malformed versions compare less than well-formed versions and equal to each other. +// The language version "1.21" compares less than the release candidate and eventual releases "1.21rc1" and "1.21.0". +func compare(x, y string) int { + vx := parse(x) + vy := parse(y) + + if c := cmpInt(vx.major, vy.major); c != 0 { + return c + } + if c := cmpInt(vx.minor, vy.minor); c != 0 { + return c + } + if c := cmpInt(vx.patch, vy.patch); c != 0 { + return c + } + if c := strings.Compare(vx.kind, vy.kind); c != 0 { // "" < alpha < beta < rc + return c + } + if c := cmpInt(vx.pre, vy.pre); c != 0 { + return c + } + return 0 +} + +// lang returns the Go language version. For example, lang("1.2.3") == "1.2". +func lang(x string) string { + v := parse(x) + if v.minor == "" || v.major == "1" && v.minor == "0" { + return v.major + } + return v.major + "." + v.minor +} + +// isValid reports whether the version x is valid. +func isValid(x string) bool { + return parse(x) != gover{} +} + +// parse parses the Go version string x into a version. +// It returns the zero version if x is malformed. +func parse(x string) gover { + var v gover + + // Parse major version. + var ok bool + v.major, x, ok = cutInt(x) + if !ok { + return gover{} + } + if x == "" { + // Interpret "1" as "1.0.0". + v.minor = "0" + v.patch = "0" + return v + } + + // Parse . before minor version. + if x[0] != '.' { + return gover{} + } + + // Parse minor version. + v.minor, x, ok = cutInt(x[1:]) + if !ok { + return gover{} + } + if x == "" { + // Patch missing is same as "0" for older versions. + // Starting in Go 1.21, patch missing is different from explicit .0. + if cmpInt(v.minor, "21") < 0 { + v.patch = "0" + } + return v + } + + // Parse patch if present. + if x[0] == '.' { + v.patch, x, ok = cutInt(x[1:]) + if !ok || x != "" { + // Note that we are disallowing prereleases (alpha, beta, rc) for patch releases here (x != ""). + // Allowing them would be a bit confusing because we already have: + // 1.21 < 1.21rc1 + // But a prerelease of a patch would have the opposite effect: + // 1.21.3rc1 < 1.21.3 + // We've never needed them before, so let's not start now. + return gover{} + } + return v + } + + // Parse prerelease. + i := 0 + for i < len(x) && (x[i] < '0' || '9' < x[i]) { + if x[i] < 'a' || 'z' < x[i] { + return gover{} + } + i++ + } + if i == 0 { + return gover{} + } + v.kind, x = x[:i], x[i:] + if x == "" { + return v + } + v.pre, x, ok = cutInt(x) + if !ok || x != "" { + return gover{} + } + + return v +} + +// cutInt scans the leading decimal number at the start of x to an integer +// and returns that value and the rest of the string. +func cutInt(x string) (n, rest string, ok bool) { + i := 0 + for i < len(x) && '0' <= x[i] && x[i] <= '9' { + i++ + } + if i == 0 || x[0] == '0' && i != 1 { // no digits or unnecessary leading zero + return "", "", false + } + return x[:i], x[i:], true +} + +// cmpInt returns cmp.Compare(x, y) interpreting x and y as decimal numbers. +// (Copied from golang.org/x/mod/semver's compareInt.) +func cmpInt(x, y string) int { + if x == y { + return 0 + } + if len(x) < len(y) { + return -1 + } + if len(x) > len(y) { + return +1 + } + if x < y { + return -1 + } else { + return +1 + } +} diff --git a/vendor/golang.org/x/tools/internal/versions/types.go b/vendor/golang.org/x/tools/internal/versions/types.go new file mode 100644 index 00000000..562eef21 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/types.go @@ -0,0 +1,19 @@ +// Copyright 2023 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 versions + +import ( + "go/types" +) + +// GoVersion returns the Go version of the type package. +// It returns zero if no version can be determined. +func GoVersion(pkg *types.Package) string { + // TODO(taking): x/tools can call GoVersion() [from 1.21] after 1.25. + if pkg, ok := any(pkg).(interface{ GoVersion() string }); ok { + return pkg.GoVersion() + } + return "" +} diff --git a/vendor/golang.org/x/tools/internal/versions/types_go121.go b/vendor/golang.org/x/tools/internal/versions/types_go121.go new file mode 100644 index 00000000..a7b79207 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/types_go121.go @@ -0,0 +1,20 @@ +// Copyright 2023 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. + +//go:build !go1.22 +// +build !go1.22 + +package versions + +import ( + "go/ast" + "go/types" +) + +// FileVersions always reports the a file's Go version as the +// zero version at this Go version. +func FileVersions(info *types.Info, file *ast.File) string { return "" } + +// InitFileVersions is a noop at this Go version. +func InitFileVersions(*types.Info) {} diff --git a/vendor/golang.org/x/tools/internal/versions/types_go122.go b/vendor/golang.org/x/tools/internal/versions/types_go122.go new file mode 100644 index 00000000..7b9ba89a --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/types_go122.go @@ -0,0 +1,24 @@ +// Copyright 2023 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. + +//go:build go1.22 +// +build go1.22 + +package versions + +import ( + "go/ast" + "go/types" +) + +// FileVersions maps a file to the file's semantic Go version. +// The reported version is the zero version if a version cannot be determined. +func FileVersions(info *types.Info, file *ast.File) string { + return info.FileVersions[file] +} + +// InitFileVersions initializes info to record Go versions for Go files. +func InitFileVersions(info *types.Info) { + info.FileVersions = make(map[*ast.File]string) +} diff --git a/vendor/golang.org/x/tools/internal/versions/versions.go b/vendor/golang.org/x/tools/internal/versions/versions.go new file mode 100644 index 00000000..e16f6c33 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/versions.go @@ -0,0 +1,52 @@ +// Copyright 2023 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 versions + +// Note: If we use build tags to use go/versions when go >=1.22, +// we run into go.dev/issue/53737. Under some operations users would see an +// import of "go/versions" even if they would not compile the file. +// For example, during `go get -u ./...` (go.dev/issue/64490) we do not try to include +// For this reason, this library just a clone of go/versions for the moment. + +// Lang returns the Go language version for version x. +// If x is not a valid version, Lang returns the empty string. +// For example: +// +// Lang("go1.21rc2") = "go1.21" +// Lang("go1.21.2") = "go1.21" +// Lang("go1.21") = "go1.21" +// Lang("go1") = "go1" +// Lang("bad") = "" +// Lang("1.21") = "" +func Lang(x string) string { + v := lang(stripGo(x)) + if v == "" { + return "" + } + return x[:2+len(v)] // "go"+v without allocation +} + +// Compare returns -1, 0, or +1 depending on whether +// x < y, x == y, or x > y, interpreted as Go versions. +// The versions x and y must begin with a "go" prefix: "go1.21" not "1.21". +// Invalid versions, including the empty string, compare less than +// valid versions and equal to each other. +// The language version "go1.21" compares less than the +// release candidate and eventual releases "go1.21rc1" and "go1.21.0". +// Custom toolchain suffixes are ignored during comparison: +// "go1.21.0" and "go1.21.0-bigcorp" are equal. +func Compare(x, y string) int { return compare(stripGo(x), stripGo(y)) } + +// IsValid reports whether the version x is valid. +func IsValid(x string) bool { return isValid(stripGo(x)) } + +// stripGo converts from a "go1.21" version to a "1.21" version. +// If v does not start with "go", stripGo returns the empty string (a known invalid version). +func stripGo(v string) string { + if len(v) < 2 || v[:2] != "go" { + return "" + } + return v[2:] +} diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index 4921b2d4..a45f112b 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -21,7 +21,7 @@ import ( "google.golang.org/protobuf/reflect/protoregistry" ) -// Unmarshal reads the given []byte into the given proto.Message. +// Unmarshal reads the given []byte into the given [proto.Message]. // The provided message must be mutable (e.g., a non-nil pointer to a message). func Unmarshal(b []byte, m proto.Message) error { return UnmarshalOptions{}.Unmarshal(b, m) @@ -51,7 +51,7 @@ type UnmarshalOptions struct { } } -// Unmarshal reads the given []byte and populates the given proto.Message +// Unmarshal reads the given []byte and populates the given [proto.Message] // using options in the UnmarshalOptions object. // The provided message must be mutable (e.g., a non-nil pointer to a message). func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { @@ -739,7 +739,9 @@ func (d decoder) skipValue() error { case text.ListClose: return nil case text.MessageOpen: - return d.skipMessageValue() + if err := d.skipMessageValue(); err != nil { + return err + } default: // Skip items. This will not validate whether skipped values are // of the same type or not, same behavior as C++ diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index 722a7b41..95967e81 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -33,7 +33,7 @@ func Format(m proto.Message) string { return MarshalOptions{Multiline: true}.Format(m) } -// Marshal writes the given proto.Message in textproto format using default +// Marshal writes the given [proto.Message] in textproto format using default // options. Do not depend on the output being stable. It may change over time // across different versions of the program. func Marshal(m proto.Message) ([]byte, error) { @@ -97,7 +97,7 @@ func (o MarshalOptions) Format(m proto.Message) string { return string(b) } -// Marshal writes the given proto.Message in textproto format using options in +// Marshal writes the given [proto.Message] in textproto format using options in // MarshalOptions object. Do not depend on the output being stable. It may // change over time across different versions of the program. func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go index f4b4686c..e942bc98 100644 --- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go @@ -6,7 +6,7 @@ // See https://protobuf.dev/programming-guides/encoding. // // For marshaling and unmarshaling entire protobuf messages, -// use the "google.golang.org/protobuf/proto" package instead. +// use the [google.golang.org/protobuf/proto] package instead. package protowire import ( @@ -87,7 +87,7 @@ func ParseError(n int) error { // ConsumeField parses an entire field record (both tag and value) and returns // the field number, the wire type, and the total length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). // // The total length includes the tag header and the end group marker (if the // field is a group). @@ -104,8 +104,8 @@ func ConsumeField(b []byte) (Number, Type, int) { } // ConsumeFieldValue parses a field value and returns its length. -// This assumes that the field Number and wire Type have already been parsed. -// This returns a negative length upon an error (see ParseError). +// This assumes that the field [Number] and wire [Type] have already been parsed. +// This returns a negative length upon an error (see [ParseError]). // // When parsing a group, the length includes the end group marker and // the end group is verified to match the starting field number. @@ -164,7 +164,7 @@ func AppendTag(b []byte, num Number, typ Type) []byte { } // ConsumeTag parses b as a varint-encoded tag, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeTag(b []byte) (Number, Type, int) { v, n := ConsumeVarint(b) if n < 0 { @@ -263,7 +263,7 @@ func AppendVarint(b []byte, v uint64) []byte { } // ConsumeVarint parses b as a varint-encoded uint64, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeVarint(b []byte) (v uint64, n int) { var y uint64 if len(b) <= 0 { @@ -384,7 +384,7 @@ func AppendFixed32(b []byte, v uint32) []byte { } // ConsumeFixed32 parses b as a little-endian uint32, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeFixed32(b []byte) (v uint32, n int) { if len(b) < 4 { return 0, errCodeTruncated @@ -412,7 +412,7 @@ func AppendFixed64(b []byte, v uint64) []byte { } // ConsumeFixed64 parses b as a little-endian uint64, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeFixed64(b []byte) (v uint64, n int) { if len(b) < 8 { return 0, errCodeTruncated @@ -432,7 +432,7 @@ func AppendBytes(b []byte, v []byte) []byte { } // ConsumeBytes parses b as a length-prefixed bytes value, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeBytes(b []byte) (v []byte, n int) { m, n := ConsumeVarint(b) if n < 0 { @@ -456,7 +456,7 @@ func AppendString(b []byte, v string) []byte { } // ConsumeString parses b as a length-prefixed bytes value, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeString(b []byte) (v string, n int) { bb, n := ConsumeBytes(b) return string(bb), n @@ -471,7 +471,7 @@ func AppendGroup(b []byte, num Number, v []byte) []byte { // ConsumeGroup parses b as a group value until the trailing end group marker, // and verifies that the end marker matches the provided num. The value v // does not contain the end marker, while the length does contain the end marker. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeGroup(num Number, b []byte) (v []byte, n int) { n = ConsumeFieldValue(num, StartGroupType, b) if n < 0 { @@ -495,8 +495,8 @@ func SizeGroup(num Number, n int) int { return n + SizeTag(num) } -// DecodeTag decodes the field Number and wire Type from its unified form. -// The Number is -1 if the decoded field number overflows int32. +// DecodeTag decodes the field [Number] and wire [Type] from its unified form. +// The [Number] is -1 if the decoded field number overflows int32. // Other than overflow, this does not check for field number validity. func DecodeTag(x uint64) (Number, Type) { // NOTE: MessageSet allows for larger field numbers than normal. @@ -506,7 +506,7 @@ func DecodeTag(x uint64) (Number, Type) { return Number(x >> 3), Type(x & 7) } -// EncodeTag encodes the field Number and wire Type into its unified form. +// EncodeTag encodes the field [Number] and wire [Type] into its unified form. func EncodeTag(num Number, typ Type) uint64 { return uint64(num)<<3 | uint64(typ&7) } diff --git a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go index db5248e1..a45625c8 100644 --- a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +++ b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go @@ -83,7 +83,13 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { case protoreflect.FileImports: for i := 0; i < vs.Len(); i++ { var rs records - rs.Append(reflect.ValueOf(vs.Get(i)), "Path", "Package", "IsPublic", "IsWeak") + rv := reflect.ValueOf(vs.Get(i)) + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Path"), "Path"}, + {rv.MethodByName("Package"), "Package"}, + {rv.MethodByName("IsPublic"), "IsPublic"}, + {rv.MethodByName("IsWeak"), "IsWeak"}, + }...) ss = append(ss, "{"+rs.Join()+"}") } return start + joinStrings(ss, allowMulti) + end @@ -92,34 +98,26 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { for i := 0; i < vs.Len(); i++ { m := reflect.ValueOf(vs).MethodByName("Get") v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface() - ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue)) + ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue, nil)) } return start + joinStrings(ss, allowMulti && isEnumValue) + end } } -// descriptorAccessors is a list of accessors to print for each descriptor. -// -// Do not print all accessors since some contain redundant information, -// while others are pointers that we do not want to follow since the descriptor -// is actually a cyclic graph. -// -// Using a list allows us to print the accessors in a sensible order. -var descriptorAccessors = map[reflect.Type][]string{ - reflect.TypeOf((*protoreflect.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, - reflect.TypeOf((*protoreflect.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, - reflect.TypeOf((*protoreflect.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, - reflect.TypeOf((*protoreflect.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt - reflect.TypeOf((*protoreflect.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, - reflect.TypeOf((*protoreflect.EnumValueDescriptor)(nil)).Elem(): {"Number"}, - reflect.TypeOf((*protoreflect.ServiceDescriptor)(nil)).Elem(): {"Methods"}, - reflect.TypeOf((*protoreflect.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, +type methodAndName struct { + method reflect.Value + name string } func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) { - io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) + io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')), nil)) } -func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { + +func InternalFormatDescOptForTesting(t protoreflect.Descriptor, isRoot, allowMulti bool, record func(string)) string { + return formatDescOpt(t, isRoot, allowMulti, record) +} + +func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool, record func(string)) string { rv := reflect.ValueOf(t) rt := rv.MethodByName("ProtoType").Type().In(0) @@ -129,26 +127,60 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { } _, isFile := t.(protoreflect.FileDescriptor) - rs := records{allowMulti: allowMulti} + rs := records{ + allowMulti: allowMulti, + record: record, + } if t.IsPlaceholder() { if isFile { - rs.Append(rv, "Path", "Package", "IsPlaceholder") + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Path"), "Path"}, + {rv.MethodByName("Package"), "Package"}, + {rv.MethodByName("IsPlaceholder"), "IsPlaceholder"}, + }...) } else { - rs.Append(rv, "FullName", "IsPlaceholder") + rs.Append(rv, []methodAndName{ + {rv.MethodByName("FullName"), "FullName"}, + {rv.MethodByName("IsPlaceholder"), "IsPlaceholder"}, + }...) } } else { switch { case isFile: - rs.Append(rv, "Syntax") + rs.Append(rv, methodAndName{rv.MethodByName("Syntax"), "Syntax"}) case isRoot: - rs.Append(rv, "Syntax", "FullName") + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Syntax"), "Syntax"}, + {rv.MethodByName("FullName"), "FullName"}, + }...) default: - rs.Append(rv, "Name") + rs.Append(rv, methodAndName{rv.MethodByName("Name"), "Name"}) } switch t := t.(type) { case protoreflect.FieldDescriptor: - for _, s := range descriptorAccessors[rt] { - switch s { + accessors := []methodAndName{ + {rv.MethodByName("Number"), "Number"}, + {rv.MethodByName("Cardinality"), "Cardinality"}, + {rv.MethodByName("Kind"), "Kind"}, + {rv.MethodByName("HasJSONName"), "HasJSONName"}, + {rv.MethodByName("JSONName"), "JSONName"}, + {rv.MethodByName("HasPresence"), "HasPresence"}, + {rv.MethodByName("IsExtension"), "IsExtension"}, + {rv.MethodByName("IsPacked"), "IsPacked"}, + {rv.MethodByName("IsWeak"), "IsWeak"}, + {rv.MethodByName("IsList"), "IsList"}, + {rv.MethodByName("IsMap"), "IsMap"}, + {rv.MethodByName("MapKey"), "MapKey"}, + {rv.MethodByName("MapValue"), "MapValue"}, + {rv.MethodByName("HasDefault"), "HasDefault"}, + {rv.MethodByName("Default"), "Default"}, + {rv.MethodByName("ContainingOneof"), "ContainingOneof"}, + {rv.MethodByName("ContainingMessage"), "ContainingMessage"}, + {rv.MethodByName("Message"), "Message"}, + {rv.MethodByName("Enum"), "Enum"}, + } + for _, s := range accessors { + switch s.name { case "MapKey": if k := t.MapKey(); k != nil { rs.recs = append(rs.recs, [2]string{"MapKey", k.Kind().String()}) @@ -157,20 +189,20 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { if v := t.MapValue(); v != nil { switch v.Kind() { case protoreflect.EnumKind: - rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Enum().FullName())}) + rs.AppendRecs("MapValue", [2]string{"MapValue", string(v.Enum().FullName())}) case protoreflect.MessageKind, protoreflect.GroupKind: - rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Message().FullName())}) + rs.AppendRecs("MapValue", [2]string{"MapValue", string(v.Message().FullName())}) default: - rs.recs = append(rs.recs, [2]string{"MapValue", v.Kind().String()}) + rs.AppendRecs("MapValue", [2]string{"MapValue", v.Kind().String()}) } } case "ContainingOneof": if od := t.ContainingOneof(); od != nil { - rs.recs = append(rs.recs, [2]string{"Oneof", string(od.Name())}) + rs.AppendRecs("ContainingOneof", [2]string{"Oneof", string(od.Name())}) } case "ContainingMessage": if t.IsExtension() { - rs.recs = append(rs.recs, [2]string{"Extendee", string(t.ContainingMessage().FullName())}) + rs.AppendRecs("ContainingMessage", [2]string{"Extendee", string(t.ContainingMessage().FullName())}) } case "Message": if !t.IsMap() { @@ -187,13 +219,61 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { ss = append(ss, string(fs.Get(i).Name())) } if len(ss) > 0 { - rs.recs = append(rs.recs, [2]string{"Fields", "[" + joinStrings(ss, false) + "]"}) + rs.AppendRecs("Fields", [2]string{"Fields", "[" + joinStrings(ss, false) + "]"}) } - default: - rs.Append(rv, descriptorAccessors[rt]...) + + case protoreflect.FileDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Path"), "Path"}, + {rv.MethodByName("Package"), "Package"}, + {rv.MethodByName("Imports"), "Imports"}, + {rv.MethodByName("Messages"), "Messages"}, + {rv.MethodByName("Enums"), "Enums"}, + {rv.MethodByName("Extensions"), "Extensions"}, + {rv.MethodByName("Services"), "Services"}, + }...) + + case protoreflect.MessageDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("IsMapEntry"), "IsMapEntry"}, + {rv.MethodByName("Fields"), "Fields"}, + {rv.MethodByName("Oneofs"), "Oneofs"}, + {rv.MethodByName("ReservedNames"), "ReservedNames"}, + {rv.MethodByName("ReservedRanges"), "ReservedRanges"}, + {rv.MethodByName("RequiredNumbers"), "RequiredNumbers"}, + {rv.MethodByName("ExtensionRanges"), "ExtensionRanges"}, + {rv.MethodByName("Messages"), "Messages"}, + {rv.MethodByName("Enums"), "Enums"}, + {rv.MethodByName("Extensions"), "Extensions"}, + }...) + + case protoreflect.EnumDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Values"), "Values"}, + {rv.MethodByName("ReservedNames"), "ReservedNames"}, + {rv.MethodByName("ReservedRanges"), "ReservedRanges"}, + }...) + + case protoreflect.EnumValueDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Number"), "Number"}, + }...) + + case protoreflect.ServiceDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Methods"), "Methods"}, + }...) + + case protoreflect.MethodDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Input"), "Input"}, + {rv.MethodByName("Output"), "Output"}, + {rv.MethodByName("IsStreamingClient"), "IsStreamingClient"}, + {rv.MethodByName("IsStreamingServer"), "IsStreamingServer"}, + }...) } - if rv.MethodByName("GoType").IsValid() { - rs.Append(rv, "GoType") + if m := rv.MethodByName("GoType"); m.IsValid() { + rs.Append(rv, methodAndName{m, "GoType"}) } } return start + rs.Join() + end @@ -202,19 +282,34 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { type records struct { recs [][2]string allowMulti bool + + // record is a function that will be called for every Append() or + // AppendRecs() call, to be used for testing with the + // InternalFormatDescOptForTesting function. + record func(string) } -func (rs *records) Append(v reflect.Value, accessors ...string) { +func (rs *records) AppendRecs(fieldName string, newRecs [2]string) { + if rs.record != nil { + rs.record(fieldName) + } + rs.recs = append(rs.recs, newRecs) +} + +func (rs *records) Append(v reflect.Value, accessors ...methodAndName) { for _, a := range accessors { + if rs.record != nil { + rs.record(a.name) + } var rv reflect.Value - if m := v.MethodByName(a); m.IsValid() { - rv = m.Call(nil)[0] + if a.method.IsValid() { + rv = a.method.Call(nil)[0] } if v.Kind() == reflect.Struct && !rv.IsValid() { - rv = v.FieldByName(a) + rv = v.FieldByName(a.name) } if !rv.IsValid() { - panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a)) + panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a.name)) } if _, ok := rv.Interface().(protoreflect.Value); ok { rv = rv.MethodByName("Interface").Call(nil)[0] @@ -261,7 +356,7 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { default: s = fmt.Sprint(v) } - rs.recs = append(rs.recs, [2]string{a, s}) + rs.recs = append(rs.recs, [2]string{a.name, s}) } } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 7c3689ba..193c68e8 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -21,11 +21,26 @@ import ( "google.golang.org/protobuf/reflect/protoregistry" ) +// Edition is an Enum for proto2.Edition +type Edition int32 + +// These values align with the value of Enum in descriptor.proto which allows +// direct conversion between the proto enum and this enum. +const ( + EditionUnknown Edition = 0 + EditionProto2 Edition = 998 + EditionProto3 Edition = 999 + Edition2023 Edition = 1000 + EditionUnsupported Edition = 100000 +) + // The types in this file may have a suffix: // • L0: Contains fields common to all descriptors (except File) and // must be initialized up front. // • L1: Contains fields specific to a descriptor and -// must be initialized up front. +// must be initialized up front. If the associated proto uses Editions, the +// Editions features must always be resolved. If not explicitly set, the +// appropriate default must be resolved and set. // • L2: Contains fields that are lazily initialized when constructing // from the raw file descriptor. When constructing as a literal, the L2 // fields must be initialized up front. @@ -44,6 +59,7 @@ type ( } FileL1 struct { Syntax protoreflect.Syntax + Edition Edition // Only used if Syntax == Editions Path string Package protoreflect.FullName @@ -51,12 +67,35 @@ type ( Messages Messages Extensions Extensions Services Services + + EditionFeatures FileEditionFeatures } FileL2 struct { Options func() protoreflect.ProtoMessage Imports FileImports Locations SourceLocations } + + FileEditionFeatures struct { + // IsFieldPresence is true if field_presence is EXPLICIT + // https://protobuf.dev/editions/features/#field_presence + IsFieldPresence bool + // IsOpenEnum is true if enum_type is OPEN + // https://protobuf.dev/editions/features/#enum_type + IsOpenEnum bool + // IsPacked is true if repeated_field_encoding is PACKED + // https://protobuf.dev/editions/features/#repeated_field_encoding + IsPacked bool + // IsUTF8Validated is true if utf_validation is VERIFY + // https://protobuf.dev/editions/features/#utf8_validation + IsUTF8Validated bool + // IsDelimitedEncoded is true if message_encoding is DELIMITED + // https://protobuf.dev/editions/features/#message_encoding + IsDelimitedEncoded bool + // IsJSONCompliant is true if json_format is ALLOW + // https://protobuf.dev/editions/features/#json_format + IsJSONCompliant bool + } ) func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } @@ -210,6 +249,9 @@ type ( ContainingOneof protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields Enum protoreflect.EnumDescriptor Message protoreflect.MessageDescriptor + + // Edition features. + Presence bool } Oneof struct { @@ -273,6 +315,9 @@ func (fd *Field) HasJSONName() bool { return fd.L1.StringNam func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } func (fd *Field) HasPresence() bool { + if fd.L0.ParentFile.L1.Syntax == protoreflect.Editions { + return fd.L1.Presence || fd.L1.Message != nil || fd.L1.ContainingOneof != nil + } return fd.L1.Cardinality != protoreflect.Repeated && (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) } func (fd *Field) HasOptionalKeyword() bool { diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go index 136f1b21..8f94230e 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go @@ -12,6 +12,12 @@ import ( const File_google_protobuf_descriptor_proto = "google/protobuf/descriptor.proto" +// Full and short names for google.protobuf.Edition. +const ( + Edition_enum_fullname = "google.protobuf.Edition" + Edition_enum_name = "Edition" +) + // Names for google.protobuf.FileDescriptorSet. const ( FileDescriptorSet_message_name protoreflect.Name = "FileDescriptorSet" @@ -81,7 +87,7 @@ const ( FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9 FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12 - FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 13 + FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 14 ) // Names for google.protobuf.DescriptorProto. @@ -184,10 +190,12 @@ const ( const ( ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" ExtensionRangeOptions_Declaration_field_name protoreflect.Name = "declaration" + ExtensionRangeOptions_Features_field_name protoreflect.Name = "features" ExtensionRangeOptions_Verification_field_name protoreflect.Name = "verification" ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option" ExtensionRangeOptions_Declaration_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.declaration" + ExtensionRangeOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.features" ExtensionRangeOptions_Verification_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.verification" ) @@ -195,6 +203,7 @@ const ( const ( ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ExtensionRangeOptions_Declaration_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Features_field_number protoreflect.FieldNumber = 50 ExtensionRangeOptions_Verification_field_number protoreflect.FieldNumber = 3 ) @@ -212,29 +221,26 @@ const ( // Field names for google.protobuf.ExtensionRangeOptions.Declaration. const ( - ExtensionRangeOptions_Declaration_Number_field_name protoreflect.Name = "number" - ExtensionRangeOptions_Declaration_FullName_field_name protoreflect.Name = "full_name" - ExtensionRangeOptions_Declaration_Type_field_name protoreflect.Name = "type" - ExtensionRangeOptions_Declaration_IsRepeated_field_name protoreflect.Name = "is_repeated" - ExtensionRangeOptions_Declaration_Reserved_field_name protoreflect.Name = "reserved" - ExtensionRangeOptions_Declaration_Repeated_field_name protoreflect.Name = "repeated" + ExtensionRangeOptions_Declaration_Number_field_name protoreflect.Name = "number" + ExtensionRangeOptions_Declaration_FullName_field_name protoreflect.Name = "full_name" + ExtensionRangeOptions_Declaration_Type_field_name protoreflect.Name = "type" + ExtensionRangeOptions_Declaration_Reserved_field_name protoreflect.Name = "reserved" + ExtensionRangeOptions_Declaration_Repeated_field_name protoreflect.Name = "repeated" - ExtensionRangeOptions_Declaration_Number_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.number" - ExtensionRangeOptions_Declaration_FullName_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.full_name" - ExtensionRangeOptions_Declaration_Type_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.type" - ExtensionRangeOptions_Declaration_IsRepeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.is_repeated" - ExtensionRangeOptions_Declaration_Reserved_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.reserved" - ExtensionRangeOptions_Declaration_Repeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.repeated" + ExtensionRangeOptions_Declaration_Number_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.number" + ExtensionRangeOptions_Declaration_FullName_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.full_name" + ExtensionRangeOptions_Declaration_Type_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.type" + ExtensionRangeOptions_Declaration_Reserved_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.reserved" + ExtensionRangeOptions_Declaration_Repeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.repeated" ) // Field numbers for google.protobuf.ExtensionRangeOptions.Declaration. const ( - ExtensionRangeOptions_Declaration_Number_field_number protoreflect.FieldNumber = 1 - ExtensionRangeOptions_Declaration_FullName_field_number protoreflect.FieldNumber = 2 - ExtensionRangeOptions_Declaration_Type_field_number protoreflect.FieldNumber = 3 - ExtensionRangeOptions_Declaration_IsRepeated_field_number protoreflect.FieldNumber = 4 - ExtensionRangeOptions_Declaration_Reserved_field_number protoreflect.FieldNumber = 5 - ExtensionRangeOptions_Declaration_Repeated_field_number protoreflect.FieldNumber = 6 + ExtensionRangeOptions_Declaration_Number_field_number protoreflect.FieldNumber = 1 + ExtensionRangeOptions_Declaration_FullName_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Declaration_Type_field_number protoreflect.FieldNumber = 3 + ExtensionRangeOptions_Declaration_Reserved_field_number protoreflect.FieldNumber = 5 + ExtensionRangeOptions_Declaration_Repeated_field_number protoreflect.FieldNumber = 6 ) // Names for google.protobuf.FieldDescriptorProto. @@ -478,6 +484,7 @@ const ( FileOptions_PhpNamespace_field_name protoreflect.Name = "php_namespace" FileOptions_PhpMetadataNamespace_field_name protoreflect.Name = "php_metadata_namespace" FileOptions_RubyPackage_field_name protoreflect.Name = "ruby_package" + FileOptions_Features_field_name protoreflect.Name = "features" FileOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" FileOptions_JavaPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_package" @@ -500,6 +507,7 @@ const ( FileOptions_PhpNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_namespace" FileOptions_PhpMetadataNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_metadata_namespace" FileOptions_RubyPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.ruby_package" + FileOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.features" FileOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.uninterpreted_option" ) @@ -525,6 +533,7 @@ const ( FileOptions_PhpNamespace_field_number protoreflect.FieldNumber = 41 FileOptions_PhpMetadataNamespace_field_number protoreflect.FieldNumber = 44 FileOptions_RubyPackage_field_number protoreflect.FieldNumber = 45 + FileOptions_Features_field_number protoreflect.FieldNumber = 50 FileOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -547,6 +556,7 @@ const ( MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + MessageOptions_Features_field_name protoreflect.Name = "features" MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" @@ -554,6 +564,7 @@ const ( MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts" + MessageOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.features" MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" ) @@ -564,6 +575,7 @@ const ( MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 11 + MessageOptions_Features_field_number protoreflect.FieldNumber = 12 MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -584,8 +596,9 @@ const ( FieldOptions_Weak_field_name protoreflect.Name = "weak" FieldOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" FieldOptions_Retention_field_name protoreflect.Name = "retention" - FieldOptions_Target_field_name protoreflect.Name = "target" FieldOptions_Targets_field_name protoreflect.Name = "targets" + FieldOptions_EditionDefaults_field_name protoreflect.Name = "edition_defaults" + FieldOptions_Features_field_name protoreflect.Name = "features" FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype" @@ -597,8 +610,9 @@ const ( FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak" FieldOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.debug_redact" FieldOptions_Retention_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.retention" - FieldOptions_Target_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.target" FieldOptions_Targets_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.targets" + FieldOptions_EditionDefaults_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.edition_defaults" + FieldOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.features" FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" ) @@ -613,8 +627,9 @@ const ( FieldOptions_Weak_field_number protoreflect.FieldNumber = 10 FieldOptions_DebugRedact_field_number protoreflect.FieldNumber = 16 FieldOptions_Retention_field_number protoreflect.FieldNumber = 17 - FieldOptions_Target_field_number protoreflect.FieldNumber = 18 FieldOptions_Targets_field_number protoreflect.FieldNumber = 19 + FieldOptions_EditionDefaults_field_number protoreflect.FieldNumber = 20 + FieldOptions_Features_field_number protoreflect.FieldNumber = 21 FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -642,6 +657,27 @@ const ( FieldOptions_OptionTargetType_enum_name = "OptionTargetType" ) +// Names for google.protobuf.FieldOptions.EditionDefault. +const ( + FieldOptions_EditionDefault_message_name protoreflect.Name = "EditionDefault" + FieldOptions_EditionDefault_message_fullname protoreflect.FullName = "google.protobuf.FieldOptions.EditionDefault" +) + +// Field names for google.protobuf.FieldOptions.EditionDefault. +const ( + FieldOptions_EditionDefault_Edition_field_name protoreflect.Name = "edition" + FieldOptions_EditionDefault_Value_field_name protoreflect.Name = "value" + + FieldOptions_EditionDefault_Edition_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.EditionDefault.edition" + FieldOptions_EditionDefault_Value_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.EditionDefault.value" +) + +// Field numbers for google.protobuf.FieldOptions.EditionDefault. +const ( + FieldOptions_EditionDefault_Edition_field_number protoreflect.FieldNumber = 3 + FieldOptions_EditionDefault_Value_field_number protoreflect.FieldNumber = 2 +) + // Names for google.protobuf.OneofOptions. const ( OneofOptions_message_name protoreflect.Name = "OneofOptions" @@ -650,13 +686,16 @@ const ( // Field names for google.protobuf.OneofOptions. const ( + OneofOptions_Features_field_name protoreflect.Name = "features" OneofOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + OneofOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.features" OneofOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.uninterpreted_option" ) // Field numbers for google.protobuf.OneofOptions. const ( + OneofOptions_Features_field_number protoreflect.FieldNumber = 1 OneofOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -671,11 +710,13 @@ const ( EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + EnumOptions_Features_field_name protoreflect.Name = "features" EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts" + EnumOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.features" EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" ) @@ -684,6 +725,7 @@ const ( EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 6 + EnumOptions_Features_field_number protoreflect.FieldNumber = 7 EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -696,15 +738,21 @@ const ( // Field names for google.protobuf.EnumValueOptions. const ( EnumValueOptions_Deprecated_field_name protoreflect.Name = "deprecated" + EnumValueOptions_Features_field_name protoreflect.Name = "features" + EnumValueOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" EnumValueOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" EnumValueOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.deprecated" + EnumValueOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.features" + EnumValueOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.debug_redact" EnumValueOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.uninterpreted_option" ) // Field numbers for google.protobuf.EnumValueOptions. const ( EnumValueOptions_Deprecated_field_number protoreflect.FieldNumber = 1 + EnumValueOptions_Features_field_number protoreflect.FieldNumber = 2 + EnumValueOptions_DebugRedact_field_number protoreflect.FieldNumber = 3 EnumValueOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -716,15 +764,18 @@ const ( // Field names for google.protobuf.ServiceOptions. const ( + ServiceOptions_Features_field_name protoreflect.Name = "features" ServiceOptions_Deprecated_field_name protoreflect.Name = "deprecated" ServiceOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + ServiceOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.features" ServiceOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.deprecated" ServiceOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.uninterpreted_option" ) // Field numbers for google.protobuf.ServiceOptions. const ( + ServiceOptions_Features_field_number protoreflect.FieldNumber = 34 ServiceOptions_Deprecated_field_number protoreflect.FieldNumber = 33 ServiceOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -739,10 +790,12 @@ const ( const ( MethodOptions_Deprecated_field_name protoreflect.Name = "deprecated" MethodOptions_IdempotencyLevel_field_name protoreflect.Name = "idempotency_level" + MethodOptions_Features_field_name protoreflect.Name = "features" MethodOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" MethodOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.deprecated" MethodOptions_IdempotencyLevel_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.idempotency_level" + MethodOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.features" MethodOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.uninterpreted_option" ) @@ -750,6 +803,7 @@ const ( const ( MethodOptions_Deprecated_field_number protoreflect.FieldNumber = 33 MethodOptions_IdempotencyLevel_field_number protoreflect.FieldNumber = 34 + MethodOptions_Features_field_number protoreflect.FieldNumber = 35 MethodOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -816,6 +870,120 @@ const ( UninterpretedOption_NamePart_IsExtension_field_number protoreflect.FieldNumber = 2 ) +// Names for google.protobuf.FeatureSet. +const ( + FeatureSet_message_name protoreflect.Name = "FeatureSet" + FeatureSet_message_fullname protoreflect.FullName = "google.protobuf.FeatureSet" +) + +// Field names for google.protobuf.FeatureSet. +const ( + FeatureSet_FieldPresence_field_name protoreflect.Name = "field_presence" + FeatureSet_EnumType_field_name protoreflect.Name = "enum_type" + FeatureSet_RepeatedFieldEncoding_field_name protoreflect.Name = "repeated_field_encoding" + FeatureSet_Utf8Validation_field_name protoreflect.Name = "utf8_validation" + FeatureSet_MessageEncoding_field_name protoreflect.Name = "message_encoding" + FeatureSet_JsonFormat_field_name protoreflect.Name = "json_format" + + FeatureSet_FieldPresence_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.field_presence" + FeatureSet_EnumType_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.enum_type" + FeatureSet_RepeatedFieldEncoding_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.repeated_field_encoding" + FeatureSet_Utf8Validation_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.utf8_validation" + FeatureSet_MessageEncoding_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.message_encoding" + FeatureSet_JsonFormat_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.json_format" +) + +// Field numbers for google.protobuf.FeatureSet. +const ( + FeatureSet_FieldPresence_field_number protoreflect.FieldNumber = 1 + FeatureSet_EnumType_field_number protoreflect.FieldNumber = 2 + FeatureSet_RepeatedFieldEncoding_field_number protoreflect.FieldNumber = 3 + FeatureSet_Utf8Validation_field_number protoreflect.FieldNumber = 4 + FeatureSet_MessageEncoding_field_number protoreflect.FieldNumber = 5 + FeatureSet_JsonFormat_field_number protoreflect.FieldNumber = 6 +) + +// Full and short names for google.protobuf.FeatureSet.FieldPresence. +const ( + FeatureSet_FieldPresence_enum_fullname = "google.protobuf.FeatureSet.FieldPresence" + FeatureSet_FieldPresence_enum_name = "FieldPresence" +) + +// Full and short names for google.protobuf.FeatureSet.EnumType. +const ( + FeatureSet_EnumType_enum_fullname = "google.protobuf.FeatureSet.EnumType" + FeatureSet_EnumType_enum_name = "EnumType" +) + +// Full and short names for google.protobuf.FeatureSet.RepeatedFieldEncoding. +const ( + FeatureSet_RepeatedFieldEncoding_enum_fullname = "google.protobuf.FeatureSet.RepeatedFieldEncoding" + FeatureSet_RepeatedFieldEncoding_enum_name = "RepeatedFieldEncoding" +) + +// Full and short names for google.protobuf.FeatureSet.Utf8Validation. +const ( + FeatureSet_Utf8Validation_enum_fullname = "google.protobuf.FeatureSet.Utf8Validation" + FeatureSet_Utf8Validation_enum_name = "Utf8Validation" +) + +// Full and short names for google.protobuf.FeatureSet.MessageEncoding. +const ( + FeatureSet_MessageEncoding_enum_fullname = "google.protobuf.FeatureSet.MessageEncoding" + FeatureSet_MessageEncoding_enum_name = "MessageEncoding" +) + +// Full and short names for google.protobuf.FeatureSet.JsonFormat. +const ( + FeatureSet_JsonFormat_enum_fullname = "google.protobuf.FeatureSet.JsonFormat" + FeatureSet_JsonFormat_enum_name = "JsonFormat" +) + +// Names for google.protobuf.FeatureSetDefaults. +const ( + FeatureSetDefaults_message_name protoreflect.Name = "FeatureSetDefaults" + FeatureSetDefaults_message_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults" +) + +// Field names for google.protobuf.FeatureSetDefaults. +const ( + FeatureSetDefaults_Defaults_field_name protoreflect.Name = "defaults" + FeatureSetDefaults_MinimumEdition_field_name protoreflect.Name = "minimum_edition" + FeatureSetDefaults_MaximumEdition_field_name protoreflect.Name = "maximum_edition" + + FeatureSetDefaults_Defaults_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.defaults" + FeatureSetDefaults_MinimumEdition_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.minimum_edition" + FeatureSetDefaults_MaximumEdition_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.maximum_edition" +) + +// Field numbers for google.protobuf.FeatureSetDefaults. +const ( + FeatureSetDefaults_Defaults_field_number protoreflect.FieldNumber = 1 + FeatureSetDefaults_MinimumEdition_field_number protoreflect.FieldNumber = 4 + FeatureSetDefaults_MaximumEdition_field_number protoreflect.FieldNumber = 5 +) + +// Names for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. +const ( + FeatureSetDefaults_FeatureSetEditionDefault_message_name protoreflect.Name = "FeatureSetEditionDefault" + FeatureSetDefaults_FeatureSetEditionDefault_message_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault" +) + +// Field names for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. +const ( + FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_name protoreflect.Name = "edition" + FeatureSetDefaults_FeatureSetEditionDefault_Features_field_name protoreflect.Name = "features" + + FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.edition" + FeatureSetDefaults_FeatureSetEditionDefault_Features_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.features" +) + +// Field numbers for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. +const ( + FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number protoreflect.FieldNumber = 3 + FeatureSetDefaults_FeatureSetEditionDefault_Features_field_number protoreflect.FieldNumber = 2 +) + // Names for google.protobuf.SourceCodeInfo. const ( SourceCodeInfo_message_name protoreflect.Name = "SourceCodeInfo" diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go b/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go index 1a509b63..f55dc01e 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go @@ -162,11 +162,20 @@ func appendBoolSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions func consumeBoolSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.BoolSlice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growBoolSlice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -732,11 +741,20 @@ func appendInt32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOption func consumeInt32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt32Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -1138,11 +1156,20 @@ func appendSint32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeSint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt32Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -1544,11 +1571,20 @@ func appendUint32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeUint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growUint32Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -1950,11 +1986,20 @@ func appendInt64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOption func consumeInt64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt64Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -2356,11 +2401,20 @@ func appendSint64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeSint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt64Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -2762,11 +2816,20 @@ func appendUint64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeUint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growUint64Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -3145,11 +3208,15 @@ func appendSfixed32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpt func consumeSfixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed32() + if count > 0 { + p.growInt32Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed32(b) if n < 0 { @@ -3461,11 +3528,15 @@ func appendFixed32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpti func consumeFixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed32() + if count > 0 { + p.growUint32Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed32(b) if n < 0 { @@ -3777,11 +3848,15 @@ func appendFloatSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOption func consumeFloatSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Float32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed32() + if count > 0 { + p.growFloat32Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed32(b) if n < 0 { @@ -4093,11 +4168,15 @@ func appendSfixed64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpt func consumeSfixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed64() + if count > 0 { + p.growInt64Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed64(b) if n < 0 { @@ -4409,11 +4488,15 @@ func appendFixed64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpti func consumeFixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed64() + if count > 0 { + p.growUint64Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed64(b) if n < 0 { @@ -4725,11 +4808,15 @@ func appendDoubleSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeDoubleSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Float64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed64() + if count > 0 { + p.growFloat64Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed64(b) if n < 0 { diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go index 61c483fa..2ab2c629 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go @@ -206,13 +206,18 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name protoreflect.FullName // Obtain a list of oneof wrapper types. var oneofWrappers []reflect.Type - for _, method := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} { - if fn, ok := t.MethodByName(method); ok { - for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { - if vs, ok := v.Interface().([]interface{}); ok { - for _, v := range vs { - oneofWrappers = append(oneofWrappers, reflect.TypeOf(v)) - } + methods := make([]reflect.Method, 0, 2) + if m, ok := t.MethodByName("XXX_OneofFuncs"); ok { + methods = append(methods, m) + } + if m, ok := t.MethodByName("XXX_OneofWrappers"); ok { + methods = append(methods, m) + } + for _, fn := range methods { + for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { + if vs, ok := v.Interface().([]interface{}); ok { + for _, v := range vs { + oneofWrappers = append(oneofWrappers, reflect.TypeOf(v)) } } } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go index 4f5fb67a..629bacdc 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message.go @@ -192,12 +192,17 @@ fieldLoop: // Derive a mapping of oneof wrappers to fields. oneofWrappers := mi.OneofWrappers - for _, method := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} { - if fn, ok := reflect.PtrTo(t).MethodByName(method); ok { - for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { - if vs, ok := v.Interface().([]interface{}); ok { - oneofWrappers = vs - } + methods := make([]reflect.Method, 0, 2) + if m, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok { + methods = append(methods, m) + } + if m, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok { + methods = append(methods, m) + } + for _, fn := range methods { + for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { + if vs, ok := v.Interface().([]interface{}); ok { + oneofWrappers = vs } } } diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go index 4c491bdf..517e9443 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go @@ -159,6 +159,42 @@ func (p pointer) SetPointer(v pointer) { p.v.Elem().Set(v.v) } +func growSlice(p pointer, addCap int) { + // TODO: Once we only support Go 1.20 and newer, use reflect.Grow. + in := p.v.Elem() + out := reflect.MakeSlice(in.Type(), in.Len(), in.Len()+addCap) + reflect.Copy(out, in) + p.v.Elem().Set(out) +} + +func (p pointer) growBoolSlice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growInt32Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growUint32Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growInt64Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growUint64Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growFloat64Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growFloat32Slice(addCap int) { + growSlice(p, addCap) +} + func (Export) MessageStateOf(p Pointer) *messageState { panic("not supported") } func (ms *messageState) pointer() pointer { panic("not supported") } func (ms *messageState) messageInfo() *MessageInfo { panic("not supported") } diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go index ee0e0573..4b020e31 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go @@ -138,6 +138,46 @@ func (p pointer) SetPointer(v pointer) { *(*unsafe.Pointer)(p.p) = (unsafe.Pointer)(v.p) } +func (p pointer) growBoolSlice(addCap int) { + sp := p.BoolSlice() + s := make([]bool, 0, addCap+len(*sp)) + s = s[:len(*sp)] + copy(s, *sp) + *sp = s +} + +func (p pointer) growInt32Slice(addCap int) { + sp := p.Int32Slice() + s := make([]int32, 0, addCap+len(*sp)) + s = s[:len(*sp)] + copy(s, *sp) + *sp = s +} + +func (p pointer) growUint32Slice(addCap int) { + p.growInt32Slice(addCap) +} + +func (p pointer) growFloat32Slice(addCap int) { + p.growInt32Slice(addCap) +} + +func (p pointer) growInt64Slice(addCap int) { + sp := p.Int64Slice() + s := make([]int64, 0, addCap+len(*sp)) + s = s[:len(*sp)] + copy(s, *sp) + *sp = s +} + +func (p pointer) growUint64Slice(addCap int) { + p.growInt64Slice(addCap) +} + +func (p pointer) growFloat64Slice(addCap int) { + p.growInt64Slice(addCap) +} + // Static check that MessageState does not exceed the size of a pointer. const _ = uint(unsafe.Sizeof(unsafe.Pointer(nil)) - unsafe.Sizeof(MessageState{})) diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go similarity index 96% rename from vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go rename to vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go index 61a84d34..a008acd0 100644 --- a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !purego && !appengine -// +build !purego,!appengine +//go:build !purego && !appengine && !go1.21 +// +build !purego,!appengine,!go1.21 package strs diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go new file mode 100644 index 00000000..60166f2b --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go @@ -0,0 +1,74 @@ +// 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 file. + +//go:build !purego && !appengine && go1.21 +// +build !purego,!appengine,go1.21 + +package strs + +import ( + "unsafe" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +// UnsafeString returns an unsafe string reference of b. +// The caller must treat the input slice as immutable. +// +// WARNING: Use carefully. The returned result must not leak to the end user +// unless the input slice is provably immutable. +func UnsafeString(b []byte) string { + return unsafe.String(unsafe.SliceData(b), len(b)) +} + +// UnsafeBytes returns an unsafe bytes slice reference of s. +// The caller must treat returned slice as immutable. +// +// WARNING: Use carefully. The returned result must not leak to the end user. +func UnsafeBytes(s string) []byte { + return unsafe.Slice(unsafe.StringData(s), len(s)) +} + +// Builder builds a set of strings with shared lifetime. +// This differs from strings.Builder, which is for building a single string. +type Builder struct { + buf []byte +} + +// AppendFullName is equivalent to protoreflect.FullName.Append, +// but optimized for large batches where each name has a shared lifetime. +func (sb *Builder) AppendFullName(prefix protoreflect.FullName, name protoreflect.Name) protoreflect.FullName { + n := len(prefix) + len(".") + len(name) + if len(prefix) == 0 { + n -= len(".") + } + sb.grow(n) + sb.buf = append(sb.buf, prefix...) + sb.buf = append(sb.buf, '.') + sb.buf = append(sb.buf, name...) + return protoreflect.FullName(sb.last(n)) +} + +// MakeString is equivalent to string(b), but optimized for large batches +// with a shared lifetime. +func (sb *Builder) MakeString(b []byte) string { + sb.grow(len(b)) + sb.buf = append(sb.buf, b...) + return sb.last(len(b)) +} + +func (sb *Builder) grow(n int) { + if cap(sb.buf)-len(sb.buf) >= n { + return + } + + // Unlike strings.Builder, we do not need to copy over the contents + // of the old buffer since our builder provides no API for + // retrieving previously created strings. + sb.buf = make([]byte, 0, 2*(cap(sb.buf)+n)) +} + +func (sb *Builder) last(n int) string { + return UnsafeString(sb.buf[len(sb.buf)-n:]) +} diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 0999f29d..d8f48faf 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -51,7 +51,7 @@ import ( // 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 31 + Minor = 32 Patch = 0 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index 48d47946..e5b03b56 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -69,7 +69,7 @@ func (o UnmarshalOptions) Unmarshal(b []byte, m Message) error { // UnmarshalState parses a wire-format message and places the result in m. // // This method permits fine-grained control over the unmarshaler. -// Most users should use Unmarshal instead. +// Most users should use [Unmarshal] instead. func (o UnmarshalOptions) UnmarshalState(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { if o.RecursionLimit == 0 { o.RecursionLimit = protowire.DefaultRecursionLimit diff --git a/vendor/google.golang.org/protobuf/proto/doc.go b/vendor/google.golang.org/protobuf/proto/doc.go index ec71e717..80ed16a0 100644 --- a/vendor/google.golang.org/protobuf/proto/doc.go +++ b/vendor/google.golang.org/protobuf/proto/doc.go @@ -18,27 +18,27 @@ // This package contains functions to convert to and from the wire format, // an efficient binary serialization of protocol buffers. // -// • Size reports the size of a message in the wire format. +// - [Size] reports the size of a message in the wire format. // -// • Marshal converts a message to the wire format. -// The MarshalOptions type provides more control over wire marshaling. +// - [Marshal] converts a message to the wire format. +// The [MarshalOptions] type provides more control over wire marshaling. // -// • Unmarshal converts a message from the wire format. -// The UnmarshalOptions type provides more control over wire unmarshaling. +// - [Unmarshal] converts a message from the wire format. +// The [UnmarshalOptions] type provides more control over wire unmarshaling. // // # Basic message operations // -// • Clone makes a deep copy of a message. +// - [Clone] makes a deep copy of a message. // -// • Merge merges the content of a message into another. +// - [Merge] merges the content of a message into another. // -// • Equal compares two messages. For more control over comparisons -// and detailed reporting of differences, see package -// "google.golang.org/protobuf/testing/protocmp". +// - [Equal] compares two messages. For more control over comparisons +// and detailed reporting of differences, see package +// [google.golang.org/protobuf/testing/protocmp]. // -// • Reset clears the content of a message. +// - [Reset] clears the content of a message. // -// • CheckInitialized reports whether all required fields in a message are set. +// - [CheckInitialized] reports whether all required fields in a message are set. // // # Optional scalar constructors // @@ -46,9 +46,9 @@ // as pointers to a value. For example, an optional string field has the // Go type *string. // -// • Bool, Int32, Int64, Uint32, Uint64, Float32, Float64, and String -// take a value and return a pointer to a new instance of it, -// to simplify construction of optional field values. +// - [Bool], [Int32], [Int64], [Uint32], [Uint64], [Float32], [Float64], and [String] +// take a value and return a pointer to a new instance of it, +// to simplify construction of optional field values. // // Generated enum types usually have an Enum method which performs the // same operation. @@ -57,29 +57,29 @@ // // # Extension accessors // -// • HasExtension, GetExtension, SetExtension, and ClearExtension -// access extension field values in a protocol buffer message. +// - [HasExtension], [GetExtension], [SetExtension], and [ClearExtension] +// access extension field values in a protocol buffer message. // // Extension fields are only supported in proto2. // // # Related packages // -// • Package "google.golang.org/protobuf/encoding/protojson" converts messages to -// and from JSON. +// - Package [google.golang.org/protobuf/encoding/protojson] converts messages to +// and from JSON. // -// • Package "google.golang.org/protobuf/encoding/prototext" converts messages to -// and from the text format. +// - Package [google.golang.org/protobuf/encoding/prototext] converts messages to +// and from the text format. // -// • Package "google.golang.org/protobuf/reflect/protoreflect" provides a -// reflection interface for protocol buffer data types. +// - Package [google.golang.org/protobuf/reflect/protoreflect] provides a +// reflection interface for protocol buffer data types. // -// • Package "google.golang.org/protobuf/testing/protocmp" provides features -// to compare protocol buffer messages with the "github.com/google/go-cmp/cmp" -// package. +// - Package [google.golang.org/protobuf/testing/protocmp] provides features +// to compare protocol buffer messages with the [github.com/google/go-cmp/cmp] +// package. // -// • Package "google.golang.org/protobuf/types/dynamicpb" provides a dynamic -// message type, suitable for working with messages where the protocol buffer -// type is only known at runtime. +// - Package [google.golang.org/protobuf/types/dynamicpb] provides a dynamic +// message type, suitable for working with messages where the protocol buffer +// type is only known at runtime. // // This module contains additional packages for more specialized use cases. // Consult the individual package documentation for details. diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go index bf7f816d..4fed202f 100644 --- a/vendor/google.golang.org/protobuf/proto/encode.go +++ b/vendor/google.golang.org/protobuf/proto/encode.go @@ -129,7 +129,7 @@ func (o MarshalOptions) MarshalAppend(b []byte, m Message) ([]byte, error) { // MarshalState returns the wire-format encoding of a message. // // This method permits fine-grained control over the marshaler. -// Most users should use Marshal instead. +// Most users should use [Marshal] instead. func (o MarshalOptions) MarshalState(in protoiface.MarshalInput) (protoiface.MarshalOutput, error) { return o.marshal(in.Buf, in.Message) } diff --git a/vendor/google.golang.org/protobuf/proto/extension.go b/vendor/google.golang.org/protobuf/proto/extension.go index 5f293cda..17899a3a 100644 --- a/vendor/google.golang.org/protobuf/proto/extension.go +++ b/vendor/google.golang.org/protobuf/proto/extension.go @@ -26,7 +26,7 @@ func HasExtension(m Message, xt protoreflect.ExtensionType) bool { } // ClearExtension clears an extension field such that subsequent -// HasExtension calls return false. +// [HasExtension] calls return false. // It panics if m is invalid or if xt does not extend m. func ClearExtension(m Message, xt protoreflect.ExtensionType) { m.ProtoReflect().Clear(xt.TypeDescriptor()) diff --git a/vendor/google.golang.org/protobuf/proto/merge.go b/vendor/google.golang.org/protobuf/proto/merge.go index d761ab33..3c6fe578 100644 --- a/vendor/google.golang.org/protobuf/proto/merge.go +++ b/vendor/google.golang.org/protobuf/proto/merge.go @@ -21,7 +21,7 @@ import ( // The unknown fields of src are appended to the unknown fields of dst. // // It is semantically equivalent to unmarshaling the encoded form of src -// into dst with the UnmarshalOptions.Merge option specified. +// into dst with the [UnmarshalOptions.Merge] option specified. func Merge(dst, src Message) { // TODO: Should nil src be treated as semantically equivalent to a // untyped, read-only, empty message? What about a nil dst? diff --git a/vendor/google.golang.org/protobuf/proto/proto.go b/vendor/google.golang.org/protobuf/proto/proto.go index 1f0d183b..7543ee6b 100644 --- a/vendor/google.golang.org/protobuf/proto/proto.go +++ b/vendor/google.golang.org/protobuf/proto/proto.go @@ -15,18 +15,20 @@ import ( // protobuf module that accept a Message, except where otherwise specified. // // This is the v2 interface definition for protobuf messages. -// The v1 interface definition is "github.com/golang/protobuf/proto".Message. +// The v1 interface definition is [github.com/golang/protobuf/proto.Message]. // -// To convert a v1 message to a v2 message, -// use "github.com/golang/protobuf/proto".MessageV2. -// To convert a v2 message to a v1 message, -// use "github.com/golang/protobuf/proto".MessageV1. +// - To convert a v1 message to a v2 message, +// use [google.golang.org/protobuf/protoadapt.MessageV2Of]. +// - To convert a v2 message to a v1 message, +// use [google.golang.org/protobuf/protoadapt.MessageV1Of]. type Message = protoreflect.ProtoMessage -// Error matches all errors produced by packages in the protobuf module. +// Error matches all errors produced by packages in the protobuf module +// according to [errors.Is]. // -// That is, errors.Is(err, Error) reports whether an error is produced -// by this module. +// Example usage: +// +// if errors.Is(err, proto.Error) { ... } var Error error func init() { diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go deleted file mode 100644 index e4dfb120..00000000 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +++ /dev/null @@ -1,276 +0,0 @@ -// 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 file. - -// Package protodesc provides functionality for converting -// FileDescriptorProto messages to/from protoreflect.FileDescriptor values. -// -// The google.protobuf.FileDescriptorProto is a protobuf message that describes -// the type information for a .proto file in a form that is easily serializable. -// The protoreflect.FileDescriptor is a more structured representation of -// the FileDescriptorProto message where references and remote dependencies -// can be directly followed. -package protodesc - -import ( - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/pragma" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - - "google.golang.org/protobuf/types/descriptorpb" -) - -// Resolver is the resolver used by NewFile to resolve dependencies. -// The enums and messages provided must belong to some parent file, -// which is also registered. -// -// It is implemented by protoregistry.Files. -type Resolver interface { - FindFileByPath(string) (protoreflect.FileDescriptor, error) - FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) -} - -// FileOptions configures the construction of file descriptors. -type FileOptions struct { - pragma.NoUnkeyedLiterals - - // AllowUnresolvable configures New to permissively allow unresolvable - // file, enum, or message dependencies. Unresolved dependencies are replaced - // by placeholder equivalents. - // - // The following dependencies may be left unresolved: - // • Resolving an imported file. - // • Resolving the type for a message field or extension field. - // If the kind of the field is unknown, then a placeholder is used for both - // the Enum and Message accessors on the protoreflect.FieldDescriptor. - // • Resolving an enum value set as the default for an optional enum field. - // If unresolvable, the protoreflect.FieldDescriptor.Default is set to the - // first value in the associated enum (or zero if the also enum dependency - // is also unresolvable). The protoreflect.FieldDescriptor.DefaultEnumValue - // is populated with a placeholder. - // • Resolving the extended message type for an extension field. - // • Resolving the input or output message type for a service method. - // - // If the unresolved dependency uses a relative name, - // then the placeholder will contain an invalid FullName with a "*." prefix, - // indicating that the starting prefix of the full name is unknown. - AllowUnresolvable bool -} - -// NewFile creates a new protoreflect.FileDescriptor from the provided -// file descriptor message. See FileOptions.New for more information. -func NewFile(fd *descriptorpb.FileDescriptorProto, r Resolver) (protoreflect.FileDescriptor, error) { - return FileOptions{}.New(fd, r) -} - -// NewFiles creates a new protoregistry.Files from the provided -// FileDescriptorSet message. See FileOptions.NewFiles for more information. -func NewFiles(fd *descriptorpb.FileDescriptorSet) (*protoregistry.Files, error) { - return FileOptions{}.NewFiles(fd) -} - -// New creates a new protoreflect.FileDescriptor from the provided -// file descriptor message. The file must represent a valid proto file according -// to protobuf semantics. The returned descriptor is a deep copy of the input. -// -// Any imported files, enum types, or message types referenced in the file are -// resolved using the provided registry. When looking up an import file path, -// the path must be unique. The newly created file descriptor is not registered -// back into the provided file registry. -func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (protoreflect.FileDescriptor, error) { - if r == nil { - r = (*protoregistry.Files)(nil) // empty resolver - } - - // Handle the file descriptor content. - f := &filedesc.File{L2: &filedesc.FileL2{}} - switch fd.GetSyntax() { - case "proto2", "": - f.L1.Syntax = protoreflect.Proto2 - case "proto3": - f.L1.Syntax = protoreflect.Proto3 - default: - return nil, errors.New("invalid syntax: %q", fd.GetSyntax()) - } - f.L1.Path = fd.GetName() - if f.L1.Path == "" { - return nil, errors.New("file path must be populated") - } - f.L1.Package = protoreflect.FullName(fd.GetPackage()) - if !f.L1.Package.IsValid() && f.L1.Package != "" { - return nil, errors.New("invalid package: %q", f.L1.Package) - } - if opts := fd.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.FileOptions) - f.L2.Options = func() protoreflect.ProtoMessage { return opts } - } - - f.L2.Imports = make(filedesc.FileImports, len(fd.GetDependency())) - for _, i := range fd.GetPublicDependency() { - if !(0 <= i && int(i) < len(f.L2.Imports)) || f.L2.Imports[i].IsPublic { - return nil, errors.New("invalid or duplicate public import index: %d", i) - } - f.L2.Imports[i].IsPublic = true - } - for _, i := range fd.GetWeakDependency() { - if !(0 <= i && int(i) < len(f.L2.Imports)) || f.L2.Imports[i].IsWeak { - return nil, errors.New("invalid or duplicate weak import index: %d", i) - } - f.L2.Imports[i].IsWeak = true - } - imps := importSet{f.Path(): true} - for i, path := range fd.GetDependency() { - imp := &f.L2.Imports[i] - f, err := r.FindFileByPath(path) - if err == protoregistry.NotFound && (o.AllowUnresolvable || imp.IsWeak) { - f = filedesc.PlaceholderFile(path) - } else if err != nil { - return nil, errors.New("could not resolve import %q: %v", path, err) - } - imp.FileDescriptor = f - - if imps[imp.Path()] { - return nil, errors.New("already imported %q", path) - } - imps[imp.Path()] = true - } - for i := range fd.GetDependency() { - imp := &f.L2.Imports[i] - imps.importPublic(imp.Imports()) - } - - // Handle source locations. - f.L2.Locations.File = f - for _, loc := range fd.GetSourceCodeInfo().GetLocation() { - var l protoreflect.SourceLocation - // TODO: Validate that the path points to an actual declaration? - l.Path = protoreflect.SourcePath(loc.GetPath()) - s := loc.GetSpan() - switch len(s) { - case 3: - l.StartLine, l.StartColumn, l.EndLine, l.EndColumn = int(s[0]), int(s[1]), int(s[0]), int(s[2]) - case 4: - l.StartLine, l.StartColumn, l.EndLine, l.EndColumn = int(s[0]), int(s[1]), int(s[2]), int(s[3]) - default: - return nil, errors.New("invalid span: %v", s) - } - // TODO: Validate that the span information is sensible? - // See https://github.com/protocolbuffers/protobuf/issues/6378. - if false && (l.EndLine < l.StartLine || l.StartLine < 0 || l.StartColumn < 0 || l.EndColumn < 0 || - (l.StartLine == l.EndLine && l.EndColumn <= l.StartColumn)) { - return nil, errors.New("invalid span: %v", s) - } - l.LeadingDetachedComments = loc.GetLeadingDetachedComments() - l.LeadingComments = loc.GetLeadingComments() - l.TrailingComments = loc.GetTrailingComments() - f.L2.Locations.List = append(f.L2.Locations.List, l) - } - - // Step 1: Allocate and derive the names for all declarations. - // This copies all fields from the descriptor proto except: - // google.protobuf.FieldDescriptorProto.type_name - // google.protobuf.FieldDescriptorProto.default_value - // google.protobuf.FieldDescriptorProto.oneof_index - // google.protobuf.FieldDescriptorProto.extendee - // google.protobuf.MethodDescriptorProto.input - // google.protobuf.MethodDescriptorProto.output - var err error - sb := new(strs.Builder) - r1 := make(descsByName) - if f.L1.Enums.List, err = r1.initEnumDeclarations(fd.GetEnumType(), f, sb); err != nil { - return nil, err - } - if f.L1.Messages.List, err = r1.initMessagesDeclarations(fd.GetMessageType(), f, sb); err != nil { - return nil, err - } - if f.L1.Extensions.List, err = r1.initExtensionDeclarations(fd.GetExtension(), f, sb); err != nil { - return nil, err - } - if f.L1.Services.List, err = r1.initServiceDeclarations(fd.GetService(), f, sb); err != nil { - return nil, err - } - - // Step 2: Resolve every dependency reference not handled by step 1. - r2 := &resolver{local: r1, remote: r, imports: imps, allowUnresolvable: o.AllowUnresolvable} - if err := r2.resolveMessageDependencies(f.L1.Messages.List, fd.GetMessageType()); err != nil { - return nil, err - } - if err := r2.resolveExtensionDependencies(f.L1.Extensions.List, fd.GetExtension()); err != nil { - return nil, err - } - if err := r2.resolveServiceDependencies(f.L1.Services.List, fd.GetService()); err != nil { - return nil, err - } - - // Step 3: Validate every enum, message, and extension declaration. - if err := validateEnumDeclarations(f.L1.Enums.List, fd.GetEnumType()); err != nil { - return nil, err - } - if err := validateMessageDeclarations(f.L1.Messages.List, fd.GetMessageType()); err != nil { - return nil, err - } - if err := validateExtensionDeclarations(f.L1.Extensions.List, fd.GetExtension()); err != nil { - return nil, err - } - - return f, nil -} - -type importSet map[string]bool - -func (is importSet) importPublic(imps protoreflect.FileImports) { - for i := 0; i < imps.Len(); i++ { - if imp := imps.Get(i); imp.IsPublic { - is[imp.Path()] = true - is.importPublic(imp.Imports()) - } - } -} - -// NewFiles creates a new protoregistry.Files from the provided -// FileDescriptorSet message. The descriptor set must include only -// valid files according to protobuf semantics. The returned descriptors -// are a deep copy of the input. -func (o FileOptions) NewFiles(fds *descriptorpb.FileDescriptorSet) (*protoregistry.Files, error) { - files := make(map[string]*descriptorpb.FileDescriptorProto) - for _, fd := range fds.File { - if _, ok := files[fd.GetName()]; ok { - return nil, errors.New("file appears multiple times: %q", fd.GetName()) - } - files[fd.GetName()] = fd - } - r := &protoregistry.Files{} - for _, fd := range files { - if err := o.addFileDeps(r, fd, files); err != nil { - return nil, err - } - } - return r, nil -} -func (o FileOptions) addFileDeps(r *protoregistry.Files, fd *descriptorpb.FileDescriptorProto, files map[string]*descriptorpb.FileDescriptorProto) error { - // Set the entry to nil while descending into a file's dependencies to detect cycles. - files[fd.GetName()] = nil - for _, dep := range fd.Dependency { - depfd, ok := files[dep] - if depfd == nil { - if ok { - return errors.New("import cycle in file: %q", dep) - } - continue - } - if err := o.addFileDeps(r, depfd, files); err != nil { - return err - } - } - // Delete the entry once dependencies are processed. - delete(files, fd.GetName()) - f, err := o.New(fd, r) - if err != nil { - return err - } - return r.RegisterFile(f) -} diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go deleted file mode 100644 index 37efda1a..00000000 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +++ /dev/null @@ -1,248 +0,0 @@ -// 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 file. - -package protodesc - -import ( - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - - "google.golang.org/protobuf/types/descriptorpb" -) - -type descsByName map[protoreflect.FullName]protoreflect.Descriptor - -func (r descsByName) initEnumDeclarations(eds []*descriptorpb.EnumDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (es []filedesc.Enum, err error) { - es = make([]filedesc.Enum, len(eds)) // allocate up-front to ensure stable pointers - for i, ed := range eds { - e := &es[i] - e.L2 = new(filedesc.EnumL2) - if e.L0, err = r.makeBase(e, parent, ed.GetName(), i, sb); err != nil { - return nil, err - } - if opts := ed.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.EnumOptions) - e.L2.Options = func() protoreflect.ProtoMessage { return opts } - } - for _, s := range ed.GetReservedName() { - e.L2.ReservedNames.List = append(e.L2.ReservedNames.List, protoreflect.Name(s)) - } - for _, rr := range ed.GetReservedRange() { - e.L2.ReservedRanges.List = append(e.L2.ReservedRanges.List, [2]protoreflect.EnumNumber{ - protoreflect.EnumNumber(rr.GetStart()), - protoreflect.EnumNumber(rr.GetEnd()), - }) - } - if e.L2.Values.List, err = r.initEnumValuesFromDescriptorProto(ed.GetValue(), e, sb); err != nil { - return nil, err - } - } - return es, nil -} - -func (r descsByName) initEnumValuesFromDescriptorProto(vds []*descriptorpb.EnumValueDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (vs []filedesc.EnumValue, err error) { - vs = make([]filedesc.EnumValue, len(vds)) // allocate up-front to ensure stable pointers - for i, vd := range vds { - v := &vs[i] - if v.L0, err = r.makeBase(v, parent, vd.GetName(), i, sb); err != nil { - return nil, err - } - if opts := vd.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.EnumValueOptions) - v.L1.Options = func() protoreflect.ProtoMessage { return opts } - } - v.L1.Number = protoreflect.EnumNumber(vd.GetNumber()) - } - return vs, nil -} - -func (r descsByName) initMessagesDeclarations(mds []*descriptorpb.DescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (ms []filedesc.Message, err error) { - ms = make([]filedesc.Message, len(mds)) // allocate up-front to ensure stable pointers - for i, md := range mds { - m := &ms[i] - m.L2 = new(filedesc.MessageL2) - if m.L0, err = r.makeBase(m, parent, md.GetName(), i, sb); err != nil { - return nil, err - } - if opts := md.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.MessageOptions) - m.L2.Options = func() protoreflect.ProtoMessage { return opts } - m.L1.IsMapEntry = opts.GetMapEntry() - m.L1.IsMessageSet = opts.GetMessageSetWireFormat() - } - for _, s := range md.GetReservedName() { - m.L2.ReservedNames.List = append(m.L2.ReservedNames.List, protoreflect.Name(s)) - } - for _, rr := range md.GetReservedRange() { - m.L2.ReservedRanges.List = append(m.L2.ReservedRanges.List, [2]protoreflect.FieldNumber{ - protoreflect.FieldNumber(rr.GetStart()), - protoreflect.FieldNumber(rr.GetEnd()), - }) - } - for _, xr := range md.GetExtensionRange() { - m.L2.ExtensionRanges.List = append(m.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{ - protoreflect.FieldNumber(xr.GetStart()), - protoreflect.FieldNumber(xr.GetEnd()), - }) - var optsFunc func() protoreflect.ProtoMessage - if opts := xr.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.ExtensionRangeOptions) - optsFunc = func() protoreflect.ProtoMessage { return opts } - } - m.L2.ExtensionRangeOptions = append(m.L2.ExtensionRangeOptions, optsFunc) - } - if m.L2.Fields.List, err = r.initFieldsFromDescriptorProto(md.GetField(), m, sb); err != nil { - return nil, err - } - if m.L2.Oneofs.List, err = r.initOneofsFromDescriptorProto(md.GetOneofDecl(), m, sb); err != nil { - return nil, err - } - if m.L1.Enums.List, err = r.initEnumDeclarations(md.GetEnumType(), m, sb); err != nil { - return nil, err - } - if m.L1.Messages.List, err = r.initMessagesDeclarations(md.GetNestedType(), m, sb); err != nil { - return nil, err - } - if m.L1.Extensions.List, err = r.initExtensionDeclarations(md.GetExtension(), m, sb); err != nil { - return nil, err - } - } - return ms, nil -} - -func (r descsByName) initFieldsFromDescriptorProto(fds []*descriptorpb.FieldDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (fs []filedesc.Field, err error) { - fs = make([]filedesc.Field, len(fds)) // allocate up-front to ensure stable pointers - for i, fd := range fds { - f := &fs[i] - if f.L0, err = r.makeBase(f, parent, fd.GetName(), i, sb); err != nil { - return nil, err - } - f.L1.IsProto3Optional = fd.GetProto3Optional() - if opts := fd.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.FieldOptions) - f.L1.Options = func() protoreflect.ProtoMessage { return opts } - f.L1.IsWeak = opts.GetWeak() - f.L1.HasPacked = opts.Packed != nil - f.L1.IsPacked = opts.GetPacked() - } - f.L1.Number = protoreflect.FieldNumber(fd.GetNumber()) - f.L1.Cardinality = protoreflect.Cardinality(fd.GetLabel()) - if fd.Type != nil { - f.L1.Kind = protoreflect.Kind(fd.GetType()) - } - if fd.JsonName != nil { - f.L1.StringName.InitJSON(fd.GetJsonName()) - } - } - return fs, nil -} - -func (r descsByName) initOneofsFromDescriptorProto(ods []*descriptorpb.OneofDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (os []filedesc.Oneof, err error) { - os = make([]filedesc.Oneof, len(ods)) // allocate up-front to ensure stable pointers - for i, od := range ods { - o := &os[i] - if o.L0, err = r.makeBase(o, parent, od.GetName(), i, sb); err != nil { - return nil, err - } - if opts := od.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.OneofOptions) - o.L1.Options = func() protoreflect.ProtoMessage { return opts } - } - } - return os, nil -} - -func (r descsByName) initExtensionDeclarations(xds []*descriptorpb.FieldDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (xs []filedesc.Extension, err error) { - xs = make([]filedesc.Extension, len(xds)) // allocate up-front to ensure stable pointers - for i, xd := range xds { - x := &xs[i] - x.L2 = new(filedesc.ExtensionL2) - if x.L0, err = r.makeBase(x, parent, xd.GetName(), i, sb); err != nil { - return nil, err - } - if opts := xd.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.FieldOptions) - x.L2.Options = func() protoreflect.ProtoMessage { return opts } - x.L2.IsPacked = opts.GetPacked() - } - x.L1.Number = protoreflect.FieldNumber(xd.GetNumber()) - x.L1.Cardinality = protoreflect.Cardinality(xd.GetLabel()) - if xd.Type != nil { - x.L1.Kind = protoreflect.Kind(xd.GetType()) - } - if xd.JsonName != nil { - x.L2.StringName.InitJSON(xd.GetJsonName()) - } - } - return xs, nil -} - -func (r descsByName) initServiceDeclarations(sds []*descriptorpb.ServiceDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (ss []filedesc.Service, err error) { - ss = make([]filedesc.Service, len(sds)) // allocate up-front to ensure stable pointers - for i, sd := range sds { - s := &ss[i] - s.L2 = new(filedesc.ServiceL2) - if s.L0, err = r.makeBase(s, parent, sd.GetName(), i, sb); err != nil { - return nil, err - } - if opts := sd.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.ServiceOptions) - s.L2.Options = func() protoreflect.ProtoMessage { return opts } - } - if s.L2.Methods.List, err = r.initMethodsFromDescriptorProto(sd.GetMethod(), s, sb); err != nil { - return nil, err - } - } - return ss, nil -} - -func (r descsByName) initMethodsFromDescriptorProto(mds []*descriptorpb.MethodDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (ms []filedesc.Method, err error) { - ms = make([]filedesc.Method, len(mds)) // allocate up-front to ensure stable pointers - for i, md := range mds { - m := &ms[i] - if m.L0, err = r.makeBase(m, parent, md.GetName(), i, sb); err != nil { - return nil, err - } - if opts := md.GetOptions(); opts != nil { - opts = proto.Clone(opts).(*descriptorpb.MethodOptions) - m.L1.Options = func() protoreflect.ProtoMessage { return opts } - } - m.L1.IsStreamingClient = md.GetClientStreaming() - m.L1.IsStreamingServer = md.GetServerStreaming() - } - return ms, nil -} - -func (r descsByName) makeBase(child, parent protoreflect.Descriptor, name string, idx int, sb *strs.Builder) (filedesc.BaseL0, error) { - if !protoreflect.Name(name).IsValid() { - return filedesc.BaseL0{}, errors.New("descriptor %q has an invalid nested name: %q", parent.FullName(), name) - } - - // Derive the full name of the child. - // Note that enum values are a sibling to the enum parent in the namespace. - var fullName protoreflect.FullName - if _, ok := parent.(protoreflect.EnumDescriptor); ok { - fullName = sb.AppendFullName(parent.FullName().Parent(), protoreflect.Name(name)) - } else { - fullName = sb.AppendFullName(parent.FullName(), protoreflect.Name(name)) - } - if _, ok := r[fullName]; ok { - return filedesc.BaseL0{}, errors.New("descriptor %q already declared", fullName) - } - r[fullName] = child - - // TODO: Verify that the full name does not already exist in the resolver? - // This is not as critical since most usages of NewFile will register - // the created file back into the registry, which will perform this check. - - return filedesc.BaseL0{ - FullName: fullName, - ParentFile: parent.ParentFile().(*filedesc.File), - Parent: parent, - Index: idx, - }, nil -} diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go deleted file mode 100644 index 27d7e350..00000000 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +++ /dev/null @@ -1,286 +0,0 @@ -// 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 file. - -package protodesc - -import ( - "google.golang.org/protobuf/internal/encoding/defval" - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - - "google.golang.org/protobuf/types/descriptorpb" -) - -// resolver is a wrapper around a local registry of declarations within the file -// and the remote resolver. The remote resolver is restricted to only return -// descriptors that have been imported. -type resolver struct { - local descsByName - remote Resolver - imports importSet - - allowUnresolvable bool -} - -func (r *resolver) resolveMessageDependencies(ms []filedesc.Message, mds []*descriptorpb.DescriptorProto) (err error) { - for i, md := range mds { - m := &ms[i] - for j, fd := range md.GetField() { - f := &m.L2.Fields.List[j] - if f.L1.Cardinality == protoreflect.Required { - m.L2.RequiredNumbers.List = append(m.L2.RequiredNumbers.List, f.L1.Number) - } - if fd.OneofIndex != nil { - k := int(fd.GetOneofIndex()) - if !(0 <= k && k < len(md.GetOneofDecl())) { - return errors.New("message field %q has an invalid oneof index: %d", f.FullName(), k) - } - o := &m.L2.Oneofs.List[k] - f.L1.ContainingOneof = o - o.L1.Fields.List = append(o.L1.Fields.List, f) - } - - if f.L1.Kind, f.L1.Enum, f.L1.Message, err = r.findTarget(f.Kind(), f.Parent().FullName(), partialName(fd.GetTypeName()), f.IsWeak()); err != nil { - return errors.New("message field %q cannot resolve type: %v", f.FullName(), err) - } - if fd.DefaultValue != nil { - v, ev, err := unmarshalDefault(fd.GetDefaultValue(), f, r.allowUnresolvable) - if err != nil { - return errors.New("message field %q has invalid default: %v", f.FullName(), err) - } - f.L1.Default = filedesc.DefaultValue(v, ev) - } - } - - if err := r.resolveMessageDependencies(m.L1.Messages.List, md.GetNestedType()); err != nil { - return err - } - if err := r.resolveExtensionDependencies(m.L1.Extensions.List, md.GetExtension()); err != nil { - return err - } - } - return nil -} - -func (r *resolver) resolveExtensionDependencies(xs []filedesc.Extension, xds []*descriptorpb.FieldDescriptorProto) (err error) { - for i, xd := range xds { - x := &xs[i] - if x.L1.Extendee, err = r.findMessageDescriptor(x.Parent().FullName(), partialName(xd.GetExtendee()), false); err != nil { - return errors.New("extension field %q cannot resolve extendee: %v", x.FullName(), err) - } - if x.L1.Kind, x.L2.Enum, x.L2.Message, err = r.findTarget(x.Kind(), x.Parent().FullName(), partialName(xd.GetTypeName()), false); err != nil { - return errors.New("extension field %q cannot resolve type: %v", x.FullName(), err) - } - if xd.DefaultValue != nil { - v, ev, err := unmarshalDefault(xd.GetDefaultValue(), x, r.allowUnresolvable) - if err != nil { - return errors.New("extension field %q has invalid default: %v", x.FullName(), err) - } - x.L2.Default = filedesc.DefaultValue(v, ev) - } - } - return nil -} - -func (r *resolver) resolveServiceDependencies(ss []filedesc.Service, sds []*descriptorpb.ServiceDescriptorProto) (err error) { - for i, sd := range sds { - s := &ss[i] - for j, md := range sd.GetMethod() { - m := &s.L2.Methods.List[j] - m.L1.Input, err = r.findMessageDescriptor(m.Parent().FullName(), partialName(md.GetInputType()), false) - if err != nil { - return errors.New("service method %q cannot resolve input: %v", m.FullName(), err) - } - m.L1.Output, err = r.findMessageDescriptor(s.FullName(), partialName(md.GetOutputType()), false) - if err != nil { - return errors.New("service method %q cannot resolve output: %v", m.FullName(), err) - } - } - } - return nil -} - -// findTarget finds an enum or message descriptor if k is an enum, message, -// group, or unknown. If unknown, and the name could be resolved, the kind -// returned kind is set based on the type of the resolved descriptor. -func (r *resolver) findTarget(k protoreflect.Kind, scope protoreflect.FullName, ref partialName, isWeak bool) (protoreflect.Kind, protoreflect.EnumDescriptor, protoreflect.MessageDescriptor, error) { - switch k { - case protoreflect.EnumKind: - ed, err := r.findEnumDescriptor(scope, ref, isWeak) - if err != nil { - return 0, nil, nil, err - } - return k, ed, nil, nil - case protoreflect.MessageKind, protoreflect.GroupKind: - md, err := r.findMessageDescriptor(scope, ref, isWeak) - if err != nil { - return 0, nil, nil, err - } - return k, nil, md, nil - case 0: - // Handle unspecified kinds (possible with parsers that operate - // on a per-file basis without knowledge of dependencies). - d, err := r.findDescriptor(scope, ref) - if err == protoregistry.NotFound && (r.allowUnresolvable || isWeak) { - return k, filedesc.PlaceholderEnum(ref.FullName()), filedesc.PlaceholderMessage(ref.FullName()), nil - } else if err == protoregistry.NotFound { - return 0, nil, nil, errors.New("%q not found", ref.FullName()) - } else if err != nil { - return 0, nil, nil, err - } - switch d := d.(type) { - case protoreflect.EnumDescriptor: - return protoreflect.EnumKind, d, nil, nil - case protoreflect.MessageDescriptor: - return protoreflect.MessageKind, nil, d, nil - default: - return 0, nil, nil, errors.New("unknown kind") - } - default: - if ref != "" { - return 0, nil, nil, errors.New("target name cannot be specified for %v", k) - } - if !k.IsValid() { - return 0, nil, nil, errors.New("invalid kind: %d", k) - } - return k, nil, nil, nil - } -} - -// findDescriptor finds the descriptor by name, -// which may be a relative name within some scope. -// -// Suppose the scope was "fizz.buzz" and the reference was "Foo.Bar", -// then the following full names are searched: -// - fizz.buzz.Foo.Bar -// - fizz.Foo.Bar -// - Foo.Bar -func (r *resolver) findDescriptor(scope protoreflect.FullName, ref partialName) (protoreflect.Descriptor, error) { - if !ref.IsValid() { - return nil, errors.New("invalid name reference: %q", ref) - } - if ref.IsFull() { - scope, ref = "", ref[1:] - } - var foundButNotImported protoreflect.Descriptor - for { - // Derive the full name to search. - s := protoreflect.FullName(ref) - if scope != "" { - s = scope + "." + s - } - - // Check the current file for the descriptor. - if d, ok := r.local[s]; ok { - return d, nil - } - - // Check the remote registry for the descriptor. - d, err := r.remote.FindDescriptorByName(s) - if err == nil { - // Only allow descriptors covered by one of the imports. - if r.imports[d.ParentFile().Path()] { - return d, nil - } - foundButNotImported = d - } else if err != protoregistry.NotFound { - return nil, errors.Wrap(err, "%q", s) - } - - // Continue on at a higher level of scoping. - if scope == "" { - if d := foundButNotImported; d != nil { - return nil, errors.New("resolved %q, but %q is not imported", d.FullName(), d.ParentFile().Path()) - } - return nil, protoregistry.NotFound - } - scope = scope.Parent() - } -} - -func (r *resolver) findEnumDescriptor(scope protoreflect.FullName, ref partialName, isWeak bool) (protoreflect.EnumDescriptor, error) { - d, err := r.findDescriptor(scope, ref) - if err == protoregistry.NotFound && (r.allowUnresolvable || isWeak) { - return filedesc.PlaceholderEnum(ref.FullName()), nil - } else if err == protoregistry.NotFound { - return nil, errors.New("%q not found", ref.FullName()) - } else if err != nil { - return nil, err - } - ed, ok := d.(protoreflect.EnumDescriptor) - if !ok { - return nil, errors.New("resolved %q, but it is not an enum", d.FullName()) - } - return ed, nil -} - -func (r *resolver) findMessageDescriptor(scope protoreflect.FullName, ref partialName, isWeak bool) (protoreflect.MessageDescriptor, error) { - d, err := r.findDescriptor(scope, ref) - if err == protoregistry.NotFound && (r.allowUnresolvable || isWeak) { - return filedesc.PlaceholderMessage(ref.FullName()), nil - } else if err == protoregistry.NotFound { - return nil, errors.New("%q not found", ref.FullName()) - } else if err != nil { - return nil, err - } - md, ok := d.(protoreflect.MessageDescriptor) - if !ok { - return nil, errors.New("resolved %q, but it is not an message", d.FullName()) - } - return md, nil -} - -// partialName is the partial name. A leading dot means that the name is full, -// otherwise the name is relative to some current scope. -// See google.protobuf.FieldDescriptorProto.type_name. -type partialName string - -func (s partialName) IsFull() bool { - return len(s) > 0 && s[0] == '.' -} - -func (s partialName) IsValid() bool { - if s.IsFull() { - return protoreflect.FullName(s[1:]).IsValid() - } - return protoreflect.FullName(s).IsValid() -} - -const unknownPrefix = "*." - -// FullName converts the partial name to a full name on a best-effort basis. -// If relative, it creates an invalid full name, using a "*." prefix -// to indicate that the start of the full name is unknown. -func (s partialName) FullName() protoreflect.FullName { - if s.IsFull() { - return protoreflect.FullName(s[1:]) - } - return protoreflect.FullName(unknownPrefix + s) -} - -func unmarshalDefault(s string, fd protoreflect.FieldDescriptor, allowUnresolvable bool) (protoreflect.Value, protoreflect.EnumValueDescriptor, error) { - var evs protoreflect.EnumValueDescriptors - if fd.Enum() != nil { - evs = fd.Enum().Values() - } - v, ev, err := defval.Unmarshal(s, fd.Kind(), evs, defval.Descriptor) - if err != nil && allowUnresolvable && evs != nil && protoreflect.Name(s).IsValid() { - v = protoreflect.ValueOfEnum(0) - if evs.Len() > 0 { - v = protoreflect.ValueOfEnum(evs.Get(0).Number()) - } - ev = filedesc.PlaceholderEnumValue(fd.Enum().FullName().Parent().Append(protoreflect.Name(s))) - } else if err != nil { - return v, ev, err - } - if fd.Syntax() == protoreflect.Proto3 { - return v, ev, errors.New("cannot be specified under proto3 semantics") - } - if fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind || fd.Cardinality() == protoreflect.Repeated { - return v, ev, errors.New("cannot be specified on composite types") - } - return v, ev, nil -} diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go deleted file mode 100644 index 9af1d564..00000000 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +++ /dev/null @@ -1,374 +0,0 @@ -// 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 file. - -package protodesc - -import ( - "strings" - "unicode" - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/filedesc" - "google.golang.org/protobuf/internal/flags" - "google.golang.org/protobuf/internal/genid" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/reflect/protoreflect" - - "google.golang.org/protobuf/types/descriptorpb" -) - -func validateEnumDeclarations(es []filedesc.Enum, eds []*descriptorpb.EnumDescriptorProto) error { - for i, ed := range eds { - e := &es[i] - if err := e.L2.ReservedNames.CheckValid(); err != nil { - return errors.New("enum %q reserved names has %v", e.FullName(), err) - } - if err := e.L2.ReservedRanges.CheckValid(); err != nil { - return errors.New("enum %q reserved ranges has %v", e.FullName(), err) - } - if len(ed.GetValue()) == 0 { - return errors.New("enum %q must contain at least one value declaration", e.FullName()) - } - allowAlias := ed.GetOptions().GetAllowAlias() - foundAlias := false - for i := 0; i < e.Values().Len(); i++ { - v1 := e.Values().Get(i) - if v2 := e.Values().ByNumber(v1.Number()); v1 != v2 { - foundAlias = true - if !allowAlias { - return errors.New("enum %q has conflicting non-aliased values on number %d: %q with %q", e.FullName(), v1.Number(), v1.Name(), v2.Name()) - } - } - } - if allowAlias && !foundAlias { - return errors.New("enum %q allows aliases, but none were found", e.FullName()) - } - if e.Syntax() == protoreflect.Proto3 { - if v := e.Values().Get(0); v.Number() != 0 { - return errors.New("enum %q using proto3 semantics must have zero number for the first value", v.FullName()) - } - // Verify that value names in proto3 do not conflict if the - // case-insensitive prefix is removed. - // See protoc v3.8.0: src/google/protobuf/descriptor.cc:4991-5055 - names := map[string]protoreflect.EnumValueDescriptor{} - prefix := strings.Replace(strings.ToLower(string(e.Name())), "_", "", -1) - for i := 0; i < e.Values().Len(); i++ { - v1 := e.Values().Get(i) - s := strs.EnumValueName(strs.TrimEnumPrefix(string(v1.Name()), prefix)) - if v2, ok := names[s]; ok && v1.Number() != v2.Number() { - return errors.New("enum %q using proto3 semantics has conflict: %q with %q", e.FullName(), v1.Name(), v2.Name()) - } - names[s] = v1 - } - } - - for j, vd := range ed.GetValue() { - v := &e.L2.Values.List[j] - if vd.Number == nil { - return errors.New("enum value %q must have a specified number", v.FullName()) - } - if e.L2.ReservedNames.Has(v.Name()) { - return errors.New("enum value %q must not use reserved name", v.FullName()) - } - if e.L2.ReservedRanges.Has(v.Number()) { - return errors.New("enum value %q must not use reserved number %d", v.FullName(), v.Number()) - } - } - } - return nil -} - -func validateMessageDeclarations(ms []filedesc.Message, mds []*descriptorpb.DescriptorProto) error { - for i, md := range mds { - m := &ms[i] - - // Handle the message descriptor itself. - isMessageSet := md.GetOptions().GetMessageSetWireFormat() - if err := m.L2.ReservedNames.CheckValid(); err != nil { - return errors.New("message %q reserved names has %v", m.FullName(), err) - } - if err := m.L2.ReservedRanges.CheckValid(isMessageSet); err != nil { - return errors.New("message %q reserved ranges has %v", m.FullName(), err) - } - if err := m.L2.ExtensionRanges.CheckValid(isMessageSet); err != nil { - return errors.New("message %q extension ranges has %v", m.FullName(), err) - } - if err := (*filedesc.FieldRanges).CheckOverlap(&m.L2.ReservedRanges, &m.L2.ExtensionRanges); err != nil { - return errors.New("message %q reserved and extension ranges has %v", m.FullName(), err) - } - for i := 0; i < m.Fields().Len(); i++ { - f1 := m.Fields().Get(i) - if f2 := m.Fields().ByNumber(f1.Number()); f1 != f2 { - return errors.New("message %q has conflicting fields: %q with %q", m.FullName(), f1.Name(), f2.Name()) - } - } - if isMessageSet && !flags.ProtoLegacy { - return errors.New("message %q is a MessageSet, which is a legacy proto1 feature that is no longer supported", m.FullName()) - } - if isMessageSet && (m.Syntax() != protoreflect.Proto2 || m.Fields().Len() > 0 || m.ExtensionRanges().Len() == 0) { - return errors.New("message %q is an invalid proto1 MessageSet", m.FullName()) - } - if m.Syntax() == protoreflect.Proto3 { - if m.ExtensionRanges().Len() > 0 { - return errors.New("message %q using proto3 semantics cannot have extension ranges", m.FullName()) - } - // Verify that field names in proto3 do not conflict if lowercased - // with all underscores removed. - // See protoc v3.8.0: src/google/protobuf/descriptor.cc:5830-5847 - names := map[string]protoreflect.FieldDescriptor{} - for i := 0; i < m.Fields().Len(); i++ { - f1 := m.Fields().Get(i) - s := strings.Replace(strings.ToLower(string(f1.Name())), "_", "", -1) - if f2, ok := names[s]; ok { - return errors.New("message %q using proto3 semantics has conflict: %q with %q", m.FullName(), f1.Name(), f2.Name()) - } - names[s] = f1 - } - } - - for j, fd := range md.GetField() { - f := &m.L2.Fields.List[j] - if m.L2.ReservedNames.Has(f.Name()) { - return errors.New("message field %q must not use reserved name", f.FullName()) - } - if !f.Number().IsValid() { - return errors.New("message field %q has an invalid number: %d", f.FullName(), f.Number()) - } - if !f.Cardinality().IsValid() { - return errors.New("message field %q has an invalid cardinality: %d", f.FullName(), f.Cardinality()) - } - if m.L2.ReservedRanges.Has(f.Number()) { - return errors.New("message field %q must not use reserved number %d", f.FullName(), f.Number()) - } - if m.L2.ExtensionRanges.Has(f.Number()) { - return errors.New("message field %q with number %d in extension range", f.FullName(), f.Number()) - } - if fd.Extendee != nil { - return errors.New("message field %q may not have extendee: %q", f.FullName(), fd.GetExtendee()) - } - if f.L1.IsProto3Optional { - if f.Syntax() != protoreflect.Proto3 { - return errors.New("message field %q under proto3 optional semantics must be specified in the proto3 syntax", f.FullName()) - } - if f.Cardinality() != protoreflect.Optional { - return errors.New("message field %q under proto3 optional semantics must have optional cardinality", f.FullName()) - } - if f.ContainingOneof() != nil && f.ContainingOneof().Fields().Len() != 1 { - return errors.New("message field %q under proto3 optional semantics must be within a single element oneof", f.FullName()) - } - } - if f.IsWeak() && !flags.ProtoLegacy { - return errors.New("message field %q is a weak field, which is a legacy proto1 feature that is no longer supported", f.FullName()) - } - if f.IsWeak() && (f.Syntax() != protoreflect.Proto2 || !isOptionalMessage(f) || f.ContainingOneof() != nil) { - return errors.New("message field %q may only be weak for an optional message", f.FullName()) - } - if f.IsPacked() && !isPackable(f) { - return errors.New("message field %q is not packable", f.FullName()) - } - if err := checkValidGroup(f); err != nil { - return errors.New("message field %q is an invalid group: %v", f.FullName(), err) - } - if err := checkValidMap(f); err != nil { - return errors.New("message field %q is an invalid map: %v", f.FullName(), err) - } - if f.Syntax() == protoreflect.Proto3 { - if f.Cardinality() == protoreflect.Required { - return errors.New("message field %q using proto3 semantics cannot be required", f.FullName()) - } - if f.Enum() != nil && !f.Enum().IsPlaceholder() && f.Enum().Syntax() != protoreflect.Proto3 { - return errors.New("message field %q using proto3 semantics may only depend on a proto3 enum", f.FullName()) - } - } - } - seenSynthetic := false // synthetic oneofs for proto3 optional must come after real oneofs - for j := range md.GetOneofDecl() { - o := &m.L2.Oneofs.List[j] - if o.Fields().Len() == 0 { - return errors.New("message oneof %q must contain at least one field declaration", o.FullName()) - } - if n := o.Fields().Len(); n-1 != (o.Fields().Get(n-1).Index() - o.Fields().Get(0).Index()) { - return errors.New("message oneof %q must have consecutively declared fields", o.FullName()) - } - - if o.IsSynthetic() { - seenSynthetic = true - continue - } - if !o.IsSynthetic() && seenSynthetic { - return errors.New("message oneof %q must be declared before synthetic oneofs", o.FullName()) - } - - for i := 0; i < o.Fields().Len(); i++ { - f := o.Fields().Get(i) - if f.Cardinality() != protoreflect.Optional { - return errors.New("message field %q belongs in a oneof and must be optional", f.FullName()) - } - if f.IsWeak() { - return errors.New("message field %q belongs in a oneof and must not be a weak reference", f.FullName()) - } - } - } - - if err := validateEnumDeclarations(m.L1.Enums.List, md.GetEnumType()); err != nil { - return err - } - if err := validateMessageDeclarations(m.L1.Messages.List, md.GetNestedType()); err != nil { - return err - } - if err := validateExtensionDeclarations(m.L1.Extensions.List, md.GetExtension()); err != nil { - return err - } - } - return nil -} - -func validateExtensionDeclarations(xs []filedesc.Extension, xds []*descriptorpb.FieldDescriptorProto) error { - for i, xd := range xds { - x := &xs[i] - // NOTE: Avoid using the IsValid method since extensions to MessageSet - // may have a field number higher than normal. This check only verifies - // that the number is not negative or reserved. We check again later - // if we know that the extendee is definitely not a MessageSet. - if n := x.Number(); n < 0 || (protowire.FirstReservedNumber <= n && n <= protowire.LastReservedNumber) { - return errors.New("extension field %q has an invalid number: %d", x.FullName(), x.Number()) - } - if !x.Cardinality().IsValid() || x.Cardinality() == protoreflect.Required { - return errors.New("extension field %q has an invalid cardinality: %d", x.FullName(), x.Cardinality()) - } - if xd.JsonName != nil { - // A bug in older versions of protoc would always populate the - // "json_name" option for extensions when it is meaningless. - // When it did so, it would always use the camel-cased field name. - if xd.GetJsonName() != strs.JSONCamelCase(string(x.Name())) { - return errors.New("extension field %q may not have an explicitly set JSON name: %q", x.FullName(), xd.GetJsonName()) - } - } - if xd.OneofIndex != nil { - return errors.New("extension field %q may not be part of a oneof", x.FullName()) - } - if md := x.ContainingMessage(); !md.IsPlaceholder() { - if !md.ExtensionRanges().Has(x.Number()) { - return errors.New("extension field %q extends %q with non-extension field number: %d", x.FullName(), md.FullName(), x.Number()) - } - isMessageSet := md.Options().(*descriptorpb.MessageOptions).GetMessageSetWireFormat() - if isMessageSet && !isOptionalMessage(x) { - return errors.New("extension field %q extends MessageSet and must be an optional message", x.FullName()) - } - if !isMessageSet && !x.Number().IsValid() { - return errors.New("extension field %q has an invalid number: %d", x.FullName(), x.Number()) - } - } - if xd.GetOptions().GetWeak() { - return errors.New("extension field %q cannot be a weak reference", x.FullName()) - } - if x.IsPacked() && !isPackable(x) { - return errors.New("extension field %q is not packable", x.FullName()) - } - if err := checkValidGroup(x); err != nil { - return errors.New("extension field %q is an invalid group: %v", x.FullName(), err) - } - if md := x.Message(); md != nil && md.IsMapEntry() { - return errors.New("extension field %q cannot be a map entry", x.FullName()) - } - if x.Syntax() == protoreflect.Proto3 { - switch x.ContainingMessage().FullName() { - case (*descriptorpb.FileOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.EnumOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.EnumValueOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.MessageOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.FieldOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.OneofOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.ExtensionRangeOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.ServiceOptions)(nil).ProtoReflect().Descriptor().FullName(): - case (*descriptorpb.MethodOptions)(nil).ProtoReflect().Descriptor().FullName(): - default: - return errors.New("extension field %q cannot be declared in proto3 unless extended descriptor options", x.FullName()) - } - } - } - return nil -} - -// isOptionalMessage reports whether this is an optional message. -// If the kind is unknown, it is assumed to be a message. -func isOptionalMessage(fd protoreflect.FieldDescriptor) bool { - return (fd.Kind() == 0 || fd.Kind() == protoreflect.MessageKind) && fd.Cardinality() == protoreflect.Optional -} - -// isPackable checks whether the pack option can be specified. -func isPackable(fd protoreflect.FieldDescriptor) bool { - switch fd.Kind() { - case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind: - return false - } - return fd.IsList() -} - -// checkValidGroup reports whether fd is a valid group according to the same -// rules that protoc imposes. -func checkValidGroup(fd protoreflect.FieldDescriptor) error { - md := fd.Message() - switch { - case fd.Kind() != protoreflect.GroupKind: - return nil - case fd.Syntax() != protoreflect.Proto2: - return errors.New("invalid under proto2 semantics") - case md == nil || md.IsPlaceholder(): - return errors.New("message must be resolvable") - case fd.FullName().Parent() != md.FullName().Parent(): - return errors.New("message and field must be declared in the same scope") - case !unicode.IsUpper(rune(md.Name()[0])): - return errors.New("message name must start with an uppercase") - case fd.Name() != protoreflect.Name(strings.ToLower(string(md.Name()))): - return errors.New("field name must be lowercased form of the message name") - } - return nil -} - -// checkValidMap checks whether the field is a valid map according to the same -// rules that protoc imposes. -// See protoc v3.8.0: src/google/protobuf/descriptor.cc:6045-6115 -func checkValidMap(fd protoreflect.FieldDescriptor) error { - md := fd.Message() - switch { - case md == nil || !md.IsMapEntry(): - return nil - case fd.FullName().Parent() != md.FullName().Parent(): - return errors.New("message and field must be declared in the same scope") - case md.Name() != protoreflect.Name(strs.MapEntryName(string(fd.Name()))): - return errors.New("incorrect implicit map entry name") - case fd.Cardinality() != protoreflect.Repeated: - return errors.New("field must be repeated") - case md.Fields().Len() != 2: - return errors.New("message must have exactly two fields") - case md.ExtensionRanges().Len() > 0: - return errors.New("message must not have any extension ranges") - case md.Enums().Len()+md.Messages().Len()+md.Extensions().Len() > 0: - return errors.New("message must not have any nested declarations") - } - kf := md.Fields().Get(0) - vf := md.Fields().Get(1) - switch { - case kf.Name() != genid.MapEntry_Key_field_name || kf.Number() != genid.MapEntry_Key_field_number || kf.Cardinality() != protoreflect.Optional || kf.ContainingOneof() != nil || kf.HasDefault(): - return errors.New("invalid key field") - case vf.Name() != genid.MapEntry_Value_field_name || vf.Number() != genid.MapEntry_Value_field_number || vf.Cardinality() != protoreflect.Optional || vf.ContainingOneof() != nil || vf.HasDefault(): - return errors.New("invalid value field") - } - switch kf.Kind() { - case protoreflect.BoolKind: // bool - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: // int32 - case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: // int64 - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: // uint32 - case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: // uint64 - case protoreflect.StringKind: // string - default: - return errors.New("invalid key kind: %v", kf.Kind()) - } - if e := vf.Enum(); e != nil && e.Values().Len() > 0 && e.Values().Get(0).Number() != 0 { - return errors.New("map enum value must have zero number for the first value") - } - return nil -} diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go deleted file mode 100644 index a7c5ceff..00000000 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +++ /dev/null @@ -1,252 +0,0 @@ -// 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 file. - -package protodesc - -import ( - "fmt" - "strings" - - "google.golang.org/protobuf/internal/encoding/defval" - "google.golang.org/protobuf/internal/strs" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - - "google.golang.org/protobuf/types/descriptorpb" -) - -// ToFileDescriptorProto copies a protoreflect.FileDescriptor into a -// google.protobuf.FileDescriptorProto message. -func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileDescriptorProto { - p := &descriptorpb.FileDescriptorProto{ - Name: proto.String(file.Path()), - Options: proto.Clone(file.Options()).(*descriptorpb.FileOptions), - } - if file.Package() != "" { - p.Package = proto.String(string(file.Package())) - } - for i, imports := 0, file.Imports(); i < imports.Len(); i++ { - imp := imports.Get(i) - p.Dependency = append(p.Dependency, imp.Path()) - if imp.IsPublic { - p.PublicDependency = append(p.PublicDependency, int32(i)) - } - if imp.IsWeak { - p.WeakDependency = append(p.WeakDependency, int32(i)) - } - } - for i, locs := 0, file.SourceLocations(); i < locs.Len(); i++ { - loc := locs.Get(i) - l := &descriptorpb.SourceCodeInfo_Location{} - l.Path = append(l.Path, loc.Path...) - if loc.StartLine == loc.EndLine { - l.Span = []int32{int32(loc.StartLine), int32(loc.StartColumn), int32(loc.EndColumn)} - } else { - l.Span = []int32{int32(loc.StartLine), int32(loc.StartColumn), int32(loc.EndLine), int32(loc.EndColumn)} - } - l.LeadingDetachedComments = append([]string(nil), loc.LeadingDetachedComments...) - if loc.LeadingComments != "" { - l.LeadingComments = proto.String(loc.LeadingComments) - } - if loc.TrailingComments != "" { - l.TrailingComments = proto.String(loc.TrailingComments) - } - if p.SourceCodeInfo == nil { - p.SourceCodeInfo = &descriptorpb.SourceCodeInfo{} - } - p.SourceCodeInfo.Location = append(p.SourceCodeInfo.Location, l) - - } - for i, messages := 0, file.Messages(); i < messages.Len(); i++ { - p.MessageType = append(p.MessageType, ToDescriptorProto(messages.Get(i))) - } - for i, enums := 0, file.Enums(); i < enums.Len(); i++ { - p.EnumType = append(p.EnumType, ToEnumDescriptorProto(enums.Get(i))) - } - for i, services := 0, file.Services(); i < services.Len(); i++ { - p.Service = append(p.Service, ToServiceDescriptorProto(services.Get(i))) - } - for i, exts := 0, file.Extensions(); i < exts.Len(); i++ { - p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i))) - } - if syntax := file.Syntax(); syntax != protoreflect.Proto2 { - p.Syntax = proto.String(file.Syntax().String()) - } - return p -} - -// ToDescriptorProto copies a protoreflect.MessageDescriptor into a -// google.protobuf.DescriptorProto message. -func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.DescriptorProto { - p := &descriptorpb.DescriptorProto{ - Name: proto.String(string(message.Name())), - Options: proto.Clone(message.Options()).(*descriptorpb.MessageOptions), - } - for i, fields := 0, message.Fields(); i < fields.Len(); i++ { - p.Field = append(p.Field, ToFieldDescriptorProto(fields.Get(i))) - } - for i, exts := 0, message.Extensions(); i < exts.Len(); i++ { - p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i))) - } - for i, messages := 0, message.Messages(); i < messages.Len(); i++ { - p.NestedType = append(p.NestedType, ToDescriptorProto(messages.Get(i))) - } - for i, enums := 0, message.Enums(); i < enums.Len(); i++ { - p.EnumType = append(p.EnumType, ToEnumDescriptorProto(enums.Get(i))) - } - for i, xranges := 0, message.ExtensionRanges(); i < xranges.Len(); i++ { - xrange := xranges.Get(i) - p.ExtensionRange = append(p.ExtensionRange, &descriptorpb.DescriptorProto_ExtensionRange{ - Start: proto.Int32(int32(xrange[0])), - End: proto.Int32(int32(xrange[1])), - Options: proto.Clone(message.ExtensionRangeOptions(i)).(*descriptorpb.ExtensionRangeOptions), - }) - } - for i, oneofs := 0, message.Oneofs(); i < oneofs.Len(); i++ { - p.OneofDecl = append(p.OneofDecl, ToOneofDescriptorProto(oneofs.Get(i))) - } - for i, ranges := 0, message.ReservedRanges(); i < ranges.Len(); i++ { - rrange := ranges.Get(i) - p.ReservedRange = append(p.ReservedRange, &descriptorpb.DescriptorProto_ReservedRange{ - Start: proto.Int32(int32(rrange[0])), - End: proto.Int32(int32(rrange[1])), - }) - } - for i, names := 0, message.ReservedNames(); i < names.Len(); i++ { - p.ReservedName = append(p.ReservedName, string(names.Get(i))) - } - return p -} - -// ToFieldDescriptorProto copies a protoreflect.FieldDescriptor into a -// google.protobuf.FieldDescriptorProto message. -func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.FieldDescriptorProto { - p := &descriptorpb.FieldDescriptorProto{ - Name: proto.String(string(field.Name())), - Number: proto.Int32(int32(field.Number())), - Label: descriptorpb.FieldDescriptorProto_Label(field.Cardinality()).Enum(), - Options: proto.Clone(field.Options()).(*descriptorpb.FieldOptions), - } - if field.IsExtension() { - p.Extendee = fullNameOf(field.ContainingMessage()) - } - if field.Kind().IsValid() { - p.Type = descriptorpb.FieldDescriptorProto_Type(field.Kind()).Enum() - } - if field.Enum() != nil { - p.TypeName = fullNameOf(field.Enum()) - } - if field.Message() != nil { - p.TypeName = fullNameOf(field.Message()) - } - if field.HasJSONName() { - // A bug in older versions of protoc would always populate the - // "json_name" option for extensions when it is meaningless. - // When it did so, it would always use the camel-cased field name. - if field.IsExtension() { - p.JsonName = proto.String(strs.JSONCamelCase(string(field.Name()))) - } else { - p.JsonName = proto.String(field.JSONName()) - } - } - if field.Syntax() == protoreflect.Proto3 && field.HasOptionalKeyword() { - p.Proto3Optional = proto.Bool(true) - } - if field.HasDefault() { - def, err := defval.Marshal(field.Default(), field.DefaultEnumValue(), field.Kind(), defval.Descriptor) - if err != nil && field.DefaultEnumValue() != nil { - def = string(field.DefaultEnumValue().Name()) // occurs for unresolved enum values - } else if err != nil { - panic(fmt.Sprintf("%v: %v", field.FullName(), err)) - } - p.DefaultValue = proto.String(def) - } - if oneof := field.ContainingOneof(); oneof != nil { - p.OneofIndex = proto.Int32(int32(oneof.Index())) - } - return p -} - -// ToOneofDescriptorProto copies a protoreflect.OneofDescriptor into a -// google.protobuf.OneofDescriptorProto message. -func ToOneofDescriptorProto(oneof protoreflect.OneofDescriptor) *descriptorpb.OneofDescriptorProto { - return &descriptorpb.OneofDescriptorProto{ - Name: proto.String(string(oneof.Name())), - Options: proto.Clone(oneof.Options()).(*descriptorpb.OneofOptions), - } -} - -// ToEnumDescriptorProto copies a protoreflect.EnumDescriptor into a -// google.protobuf.EnumDescriptorProto message. -func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumDescriptorProto { - p := &descriptorpb.EnumDescriptorProto{ - Name: proto.String(string(enum.Name())), - Options: proto.Clone(enum.Options()).(*descriptorpb.EnumOptions), - } - for i, values := 0, enum.Values(); i < values.Len(); i++ { - p.Value = append(p.Value, ToEnumValueDescriptorProto(values.Get(i))) - } - for i, ranges := 0, enum.ReservedRanges(); i < ranges.Len(); i++ { - rrange := ranges.Get(i) - p.ReservedRange = append(p.ReservedRange, &descriptorpb.EnumDescriptorProto_EnumReservedRange{ - Start: proto.Int32(int32(rrange[0])), - End: proto.Int32(int32(rrange[1])), - }) - } - for i, names := 0, enum.ReservedNames(); i < names.Len(); i++ { - p.ReservedName = append(p.ReservedName, string(names.Get(i))) - } - return p -} - -// ToEnumValueDescriptorProto copies a protoreflect.EnumValueDescriptor into a -// google.protobuf.EnumValueDescriptorProto message. -func ToEnumValueDescriptorProto(value protoreflect.EnumValueDescriptor) *descriptorpb.EnumValueDescriptorProto { - return &descriptorpb.EnumValueDescriptorProto{ - Name: proto.String(string(value.Name())), - Number: proto.Int32(int32(value.Number())), - Options: proto.Clone(value.Options()).(*descriptorpb.EnumValueOptions), - } -} - -// ToServiceDescriptorProto copies a protoreflect.ServiceDescriptor into a -// google.protobuf.ServiceDescriptorProto message. -func ToServiceDescriptorProto(service protoreflect.ServiceDescriptor) *descriptorpb.ServiceDescriptorProto { - p := &descriptorpb.ServiceDescriptorProto{ - Name: proto.String(string(service.Name())), - Options: proto.Clone(service.Options()).(*descriptorpb.ServiceOptions), - } - for i, methods := 0, service.Methods(); i < methods.Len(); i++ { - p.Method = append(p.Method, ToMethodDescriptorProto(methods.Get(i))) - } - return p -} - -// ToMethodDescriptorProto copies a protoreflect.MethodDescriptor into a -// google.protobuf.MethodDescriptorProto message. -func ToMethodDescriptorProto(method protoreflect.MethodDescriptor) *descriptorpb.MethodDescriptorProto { - p := &descriptorpb.MethodDescriptorProto{ - Name: proto.String(string(method.Name())), - InputType: fullNameOf(method.Input()), - OutputType: fullNameOf(method.Output()), - Options: proto.Clone(method.Options()).(*descriptorpb.MethodOptions), - } - if method.IsStreamingClient() { - p.ClientStreaming = proto.Bool(true) - } - if method.IsStreamingServer() { - p.ServerStreaming = proto.Bool(true) - } - return p -} - -func fullNameOf(d protoreflect.Descriptor) *string { - if d == nil { - return nil - } - if strings.HasPrefix(string(d.FullName()), unknownPrefix) { - return proto.String(string(d.FullName()[len(unknownPrefix):])) - } - return proto.String("." + string(d.FullName())) -} diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go index 55aa1492..ec6572df 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go @@ -10,46 +10,46 @@ // // # Protocol Buffer Descriptors // -// Protobuf descriptors (e.g., EnumDescriptor or MessageDescriptor) +// Protobuf descriptors (e.g., [EnumDescriptor] or [MessageDescriptor]) // are immutable objects that represent protobuf type information. // They are wrappers around the messages declared in descriptor.proto. // Protobuf descriptors alone lack any information regarding Go types. // -// Enums and messages generated by this module implement Enum and ProtoMessage, +// Enums and messages generated by this module implement [Enum] and [ProtoMessage], // where the Descriptor and ProtoReflect.Descriptor accessors respectively // return the protobuf descriptor for the values. // // The protobuf descriptor interfaces are not meant to be implemented by // user code since they might need to be extended in the future to support // additions to the protobuf language. -// The "google.golang.org/protobuf/reflect/protodesc" package converts between +// The [google.golang.org/protobuf/reflect/protodesc] package converts between // google.protobuf.DescriptorProto messages and protobuf descriptors. // // # Go Type Descriptors // -// A type descriptor (e.g., EnumType or MessageType) is a constructor for +// A type descriptor (e.g., [EnumType] or [MessageType]) is a constructor for // a concrete Go type that represents the associated protobuf descriptor. // There is commonly a one-to-one relationship between protobuf descriptors and // Go type descriptors, but it can potentially be a one-to-many relationship. // -// Enums and messages generated by this module implement Enum and ProtoMessage, +// Enums and messages generated by this module implement [Enum] and [ProtoMessage], // where the Type and ProtoReflect.Type accessors respectively // return the protobuf descriptor for the values. // -// The "google.golang.org/protobuf/types/dynamicpb" package can be used to +// The [google.golang.org/protobuf/types/dynamicpb] package can be used to // create Go type descriptors from protobuf descriptors. // // # Value Interfaces // -// The Enum and Message interfaces provide a reflective view over an +// The [Enum] and [Message] interfaces provide a reflective view over an // enum or message instance. For enums, it provides the ability to retrieve // the enum value number for any concrete enum type. For messages, it provides // the ability to access or manipulate fields of the message. // -// To convert a proto.Message to a protoreflect.Message, use the +// To convert a [google.golang.org/protobuf/proto.Message] to a [protoreflect.Message], use the // former's ProtoReflect method. Since the ProtoReflect method is new to the // v2 message interface, it may not be present on older message implementations. -// The "github.com/golang/protobuf/proto".MessageReflect function can be used +// The [github.com/golang/protobuf/proto.MessageReflect] function can be used // to obtain a reflective view on older messages. // // # Relationships @@ -71,12 +71,12 @@ // │ │ // └────────────────── Type() ───────┘ // -// • An EnumType describes a concrete Go enum type. +// • An [EnumType] describes a concrete Go enum type. // It has an EnumDescriptor and can construct an Enum instance. // -// • An EnumDescriptor describes an abstract protobuf enum type. +// • An [EnumDescriptor] describes an abstract protobuf enum type. // -// • An Enum is a concrete enum instance. Generated enums implement Enum. +// • An [Enum] is a concrete enum instance. Generated enums implement Enum. // // ┌──────────────── New() ─────────────────┐ // │ │ @@ -90,24 +90,26 @@ // │ │ // └─────────────────── Type() ─────────┘ // -// • A MessageType describes a concrete Go message type. -// It has a MessageDescriptor and can construct a Message instance. -// Just as how Go's reflect.Type is a reflective description of a Go type, -// a MessageType is a reflective description of a Go type for a protobuf message. +// • A [MessageType] describes a concrete Go message type. +// It has a [MessageDescriptor] and can construct a [Message] instance. +// Just as how Go's [reflect.Type] is a reflective description of a Go type, +// a [MessageType] is a reflective description of a Go type for a protobuf message. // -// • A MessageDescriptor describes an abstract protobuf message type. -// It has no understanding of Go types. In order to construct a MessageType -// from just a MessageDescriptor, you can consider looking up the message type -// in the global registry using protoregistry.GlobalTypes.FindMessageByName -// or constructing a dynamic MessageType using dynamicpb.NewMessageType. +// • A [MessageDescriptor] describes an abstract protobuf message type. +// It has no understanding of Go types. In order to construct a [MessageType] +// from just a [MessageDescriptor], you can consider looking up the message type +// in the global registry using the FindMessageByName method on +// [google.golang.org/protobuf/reflect/protoregistry.GlobalTypes] +// or constructing a dynamic [MessageType] using +// [google.golang.org/protobuf/types/dynamicpb.NewMessageType]. // -// • A Message is a reflective view over a concrete message instance. -// Generated messages implement ProtoMessage, which can convert to a Message. -// Just as how Go's reflect.Value is a reflective view over a Go value, -// a Message is a reflective view over a concrete protobuf message instance. -// Using Go reflection as an analogy, the ProtoReflect method is similar to -// calling reflect.ValueOf, and the Message.Interface method is similar to -// calling reflect.Value.Interface. +// • A [Message] is a reflective view over a concrete message instance. +// Generated messages implement [ProtoMessage], which can convert to a [Message]. +// Just as how Go's [reflect.Value] is a reflective view over a Go value, +// a [Message] is a reflective view over a concrete protobuf message instance. +// Using Go reflection as an analogy, the [ProtoMessage.ProtoReflect] method is similar to +// calling [reflect.ValueOf], and the [Message.Interface] method is similar to +// calling [reflect.Value.Interface]. // // ┌── TypeDescriptor() ──┐ ┌───── Descriptor() ─────┐ // │ V │ V @@ -119,15 +121,15 @@ // │ │ // └────── implements ────────┘ // -// • An ExtensionType describes a concrete Go implementation of an extension. -// It has an ExtensionTypeDescriptor and can convert to/from -// abstract Values and Go values. +// • An [ExtensionType] describes a concrete Go implementation of an extension. +// It has an [ExtensionTypeDescriptor] and can convert to/from +// an abstract [Value] and a Go value. // -// • An ExtensionTypeDescriptor is an ExtensionDescriptor -// which also has an ExtensionType. +// • An [ExtensionTypeDescriptor] is an [ExtensionDescriptor] +// which also has an [ExtensionType]. // -// • An ExtensionDescriptor describes an abstract protobuf extension field and -// may not always be an ExtensionTypeDescriptor. +// • An [ExtensionDescriptor] describes an abstract protobuf extension field and +// may not always be an [ExtensionTypeDescriptor]. package protoreflect import ( @@ -142,7 +144,7 @@ type doNotImplement pragma.DoNotImplement // ProtoMessage is the top-level interface that all proto messages implement. // This is declared in the protoreflect package to avoid a cyclic dependency; -// use the proto.Message type instead, which aliases this type. +// use the [google.golang.org/protobuf/proto.Message] type instead, which aliases this type. type ProtoMessage interface{ ProtoReflect() Message } // Syntax is the language version of the proto file. @@ -151,8 +153,9 @@ type Syntax syntax type syntax int8 // keep exact type opaque as the int type may change const ( - Proto2 Syntax = 2 - Proto3 Syntax = 3 + Proto2 Syntax = 2 + Proto3 Syntax = 3 + Editions Syntax = 4 ) // IsValid reports whether the syntax is valid. @@ -436,7 +439,7 @@ type Names interface { // FullName is a qualified name that uniquely identifies a proto declaration. // A qualified name is the concatenation of the proto package along with the // fully-declared name (i.e., name of parent preceding the name of the child), -// with a '.' delimiter placed between each Name. +// with a '.' delimiter placed between each [Name]. // // This should not have any leading or trailing dots. type FullName string // e.g., "google.protobuf.Field.Kind" @@ -480,7 +483,7 @@ func isLetterDigit(c byte) bool { } // Name returns the short name, which is the last identifier segment. -// A single segment FullName is the Name itself. +// A single segment FullName is the [Name] itself. func (n FullName) Name() Name { if i := strings.LastIndexByte(string(n), '.'); i >= 0 { return Name(n[i+1:]) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go index 717b106f..0c045db6 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go @@ -35,7 +35,7 @@ func (p *SourcePath) appendFileDescriptorProto(b []byte) []byte { b = p.appendSingularField(b, "source_code_info", (*SourcePath).appendSourceCodeInfo) case 12: b = p.appendSingularField(b, "syntax", nil) - case 13: + case 14: b = p.appendSingularField(b, "edition", nil) } return b @@ -180,6 +180,8 @@ func (p *SourcePath) appendFileOptions(b []byte) []byte { b = p.appendSingularField(b, "php_metadata_namespace", nil) case 45: b = p.appendSingularField(b, "ruby_package", nil) + case 50: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -240,6 +242,8 @@ func (p *SourcePath) appendMessageOptions(b []byte) []byte { b = p.appendSingularField(b, "map_entry", nil) case 11: b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) + case 12: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -285,6 +289,8 @@ func (p *SourcePath) appendEnumOptions(b []byte) []byte { b = p.appendSingularField(b, "deprecated", nil) case 6: b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) + case 7: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -330,6 +336,8 @@ func (p *SourcePath) appendServiceOptions(b []byte) []byte { return b } switch (*p)[0] { + case 34: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 33: b = p.appendSingularField(b, "deprecated", nil) case 999: @@ -361,16 +369,39 @@ func (p *SourcePath) appendFieldOptions(b []byte) []byte { b = p.appendSingularField(b, "debug_redact", nil) case 17: b = p.appendSingularField(b, "retention", nil) - case 18: - b = p.appendSingularField(b, "target", nil) case 19: b = p.appendRepeatedField(b, "targets", nil) + case 20: + b = p.appendRepeatedField(b, "edition_defaults", (*SourcePath).appendFieldOptions_EditionDefault) + case 21: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } return b } +func (p *SourcePath) appendFeatureSet(b []byte) []byte { + if len(*p) == 0 { + return b + } + switch (*p)[0] { + case 1: + b = p.appendSingularField(b, "field_presence", nil) + case 2: + b = p.appendSingularField(b, "enum_type", nil) + case 3: + b = p.appendSingularField(b, "repeated_field_encoding", nil) + case 4: + b = p.appendSingularField(b, "utf8_validation", nil) + case 5: + b = p.appendSingularField(b, "message_encoding", nil) + case 6: + b = p.appendSingularField(b, "json_format", nil) + } + return b +} + func (p *SourcePath) appendUninterpretedOption(b []byte) []byte { if len(*p) == 0 { return b @@ -422,6 +453,8 @@ func (p *SourcePath) appendExtensionRangeOptions(b []byte) []byte { b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) case 2: b = p.appendRepeatedField(b, "declaration", (*SourcePath).appendExtensionRangeOptions_Declaration) + case 50: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 3: b = p.appendSingularField(b, "verification", nil) } @@ -433,6 +466,8 @@ func (p *SourcePath) appendOneofOptions(b []byte) []byte { return b } switch (*p)[0] { + case 1: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -446,6 +481,10 @@ func (p *SourcePath) appendEnumValueOptions(b []byte) []byte { switch (*p)[0] { case 1: b = p.appendSingularField(b, "deprecated", nil) + case 2: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) + case 3: + b = p.appendSingularField(b, "debug_redact", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -461,12 +500,27 @@ func (p *SourcePath) appendMethodOptions(b []byte) []byte { b = p.appendSingularField(b, "deprecated", nil) case 34: b = p.appendSingularField(b, "idempotency_level", nil) + case 35: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } return b } +func (p *SourcePath) appendFieldOptions_EditionDefault(b []byte) []byte { + if len(*p) == 0 { + return b + } + switch (*p)[0] { + case 3: + b = p.appendSingularField(b, "edition", nil) + case 2: + b = p.appendSingularField(b, "value", nil) + } + return b +} + func (p *SourcePath) appendUninterpretedOption_NamePart(b []byte) []byte { if len(*p) == 0 { return b @@ -491,8 +545,6 @@ func (p *SourcePath) appendExtensionRangeOptions_Declaration(b []byte) []byte { b = p.appendSingularField(b, "full_name", nil) case 3: b = p.appendSingularField(b, "type", nil) - case 4: - b = p.appendSingularField(b, "is_repeated", nil) case 5: b = p.appendSingularField(b, "reserved", nil) case 6: diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go index 3867470d..60ff62b4 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go @@ -12,7 +12,7 @@ package protoreflect // exactly identical. However, it is possible for the same semantically // identical proto type to be represented by multiple type descriptors. // -// For example, suppose we have t1 and t2 which are both MessageDescriptors. +// For example, suppose we have t1 and t2 which are both an [MessageDescriptor]. // If t1 == t2, then the types are definitely equal and all accessors return // the same information. However, if t1 != t2, then it is still possible that // they still represent the same proto type (e.g., t1.FullName == t2.FullName). @@ -115,7 +115,7 @@ type Descriptor interface { // corresponds with the google.protobuf.FileDescriptorProto message. // // Top-level declarations: -// EnumDescriptor, MessageDescriptor, FieldDescriptor, and/or ServiceDescriptor. +// [EnumDescriptor], [MessageDescriptor], [FieldDescriptor], and/or [ServiceDescriptor]. type FileDescriptor interface { Descriptor // Descriptor.FullName is identical to Package @@ -180,8 +180,8 @@ type FileImport struct { // corresponds with the google.protobuf.DescriptorProto message. // // Nested declarations: -// FieldDescriptor, OneofDescriptor, FieldDescriptor, EnumDescriptor, -// and/or MessageDescriptor. +// [FieldDescriptor], [OneofDescriptor], [FieldDescriptor], [EnumDescriptor], +// and/or [MessageDescriptor]. type MessageDescriptor interface { Descriptor @@ -214,7 +214,7 @@ type MessageDescriptor interface { ExtensionRanges() FieldRanges // ExtensionRangeOptions returns the ith extension range options. // - // To avoid a dependency cycle, this method returns a proto.Message value, + // To avoid a dependency cycle, this method returns a proto.Message] value, // which always contains a google.protobuf.ExtensionRangeOptions message. // This method returns a typed nil-pointer if no options are present. // The caller must import the descriptorpb package to use this. @@ -231,9 +231,9 @@ type MessageDescriptor interface { } type isMessageDescriptor interface{ ProtoType(MessageDescriptor) } -// MessageType encapsulates a MessageDescriptor with a concrete Go implementation. +// MessageType encapsulates a [MessageDescriptor] with a concrete Go implementation. // It is recommended that implementations of this interface also implement the -// MessageFieldTypes interface. +// [MessageFieldTypes] interface. type MessageType interface { // New returns a newly allocated empty message. // It may return nil for synthetic messages representing a map entry. @@ -249,19 +249,19 @@ type MessageType interface { Descriptor() MessageDescriptor } -// MessageFieldTypes extends a MessageType by providing type information +// MessageFieldTypes extends a [MessageType] by providing type information // regarding enums and messages referenced by the message fields. type MessageFieldTypes interface { MessageType - // Enum returns the EnumType for the ith field in Descriptor.Fields. + // Enum returns the EnumType for the ith field in MessageDescriptor.Fields. // It returns nil if the ith field is not an enum kind. // It panics if out of bounds. // // Invariant: mt.Enum(i).Descriptor() == mt.Descriptor().Fields(i).Enum() Enum(i int) EnumType - // Message returns the MessageType for the ith field in Descriptor.Fields. + // Message returns the MessageType for the ith field in MessageDescriptor.Fields. // It returns nil if the ith field is not a message or group kind. // It panics if out of bounds. // @@ -286,8 +286,8 @@ type MessageDescriptors interface { // corresponds with the google.protobuf.FieldDescriptorProto message. // // It is used for both normal fields defined within the parent message -// (e.g., MessageDescriptor.Fields) and fields that extend some remote message -// (e.g., FileDescriptor.Extensions or MessageDescriptor.Extensions). +// (e.g., [MessageDescriptor.Fields]) and fields that extend some remote message +// (e.g., [FileDescriptor.Extensions] or [MessageDescriptor.Extensions]). type FieldDescriptor interface { Descriptor @@ -344,7 +344,7 @@ type FieldDescriptor interface { // IsMap reports whether this field represents a map, // where the value type for the associated field is a Map. // It is equivalent to checking whether Cardinality is Repeated, - // that the Kind is MessageKind, and that Message.IsMapEntry reports true. + // that the Kind is MessageKind, and that MessageDescriptor.IsMapEntry reports true. IsMap() bool // MapKey returns the field descriptor for the key in the map entry. @@ -419,7 +419,7 @@ type OneofDescriptor interface { // IsSynthetic reports whether this is a synthetic oneof created to support // proto3 optional semantics. If true, Fields contains exactly one field - // with HasOptionalKeyword specified. + // with FieldDescriptor.HasOptionalKeyword specified. IsSynthetic() bool // Fields is a list of fields belonging to this oneof. @@ -442,10 +442,10 @@ type OneofDescriptors interface { doNotImplement } -// ExtensionDescriptor is an alias of FieldDescriptor for documentation. +// ExtensionDescriptor is an alias of [FieldDescriptor] for documentation. type ExtensionDescriptor = FieldDescriptor -// ExtensionTypeDescriptor is an ExtensionDescriptor with an associated ExtensionType. +// ExtensionTypeDescriptor is an [ExtensionDescriptor] with an associated [ExtensionType]. type ExtensionTypeDescriptor interface { ExtensionDescriptor @@ -470,12 +470,12 @@ type ExtensionDescriptors interface { doNotImplement } -// ExtensionType encapsulates an ExtensionDescriptor with a concrete +// ExtensionType encapsulates an [ExtensionDescriptor] with a concrete // Go implementation. The nested field descriptor must be for a extension field. // // While a normal field is a member of the parent message that it is declared -// within (see Descriptor.Parent), an extension field is a member of some other -// target message (see ExtensionDescriptor.Extendee) and may have no +// within (see [Descriptor.Parent]), an extension field is a member of some other +// target message (see [FieldDescriptor.ContainingMessage]) and may have no // relationship with the parent. However, the full name of an extension field is // relative to the parent that it is declared within. // @@ -532,7 +532,7 @@ type ExtensionType interface { // corresponds with the google.protobuf.EnumDescriptorProto message. // // Nested declarations: -// EnumValueDescriptor. +// [EnumValueDescriptor]. type EnumDescriptor interface { Descriptor @@ -548,7 +548,7 @@ type EnumDescriptor interface { } type isEnumDescriptor interface{ ProtoType(EnumDescriptor) } -// EnumType encapsulates an EnumDescriptor with a concrete Go implementation. +// EnumType encapsulates an [EnumDescriptor] with a concrete Go implementation. type EnumType interface { // New returns an instance of this enum type with its value set to n. New(n EnumNumber) Enum @@ -610,7 +610,7 @@ type EnumValueDescriptors interface { // ServiceDescriptor describes a service and // corresponds with the google.protobuf.ServiceDescriptorProto message. // -// Nested declarations: MethodDescriptor. +// Nested declarations: [MethodDescriptor]. type ServiceDescriptor interface { Descriptor diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go index 37601b78..a7b0d06f 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go @@ -27,16 +27,16 @@ type Enum interface { // Message is a reflective interface for a concrete message value, // encapsulating both type and value information for the message. // -// Accessor/mutators for individual fields are keyed by FieldDescriptor. +// Accessor/mutators for individual fields are keyed by [FieldDescriptor]. // For non-extension fields, the descriptor must exactly match the // field known by the parent message. -// For extension fields, the descriptor must implement ExtensionTypeDescriptor, -// extend the parent message (i.e., have the same message FullName), and +// For extension fields, the descriptor must implement [ExtensionTypeDescriptor], +// extend the parent message (i.e., have the same message [FullName]), and // be within the parent's extension range. // -// Each field Value can be a scalar or a composite type (Message, List, or Map). -// See Value for the Go types associated with a FieldDescriptor. -// Providing a Value that is invalid or of an incorrect type panics. +// Each field [Value] can be a scalar or a composite type ([Message], [List], or [Map]). +// See [Value] for the Go types associated with a [FieldDescriptor]. +// Providing a [Value] that is invalid or of an incorrect type panics. type Message interface { // Descriptor returns message descriptor, which contains only the protobuf // type information for the message. @@ -152,7 +152,7 @@ type Message interface { // This method may return nil. // // The returned methods type is identical to - // "google.golang.org/protobuf/runtime/protoiface".Methods. + // google.golang.org/protobuf/runtime/protoiface.Methods. // Consult the protoiface package documentation for details. ProtoMethods() *methods } @@ -175,8 +175,8 @@ func (b RawFields) IsValid() bool { } // List is a zero-indexed, ordered list. -// The element Value type is determined by FieldDescriptor.Kind. -// Providing a Value that is invalid or of an incorrect type panics. +// The element [Value] type is determined by [FieldDescriptor.Kind]. +// Providing a [Value] that is invalid or of an incorrect type panics. type List interface { // Len reports the number of entries in the List. // Get, Set, and Truncate panic with out of bound indexes. @@ -226,9 +226,9 @@ type List interface { } // Map is an unordered, associative map. -// The entry MapKey type is determined by FieldDescriptor.MapKey.Kind. -// The entry Value type is determined by FieldDescriptor.MapValue.Kind. -// Providing a MapKey or Value that is invalid or of an incorrect type panics. +// The entry [MapKey] type is determined by [FieldDescriptor.MapKey].Kind. +// The entry [Value] type is determined by [FieldDescriptor.MapValue].Kind. +// Providing a [MapKey] or [Value] that is invalid or of an incorrect type panics. type Map interface { // Len reports the number of elements in the map. Len() int diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go index 59165254..654599d4 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go @@ -24,19 +24,19 @@ import ( // Unlike the == operator, a NaN is equal to another NaN. // // - Enums are equal if they contain the same number. -// Since Value does not contain an enum descriptor, +// Since [Value] does not contain an enum descriptor, // enum values do not consider the type of the enum. // // - Other scalar values are equal if they contain the same value. // -// - Message values are equal if they belong to the same message descriptor, +// - [Message] values are equal if they belong to the same message descriptor, // have the same set of populated known and extension field values, // and the same set of unknown fields values. // -// - Lists are equal if they are the same length and +// - [List] values are equal if they are the same length and // each corresponding element is equal. // -// - Maps are equal if they have the same set of keys and +// - [Map] values are equal if they have the same set of keys and // the corresponding value for each key is equal. func (v1 Value) Equal(v2 Value) bool { return equalValue(v1, v2) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go index 08e5ef73..16030973 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go @@ -11,7 +11,7 @@ import ( // Value is a union where only one Go type may be set at a time. // The Value is used to represent all possible values a field may take. -// The following shows which Go type is used to represent each proto Kind: +// The following shows which Go type is used to represent each proto [Kind]: // // ╔════════════╤═════════════════════════════════════╗ // ║ Go type │ Protobuf kind ║ @@ -31,22 +31,22 @@ import ( // // Multiple protobuf Kinds may be represented by a single Go type if the type // can losslessly represent the information for the proto kind. For example, -// Int64Kind, Sint64Kind, and Sfixed64Kind are all represented by int64, +// [Int64Kind], [Sint64Kind], and [Sfixed64Kind] are all represented by int64, // but use different integer encoding methods. // -// The List or Map types are used if the field cardinality is repeated. -// A field is a List if FieldDescriptor.IsList reports true. -// A field is a Map if FieldDescriptor.IsMap reports true. +// The [List] or [Map] types are used if the field cardinality is repeated. +// A field is a [List] if [FieldDescriptor.IsList] reports true. +// A field is a [Map] if [FieldDescriptor.IsMap] reports true. // // Converting to/from a Value and a concrete Go value panics on type mismatch. -// For example, ValueOf("hello").Int() panics because this attempts to +// For example, [ValueOf]("hello").Int() panics because this attempts to // retrieve an int64 from a string. // -// List, Map, and Message Values are called "composite" values. +// [List], [Map], and [Message] Values are called "composite" values. // // A composite Value may alias (reference) memory at some location, // such that changes to the Value updates the that location. -// A composite value acquired with a Mutable method, such as Message.Mutable, +// A composite value acquired with a Mutable method, such as [Message.Mutable], // always references the source object. // // For example: @@ -65,7 +65,7 @@ import ( // // appending to the List here may or may not modify the message. // list.Append(protoreflect.ValueOfInt32(0)) // -// Some operations, such as Message.Get, may return an "empty, read-only" +// Some operations, such as [Message.Get], may return an "empty, read-only" // composite Value. Modifying an empty, read-only value panics. type Value value @@ -306,7 +306,7 @@ func (v Value) Float() float64 { } } -// String returns v as a string. Since this method implements fmt.Stringer, +// String returns v as a string. Since this method implements [fmt.Stringer], // this returns the formatted string value for any non-string type. func (v Value) String() string { switch v.typ { @@ -327,7 +327,7 @@ func (v Value) Bytes() []byte { } } -// Enum returns v as a EnumNumber and panics if the type is not a EnumNumber. +// Enum returns v as a [EnumNumber] and panics if the type is not a [EnumNumber]. func (v Value) Enum() EnumNumber { switch v.typ { case enumType: @@ -337,7 +337,7 @@ func (v Value) Enum() EnumNumber { } } -// Message returns v as a Message and panics if the type is not a Message. +// Message returns v as a [Message] and panics if the type is not a [Message]. func (v Value) Message() Message { switch vi := v.getIface().(type) { case Message: @@ -347,7 +347,7 @@ func (v Value) Message() Message { } } -// List returns v as a List and panics if the type is not a List. +// List returns v as a [List] and panics if the type is not a [List]. func (v Value) List() List { switch vi := v.getIface().(type) { case List: @@ -357,7 +357,7 @@ func (v Value) List() List { } } -// Map returns v as a Map and panics if the type is not a Map. +// Map returns v as a [Map] and panics if the type is not a [Map]. func (v Value) Map() Map { switch vi := v.getIface().(type) { case Map: @@ -367,7 +367,7 @@ func (v Value) Map() Map { } } -// MapKey returns v as a MapKey and panics for invalid MapKey types. +// MapKey returns v as a [MapKey] and panics for invalid [MapKey] types. func (v Value) MapKey() MapKey { switch v.typ { case boolType, int32Type, int64Type, uint32Type, uint64Type, stringType: @@ -378,8 +378,8 @@ func (v Value) MapKey() MapKey { } // MapKey is used to index maps, where the Go type of the MapKey must match -// the specified key Kind (see MessageDescriptor.IsMapEntry). -// The following shows what Go type is used to represent each proto Kind: +// the specified key [Kind] (see [MessageDescriptor.IsMapEntry]). +// The following shows what Go type is used to represent each proto [Kind]: // // ╔═════════╤═════════════════════════════════════╗ // ║ Go type │ Protobuf kind ║ @@ -392,13 +392,13 @@ func (v Value) MapKey() MapKey { // ║ string │ StringKind ║ // ╚═════════╧═════════════════════════════════════╝ // -// A MapKey is constructed and accessed through a Value: +// A MapKey is constructed and accessed through a [Value]: // // k := ValueOf("hash").MapKey() // convert string to MapKey // s := k.String() // convert MapKey to string // -// The MapKey is a strict subset of valid types used in Value; -// converting a Value to a MapKey with an invalid type panics. +// The MapKey is a strict subset of valid types used in [Value]; +// converting a [Value] to a MapKey with an invalid type panics. type MapKey value // IsValid reports whether k is populated with a value. @@ -426,13 +426,13 @@ func (k MapKey) Uint() uint64 { return Value(k).Uint() } -// String returns k as a string. Since this method implements fmt.Stringer, +// String returns k as a string. Since this method implements [fmt.Stringer], // this returns the formatted string value for any non-string type. func (k MapKey) String() string { return Value(k).String() } -// Value returns k as a Value. +// Value returns k as a [Value]. func (k MapKey) Value() Value { return Value(k) } diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go similarity index 97% rename from vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go rename to vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go index 702ddf22..b1fdbe3e 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !purego && !appengine -// +build !purego,!appengine +//go:build !purego && !appengine && !go1.21 +// +build !purego,!appengine,!go1.21 package protoreflect diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go new file mode 100644 index 00000000..43547011 --- /dev/null +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go @@ -0,0 +1,87 @@ +// 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 file. + +//go:build !purego && !appengine && go1.21 +// +build !purego,!appengine,go1.21 + +package protoreflect + +import ( + "unsafe" + + "google.golang.org/protobuf/internal/pragma" +) + +type ( + ifaceHeader struct { + _ [0]interface{} // if interfaces have greater alignment than unsafe.Pointer, this will enforce it. + Type unsafe.Pointer + Data unsafe.Pointer + } +) + +var ( + nilType = typeOf(nil) + boolType = typeOf(*new(bool)) + int32Type = typeOf(*new(int32)) + int64Type = typeOf(*new(int64)) + uint32Type = typeOf(*new(uint32)) + uint64Type = typeOf(*new(uint64)) + float32Type = typeOf(*new(float32)) + float64Type = typeOf(*new(float64)) + stringType = typeOf(*new(string)) + bytesType = typeOf(*new([]byte)) + enumType = typeOf(*new(EnumNumber)) +) + +// typeOf returns a pointer to the Go type information. +// The pointer is comparable and equal if and only if the types are identical. +func typeOf(t interface{}) unsafe.Pointer { + return (*ifaceHeader)(unsafe.Pointer(&t)).Type +} + +// value is a union where only one type can be represented at a time. +// The struct is 24B large on 64-bit systems and requires the minimum storage +// necessary to represent each possible type. +// +// The Go GC needs to be able to scan variables containing pointers. +// As such, pointers and non-pointers cannot be intermixed. +type value struct { + pragma.DoNotCompare // 0B + + // typ stores the type of the value as a pointer to the Go type. + typ unsafe.Pointer // 8B + + // ptr stores the data pointer for a String, Bytes, or interface value. + ptr unsafe.Pointer // 8B + + // num stores a Bool, Int32, Int64, Uint32, Uint64, Float32, Float64, or + // Enum value as a raw uint64. + // + // It is also used to store the length of a String or Bytes value; + // the capacity is ignored. + num uint64 // 8B +} + +func valueOfString(v string) Value { + return Value{typ: stringType, ptr: unsafe.Pointer(unsafe.StringData(v)), num: uint64(len(v))} +} +func valueOfBytes(v []byte) Value { + return Value{typ: bytesType, ptr: unsafe.Pointer(unsafe.SliceData(v)), num: uint64(len(v))} +} +func valueOfIface(v interface{}) Value { + p := (*ifaceHeader)(unsafe.Pointer(&v)) + return Value{typ: p.Type, ptr: p.Data} +} + +func (v Value) getString() string { + return unsafe.String((*byte)(v.ptr), v.num) +} +func (v Value) getBytes() []byte { + return unsafe.Slice((*byte)(v.ptr), v.num) +} +func (v Value) getIface() (x interface{}) { + *(*ifaceHeader)(unsafe.Pointer(&x)) = ifaceHeader{Type: v.typ, Data: v.ptr} + return x +} diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index aeb55977..6267dc52 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -5,12 +5,12 @@ // Package protoregistry provides data structures to register and lookup // protobuf descriptor types. // -// The Files registry contains file descriptors and provides the ability +// The [Files] registry contains file descriptors and provides the ability // to iterate over the files or lookup a specific descriptor within the files. -// Files only contains protobuf descriptors and has no understanding of Go +// [Files] only contains protobuf descriptors and has no understanding of Go // type information that may be associated with each descriptor. // -// The Types registry contains descriptor types for which there is a known +// The [Types] registry contains descriptor types for which there is a known // Go type associated with that descriptor. It provides the ability to iterate // over the registered types or lookup a type by name. package protoregistry @@ -218,7 +218,7 @@ func (r *Files) checkGenProtoConflict(path string) { // FindDescriptorByName looks up a descriptor by the full name. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Files) FindDescriptorByName(name protoreflect.FullName) (protoreflect.Descriptor, error) { if r == nil { return nil, NotFound @@ -310,7 +310,7 @@ func (s *nameSuffix) Pop() (name protoreflect.Name) { // FindFileByPath looks up a file by the path. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. // This returns an error if multiple files have the same path. func (r *Files) FindFileByPath(path string) (protoreflect.FileDescriptor, error) { if r == nil { @@ -431,7 +431,7 @@ func rangeTopLevelDescriptors(fd protoreflect.FileDescriptor, f func(protoreflec // A compliant implementation must deterministically return the same type // if no error is encountered. // -// The Types type implements this interface. +// The [Types] type implements this interface. type MessageTypeResolver interface { // FindMessageByName looks up a message by its full name. // E.g., "google.protobuf.Any" @@ -451,7 +451,7 @@ type MessageTypeResolver interface { // A compliant implementation must deterministically return the same type // if no error is encountered. // -// The Types type implements this interface. +// The [Types] type implements this interface. type ExtensionTypeResolver interface { // FindExtensionByName looks up a extension field by the field's full name. // Note that this is the full name of the field as determined by @@ -590,7 +590,7 @@ func (r *Types) register(kind string, desc protoreflect.Descriptor, typ interfac // FindEnumByName looks up an enum by its full name. // E.g., "google.protobuf.Field.Kind". // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindEnumByName(enum protoreflect.FullName) (protoreflect.EnumType, error) { if r == nil { return nil, NotFound @@ -611,7 +611,7 @@ func (r *Types) FindEnumByName(enum protoreflect.FullName) (protoreflect.EnumTyp // FindMessageByName looks up a message by its full name, // e.g. "google.protobuf.Any". // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) { if r == nil { return nil, NotFound @@ -632,7 +632,7 @@ func (r *Types) FindMessageByName(message protoreflect.FullName) (protoreflect.M // FindMessageByURL looks up a message by a URL identifier. // See documentation on google.protobuf.Any.type_url for the URL format. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindMessageByURL(url string) (protoreflect.MessageType, error) { // This function is similar to FindMessageByName but // truncates anything before and including '/' in the URL. @@ -662,7 +662,7 @@ func (r *Types) FindMessageByURL(url string) (protoreflect.MessageType, error) { // where the extension is declared and is unrelated to the full name of the // message being extended. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { if r == nil { return nil, NotFound @@ -703,7 +703,7 @@ func (r *Types) FindExtensionByName(field protoreflect.FullName) (protoreflect.E // FindExtensionByNumber looks up a extension field by the field number // within some parent message, identified by full name. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { if r == nil { return nil, NotFound diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go deleted file mode 100644 index 04c00f73..00000000 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ /dev/null @@ -1,4605 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// 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. - -// Author: kenton@google.com (Kenton Varda) -// Based on original Protocol Buffers design by -// Sanjay Ghemawat, Jeff Dean, and others. -// -// The messages in this file describe the definitions found in .proto files. -// A valid .proto file can be translated directly to a FileDescriptorProto -// without any other information (e.g. without reading its imports). - -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/protobuf/descriptor.proto - -package descriptorpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -// The verification state of the extension range. -type ExtensionRangeOptions_VerificationState int32 - -const ( - // All the extensions of the range must be declared. - ExtensionRangeOptions_DECLARATION ExtensionRangeOptions_VerificationState = 0 - ExtensionRangeOptions_UNVERIFIED ExtensionRangeOptions_VerificationState = 1 -) - -// Enum value maps for ExtensionRangeOptions_VerificationState. -var ( - ExtensionRangeOptions_VerificationState_name = map[int32]string{ - 0: "DECLARATION", - 1: "UNVERIFIED", - } - ExtensionRangeOptions_VerificationState_value = map[string]int32{ - "DECLARATION": 0, - "UNVERIFIED": 1, - } -) - -func (x ExtensionRangeOptions_VerificationState) Enum() *ExtensionRangeOptions_VerificationState { - p := new(ExtensionRangeOptions_VerificationState) - *p = x - return p -} - -func (x ExtensionRangeOptions_VerificationState) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ExtensionRangeOptions_VerificationState) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() -} - -func (ExtensionRangeOptions_VerificationState) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[0] -} - -func (x ExtensionRangeOptions_VerificationState) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *ExtensionRangeOptions_VerificationState) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = ExtensionRangeOptions_VerificationState(num) - return nil -} - -// Deprecated: Use ExtensionRangeOptions_VerificationState.Descriptor instead. -func (ExtensionRangeOptions_VerificationState) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3, 0} -} - -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 // Length-delimited aggregate. - // 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 // Uses ZigZag encoding. - FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 // Uses ZigZag encoding. -) - -// Enum value maps for FieldDescriptorProto_Type. -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", - } - 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 protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FieldDescriptorProto_Type) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() -} - -func (FieldDescriptorProto_Type) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[1] -} - -func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FieldDescriptorProto_Type) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FieldDescriptorProto_Type(num) - return nil -} - -// Deprecated: Use FieldDescriptorProto_Type.Descriptor instead. -func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []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 -) - -// Enum value maps for FieldDescriptorProto_Label. -var ( - FieldDescriptorProto_Label_name = map[int32]string{ - 1: "LABEL_OPTIONAL", - 2: "LABEL_REQUIRED", - 3: "LABEL_REPEATED", - } - 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 protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FieldDescriptorProto_Label) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() -} - -func (FieldDescriptorProto_Label) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[2] -} - -func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FieldDescriptorProto_Label) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FieldDescriptorProto_Label(num) - return nil -} - -// Deprecated: Use FieldDescriptorProto_Label.Descriptor instead. -func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{4, 1} -} - -// Generated classes can be optimized for speed or code size. -type FileOptions_OptimizeMode int32 - -const ( - FileOptions_SPEED FileOptions_OptimizeMode = 1 // Generate complete code for parsing, serialization, - // etc. - FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 // Use ReflectionOps to implement these methods. - FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 // Generate code using MessageLite and the lite runtime. -) - -// Enum value maps for FileOptions_OptimizeMode. -var ( - FileOptions_OptimizeMode_name = map[int32]string{ - 1: "SPEED", - 2: "CODE_SIZE", - 3: "LITE_RUNTIME", - } - 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 protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FileOptions_OptimizeMode) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() -} - -func (FileOptions_OptimizeMode) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[3] -} - -func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FileOptions_OptimizeMode) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FileOptions_OptimizeMode(num) - return nil -} - -// Deprecated: Use FileOptions_OptimizeMode.Descriptor instead. -func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{10, 0} -} - -type FieldOptions_CType int32 - -const ( - // Default mode. - FieldOptions_STRING FieldOptions_CType = 0 - // The option [ctype=CORD] may be applied to a non-repeated field of type - // "bytes". It indicates that in C++, the data should be stored in a Cord - // instead of a string. For very large strings, this may reduce memory - // fragmentation. It may also allow better performance when parsing from a - // Cord, or when parsing with aliasing enabled, as the parsed Cord may then - // alias the original buffer. - FieldOptions_CORD FieldOptions_CType = 1 - FieldOptions_STRING_PIECE FieldOptions_CType = 2 -) - -// Enum value maps for FieldOptions_CType. -var ( - FieldOptions_CType_name = map[int32]string{ - 0: "STRING", - 1: "CORD", - 2: "STRING_PIECE", - } - 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 protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FieldOptions_CType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() -} - -func (FieldOptions_CType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[4] -} - -func (x FieldOptions_CType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FieldOptions_CType) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FieldOptions_CType(num) - return nil -} - -// Deprecated: Use FieldOptions_CType.Descriptor instead. -func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []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 -) - -// Enum value maps for FieldOptions_JSType. -var ( - FieldOptions_JSType_name = map[int32]string{ - 0: "JS_NORMAL", - 1: "JS_STRING", - 2: "JS_NUMBER", - } - 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 protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FieldOptions_JSType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() -} - -func (FieldOptions_JSType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[5] -} - -func (x FieldOptions_JSType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FieldOptions_JSType) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FieldOptions_JSType(num) - return nil -} - -// Deprecated: Use FieldOptions_JSType.Descriptor instead. -func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 1} -} - -// If set to RETENTION_SOURCE, the option will be omitted from the binary. -// Note: as of January 2023, support for this is in progress and does not yet -// have an effect (b/264593489). -type FieldOptions_OptionRetention int32 - -const ( - FieldOptions_RETENTION_UNKNOWN FieldOptions_OptionRetention = 0 - FieldOptions_RETENTION_RUNTIME FieldOptions_OptionRetention = 1 - FieldOptions_RETENTION_SOURCE FieldOptions_OptionRetention = 2 -) - -// Enum value maps for FieldOptions_OptionRetention. -var ( - FieldOptions_OptionRetention_name = map[int32]string{ - 0: "RETENTION_UNKNOWN", - 1: "RETENTION_RUNTIME", - 2: "RETENTION_SOURCE", - } - FieldOptions_OptionRetention_value = map[string]int32{ - "RETENTION_UNKNOWN": 0, - "RETENTION_RUNTIME": 1, - "RETENTION_SOURCE": 2, - } -) - -func (x FieldOptions_OptionRetention) Enum() *FieldOptions_OptionRetention { - p := new(FieldOptions_OptionRetention) - *p = x - return p -} - -func (x FieldOptions_OptionRetention) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FieldOptions_OptionRetention) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[6].Descriptor() -} - -func (FieldOptions_OptionRetention) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[6] -} - -func (x FieldOptions_OptionRetention) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FieldOptions_OptionRetention) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FieldOptions_OptionRetention(num) - return nil -} - -// Deprecated: Use FieldOptions_OptionRetention.Descriptor instead. -func (FieldOptions_OptionRetention) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 2} -} - -// This indicates the types of entities that the field may apply to when used -// as an option. If it is unset, then the field may be freely used as an -// option on any kind of entity. Note: as of January 2023, support for this is -// in progress and does not yet have an effect (b/264593489). -type FieldOptions_OptionTargetType int32 - -const ( - FieldOptions_TARGET_TYPE_UNKNOWN FieldOptions_OptionTargetType = 0 - FieldOptions_TARGET_TYPE_FILE FieldOptions_OptionTargetType = 1 - FieldOptions_TARGET_TYPE_EXTENSION_RANGE FieldOptions_OptionTargetType = 2 - FieldOptions_TARGET_TYPE_MESSAGE FieldOptions_OptionTargetType = 3 - FieldOptions_TARGET_TYPE_FIELD FieldOptions_OptionTargetType = 4 - FieldOptions_TARGET_TYPE_ONEOF FieldOptions_OptionTargetType = 5 - FieldOptions_TARGET_TYPE_ENUM FieldOptions_OptionTargetType = 6 - FieldOptions_TARGET_TYPE_ENUM_ENTRY FieldOptions_OptionTargetType = 7 - FieldOptions_TARGET_TYPE_SERVICE FieldOptions_OptionTargetType = 8 - FieldOptions_TARGET_TYPE_METHOD FieldOptions_OptionTargetType = 9 -) - -// Enum value maps for FieldOptions_OptionTargetType. -var ( - FieldOptions_OptionTargetType_name = map[int32]string{ - 0: "TARGET_TYPE_UNKNOWN", - 1: "TARGET_TYPE_FILE", - 2: "TARGET_TYPE_EXTENSION_RANGE", - 3: "TARGET_TYPE_MESSAGE", - 4: "TARGET_TYPE_FIELD", - 5: "TARGET_TYPE_ONEOF", - 6: "TARGET_TYPE_ENUM", - 7: "TARGET_TYPE_ENUM_ENTRY", - 8: "TARGET_TYPE_SERVICE", - 9: "TARGET_TYPE_METHOD", - } - FieldOptions_OptionTargetType_value = map[string]int32{ - "TARGET_TYPE_UNKNOWN": 0, - "TARGET_TYPE_FILE": 1, - "TARGET_TYPE_EXTENSION_RANGE": 2, - "TARGET_TYPE_MESSAGE": 3, - "TARGET_TYPE_FIELD": 4, - "TARGET_TYPE_ONEOF": 5, - "TARGET_TYPE_ENUM": 6, - "TARGET_TYPE_ENUM_ENTRY": 7, - "TARGET_TYPE_SERVICE": 8, - "TARGET_TYPE_METHOD": 9, - } -) - -func (x FieldOptions_OptionTargetType) Enum() *FieldOptions_OptionTargetType { - p := new(FieldOptions_OptionTargetType) - *p = x - return p -} - -func (x FieldOptions_OptionTargetType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (FieldOptions_OptionTargetType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[7].Descriptor() -} - -func (FieldOptions_OptionTargetType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[7] -} - -func (x FieldOptions_OptionTargetType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *FieldOptions_OptionTargetType) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = FieldOptions_OptionTargetType(num) - return nil -} - -// Deprecated: Use FieldOptions_OptionTargetType.Descriptor instead. -func (FieldOptions_OptionTargetType) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 3} -} - -// 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 // implies idempotent - MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 // idempotent, but may have side effects -) - -// Enum value maps for MethodOptions_IdempotencyLevel. -var ( - MethodOptions_IdempotencyLevel_name = map[int32]string{ - 0: "IDEMPOTENCY_UNKNOWN", - 1: "NO_SIDE_EFFECTS", - 2: "IDEMPOTENT", - } - 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 protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[8].Descriptor() -} - -func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[8] -} - -func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = MethodOptions_IdempotencyLevel(num) - return nil -} - -// Deprecated: Use MethodOptions_IdempotencyLevel.Descriptor instead. -func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17, 0} -} - -// Represents the identified object's effect on the element in the original -// .proto file. -type GeneratedCodeInfo_Annotation_Semantic int32 - -const ( - // There is no effect or the effect is indescribable. - GeneratedCodeInfo_Annotation_NONE GeneratedCodeInfo_Annotation_Semantic = 0 - // The element is set or otherwise mutated. - GeneratedCodeInfo_Annotation_SET GeneratedCodeInfo_Annotation_Semantic = 1 - // An alias to the element is returned. - GeneratedCodeInfo_Annotation_ALIAS GeneratedCodeInfo_Annotation_Semantic = 2 -) - -// Enum value maps for GeneratedCodeInfo_Annotation_Semantic. -var ( - GeneratedCodeInfo_Annotation_Semantic_name = map[int32]string{ - 0: "NONE", - 1: "SET", - 2: "ALIAS", - } - GeneratedCodeInfo_Annotation_Semantic_value = map[string]int32{ - "NONE": 0, - "SET": 1, - "ALIAS": 2, - } -) - -func (x GeneratedCodeInfo_Annotation_Semantic) Enum() *GeneratedCodeInfo_Annotation_Semantic { - p := new(GeneratedCodeInfo_Annotation_Semantic) - *p = x - return p -} - -func (x GeneratedCodeInfo_Annotation_Semantic) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[9].Descriptor() -} - -func (GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[9] -} - -func (x GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *GeneratedCodeInfo_Annotation_Semantic) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = GeneratedCodeInfo_Annotation_Semantic(num) - return nil -} - -// Deprecated: Use GeneratedCodeInfo_Annotation_Semantic.Descriptor instead. -func (GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0, 0} -} - -// The protocol compiler can output a FileDescriptorSet containing the .proto -// files it parses. -type FileDescriptorSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` -} - -func (x *FileDescriptorSet) Reset() { - *x = FileDescriptorSet{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FileDescriptorSet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FileDescriptorSet) ProtoMessage() {} - -func (x *FileDescriptorSet) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FileDescriptorSet.ProtoReflect.Descriptor instead. -func (*FileDescriptorSet) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{0} -} - -func (x *FileDescriptorSet) GetFile() []*FileDescriptorProto { - if x != nil { - return x.File - } - return nil -} - -// Describes a complete .proto file. -type FileDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // file name, relative to root of source tree - Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` // e.g. "foo", "foo.bar", etc. - // 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", "proto3", and "editions". - // - // If `edition` is present, this value must be "editions". - Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` - // The edition of the proto file, which is an opaque string. - Edition *string `protobuf:"bytes,13,opt,name=edition" json:"edition,omitempty"` -} - -func (x *FileDescriptorProto) Reset() { - *x = FileDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FileDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FileDescriptorProto) ProtoMessage() {} - -func (x *FileDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FileDescriptorProto.ProtoReflect.Descriptor instead. -func (*FileDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{1} -} - -func (x *FileDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *FileDescriptorProto) GetPackage() string { - if x != nil && x.Package != nil { - return *x.Package - } - return "" -} - -func (x *FileDescriptorProto) GetDependency() []string { - if x != nil { - return x.Dependency - } - return nil -} - -func (x *FileDescriptorProto) GetPublicDependency() []int32 { - if x != nil { - return x.PublicDependency - } - return nil -} - -func (x *FileDescriptorProto) GetWeakDependency() []int32 { - if x != nil { - return x.WeakDependency - } - return nil -} - -func (x *FileDescriptorProto) GetMessageType() []*DescriptorProto { - if x != nil { - return x.MessageType - } - return nil -} - -func (x *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { - if x != nil { - return x.EnumType - } - return nil -} - -func (x *FileDescriptorProto) GetService() []*ServiceDescriptorProto { - if x != nil { - return x.Service - } - return nil -} - -func (x *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { - if x != nil { - return x.Extension - } - return nil -} - -func (x *FileDescriptorProto) GetOptions() *FileOptions { - if x != nil { - return x.Options - } - return nil -} - -func (x *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { - if x != nil { - return x.SourceCodeInfo - } - return nil -} - -func (x *FileDescriptorProto) GetSyntax() string { - if x != nil && x.Syntax != nil { - return *x.Syntax - } - return "" -} - -func (x *FileDescriptorProto) GetEdition() string { - if x != nil && x.Edition != nil { - return *x.Edition - } - return "" -} - -// Describes a message type. -type DescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -func (x *DescriptorProto) Reset() { - *x = DescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DescriptorProto) ProtoMessage() {} - -func (x *DescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DescriptorProto.ProtoReflect.Descriptor instead. -func (*DescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{2} -} - -func (x *DescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *DescriptorProto) GetField() []*FieldDescriptorProto { - if x != nil { - return x.Field - } - return nil -} - -func (x *DescriptorProto) GetExtension() []*FieldDescriptorProto { - if x != nil { - return x.Extension - } - return nil -} - -func (x *DescriptorProto) GetNestedType() []*DescriptorProto { - if x != nil { - return x.NestedType - } - return nil -} - -func (x *DescriptorProto) GetEnumType() []*EnumDescriptorProto { - if x != nil { - return x.EnumType - } - return nil -} - -func (x *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { - if x != nil { - return x.ExtensionRange - } - return nil -} - -func (x *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { - if x != nil { - return x.OneofDecl - } - return nil -} - -func (x *DescriptorProto) GetOptions() *MessageOptions { - if x != nil { - return x.Options - } - return nil -} - -func (x *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { - if x != nil { - return x.ReservedRange - } - return nil -} - -func (x *DescriptorProto) GetReservedName() []string { - if x != nil { - return x.ReservedName - } - return nil -} - -type ExtensionRangeOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` - // go/protobuf-stripping-extension-declarations - // Like Metadata, but we use a repeated field to hold all extension - // declarations. This should avoid the size increases of transforming a large - // extension range into small ranges in generated binaries. - Declaration []*ExtensionRangeOptions_Declaration `protobuf:"bytes,2,rep,name=declaration" json:"declaration,omitempty"` - // The verification state of the range. - // TODO(b/278783756): flip the default to DECLARATION once all empty ranges - // are marked as UNVERIFIED. - Verification *ExtensionRangeOptions_VerificationState `protobuf:"varint,3,opt,name=verification,enum=google.protobuf.ExtensionRangeOptions_VerificationState,def=1" json:"verification,omitempty"` -} - -// Default values for ExtensionRangeOptions fields. -const ( - Default_ExtensionRangeOptions_Verification = ExtensionRangeOptions_UNVERIFIED -) - -func (x *ExtensionRangeOptions) Reset() { - *x = ExtensionRangeOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ExtensionRangeOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExtensionRangeOptions) ProtoMessage() {} - -func (x *ExtensionRangeOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExtensionRangeOptions.ProtoReflect.Descriptor instead. -func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3} -} - -func (x *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -func (x *ExtensionRangeOptions) GetDeclaration() []*ExtensionRangeOptions_Declaration { - if x != nil { - return x.Declaration - } - return nil -} - -func (x *ExtensionRangeOptions) GetVerification() ExtensionRangeOptions_VerificationState { - if x != nil && x.Verification != nil { - return *x.Verification - } - return Default_ExtensionRangeOptions_Verification -} - -// Describes a field within a message. -type FieldDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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. - 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"` - // If true, this is a proto3 "optional". When a proto3 field is optional, it - // tracks presence regardless of field type. - // - // When proto3_optional is true, this field must be belong to a oneof to - // signal to old proto3 clients that presence is tracked for this field. This - // oneof is known as a "synthetic" oneof, and this field must be its sole - // member (each proto3 optional field gets its own synthetic oneof). Synthetic - // oneofs exist in the descriptor only, and do not generate any API. Synthetic - // oneofs must be ordered after all "real" oneofs. - // - // For message fields, proto3_optional doesn't create any semantic change, - // since non-repeated message fields always track presence. However it still - // indicates the semantic detail of whether the user wrote "optional" or not. - // This can be useful for round-tripping the .proto file. For consistency we - // give message fields a synthetic oneof also, even though it is not required - // to track presence. This is especially important because the parser can't - // tell if a field is a message or an enum, so it must always create a - // synthetic oneof. - // - // Proto2 optional fields do not set this flag, because they already indicate - // optional with `LABEL_OPTIONAL`. - Proto3Optional *bool `protobuf:"varint,17,opt,name=proto3_optional,json=proto3Optional" json:"proto3_optional,omitempty"` -} - -func (x *FieldDescriptorProto) Reset() { - *x = FieldDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FieldDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FieldDescriptorProto) ProtoMessage() {} - -func (x *FieldDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FieldDescriptorProto.ProtoReflect.Descriptor instead. -func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{4} -} - -func (x *FieldDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *FieldDescriptorProto) GetNumber() int32 { - if x != nil && x.Number != nil { - return *x.Number - } - return 0 -} - -func (x *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { - if x != nil && x.Label != nil { - return *x.Label - } - return FieldDescriptorProto_LABEL_OPTIONAL -} - -func (x *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { - if x != nil && x.Type != nil { - return *x.Type - } - return FieldDescriptorProto_TYPE_DOUBLE -} - -func (x *FieldDescriptorProto) GetTypeName() string { - if x != nil && x.TypeName != nil { - return *x.TypeName - } - return "" -} - -func (x *FieldDescriptorProto) GetExtendee() string { - if x != nil && x.Extendee != nil { - return *x.Extendee - } - return "" -} - -func (x *FieldDescriptorProto) GetDefaultValue() string { - if x != nil && x.DefaultValue != nil { - return *x.DefaultValue - } - return "" -} - -func (x *FieldDescriptorProto) GetOneofIndex() int32 { - if x != nil && x.OneofIndex != nil { - return *x.OneofIndex - } - return 0 -} - -func (x *FieldDescriptorProto) GetJsonName() string { - if x != nil && x.JsonName != nil { - return *x.JsonName - } - return "" -} - -func (x *FieldDescriptorProto) GetOptions() *FieldOptions { - if x != nil { - return x.Options - } - return nil -} - -func (x *FieldDescriptorProto) GetProto3Optional() bool { - if x != nil && x.Proto3Optional != nil { - return *x.Proto3Optional - } - return false -} - -// Describes a oneof. -type OneofDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` -} - -func (x *OneofDescriptorProto) Reset() { - *x = OneofDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OneofDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OneofDescriptorProto) ProtoMessage() {} - -func (x *OneofDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OneofDescriptorProto.ProtoReflect.Descriptor instead. -func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{5} -} - -func (x *OneofDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *OneofDescriptorProto) GetOptions() *OneofOptions { - if x != nil { - return x.Options - } - return nil -} - -// Describes an enum type. -type EnumDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -func (x *EnumDescriptorProto) Reset() { - *x = EnumDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnumDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnumDescriptorProto) ProtoMessage() {} - -func (x *EnumDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnumDescriptorProto.ProtoReflect.Descriptor instead. -func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{6} -} - -func (x *EnumDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { - if x != nil { - return x.Value - } - return nil -} - -func (x *EnumDescriptorProto) GetOptions() *EnumOptions { - if x != nil { - return x.Options - } - return nil -} - -func (x *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { - if x != nil { - return x.ReservedRange - } - return nil -} - -func (x *EnumDescriptorProto) GetReservedName() []string { - if x != nil { - return x.ReservedName - } - return nil -} - -// Describes a value within an enum. -type EnumValueDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -func (x *EnumValueDescriptorProto) Reset() { - *x = EnumValueDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnumValueDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnumValueDescriptorProto) ProtoMessage() {} - -func (x *EnumValueDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnumValueDescriptorProto.ProtoReflect.Descriptor instead. -func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{7} -} - -func (x *EnumValueDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *EnumValueDescriptorProto) GetNumber() int32 { - if x != nil && x.Number != nil { - return *x.Number - } - return 0 -} - -func (x *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { - if x != nil { - return x.Options - } - return nil -} - -// Describes a service. -type ServiceDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -func (x *ServiceDescriptorProto) Reset() { - *x = ServiceDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServiceDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceDescriptorProto) ProtoMessage() {} - -func (x *ServiceDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceDescriptorProto.ProtoReflect.Descriptor instead. -func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{8} -} - -func (x *ServiceDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { - if x != nil { - return x.Method - } - return nil -} - -func (x *ServiceDescriptorProto) GetOptions() *ServiceOptions { - if x != nil { - return x.Options - } - return nil -} - -// Describes a method of a service. -type MethodDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -// Default values for MethodDescriptorProto fields. -const ( - Default_MethodDescriptorProto_ClientStreaming = bool(false) - Default_MethodDescriptorProto_ServerStreaming = bool(false) -) - -func (x *MethodDescriptorProto) Reset() { - *x = MethodDescriptorProto{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MethodDescriptorProto) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MethodDescriptorProto) ProtoMessage() {} - -func (x *MethodDescriptorProto) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MethodDescriptorProto.ProtoReflect.Descriptor instead. -func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{9} -} - -func (x *MethodDescriptorProto) GetName() string { - if x != nil && x.Name != nil { - return *x.Name - } - return "" -} - -func (x *MethodDescriptorProto) GetInputType() string { - if x != nil && x.InputType != nil { - return *x.InputType - } - return "" -} - -func (x *MethodDescriptorProto) GetOutputType() string { - if x != nil && x.OutputType != nil { - return *x.OutputType - } - return "" -} - -func (x *MethodDescriptorProto) GetOptions() *MethodOptions { - if x != nil { - return x.Options - } - return nil -} - -func (x *MethodDescriptorProto) GetClientStreaming() bool { - if x != nil && x.ClientStreaming != nil { - return *x.ClientStreaming - } - return Default_MethodDescriptorProto_ClientStreaming -} - -func (x *MethodDescriptorProto) GetServerStreaming() bool { - if x != nil && x.ServerStreaming != nil { - return *x.ServerStreaming - } - return Default_MethodDescriptorProto_ServerStreaming -} - -type FileOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` - // Controls the name of the wrapper Java class generated for the .proto file. - // That class will always contain the .proto file's getDescriptor() method as - // well as any top-level extensions defined in the .proto file. - // If java_multiple_files is disabled, then all the other classes from the - // .proto file will be nested inside the single wrapper outer class. - JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` - // If enabled, 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 wrapper class - // named by java_outer_classname. However, the wrapper 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. - // - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` - // 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=1" 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"` -} - -// Default values for FileOptions fields. -const ( - Default_FileOptions_JavaMultipleFiles = bool(false) - Default_FileOptions_JavaStringCheckUtf8 = bool(false) - Default_FileOptions_OptimizeFor = FileOptions_SPEED - Default_FileOptions_CcGenericServices = bool(false) - Default_FileOptions_JavaGenericServices = bool(false) - Default_FileOptions_PyGenericServices = bool(false) - Default_FileOptions_PhpGenericServices = bool(false) - Default_FileOptions_Deprecated = bool(false) - Default_FileOptions_CcEnableArenas = bool(true) -) - -func (x *FileOptions) Reset() { - *x = FileOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FileOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FileOptions) ProtoMessage() {} - -func (x *FileOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FileOptions.ProtoReflect.Descriptor instead. -func (*FileOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{10} -} - -func (x *FileOptions) GetJavaPackage() string { - if x != nil && x.JavaPackage != nil { - return *x.JavaPackage - } - return "" -} - -func (x *FileOptions) GetJavaOuterClassname() string { - if x != nil && x.JavaOuterClassname != nil { - return *x.JavaOuterClassname - } - return "" -} - -func (x *FileOptions) GetJavaMultipleFiles() bool { - if x != nil && x.JavaMultipleFiles != nil { - return *x.JavaMultipleFiles - } - return Default_FileOptions_JavaMultipleFiles -} - -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *FileOptions) GetJavaGenerateEqualsAndHash() bool { - if x != nil && x.JavaGenerateEqualsAndHash != nil { - return *x.JavaGenerateEqualsAndHash - } - return false -} - -func (x *FileOptions) GetJavaStringCheckUtf8() bool { - if x != nil && x.JavaStringCheckUtf8 != nil { - return *x.JavaStringCheckUtf8 - } - return Default_FileOptions_JavaStringCheckUtf8 -} - -func (x *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { - if x != nil && x.OptimizeFor != nil { - return *x.OptimizeFor - } - return Default_FileOptions_OptimizeFor -} - -func (x *FileOptions) GetGoPackage() string { - if x != nil && x.GoPackage != nil { - return *x.GoPackage - } - return "" -} - -func (x *FileOptions) GetCcGenericServices() bool { - if x != nil && x.CcGenericServices != nil { - return *x.CcGenericServices - } - return Default_FileOptions_CcGenericServices -} - -func (x *FileOptions) GetJavaGenericServices() bool { - if x != nil && x.JavaGenericServices != nil { - return *x.JavaGenericServices - } - return Default_FileOptions_JavaGenericServices -} - -func (x *FileOptions) GetPyGenericServices() bool { - if x != nil && x.PyGenericServices != nil { - return *x.PyGenericServices - } - return Default_FileOptions_PyGenericServices -} - -func (x *FileOptions) GetPhpGenericServices() bool { - if x != nil && x.PhpGenericServices != nil { - return *x.PhpGenericServices - } - return Default_FileOptions_PhpGenericServices -} - -func (x *FileOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_FileOptions_Deprecated -} - -func (x *FileOptions) GetCcEnableArenas() bool { - if x != nil && x.CcEnableArenas != nil { - return *x.CcEnableArenas - } - return Default_FileOptions_CcEnableArenas -} - -func (x *FileOptions) GetObjcClassPrefix() string { - if x != nil && x.ObjcClassPrefix != nil { - return *x.ObjcClassPrefix - } - return "" -} - -func (x *FileOptions) GetCsharpNamespace() string { - if x != nil && x.CsharpNamespace != nil { - return *x.CsharpNamespace - } - return "" -} - -func (x *FileOptions) GetSwiftPrefix() string { - if x != nil && x.SwiftPrefix != nil { - return *x.SwiftPrefix - } - return "" -} - -func (x *FileOptions) GetPhpClassPrefix() string { - if x != nil && x.PhpClassPrefix != nil { - return *x.PhpClassPrefix - } - return "" -} - -func (x *FileOptions) GetPhpNamespace() string { - if x != nil && x.PhpNamespace != nil { - return *x.PhpNamespace - } - return "" -} - -func (x *FileOptions) GetPhpMetadataNamespace() string { - if x != nil && x.PhpMetadataNamespace != nil { - return *x.PhpMetadataNamespace - } - return "" -} - -func (x *FileOptions) GetRubyPackage() string { - if x != nil && x.RubyPackage != nil { - return *x.RubyPackage - } - return "" -} - -func (x *FileOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type MessageOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` - // 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. - // - // 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 implementations still need to work as - // if the field is a repeated message field. - MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` - // Enable the legacy handling of JSON field name conflicts. This lowercases - // and strips underscored from the fields before comparison in proto3 only. - // The new behavior takes `json_name` into account and applies to proto2 as - // well. - // - // This should only be used as a temporary measure against broken builds due - // to the change in behavior for JSON field name conflicts. - // - // TODO(b/261750190) This is legacy behavior we plan to remove once downstream - // teams have had time to migrate. - // - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,11,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,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"` -} - -// Default values for MessageOptions fields. -const ( - Default_MessageOptions_MessageSetWireFormat = bool(false) - Default_MessageOptions_NoStandardDescriptorAccessor = bool(false) - Default_MessageOptions_Deprecated = bool(false) -) - -func (x *MessageOptions) Reset() { - *x = MessageOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MessageOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MessageOptions) ProtoMessage() {} - -func (x *MessageOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MessageOptions.ProtoReflect.Descriptor instead. -func (*MessageOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{11} -} - -func (x *MessageOptions) GetMessageSetWireFormat() bool { - if x != nil && x.MessageSetWireFormat != nil { - return *x.MessageSetWireFormat - } - return Default_MessageOptions_MessageSetWireFormat -} - -func (x *MessageOptions) GetNoStandardDescriptorAccessor() bool { - if x != nil && x.NoStandardDescriptorAccessor != nil { - return *x.NoStandardDescriptorAccessor - } - return Default_MessageOptions_NoStandardDescriptorAccessor -} - -func (x *MessageOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_MessageOptions_Deprecated -} - -func (x *MessageOptions) GetMapEntry() bool { - if x != nil && x.MapEntry != nil { - return *x.MapEntry - } - return false -} - -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *MessageOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { - if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { - return *x.DeprecatedLegacyJsonFieldConflicts - } - return false -} - -func (x *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type FieldOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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 only implemented to support use of - // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of - // type "bytes" in the open source release -- sorry, we'll try to include - // other types 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. - // - // As of May 2022, lazy verifies the contents of the byte stream during - // parsing. An invalid byte stream will cause the overall parsing to fail. - Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` - // unverified_lazy does no correctness checks on the byte stream. This should - // only be used where lazy with verification is prohibitive for performance - // reasons. - UnverifiedLazy *bool `protobuf:"varint,15,opt,name=unverified_lazy,json=unverifiedLazy,def=0" json:"unverified_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"` - // Indicate that the field value should not be printed out when using debug - // formats, e.g. when the field contains sensitive credentials. - DebugRedact *bool `protobuf:"varint,16,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` - Retention *FieldOptions_OptionRetention `protobuf:"varint,17,opt,name=retention,enum=google.protobuf.FieldOptions_OptionRetention" json:"retention,omitempty"` - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - Target *FieldOptions_OptionTargetType `protobuf:"varint,18,opt,name=target,enum=google.protobuf.FieldOptions_OptionTargetType" json:"target,omitempty"` - Targets []FieldOptions_OptionTargetType `protobuf:"varint,19,rep,name=targets,enum=google.protobuf.FieldOptions_OptionTargetType" json:"targets,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"` -} - -// Default values for FieldOptions fields. -const ( - Default_FieldOptions_Ctype = FieldOptions_STRING - Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL - Default_FieldOptions_Lazy = bool(false) - Default_FieldOptions_UnverifiedLazy = bool(false) - Default_FieldOptions_Deprecated = bool(false) - Default_FieldOptions_Weak = bool(false) - Default_FieldOptions_DebugRedact = bool(false) -) - -func (x *FieldOptions) Reset() { - *x = FieldOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FieldOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FieldOptions) ProtoMessage() {} - -func (x *FieldOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FieldOptions.ProtoReflect.Descriptor instead. -func (*FieldOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12} -} - -func (x *FieldOptions) GetCtype() FieldOptions_CType { - if x != nil && x.Ctype != nil { - return *x.Ctype - } - return Default_FieldOptions_Ctype -} - -func (x *FieldOptions) GetPacked() bool { - if x != nil && x.Packed != nil { - return *x.Packed - } - return false -} - -func (x *FieldOptions) GetJstype() FieldOptions_JSType { - if x != nil && x.Jstype != nil { - return *x.Jstype - } - return Default_FieldOptions_Jstype -} - -func (x *FieldOptions) GetLazy() bool { - if x != nil && x.Lazy != nil { - return *x.Lazy - } - return Default_FieldOptions_Lazy -} - -func (x *FieldOptions) GetUnverifiedLazy() bool { - if x != nil && x.UnverifiedLazy != nil { - return *x.UnverifiedLazy - } - return Default_FieldOptions_UnverifiedLazy -} - -func (x *FieldOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_FieldOptions_Deprecated -} - -func (x *FieldOptions) GetWeak() bool { - if x != nil && x.Weak != nil { - return *x.Weak - } - return Default_FieldOptions_Weak -} - -func (x *FieldOptions) GetDebugRedact() bool { - if x != nil && x.DebugRedact != nil { - return *x.DebugRedact - } - return Default_FieldOptions_DebugRedact -} - -func (x *FieldOptions) GetRetention() FieldOptions_OptionRetention { - if x != nil && x.Retention != nil { - return *x.Retention - } - return FieldOptions_RETENTION_UNKNOWN -} - -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *FieldOptions) GetTarget() FieldOptions_OptionTargetType { - if x != nil && x.Target != nil { - return *x.Target - } - return FieldOptions_TARGET_TYPE_UNKNOWN -} - -func (x *FieldOptions) GetTargets() []FieldOptions_OptionTargetType { - if x != nil { - return x.Targets - } - return nil -} - -func (x *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type OneofOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` -} - -func (x *OneofOptions) Reset() { - *x = OneofOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OneofOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OneofOptions) ProtoMessage() {} - -func (x *OneofOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OneofOptions.ProtoReflect.Descriptor instead. -func (*OneofOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{13} -} - -func (x *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type EnumOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` - // Enable the legacy handling of JSON field name conflicts. This lowercases - // and strips underscored from the fields before comparison in proto3 only. - // The new behavior takes `json_name` into account and applies to proto2 as - // well. - // TODO(b/261750190) Remove this legacy behavior once downstream teams have - // had time to migrate. - // - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,6,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,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"` -} - -// Default values for EnumOptions fields. -const ( - Default_EnumOptions_Deprecated = bool(false) -) - -func (x *EnumOptions) Reset() { - *x = EnumOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnumOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnumOptions) ProtoMessage() {} - -func (x *EnumOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnumOptions.ProtoReflect.Descriptor instead. -func (*EnumOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{14} -} - -func (x *EnumOptions) GetAllowAlias() bool { - if x != nil && x.AllowAlias != nil { - return *x.AllowAlias - } - return false -} - -func (x *EnumOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_EnumOptions_Deprecated -} - -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *EnumOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { - if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { - return *x.DeprecatedLegacyJsonFieldConflicts - } - return false -} - -func (x *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type EnumValueOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` -} - -// Default values for EnumValueOptions fields. -const ( - Default_EnumValueOptions_Deprecated = bool(false) -) - -func (x *EnumValueOptions) Reset() { - *x = EnumValueOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnumValueOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnumValueOptions) ProtoMessage() {} - -func (x *EnumValueOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnumValueOptions.ProtoReflect.Descriptor instead. -func (*EnumValueOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{15} -} - -func (x *EnumValueOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_EnumValueOptions_Deprecated -} - -func (x *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type ServiceOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` -} - -// Default values for ServiceOptions fields. -const ( - Default_ServiceOptions_Deprecated = bool(false) -) - -func (x *ServiceOptions) Reset() { - *x = ServiceOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServiceOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServiceOptions) ProtoMessage() {} - -func (x *ServiceOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServiceOptions.ProtoReflect.Descriptor instead. -func (*ServiceOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{16} -} - -func (x *ServiceOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_ServiceOptions_Deprecated -} - -func (x *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.UninterpretedOption - } - return nil -} - -type MethodOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - - // 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"` -} - -// Default values for MethodOptions fields. -const ( - Default_MethodOptions_Deprecated = bool(false) - Default_MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN -) - -func (x *MethodOptions) Reset() { - *x = MethodOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MethodOptions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MethodOptions) ProtoMessage() {} - -func (x *MethodOptions) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MethodOptions.ProtoReflect.Descriptor instead. -func (*MethodOptions) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17} -} - -func (x *MethodOptions) GetDeprecated() bool { - if x != nil && x.Deprecated != nil { - return *x.Deprecated - } - return Default_MethodOptions_Deprecated -} - -func (x *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { - if x != nil && x.IdempotencyLevel != nil { - return *x.IdempotencyLevel - } - return Default_MethodOptions_IdempotencyLevel -} - -func (x *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { - if x != nil { - return x.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 { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -func (x *UninterpretedOption) Reset() { - *x = UninterpretedOption{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UninterpretedOption) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UninterpretedOption) ProtoMessage() {} - -func (x *UninterpretedOption) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UninterpretedOption.ProtoReflect.Descriptor instead. -func (*UninterpretedOption) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{18} -} - -func (x *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { - if x != nil { - return x.Name - } - return nil -} - -func (x *UninterpretedOption) GetIdentifierValue() string { - if x != nil && x.IdentifierValue != nil { - return *x.IdentifierValue - } - return "" -} - -func (x *UninterpretedOption) GetPositiveIntValue() uint64 { - if x != nil && x.PositiveIntValue != nil { - return *x.PositiveIntValue - } - return 0 -} - -func (x *UninterpretedOption) GetNegativeIntValue() int64 { - if x != nil && x.NegativeIntValue != nil { - return *x.NegativeIntValue - } - return 0 -} - -func (x *UninterpretedOption) GetDoubleValue() float64 { - if x != nil && x.DoubleValue != nil { - return *x.DoubleValue - } - return 0 -} - -func (x *UninterpretedOption) GetStringValue() []byte { - if x != nil { - return x.StringValue - } - return nil -} - -func (x *UninterpretedOption) GetAggregateValue() string { - if x != nil && x.AggregateValue != nil { - return *x.AggregateValue - } - return "" -} - -// Encapsulates information about the original source file from which a -// FileDescriptorProto was generated. -type SourceCodeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // 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 descendant. 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"` -} - -func (x *SourceCodeInfo) Reset() { - *x = SourceCodeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SourceCodeInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SourceCodeInfo) ProtoMessage() {} - -func (x *SourceCodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SourceCodeInfo.ProtoReflect.Descriptor instead. -func (*SourceCodeInfo) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19} -} - -func (x *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { - if x != nil { - return x.Location - } - 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 { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // 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"` -} - -func (x *GeneratedCodeInfo) Reset() { - *x = GeneratedCodeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GeneratedCodeInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GeneratedCodeInfo) ProtoMessage() {} - -func (x *GeneratedCodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GeneratedCodeInfo.ProtoReflect.Descriptor instead. -func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20} -} - -func (x *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { - if x != nil { - return x.Annotation - } - return nil -} - -type DescriptorProto_ExtensionRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Exclusive. - Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` -} - -func (x *DescriptorProto_ExtensionRange) Reset() { - *x = DescriptorProto_ExtensionRange{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DescriptorProto_ExtensionRange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DescriptorProto_ExtensionRange) ProtoMessage() {} - -func (x *DescriptorProto_ExtensionRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DescriptorProto_ExtensionRange.ProtoReflect.Descriptor instead. -func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{2, 0} -} - -func (x *DescriptorProto_ExtensionRange) GetStart() int32 { - if x != nil && x.Start != nil { - return *x.Start - } - return 0 -} - -func (x *DescriptorProto_ExtensionRange) GetEnd() int32 { - if x != nil && x.End != nil { - return *x.End - } - return 0 -} - -func (x *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { - if x != nil { - return x.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 { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Exclusive. -} - -func (x *DescriptorProto_ReservedRange) Reset() { - *x = DescriptorProto_ReservedRange{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DescriptorProto_ReservedRange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DescriptorProto_ReservedRange) ProtoMessage() {} - -func (x *DescriptorProto_ReservedRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DescriptorProto_ReservedRange.ProtoReflect.Descriptor instead. -func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{2, 1} -} - -func (x *DescriptorProto_ReservedRange) GetStart() int32 { - if x != nil && x.Start != nil { - return *x.Start - } - return 0 -} - -func (x *DescriptorProto_ReservedRange) GetEnd() int32 { - if x != nil && x.End != nil { - return *x.End - } - return 0 -} - -type ExtensionRangeOptions_Declaration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The extension number declared within the extension range. - Number *int32 `protobuf:"varint,1,opt,name=number" json:"number,omitempty"` - // The fully-qualified name of the extension field. There must be a leading - // dot in front of the full name. - FullName *string `protobuf:"bytes,2,opt,name=full_name,json=fullName" json:"full_name,omitempty"` - // The fully-qualified type name of the extension field. Unlike - // Metadata.type, Declaration.type must have a leading dot for messages - // and enums. - Type *string `protobuf:"bytes,3,opt,name=type" json:"type,omitempty"` - // Deprecated. Please use "repeated". - // - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - IsRepeated *bool `protobuf:"varint,4,opt,name=is_repeated,json=isRepeated" json:"is_repeated,omitempty"` - // If true, indicates that the number is reserved in the extension range, - // and any extension field with the number will fail to compile. Set this - // when a declared extension field is deleted. - Reserved *bool `protobuf:"varint,5,opt,name=reserved" json:"reserved,omitempty"` - // If true, indicates that the extension must be defined as repeated. - // Otherwise the extension must be defined as optional. - Repeated *bool `protobuf:"varint,6,opt,name=repeated" json:"repeated,omitempty"` -} - -func (x *ExtensionRangeOptions_Declaration) Reset() { - *x = ExtensionRangeOptions_Declaration{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ExtensionRangeOptions_Declaration) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExtensionRangeOptions_Declaration) ProtoMessage() {} - -func (x *ExtensionRangeOptions_Declaration) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExtensionRangeOptions_Declaration.ProtoReflect.Descriptor instead. -func (*ExtensionRangeOptions_Declaration) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3, 0} -} - -func (x *ExtensionRangeOptions_Declaration) GetNumber() int32 { - if x != nil && x.Number != nil { - return *x.Number - } - return 0 -} - -func (x *ExtensionRangeOptions_Declaration) GetFullName() string { - if x != nil && x.FullName != nil { - return *x.FullName - } - return "" -} - -func (x *ExtensionRangeOptions_Declaration) GetType() string { - if x != nil && x.Type != nil { - return *x.Type - } - return "" -} - -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *ExtensionRangeOptions_Declaration) GetIsRepeated() bool { - if x != nil && x.IsRepeated != nil { - return *x.IsRepeated - } - return false -} - -func (x *ExtensionRangeOptions_Declaration) GetReserved() bool { - if x != nil && x.Reserved != nil { - return *x.Reserved - } - return false -} - -func (x *ExtensionRangeOptions_Declaration) GetRepeated() bool { - if x != nil && x.Repeated != nil { - return *x.Repeated - } - return false -} - -// 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 { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Inclusive. -} - -func (x *EnumDescriptorProto_EnumReservedRange) Reset() { - *x = EnumDescriptorProto_EnumReservedRange{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnumDescriptorProto_EnumReservedRange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} - -func (x *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnumDescriptorProto_EnumReservedRange.ProtoReflect.Descriptor instead. -func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{6, 0} -} - -func (x *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { - if x != nil && x.Start != nil { - return *x.Start - } - return 0 -} - -func (x *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { - if x != nil && x.End != nil { - return *x.End - } - return 0 -} - -// 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], ["moo", false] } represents -// "foo.(bar.baz).moo". -type UninterpretedOption_NamePart struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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"` -} - -func (x *UninterpretedOption_NamePart) Reset() { - *x = UninterpretedOption_NamePart{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UninterpretedOption_NamePart) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UninterpretedOption_NamePart) ProtoMessage() {} - -func (x *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UninterpretedOption_NamePart.ProtoReflect.Descriptor instead. -func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{18, 0} -} - -func (x *UninterpretedOption_NamePart) GetNamePart() string { - if x != nil && x.NamePart != nil { - return *x.NamePart - } - return "" -} - -func (x *UninterpretedOption_NamePart) GetIsExtension() bool { - if x != nil && x.IsExtension != nil { - return *x.IsExtension - } - return false -} - -type SourceCodeInfo_Location struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // 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 occurs. - // 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 moo. - // // - // // Another line attached to moo. - // optional double moo = 4; - // - // // Detached comment for corge. This is not leading or trailing comments - // // to moo 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"` -} - -func (x *SourceCodeInfo_Location) Reset() { - *x = SourceCodeInfo_Location{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SourceCodeInfo_Location) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SourceCodeInfo_Location) ProtoMessage() {} - -func (x *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SourceCodeInfo_Location.ProtoReflect.Descriptor instead. -func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 0} -} - -func (x *SourceCodeInfo_Location) GetPath() []int32 { - if x != nil { - return x.Path - } - return nil -} - -func (x *SourceCodeInfo_Location) GetSpan() []int32 { - if x != nil { - return x.Span - } - return nil -} - -func (x *SourceCodeInfo_Location) GetLeadingComments() string { - if x != nil && x.LeadingComments != nil { - return *x.LeadingComments - } - return "" -} - -func (x *SourceCodeInfo_Location) GetTrailingComments() string { - if x != nil && x.TrailingComments != nil { - return *x.TrailingComments - } - return "" -} - -func (x *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { - if x != nil { - return x.LeadingDetachedComments - } - return nil -} - -type GeneratedCodeInfo_Annotation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // 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 object. 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"` - Semantic *GeneratedCodeInfo_Annotation_Semantic `protobuf:"varint,5,opt,name=semantic,enum=google.protobuf.GeneratedCodeInfo_Annotation_Semantic" json:"semantic,omitempty"` -} - -func (x *GeneratedCodeInfo_Annotation) Reset() { - *x = GeneratedCodeInfo_Annotation{} - if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GeneratedCodeInfo_Annotation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} - -func (x *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GeneratedCodeInfo_Annotation.ProtoReflect.Descriptor instead. -func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0} -} - -func (x *GeneratedCodeInfo_Annotation) GetPath() []int32 { - if x != nil { - return x.Path - } - return nil -} - -func (x *GeneratedCodeInfo_Annotation) GetSourceFile() string { - if x != nil && x.SourceFile != nil { - return *x.SourceFile - } - return "" -} - -func (x *GeneratedCodeInfo_Annotation) GetBegin() int32 { - if x != nil && x.Begin != nil { - return *x.Begin - } - return 0 -} - -func (x *GeneratedCodeInfo_Annotation) GetEnd() int32 { - if x != nil && x.End != nil { - return *x.End - } - return 0 -} - -func (x *GeneratedCodeInfo_Annotation) GetSemantic() GeneratedCodeInfo_Annotation_Semantic { - if x != nil && x.Semantic != nil { - return *x.Semantic - } - return GeneratedCodeInfo_Annotation_NONE -} - -var File_google_protobuf_descriptor_proto protoreflect.FileDescriptor - -var file_google_protobuf_descriptor_proto_rawDesc = []byte{ - 0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x22, 0x4d, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0xfe, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, - 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x5f, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x05, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0e, - 0x77, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x43, - 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, - 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, - 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, - 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, - 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, - 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, - 0xad, 0x04, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, - 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, - 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x0a, - 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb3, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x52, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, - 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, - 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, - 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, - 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, - 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, - 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, - 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, - 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, - 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, - 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, - 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, - 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, - 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, - 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, - 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, - 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, - 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, - 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, - 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, - 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, - 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, - 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, - 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x09, 0x0a, 0x0b, 0x46, - 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, - 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, - 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, - 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, - 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, - 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, - 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, - 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, - 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, - 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, - 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, 0x5f, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x2a, 0x20, - 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x70, 0x68, 0x70, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, - 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, - 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, - 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, - 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, - 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, - 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x22, 0xbb, - 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, - 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, - 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, - 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, - 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x85, 0x09, 0x0a, - 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, - 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, - 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, - 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, - 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, - 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, - 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x48, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, - 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, - 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, - 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, - 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, - 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, - 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, - 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, - 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, - 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, - 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, - 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, - 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x45, 0x6e, - 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, - 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, - 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, - 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, - 0x80, 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, - 0x11, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, - 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, - 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, - 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, - 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, - 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, - 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, - 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, - 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, - 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, - 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, - 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, - 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, - 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd0, - 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, - 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, - 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, - 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, - 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, - 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, - 0x02, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xa2, 0x02, - 0x03, 0x47, 0x50, 0x42, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, -} - -var ( - file_google_protobuf_descriptor_proto_rawDescOnce sync.Once - file_google_protobuf_descriptor_proto_rawDescData = file_google_protobuf_descriptor_proto_rawDesc -) - -func file_google_protobuf_descriptor_proto_rawDescGZIP() []byte { - file_google_protobuf_descriptor_proto_rawDescOnce.Do(func() { - file_google_protobuf_descriptor_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_protobuf_descriptor_proto_rawDescData) - }) - return file_google_protobuf_descriptor_proto_rawDescData -} - -var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 28) -var file_google_protobuf_descriptor_proto_goTypes = []interface{}{ - (ExtensionRangeOptions_VerificationState)(0), // 0: google.protobuf.ExtensionRangeOptions.VerificationState - (FieldDescriptorProto_Type)(0), // 1: google.protobuf.FieldDescriptorProto.Type - (FieldDescriptorProto_Label)(0), // 2: google.protobuf.FieldDescriptorProto.Label - (FileOptions_OptimizeMode)(0), // 3: google.protobuf.FileOptions.OptimizeMode - (FieldOptions_CType)(0), // 4: google.protobuf.FieldOptions.CType - (FieldOptions_JSType)(0), // 5: google.protobuf.FieldOptions.JSType - (FieldOptions_OptionRetention)(0), // 6: google.protobuf.FieldOptions.OptionRetention - (FieldOptions_OptionTargetType)(0), // 7: google.protobuf.FieldOptions.OptionTargetType - (MethodOptions_IdempotencyLevel)(0), // 8: google.protobuf.MethodOptions.IdempotencyLevel - (GeneratedCodeInfo_Annotation_Semantic)(0), // 9: google.protobuf.GeneratedCodeInfo.Annotation.Semantic - (*FileDescriptorSet)(nil), // 10: google.protobuf.FileDescriptorSet - (*FileDescriptorProto)(nil), // 11: google.protobuf.FileDescriptorProto - (*DescriptorProto)(nil), // 12: google.protobuf.DescriptorProto - (*ExtensionRangeOptions)(nil), // 13: google.protobuf.ExtensionRangeOptions - (*FieldDescriptorProto)(nil), // 14: google.protobuf.FieldDescriptorProto - (*OneofDescriptorProto)(nil), // 15: google.protobuf.OneofDescriptorProto - (*EnumDescriptorProto)(nil), // 16: google.protobuf.EnumDescriptorProto - (*EnumValueDescriptorProto)(nil), // 17: google.protobuf.EnumValueDescriptorProto - (*ServiceDescriptorProto)(nil), // 18: google.protobuf.ServiceDescriptorProto - (*MethodDescriptorProto)(nil), // 19: google.protobuf.MethodDescriptorProto - (*FileOptions)(nil), // 20: google.protobuf.FileOptions - (*MessageOptions)(nil), // 21: google.protobuf.MessageOptions - (*FieldOptions)(nil), // 22: google.protobuf.FieldOptions - (*OneofOptions)(nil), // 23: google.protobuf.OneofOptions - (*EnumOptions)(nil), // 24: google.protobuf.EnumOptions - (*EnumValueOptions)(nil), // 25: google.protobuf.EnumValueOptions - (*ServiceOptions)(nil), // 26: google.protobuf.ServiceOptions - (*MethodOptions)(nil), // 27: google.protobuf.MethodOptions - (*UninterpretedOption)(nil), // 28: google.protobuf.UninterpretedOption - (*SourceCodeInfo)(nil), // 29: google.protobuf.SourceCodeInfo - (*GeneratedCodeInfo)(nil), // 30: google.protobuf.GeneratedCodeInfo - (*DescriptorProto_ExtensionRange)(nil), // 31: google.protobuf.DescriptorProto.ExtensionRange - (*DescriptorProto_ReservedRange)(nil), // 32: google.protobuf.DescriptorProto.ReservedRange - (*ExtensionRangeOptions_Declaration)(nil), // 33: google.protobuf.ExtensionRangeOptions.Declaration - (*EnumDescriptorProto_EnumReservedRange)(nil), // 34: google.protobuf.EnumDescriptorProto.EnumReservedRange - (*UninterpretedOption_NamePart)(nil), // 35: google.protobuf.UninterpretedOption.NamePart - (*SourceCodeInfo_Location)(nil), // 36: google.protobuf.SourceCodeInfo.Location - (*GeneratedCodeInfo_Annotation)(nil), // 37: google.protobuf.GeneratedCodeInfo.Annotation -} -var file_google_protobuf_descriptor_proto_depIdxs = []int32{ - 11, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto - 12, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto - 16, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 18, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto - 14, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 20, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions - 29, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo - 14, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto - 14, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 12, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto - 16, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 31, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange - 15, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto - 21, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions - 32, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange - 28, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 33, // 16: google.protobuf.ExtensionRangeOptions.declaration:type_name -> google.protobuf.ExtensionRangeOptions.Declaration - 0, // 17: google.protobuf.ExtensionRangeOptions.verification:type_name -> google.protobuf.ExtensionRangeOptions.VerificationState - 2, // 18: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label - 1, // 19: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type - 22, // 20: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions - 23, // 21: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions - 17, // 22: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto - 24, // 23: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions - 34, // 24: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange - 25, // 25: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions - 19, // 26: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto - 26, // 27: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions - 27, // 28: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions - 3, // 29: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode - 28, // 30: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 31: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 4, // 32: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType - 5, // 33: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType - 6, // 34: google.protobuf.FieldOptions.retention:type_name -> google.protobuf.FieldOptions.OptionRetention - 7, // 35: google.protobuf.FieldOptions.target:type_name -> google.protobuf.FieldOptions.OptionTargetType - 7, // 36: google.protobuf.FieldOptions.targets:type_name -> google.protobuf.FieldOptions.OptionTargetType - 28, // 37: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 38: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 39: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 40: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 41: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 8, // 42: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel - 28, // 43: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 35, // 44: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart - 36, // 45: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location - 37, // 46: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation - 13, // 47: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions - 9, // 48: google.protobuf.GeneratedCodeInfo.Annotation.semantic:type_name -> google.protobuf.GeneratedCodeInfo.Annotation.Semantic - 49, // [49:49] is the sub-list for method output_type - 49, // [49:49] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name -} - -func init() { file_google_protobuf_descriptor_proto_init() } -func file_google_protobuf_descriptor_proto_init() { - if File_google_protobuf_descriptor_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_google_protobuf_descriptor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileDescriptorSet); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRangeOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneofDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumValueDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MethodDescriptorProto); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MessageOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneofOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumValueOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MethodOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - case 3: - return &v.extensionFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UninterpretedOption); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceCodeInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratedCodeInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DescriptorProto_ExtensionRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DescriptorProto_ReservedRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRangeOptions_Declaration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UninterpretedOption_NamePart); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceCodeInfo_Location); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_google_protobuf_descriptor_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratedCodeInfo_Annotation); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_google_protobuf_descriptor_proto_rawDesc, - NumEnums: 10, - NumMessages: 28, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_google_protobuf_descriptor_proto_goTypes, - DependencyIndexes: file_google_protobuf_descriptor_proto_depIdxs, - EnumInfos: file_google_protobuf_descriptor_proto_enumTypes, - MessageInfos: file_google_protobuf_descriptor_proto_msgTypes, - }.Build() - File_google_protobuf_descriptor_proto = out.File - file_google_protobuf_descriptor_proto_rawDesc = nil - file_google_protobuf_descriptor_proto_goTypes = nil - file_google_protobuf_descriptor_proto_depIdxs = nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index b0058e90..c5658f49 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# github.com/99designs/gqlgen v0.17.36 +# github.com/99designs/gqlgen v0.17.42 ## explicit; go 1.18 github.com/99designs/gqlgen github.com/99designs/gqlgen/api @@ -42,7 +42,7 @@ github.com/benburkert/openpgp/aes/keywrap # github.com/beorn7/perks v1.0.1 ## explicit; go 1.11 github.com/beorn7/perks/quantile -# github.com/caddyserver/certmagic v0.19.2 +# github.com/caddyserver/certmagic v0.20.0 ## explicit; go 1.19 github.com/caddyserver/certmagic # github.com/cespare/xxhash/v2 v2.2.0 @@ -60,7 +60,7 @@ github.com/datarhei/gosrt/internal/crypto github.com/datarhei/gosrt/internal/net github.com/datarhei/gosrt/internal/packet github.com/datarhei/gosrt/internal/rand -# github.com/datarhei/joy4 v0.0.0-20230505074825-fde05957445a +# github.com/datarhei/joy4 v0.0.0-20240103155326-704dff2c27fb ## explicit; go 1.14 github.com/datarhei/joy4/av github.com/datarhei/joy4/av/avutil @@ -68,8 +68,11 @@ github.com/datarhei/joy4/av/pktque github.com/datarhei/joy4/av/pubsub github.com/datarhei/joy4/codec github.com/datarhei/joy4/codec/aacparser +github.com/datarhei/joy4/codec/av1parser github.com/datarhei/joy4/codec/fake github.com/datarhei/joy4/codec/h264parser +github.com/datarhei/joy4/codec/hevcparser +github.com/datarhei/joy4/codec/vp9parser github.com/datarhei/joy4/format github.com/datarhei/joy4/format/aac github.com/datarhei/joy4/format/flv @@ -89,7 +92,7 @@ github.com/davecgh/go-spew/spew # github.com/dustin/go-humanize v1.0.1 ## explicit; go 1.16 github.com/dustin/go-humanize -# github.com/gabriel-vasile/mimetype v1.4.2 +# github.com/gabriel-vasile/mimetype v1.4.3 ## explicit; go 1.20 github.com/gabriel-vasile/mimetype github.com/gabriel-vasile/mimetype/internal/charset @@ -102,18 +105,18 @@ github.com/ghodss/yaml ## explicit; go 1.12 github.com/go-ole/go-ole github.com/go-ole/go-ole/oleutil -# github.com/go-openapi/jsonpointer v0.20.0 -## explicit; go 1.18 +# github.com/go-openapi/jsonpointer v0.20.2 +## explicit; go 1.19 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.20.2 -## explicit; go 1.13 +# github.com/go-openapi/jsonreference v0.20.4 +## explicit; go 1.19 github.com/go-openapi/jsonreference github.com/go-openapi/jsonreference/internal -# github.com/go-openapi/spec v0.20.9 -## explicit; go 1.13 +# github.com/go-openapi/spec v0.20.14 +## explicit; go 1.19 github.com/go-openapi/spec -# github.com/go-openapi/swag v0.22.4 -## explicit; go 1.18 +# github.com/go-openapi/swag v0.22.7 +## explicit; go 1.19 github.com/go-openapi/swag # github.com/go-playground/locales v0.14.1 ## explicit; go 1.17 @@ -122,7 +125,7 @@ github.com/go-playground/locales/currency # github.com/go-playground/universal-translator v0.18.1 ## explicit; go 1.18 github.com/go-playground/universal-translator -# github.com/go-playground/validator/v10 v10.15.3 +# github.com/go-playground/validator/v10 v10.16.0 ## explicit; go 1.18 github.com/go-playground/validator/v10 # github.com/gobwas/glob v0.2.3 @@ -141,19 +144,16 @@ github.com/golang-jwt/jwt # github.com/golang-jwt/jwt/v4 v4.5.0 ## explicit; go 1.16 github.com/golang-jwt/jwt/v4 -# github.com/golang-jwt/jwt/v5 v5.0.0 +# github.com/golang-jwt/jwt/v5 v5.2.0 ## explicit; go 1.18 github.com/golang-jwt/jwt/v5 -# github.com/golang/protobuf v1.5.3 -## explicit; go 1.9 -github.com/golang/protobuf/proto -# github.com/google/uuid v1.3.1 +# github.com/google/uuid v1.5.0 ## explicit github.com/google/uuid -# github.com/gorilla/websocket v1.5.0 -## explicit; go 1.12 +# github.com/gorilla/websocket v1.5.1 +## explicit; go 1.20 github.com/gorilla/websocket -# github.com/hashicorp/golang-lru/v2 v2.0.6 +# github.com/hashicorp/golang-lru/v2 v2.0.7 ## explicit; go 1.18 github.com/hashicorp/golang-lru/v2 github.com/hashicorp/golang-lru/v2/internal @@ -174,25 +174,24 @@ github.com/josharian/intern # github.com/json-iterator/go v1.1.12 ## explicit; go 1.12 github.com/json-iterator/go -# github.com/klauspost/compress v1.16.7 -## explicit; go 1.18 +# github.com/klauspost/compress v1.17.4 +## explicit; go 1.19 github.com/klauspost/compress/s2 -# github.com/klauspost/cpuid/v2 v2.2.5 +# github.com/klauspost/cpuid/v2 v2.2.6 ## explicit; go 1.15 github.com/klauspost/cpuid/v2 # github.com/labstack/echo-jwt v0.0.0-20221127215225-c84d41a71003 ## explicit; go 1.17 github.com/labstack/echo-jwt -# github.com/labstack/echo/v4 v4.11.1 -## explicit; go 1.17 +# github.com/labstack/echo/v4 v4.11.4 +## explicit; go 1.18 github.com/labstack/echo/v4 github.com/labstack/echo/v4/middleware -# github.com/labstack/gommon v0.4.0 -## explicit; go 1.12 +# github.com/labstack/gommon v0.4.2 +## explicit; go 1.18 github.com/labstack/gommon/bytes github.com/labstack/gommon/color github.com/labstack/gommon/log -github.com/labstack/gommon/random # github.com/leodido/go-urn v1.2.4 ## explicit; go 1.16 github.com/leodido/go-urn @@ -202,7 +201,7 @@ github.com/libdns/libdns # github.com/lithammer/shortuuid/v4 v4.0.0 ## explicit; go 1.13 github.com/lithammer/shortuuid/v4 -# github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a +# github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed ## explicit; go 1.16 github.com/lufia/plan9stats # github.com/mailru/easyjson v0.7.7 @@ -213,23 +212,23 @@ github.com/mailru/easyjson/jwriter # github.com/mattn/go-colorable v0.1.13 ## explicit; go 1.15 github.com/mattn/go-colorable -# github.com/mattn/go-isatty v0.0.19 +# github.com/mattn/go-isatty v0.0.20 ## explicit; go 1.15 github.com/mattn/go-isatty -# github.com/matttproud/golang_protobuf_extensions v1.0.4 -## explicit; go 1.9 -github.com/matttproud/golang_protobuf_extensions/pbutil +# github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 +## explicit; go 1.19 +github.com/matttproud/golang_protobuf_extensions/v2/pbutil # github.com/mholt/acmez v1.2.0 ## explicit; go 1.20 github.com/mholt/acmez github.com/mholt/acmez/acme -# github.com/miekg/dns v1.1.55 +# github.com/miekg/dns v1.1.57 ## explicit; go 1.19 github.com/miekg/dns # github.com/minio/md5-simd v1.1.2 ## explicit; go 1.14 github.com/minio/md5-simd -# github.com/minio/minio-go/v7 v7.0.63 +# github.com/minio/minio-go/v7 v7.0.66 ## explicit; go 1.17 github.com/minio/minio-go/v7 github.com/minio/minio-go/v7/pkg/credentials @@ -263,20 +262,20 @@ github.com/power-devops/perfstat # github.com/prep/average v0.0.0-20200506183628-d26c465f48c3 ## explicit github.com/prep/average -# github.com/prometheus/client_golang v1.16.0 -## explicit; go 1.17 +# github.com/prometheus/client_golang v1.18.0 +## explicit; go 1.19 github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/internal github.com/prometheus/client_golang/prometheus/promhttp -# github.com/prometheus/client_model v0.4.0 -## explicit; go 1.18 +# github.com/prometheus/client_model v0.5.0 +## explicit; go 1.19 github.com/prometheus/client_model/go -# github.com/prometheus/common v0.44.0 -## explicit; go 1.18 +# github.com/prometheus/common v0.45.0 +## explicit; go 1.20 github.com/prometheus/common/expfmt github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg github.com/prometheus/common/model -# github.com/prometheus/procfs v0.11.1 +# github.com/prometheus/procfs v0.12.0 ## explicit; go 1.19 github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs @@ -287,7 +286,7 @@ github.com/rs/xid # github.com/russross/blackfriday/v2 v2.1.0 ## explicit github.com/russross/blackfriday/v2 -# github.com/shirou/gopsutil/v3 v3.23.8 +# github.com/shirou/gopsutil/v3 v3.23.12 ## explicit; go 1.15 github.com/shirou/gopsutil/v3/common github.com/shirou/gopsutil/v3/cpu @@ -302,6 +301,9 @@ github.com/shoenig/go-m1cpu # github.com/sirupsen/logrus v1.9.3 ## explicit; go 1.13 github.com/sirupsen/logrus +# github.com/sosodev/duration v1.2.0 +## explicit; go 1.17 +github.com/sosodev/duration # github.com/stretchr/testify v1.8.4 ## explicit; go 1.20 github.com/stretchr/testify/assert @@ -315,11 +317,11 @@ github.com/swaggo/files/v2 # github.com/swaggo/swag v1.16.2 ## explicit; go 1.18 github.com/swaggo/swag -# github.com/tklauser/go-sysconf v0.3.12 -## explicit; go 1.13 +# github.com/tklauser/go-sysconf v0.3.13 +## explicit; go 1.18 github.com/tklauser/go-sysconf -# github.com/tklauser/numcpus v0.6.1 -## explicit; go 1.13 +# github.com/tklauser/numcpus v0.7.0 +## explicit; go 1.18 github.com/tklauser/numcpus # github.com/urfave/cli/v2 v2.25.5 ## explicit; go 1.18 @@ -330,8 +332,8 @@ github.com/valyala/bytebufferpool # github.com/valyala/fasttemplate v1.2.2 ## explicit; go 1.12 github.com/valyala/fasttemplate -# github.com/vektah/gqlparser/v2 v2.5.8 -## explicit; go 1.16 +# github.com/vektah/gqlparser/v2 v2.5.10 +## explicit; go 1.19 github.com/vektah/gqlparser/v2 github.com/vektah/gqlparser/v2/ast github.com/vektah/gqlparser/v2/gqlerror @@ -369,7 +371,7 @@ github.com/zeebo/blake3/internal/utils # go.uber.org/multierr v1.11.0 ## explicit; go 1.19 go.uber.org/multierr -# go.uber.org/zap v1.25.0 +# go.uber.org/zap v1.26.0 ## explicit; go 1.19 go.uber.org/zap go.uber.org/zap/buffer @@ -378,8 +380,9 @@ go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/internal/pool +go.uber.org/zap/internal/stacktrace go.uber.org/zap/zapcore -# golang.org/x/crypto v0.15.0 +# golang.org/x/crypto v0.18.0 ## explicit; go 1.18 golang.org/x/crypto/acme golang.org/x/crypto/acme/autocert @@ -390,13 +393,13 @@ golang.org/x/crypto/cryptobyte/asn1 golang.org/x/crypto/ocsp golang.org/x/crypto/pbkdf2 golang.org/x/crypto/sha3 -# golang.org/x/mod v0.12.0 -## explicit; go 1.17 +# golang.org/x/mod v0.14.0 +## explicit; go 1.18 golang.org/x/mod/internal/lazyregexp golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.14.0 -## explicit; go 1.17 +# golang.org/x/net v0.20.0 +## explicit; go 1.18 golang.org/x/net/bpf golang.org/x/net/html golang.org/x/net/html/atom @@ -407,13 +410,14 @@ golang.org/x/net/http2/hpack golang.org/x/net/idna golang.org/x/net/internal/iana golang.org/x/net/internal/socket +golang.org/x/net/internal/socks golang.org/x/net/ipv4 golang.org/x/net/ipv6 +golang.org/x/net/proxy golang.org/x/net/publicsuffix -# golang.org/x/sys v0.14.0 +# golang.org/x/sys v0.16.0 ## explicit; go 1.18 golang.org/x/sys/cpu -golang.org/x/sys/execabs golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry @@ -429,10 +433,10 @@ golang.org/x/text/secure/bidirule golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm -# golang.org/x/time v0.3.0 -## explicit +# golang.org/x/time v0.5.0 +## explicit; go 1.18 golang.org/x/time/rate -# golang.org/x/tools v0.12.0 +# golang.org/x/tools v0.17.0 ## explicit; go 1.18 golang.org/x/tools/go/ast/astutil golang.org/x/tools/go/buildutil @@ -448,7 +452,6 @@ golang.org/x/tools/internal/event/core golang.org/x/tools/internal/event/keys golang.org/x/tools/internal/event/label golang.org/x/tools/internal/event/tag -golang.org/x/tools/internal/fastwalk golang.org/x/tools/internal/gcimporter golang.org/x/tools/internal/gocommand golang.org/x/tools/internal/gopathwalk @@ -458,8 +461,9 @@ golang.org/x/tools/internal/pkgbits golang.org/x/tools/internal/tokeninternal golang.org/x/tools/internal/typeparams golang.org/x/tools/internal/typesinternal -# google.golang.org/protobuf v1.31.0 -## explicit; go 1.11 +golang.org/x/tools/internal/versions +# google.golang.org/protobuf v1.32.0 +## explicit; go 1.17 google.golang.org/protobuf/encoding/prototext google.golang.org/protobuf/encoding/protowire google.golang.org/protobuf/internal/descfmt @@ -481,12 +485,10 @@ google.golang.org/protobuf/internal/set google.golang.org/protobuf/internal/strs google.golang.org/protobuf/internal/version google.golang.org/protobuf/proto -google.golang.org/protobuf/reflect/protodesc google.golang.org/protobuf/reflect/protoreflect google.golang.org/protobuf/reflect/protoregistry google.golang.org/protobuf/runtime/protoiface google.golang.org/protobuf/runtime/protoimpl -google.golang.org/protobuf/types/descriptorpb google.golang.org/protobuf/types/known/timestamppb # gopkg.in/ini.v1 v1.67.0 ## explicit